[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: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
8d274e7c0a
commit
f8bca4f529
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue