aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>2011-09-05 07:26:20 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-11-03 16:28:43 -0400
commitda83d9dc0ac18ffb07b5b344e237005a0ba08089 (patch)
treea33d785935b0a25896e7933f15645c83c4727451 /drivers
parent489759c0ca26bcd405c82966bdce7ff7fec5a110 (diff)
[media] V4L: sh_mobile_csi2: do not guess the client, the host tells us
We do not have to scan the list of subdevices to find our client - the sensor, the host has already set our grp_id value. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/sh_mobile_csi2.c18
1 files changed, 3 insertions, 15 deletions
diff --git a/drivers/media/video/sh_mobile_csi2.c b/drivers/media/video/sh_mobile_csi2.c
index 6f9f2b7ee453..91c680a72849 100644
--- a/drivers/media/video/sh_mobile_csi2.c
+++ b/drivers/media/video/sh_mobile_csi2.c
@@ -201,22 +201,13 @@ static void sh_csi2_hwinit(struct sh_csi2 *priv)
201static int sh_csi2_client_connect(struct sh_csi2 *priv) 201static int sh_csi2_client_connect(struct sh_csi2 *priv)
202{ 202{
203 struct sh_csi2_pdata *pdata = priv->pdev->dev.platform_data; 203 struct sh_csi2_pdata *pdata = priv->pdev->dev.platform_data;
204 struct v4l2_subdev *sd, *csi2_sd = &priv->subdev; 204 struct soc_camera_device *icd = (struct soc_camera_device *)priv->subdev.grp_id;
205 struct soc_camera_device *icd = NULL; 205 struct v4l2_subdev *client_sd = soc_camera_to_subdev(icd);
206 struct device *dev = v4l2_get_subdevdata(&priv->subdev); 206 struct device *dev = v4l2_get_subdevdata(&priv->subdev);
207 struct v4l2_mbus_config cfg; 207 struct v4l2_mbus_config cfg;
208 unsigned long common_flags, csi2_flags; 208 unsigned long common_flags, csi2_flags;
209 int i, ret; 209 int i, ret;
210 210
211 v4l2_device_for_each_subdev(sd, csi2_sd->v4l2_dev)
212 if (sd->grp_id) {
213 icd = (struct soc_camera_device *)sd->grp_id;
214 break;
215 }
216
217 if (!icd)
218 return -EINVAL;
219
220 for (i = 0; i < pdata->num_clients; i++) 211 for (i = 0; i < pdata->num_clients; i++)
221 if (&pdata->clients[i].pdev->dev == icd->pdev) 212 if (&pdata->clients[i].pdev->dev == icd->pdev)
222 break; 213 break;
@@ -246,7 +237,7 @@ static int sh_csi2_client_connect(struct sh_csi2 *priv)
246 } 237 }
247 238
248 cfg.type = V4L2_MBUS_CSI2; 239 cfg.type = V4L2_MBUS_CSI2;
249 ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg); 240 ret = v4l2_subdev_call(client_sd, video, g_mbus_config, &cfg);
250 if (ret == -ENOIOCTLCMD) 241 if (ret == -ENOIOCTLCMD)
251 common_flags = csi2_flags; 242 common_flags = csi2_flags;
252 else if (!ret) 243 else if (!ret)
@@ -262,8 +253,6 @@ static int sh_csi2_client_connect(struct sh_csi2 *priv)
262 priv->mipi_flags = common_flags; 253 priv->mipi_flags = common_flags;
263 priv->client = pdata->clients + i; 254 priv->client = pdata->clients + i;
264 255
265 csi2_sd->grp_id = (long)icd;
266
267 pm_runtime_get_sync(dev); 256 pm_runtime_get_sync(dev);
268 257
269 sh_csi2_hwinit(priv); 258 sh_csi2_hwinit(priv);
@@ -274,7 +263,6 @@ static int sh_csi2_client_connect(struct sh_csi2 *priv)
274static void sh_csi2_client_disconnect(struct sh_csi2 *priv) 263static void sh_csi2_client_disconnect(struct sh_csi2 *priv)
275{ 264{
276 priv->client = NULL; 265 priv->client = NULL;
277 priv->subdev.grp_id = 0;
278 266
279 pm_runtime_put(v4l2_get_subdevdata(&priv->subdev)); 267 pm_runtime_put(v4l2_get_subdevdata(&priv->subdev));
280} 268}