aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2012-05-23 11:08:19 -0400
committerPhilipp Zabel <p.zabel@pengutronix.de>2014-06-04 05:07:12 -0400
commitd6ca8ca7ec555bdd3372687d0d775c837a09ff6e (patch)
tree842b52a03721b61b82c556aa18c14dcf1162ecba
parent3f5a8a946d860b9022a23bf1ed5ab76f6fdd7e6e (diff)
gpu: ipu-v3: Register the CSI modules
This patch registers the two CSI platform devices per IPU. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--drivers/gpu/ipu-v3/ipu-common.c37
-rw-r--r--include/video/imx-ipu-v3.h1
2 files changed, 33 insertions, 5 deletions
diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c
index 1442b9e1cf8d..719788ce7d9f 100644
--- a/drivers/gpu/ipu-v3/ipu-common.c
+++ b/drivers/gpu/ipu-v3/ipu-common.c
@@ -1014,6 +1014,7 @@ static void platform_device_unregister_children(struct platform_device *pdev)
1014struct ipu_platform_reg { 1014struct ipu_platform_reg {
1015 struct ipu_client_platformdata pdata; 1015 struct ipu_client_platformdata pdata;
1016 const char *name; 1016 const char *name;
1017 int reg_offset;
1017}; 1018};
1018 1019
1019static const struct ipu_platform_reg client_reg[] = { 1020static const struct ipu_platform_reg client_reg[] = {
@@ -1035,13 +1036,29 @@ static const struct ipu_platform_reg client_reg[] = {
1035 .dma[1] = -EINVAL, 1036 .dma[1] = -EINVAL,
1036 }, 1037 },
1037 .name = "imx-ipuv3-crtc", 1038 .name = "imx-ipuv3-crtc",
1039 }, {
1040 .pdata = {
1041 .csi = 0,
1042 .dma[0] = IPUV3_CHANNEL_CSI0,
1043 .dma[1] = -EINVAL,
1044 },
1045 .reg_offset = IPU_CM_CSI0_REG_OFS,
1046 .name = "imx-ipuv3-camera",
1047 }, {
1048 .pdata = {
1049 .csi = 1,
1050 .dma[0] = IPUV3_CHANNEL_CSI1,
1051 .dma[1] = -EINVAL,
1052 },
1053 .reg_offset = IPU_CM_CSI1_REG_OFS,
1054 .name = "imx-ipuv3-camera",
1038 }, 1055 },
1039}; 1056};
1040 1057
1041static DEFINE_MUTEX(ipu_client_id_mutex); 1058static DEFINE_MUTEX(ipu_client_id_mutex);
1042static int ipu_client_id; 1059static int ipu_client_id;
1043 1060
1044static int ipu_add_client_devices(struct ipu_soc *ipu) 1061static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
1045{ 1062{
1046 struct device *dev = ipu->dev; 1063 struct device *dev = ipu->dev;
1047 unsigned i; 1064 unsigned i;
@@ -1055,9 +1072,19 @@ static int ipu_add_client_devices(struct ipu_soc *ipu)
1055 for (i = 0; i < ARRAY_SIZE(client_reg); i++) { 1072 for (i = 0; i < ARRAY_SIZE(client_reg); i++) {
1056 const struct ipu_platform_reg *reg = &client_reg[i]; 1073 const struct ipu_platform_reg *reg = &client_reg[i];
1057 struct platform_device *pdev; 1074 struct platform_device *pdev;
1058 1075 struct resource res;
1059 pdev = platform_device_register_data(dev, reg->name, 1076
1060 id++, &reg->pdata, sizeof(reg->pdata)); 1077 if (reg->reg_offset) {
1078 memset(&res, 0, sizeof(res));
1079 res.flags = IORESOURCE_MEM;
1080 res.start = ipu_base + ipu->devtype->cm_ofs + reg->reg_offset;
1081 res.end = res.start + PAGE_SIZE - 1;
1082 pdev = platform_device_register_resndata(dev, reg->name,
1083 id++, &res, 1, &reg->pdata, sizeof(reg->pdata));
1084 } else {
1085 pdev = platform_device_register_data(dev, reg->name,
1086 id++, &reg->pdata, sizeof(reg->pdata));
1087 }
1061 1088
1062 if (IS_ERR(pdev)) 1089 if (IS_ERR(pdev))
1063 goto err_register; 1090 goto err_register;
@@ -1253,7 +1280,7 @@ static int ipu_probe(struct platform_device *pdev)
1253 if (ret) 1280 if (ret)
1254 goto failed_submodules_init; 1281 goto failed_submodules_init;
1255 1282
1256 ret = ipu_add_client_devices(ipu); 1283 ret = ipu_add_client_devices(ipu, ipu_base);
1257 if (ret) { 1284 if (ret) {
1258 dev_err(&pdev->dev, "adding client devices failed with %d\n", 1285 dev_err(&pdev->dev, "adding client devices failed with %d\n",
1259 ret); 1286 ret);
diff --git a/include/video/imx-ipu-v3.h b/include/video/imx-ipu-v3.h
index fe6053e6ae6d..61d6d25caf95 100644
--- a/include/video/imx-ipu-v3.h
+++ b/include/video/imx-ipu-v3.h
@@ -331,6 +331,7 @@ static inline void ipu_cpmem_set_burstsize(struct ipu_ch_param __iomem *p,
331}; 331};
332 332
333struct ipu_client_platformdata { 333struct ipu_client_platformdata {
334 int csi;
334 int di; 335 int di;
335 int dc; 336 int dc;
336 int dp; 337 int dp;