|
@@ -128,23 +128,33 @@ static int __subdev_set_power(struct v4l2_subdev *sd, int on)
|
|
|
*
|
|
|
* 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;
|
|
|
- int ret;
|
|
|
+ static const u8 seq[2][IDX_MAX - 1] = {
|
|
|
+ { 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)
|
|
|
return -ENXIO;
|
|
|
|
|
|
- for (i = 0; i < IDX_MAX; i++) {
|
|
|
- unsigned int idx = state ? (IDX_MAX - 1) - i : i;
|
|
|
+ for (i = 0; i < IDX_MAX - 1; 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)
|
|
|
- return ret;
|
|
|
+ goto error;
|
|
|
}
|
|
|
-
|
|
|
return 0;
|
|
|
+error:
|
|
|
+ for (; i >= 0; i--) {
|
|
|
+ unsigned int idx = seq[on][i];
|
|
|
+ __subdev_set_power(p->subdevs[idx], !on);
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/**
|