提交 f8bca4f5 编写于 作者: S Sylwester Nawrocki 提交者: Mauro Carvalho Chehab

[media] s5p-fimc: Ensure proper s_power() call order in the ISP datapaths

Since the FIMC-IS firmware communicates with an image sensor directly
through the ISP I2C bus controllers the sub-devices power supplies
cannot be simply enabled from left to right or disabled from right
to left along the processing pipeline. Thus a subdev index to call
s_power() on is looked up from a table, rather than doing the op call
based on increasing/decreasing indexes.
Signed-off-by: NSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 8d274e7c
...@@ -128,23 +128,33 @@ static int __subdev_set_power(struct v4l2_subdev *sd, int on) ...@@ -128,23 +128,33 @@ static int __subdev_set_power(struct v4l2_subdev *sd, int on)
* *
* Needs to be called with the graph mutex held. * Needs to be called with the graph mutex held.
*/ */
static int fimc_pipeline_s_power(struct fimc_pipeline *p, bool state) static int fimc_pipeline_s_power(struct fimc_pipeline *p, bool on)
{ {
unsigned int i; static const u8 seq[2][IDX_MAX - 1] = {
int ret; { IDX_IS_ISP, IDX_SENSOR, IDX_CSIS, IDX_FLITE },
{ IDX_CSIS, IDX_FLITE, IDX_SENSOR, IDX_IS_ISP },
};
int i, ret = 0;
if (p->subdevs[IDX_SENSOR] == NULL) if (p->subdevs[IDX_SENSOR] == NULL)
return -ENXIO; return -ENXIO;
for (i = 0; i < IDX_MAX; i++) { for (i = 0; i < IDX_MAX - 1; i++) {
unsigned int idx = state ? (IDX_MAX - 1) - i : i; unsigned int idx = seq[on][i];
ret = __subdev_set_power(p->subdevs[idx], on);
ret = __subdev_set_power(p->subdevs[idx], state);
if (ret < 0 && ret != -ENXIO) if (ret < 0 && ret != -ENXIO)
return ret; goto error;
} }
return 0; return 0;
error:
for (; i >= 0; i--) {
unsigned int idx = seq[on][i];
__subdev_set_power(p->subdevs[idx], !on);
}
return ret;
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册