Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] V4L2: mx3_camera: add support for asynchronous subdevice registration

The soc-camera core does all the work on supporting asynchronous
subdevice probing, host drivers only have to pass a subdevice list to
soc-camera. Typically this list is provided by the platform.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>

authored by

Guennadi Liakhovetski and committed by
Mauro Carvalho Chehab
4dbfd040 2bcccaec

+17 -3
+13 -3
drivers/media/platform/soc_camera/mx3_camera.c
··· 1144 1144 1145 1145 static int mx3_camera_probe(struct platform_device *pdev) 1146 1146 { 1147 + struct mx3_camera_pdata *pdata = pdev->dev.platform_data; 1147 1148 struct mx3_camera_dev *mx3_cam; 1148 1149 struct resource *res; 1149 1150 void __iomem *base; ··· 1156 1155 if (IS_ERR(base)) 1157 1156 return PTR_ERR(base); 1158 1157 1158 + if (!pdata) 1159 + return -EINVAL; 1160 + 1159 1161 mx3_cam = devm_kzalloc(&pdev->dev, sizeof(*mx3_cam), GFP_KERNEL); 1160 1162 if (!mx3_cam) { 1161 1163 dev_err(&pdev->dev, "Could not allocate mx3 camera object\n"); ··· 1169 1165 if (IS_ERR(mx3_cam->clk)) 1170 1166 return PTR_ERR(mx3_cam->clk); 1171 1167 1172 - mx3_cam->pdata = pdev->dev.platform_data; 1173 - mx3_cam->platform_flags = mx3_cam->pdata->flags; 1168 + mx3_cam->pdata = pdata; 1169 + mx3_cam->platform_flags = pdata->flags; 1174 1170 if (!(mx3_cam->platform_flags & MX3_CAMERA_DATAWIDTH_MASK)) { 1175 1171 /* 1176 1172 * Platform hasn't set available data widths. This is bad. ··· 1189 1185 if (mx3_cam->platform_flags & MX3_CAMERA_DATAWIDTH_15) 1190 1186 mx3_cam->width_flags |= 1 << 14; 1191 1187 1192 - mx3_cam->mclk = mx3_cam->pdata->mclk_10khz * 10000; 1188 + mx3_cam->mclk = pdata->mclk_10khz * 10000; 1193 1189 if (!mx3_cam->mclk) { 1194 1190 dev_warn(&pdev->dev, 1195 1191 "mclk_10khz == 0! Please, fix your platform data. " ··· 1213 1209 mx3_cam->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); 1214 1210 if (IS_ERR(mx3_cam->alloc_ctx)) 1215 1211 return PTR_ERR(mx3_cam->alloc_ctx); 1212 + 1213 + if (pdata->asd_sizes) { 1214 + soc_host->asd = pdata->asd; 1215 + soc_host->asd_sizes = pdata->asd_sizes; 1216 + } 1216 1217 1217 1218 err = soc_camera_host_register(soc_host); 1218 1219 if (err) ··· 1258 1249 static struct platform_driver mx3_camera_driver = { 1259 1250 .driver = { 1260 1251 .name = MX3_CAM_DRV_NAME, 1252 + .owner = THIS_MODULE, 1261 1253 }, 1262 1254 .probe = mx3_camera_probe, 1263 1255 .remove = mx3_camera_remove,
+4
include/linux/platform_data/camera-mx3.h
··· 33 33 #define MX3_CAMERA_DATAWIDTH_MASK (MX3_CAMERA_DATAWIDTH_4 | MX3_CAMERA_DATAWIDTH_8 | \ 34 34 MX3_CAMERA_DATAWIDTH_10 | MX3_CAMERA_DATAWIDTH_15) 35 35 36 + struct v4l2_async_subdev; 37 + 36 38 /** 37 39 * struct mx3_camera_pdata - i.MX3x camera platform data 38 40 * @flags: MX3_CAMERA_* flags ··· 45 43 unsigned long flags; 46 44 unsigned long mclk_10khz; 47 45 struct device *dma_dev; 46 + struct v4l2_async_subdev **asd; /* Flat array, arranged in groups */ 47 + int *asd_sizes; /* 0-terminated array of asd group sizes */ 48 48 }; 49 49 50 50 #endif