diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2014-02-21 19:36:18 +0100 |
---|---|---|
committer | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2014-11-27 03:37:00 -0800 |
commit | e53c708f791c5234b0ab666661480db3bbb2bae1 (patch) | |
tree | d1a7a391bcb70140cac40fedd7db550d3c72f049 /drivers | |
parent | c28f5dd0b9b73130a4c93f33a7d1fd6296b2d8be (diff) | |
download | linux-3.10-e53c708f791c5234b0ab666661480db3bbb2bae1.tar.gz linux-3.10-e53c708f791c5234b0ab666661480db3bbb2bae1.tar.bz2 linux-3.10-e53c708f791c5234b0ab666661480db3bbb2bae1.zip |
exynos5-is: Allow initialization when fimc-is is a master node
Change platform sub-devices registration method so the driver
can support exynos3250 DT binding, i.e. initialize when fimc-is
is the complex root node, not "camera".
This also merges exynos5-fimc-is and exynos-mdevice into single
kernel module called exynos-iss.ko.
Change-Id: Ie340fd7a3e1f7b5dba2c71963c920f324fab4e5a
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/platform/exynos5-is/Kconfig | 17 | ||||
-rw-r--r-- | drivers/media/platform/exynos5-is/Makefile | 13 | ||||
-rw-r--r-- | drivers/media/platform/exynos5-is/exynos5-mdev.c | 217 | ||||
-rw-r--r-- | drivers/media/platform/exynos5-is/exynos5-mdev.h | 8 | ||||
-rw-r--r-- | drivers/media/platform/exynos5-is/fimc-is-core.c | 68 | ||||
-rw-r--r-- | drivers/media/platform/exynos5-is/fimc-is-core.h | 9 | ||||
-rw-r--r-- | drivers/media/platform/exynos5-is/fimc-is.h | 3 |
7 files changed, 222 insertions, 113 deletions
diff --git a/drivers/media/platform/exynos5-is/Kconfig b/drivers/media/platform/exynos5-is/Kconfig index ca46b588634..0c01e15d97f 100644 --- a/drivers/media/platform/exynos5-is/Kconfig +++ b/drivers/media/platform/exynos5-is/Kconfig @@ -1,20 +1,23 @@ config VIDEO_SAMSUNG_EXYNOS5_CAMERA bool "Samsung Exynos5 SoC series Camera Subsystem driver" - depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API && PM_RUNTIME + depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API depends on VIDEO_SAMSUNG_EXYNOS4_IS help - This is a V4L2 media device driver for Exynos5 SoC series - camera subsystem. + This is a V4L2 driver for Exynos5xxx, Exynos3250 SoC series camera + subsystem. + + To compile this driver as a module, choose M here: the + module will be called exynos-iss. if VIDEO_SAMSUNG_EXYNOS5_CAMERA config VIDEO_SAMSUNG_EXYNOS5_FIMC_IS - tristate "Samsung Exynos5 SoC FIMC-IS driver" + bool "Samsung Exynos5/Exynos3250 SoC Imaging Subsystem (FIMC-IS) driver" depends on I2C && OF depends on VIDEO_EXYNOS4_FIMC_IS select VIDEOBUF2_DMA_CONTIG help - This is a V4L2 driver for Samsung Exynos5 SoC series Imaging - Subsystem known as FIMC-IS. + This is a V4L2 driver for Samsung Exynos5xxx, Exynos3250 SoC series + Imaging Subsystem (FIMC-IS). -endif #VIDEO_SAMSUNG_EXYNOS5_MDEV +endif #VIDEO_SAMSUNG_EXYNOS5_CAMERA diff --git a/drivers/media/platform/exynos5-is/Makefile b/drivers/media/platform/exynos5-is/Makefile index 6cdb0374f54..d928569ac75 100644 --- a/drivers/media/platform/exynos5-is/Makefile +++ b/drivers/media/platform/exynos5-is/Makefile @@ -1,7 +1,10 @@ ccflags-y += -Idrivers/media/platform/exynos4-is -exynos5-fimc-is-objs := fimc-is-core.o fimc-is-isp.o fimc-is-scaler.o -exynos5-fimc-is-objs += fimc-is-pipeline.o fimc-is-interface.o fimc-is-sensor.o -exynos-mdevice-objs := exynos5-mdev.o -obj-$(CONFIG_VIDEO_SAMSUNG_EXYNOS5_FIMC_IS) += exynos5-fimc-is.o -obj-$(CONFIG_VIDEO_SAMSUNG_EXYNOS5_CAMERA) += exynos-mdevice.o +exynos-iss-objs := exynos5-mdev.o + +ifeq ($(CONFIG_VIDEO_SAMSUNG_EXYNOS5_FIMC_IS),y) +exynos-iss-objs += fimc-is-core.o fimc-is-isp.o fimc-is-scaler.o +exynos-iss-objs += fimc-is-pipeline.o fimc-is-interface.o fimc-is-sensor.o +endif + +obj-$(CONFIG_VIDEO_SAMSUNG_EXYNOS5_CAMERA) += exynos-iss.o diff --git a/drivers/media/platform/exynos5-is/exynos5-mdev.c b/drivers/media/platform/exynos5-is/exynos5-mdev.c index 94961602df5..33f20a0e761 100644 --- a/drivers/media/platform/exynos5-is/exynos5-mdev.c +++ b/drivers/media/platform/exynos5-is/exynos5-mdev.c @@ -408,24 +408,24 @@ static int fimc_md_parse_port_node(struct fimc_md *fmd, static int fimc_md_of_sensors_register(struct fimc_md *fmd, struct device_node *np) { - struct device_node *parent = fmd->pdev->dev.of_node; + struct device_node *parent = fmd->dev->of_node; struct device_node *node, *ports; - int index; + int index, sensor_index = 0; int ret; /* Attach sensors linked to MIPI CSI-2 receivers */ for (index = 0; index < FIMC_NUM_MIPI_CSIS; index++) { struct device_node *port; - node = of_parse_phandle(parent, "samsung,csis", index); - if (!node || !of_device_is_available(node)) + if (fmd->csis[index].of_node == NULL) continue; + /* The csis node can have only port subnode. */ - port = of_get_next_child(node, NULL); + port = of_get_next_child(fmd->csis[index].of_node, NULL); if (!port) continue; - ret = fimc_md_parse_port_node(fmd, port, index); + ret = fimc_md_parse_port_node(fmd, port, sensor_index++); if (ret < 0) return ret; } @@ -506,11 +506,14 @@ static int register_csis_entity(struct fimc_md *fmd, sd->grp_id = GRP_ID_CSIS; ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd); - if (!ret) - fmd->csis[id].sd = sd; - else + if (ret < 0) { v4l2_err(&fmd->v4l2_dev, "Failed to register MIPI-CSIS.%d (%d)\n", id, ret); + return ret; + } + + fmd->csis[id].sd = sd; + fmd->csis[id].of_node = node; return ret; } @@ -614,13 +617,21 @@ static int register_fimc_is_entity(struct fimc_md *fmd, } static int fimc_md_register_platform_entity(struct fimc_md *fmd, - struct platform_device *pdev, + struct device_node *node, int plat_entity) { - struct device *dev = &pdev->dev; + struct platform_device *pdev = NULL; + struct device *dev; int ret = -EPROBE_DEFER; void *drvdata; + if (node) { + pdev = of_find_device_by_node(node); + if (!pdev) + return -ENOENT; + } + dev = &pdev->dev; + /* Lock to ensure dev->driver won't change. */ device_lock(dev); @@ -649,71 +660,97 @@ static int fimc_md_register_platform_entity(struct fimc_md *fmd, dev_unlock: device_unlock(dev); if (ret == -EPROBE_DEFER) - dev_info(&fmd->pdev->dev, "deferring %s device registration\n", + dev_info(fmd->dev, "deferring %s device registration\n", dev_name(dev)); else if (ret < 0) - dev_err(&fmd->pdev->dev, "%s device registration failed (%d)\n", + dev_err(fmd->dev, "%s device registration failed (%d)\n", dev_name(dev), ret); + if (pdev) + put_device(&pdev->dev); + return ret; } -/* Register FIMC-LITE, CSIS and FIMC-IS media entities */ -static int fimc_md_register_of_platform_entities(struct fimc_md *fmd, - struct device_node *camera) +/* Register Exynos3250 FIMC-LITE and CSIS platform sub-devices */ +static int __register_fimc_is_sub_entities(struct fimc_md *fmd) { struct device_node *node; - struct platform_device *pdev; int ret = 0; - int i; - /* Register MIPI-CSIS entities */ - for (i = 0; i < FIMC_NUM_MIPI_CSIS; i++) { + for_each_available_child_of_node(fmd->dev->of_node, node) { + int plat_entity = -1; - node = of_parse_phandle(camera, "samsung,csis", i); - if (!node || !of_device_is_available(node)) - continue; + if (!strcmp(node->name, "csis")) + plat_entity = IDX_CSIS; + else if (!strcmp(node->name, "fimc-lite")) + plat_entity = IDX_FLITE; - pdev = of_find_device_by_node(node); - if (!pdev) + if (plat_entity < 0) continue; - ret = fimc_md_register_platform_entity(fmd, pdev, IDX_CSIS); - put_device(&pdev->dev); + ret = fimc_md_register_platform_entity(fmd, node, + plat_entity); if (ret < 0) break; } - /* Register FIMC-LITE entities */ - for (i = 0; i < FIMC_NUM_FIMC_LITE; i++) { + return ret; +} - node = of_parse_phandle(camera, "samsung,fimc-lite", i); - if (!node || !of_device_is_available(node)) - continue; +/* Register FIMC-LITE, CSIS and FIMC-IS media entities */ +static int fimc_md_register_platform_entities(struct fimc_md *fmd) +{ + struct device_node *master = fmd->dev->of_node; + struct device_node *node; + int ret = 0; + int i; - pdev = of_find_device_by_node(node); - if (!pdev) - continue; + if (of_device_is_compatible(master, "samsung,exynos3250-fimc-is")) { + void *drvdata; - ret = fimc_md_register_platform_entity(fmd, pdev, IDX_FLITE); - put_device(&pdev->dev); + ret = __register_fimc_is_sub_entities(fmd); if (ret < 0) - break; - } + return ret; - /* Register fimc-is entity */ - node = of_parse_phandle(camera, "samsung,fimc-is", 0); - if (!node || !of_device_is_available(node)) - goto exit; + drvdata = dev_get_drvdata(fmd->dev); + if (!drvdata) + return -EINVAL; /* this shouldn't happen */ - pdev = of_find_device_by_node(node); - if (!pdev) - goto exit; + return register_fimc_is_entity(fmd, drvdata); + } else { + /* Register MIPI-CSIS entities */ + for (i = 0; i < FIMC_NUM_MIPI_CSIS; i++) { - ret = fimc_md_register_platform_entity(fmd, pdev, IDX_FIMC_IS); + node = of_parse_phandle(master, "samsung,csis", i); + if (!node || !of_device_is_available(node)) + continue; - put_device(&pdev->dev); -exit: - return ret; + ret = fimc_md_register_platform_entity(fmd, node, + IDX_CSIS); + if (ret < 0) + break; + } + + /* Register FIMC-LITE entities */ + for (i = 0; i < FIMC_NUM_FIMC_LITE; i++) { + + node = of_parse_phandle(master, "samsung,fimc-lite", i); + if (!node || !of_device_is_available(node)) + continue; + + ret = fimc_md_register_platform_entity(fmd, node, + IDX_FLITE); + if (ret < 0) + break; + } + + /* Register fimc-is entity */ + node = of_parse_phandle(master, "samsung,fimc-is", 0); + if (!node || !of_device_is_available(node)) + return 0; + + return fimc_md_register_platform_entity(fmd, node, IDX_FIMC_IS); + } } static void fimc_md_unregister_entities(struct fimc_md *fmd) @@ -1078,9 +1115,8 @@ unlock: return ret; } -static int fimc_md_probe(struct platform_device *pdev) +int exynos_camera_register(struct device *dev, struct fimc_md **md) { - struct device *dev = &pdev->dev; struct v4l2_device *v4l2_dev; struct fimc_md *fmd; int ret; @@ -1090,12 +1126,13 @@ static int fimc_md_probe(struct platform_device *pdev) return -ENOMEM; spin_lock_init(&fmd->slock); - fmd->pdev = pdev; + fmd->dev = dev; INIT_LIST_HEAD(&fmd->pipelines); INIT_LIST_HEAD(&fmd->isp_pipelines); strlcpy(fmd->media_dev.model, "SAMSUNG EXYNOS5 IS", sizeof(fmd->media_dev.model)); + fmd->media_dev.link_notify = fimc_md_link_notify; fmd->media_dev.dev = dev; @@ -1103,7 +1140,7 @@ static int fimc_md_probe(struct platform_device *pdev) v4l2_dev->mdev = &fmd->media_dev; strlcpy(v4l2_dev->name, "exynos5-fimc-md", sizeof(v4l2_dev->name)); - ret = v4l2_device_register(dev, &fmd->v4l2_dev); + ret = v4l2_device_register(dev, v4l2_dev); if (ret < 0) { v4l2_err(v4l2_dev, "Failed to register v4l2_device: %d\n", ret); return ret; @@ -1121,12 +1158,11 @@ static int fimc_md_probe(struct platform_device *pdev) goto err_md; } - platform_set_drvdata(pdev, fmd); /* Protect the media graph while we're registering entities */ mutex_lock(&fmd->media_dev.graph_mutex); - ret = fimc_md_register_of_platform_entities(fmd, dev->of_node); + ret = fimc_md_register_platform_entities(fmd); if (ret) goto err_unlock; @@ -1143,11 +1179,11 @@ static int fimc_md_probe(struct platform_device *pdev) fmd->subdev_notifier.complete = subdev_notifier_complete; fmd->num_sensors = 0; - ret = v4l2_async_notifier_register(&fmd->v4l2_dev, - &fmd->subdev_notifier); + ret = v4l2_async_notifier_register(v4l2_dev, &fmd->subdev_notifier); if (ret) goto err_clk; + *md = fmd; return 0; err_unlock: @@ -1161,9 +1197,10 @@ err_md: return ret; } -static int fimc_md_remove(struct platform_device *pdev) +int exynos_camera_unregister(struct fimc_md *fmd) { - struct fimc_md *fmd = platform_get_drvdata(pdev); + if (!fmd) + return 0; v4l2_async_notifier_unregister(&fmd->subdev_notifier); @@ -1175,36 +1212,70 @@ static int fimc_md_remove(struct platform_device *pdev) return 0; } -static const struct of_device_id fimc_md_of_match[] = { +static int exynos_camera_probe(struct platform_device *pdev) +{ + struct fimc_md *fmd = NULL; + int ret; + + ret = exynos_camera_register(&pdev->dev, &fmd); + if (ret < 0) + return ret; + + platform_set_drvdata(pdev, fmd); + return 0; +} + +static int exynos_camera_remove(struct platform_device *pdev) +{ + struct fimc_md *fmd = platform_get_drvdata(pdev); + + return exynos_camera_unregister(fmd); +} + +static const struct of_device_id exynos_camera_of_match[] = { { .compatible = "samsung,exynos5250-fimc" }, { }, }; MODULE_DEVICE_TABLE(of, fimc_md_of_match); -static struct platform_driver fimc_md_driver = { - .probe = fimc_md_probe, - .remove = fimc_md_remove, +struct platform_driver exynos_camera_driver = { + .probe = exynos_camera_probe, + .remove = exynos_camera_remove, .driver = { - .of_match_table = fimc_md_of_match, - .name = "exynos5-fimc-md", + .of_match_table = exynos_camera_of_match, + .name = "exynos-camera", .owner = THIS_MODULE, } }; -static int __init fimc_md_init(void) +static int __init exynos_camera_init(void) { + int ret; + request_module("s5p-csis"); - return platform_driver_register(&fimc_md_driver); + + ret = fimc_is_init(); + if (ret < 0) + return ret; + + ret = platform_driver_register(&exynos_camera_driver); + + if (ret < 0) + fimc_is_cleanup(); + + return ret; } -static void __exit fimc_md_exit(void) +static void __exit exynos_camera_exit(void) { - platform_driver_unregister(&fimc_md_driver); + platform_driver_unregister(&exynos_camera_driver); + fimc_is_cleanup(); } -module_init(fimc_md_init); -module_exit(fimc_md_exit); +module_init(exynos_camera_init); +module_exit(exynos_camera_exit); +MODULE_AUTHOR("Arun Kumar K <arun.kk@samsung.com>"); MODULE_AUTHOR("Shaik Ameer Basha <shaik.ameer@samsung.com>"); -MODULE_DESCRIPTION("EXYNOS5 camera subsystem media device driver"); +MODULE_DESCRIPTION("Samsung Exynos5/3 SoC series camera subsystem driver"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/platform/exynos5-is/exynos5-mdev.h b/drivers/media/platform/exynos5-is/exynos5-mdev.h index 44e57a2e0a9..79b53509db2 100644 --- a/drivers/media/platform/exynos5-is/exynos5-mdev.h +++ b/drivers/media/platform/exynos5-is/exynos5-mdev.h @@ -57,6 +57,7 @@ struct fimc_pipeline_isp { struct fimc_csis_info { struct v4l2_subdev *sd; + struct device_node *of_node; int id; }; @@ -86,7 +87,7 @@ struct fimc_sensor_info { * @is: fimc-is data structure * @media_dev: top level media device * @v4l2_dev: top level v4l2_device holding up the subdevs - * @pdev: platform device this media device is hooked up into + * @dev: struct device associated with this media device * @slock: spinlock protecting @sensor array * @pipelines: list holding pipeline0 (sensor-mipi-flite) instances * @isp_pipelines: list holding pipeline1 (isp-scc-scp) instances @@ -100,7 +101,7 @@ struct fimc_md { struct fimc_is *is; struct media_device media_dev; struct v4l2_device v4l2_dev; - struct platform_device *pdev; + struct device *dev; struct v4l2_async_notifier subdev_notifier; struct v4l2_async_subdev *async_subdevs[FIMC_MAX_SENSORS]; @@ -123,4 +124,7 @@ static inline struct fimc_md *notifier_to_fimc_md(struct v4l2_async_notifier *n) { return container_of(n, struct fimc_md, subdev_notifier); } + +int exynos_camera_register(struct device *dev, struct fimc_md **md); +int exynos_camera_unregister(struct fimc_md *fmd); #endif diff --git a/drivers/media/platform/exynos5-is/fimc-is-core.c b/drivers/media/platform/exynos5-is/fimc-is-core.c index 0b391f21d6e..5fc077f616f 100644 --- a/drivers/media/platform/exynos5-is/fimc-is-core.c +++ b/drivers/media/platform/exynos5-is/fimc-is-core.c @@ -24,6 +24,7 @@ #include "fimc-is.h" #include "fimc-is-i2c.h" +#include "exynos5-mdev.h" #define CLK_MCU_ISP_DIV0_FREQ (200 * 1000000) #define CLK_MCU_ISP_DIV1_FREQ (100 * 1000000) @@ -173,30 +174,28 @@ static struct fimc_is_drvdata exynos5250_drvdata = { .fw_name = "exynos5_fimc_is_fw.bin", }; -static const struct of_device_id exynos5_fimc_is_match[] = { +static struct fimc_is_drvdata exynos3250_drvdata = { + .num_instances = 1, + .fw_name = "exynos3_fimc_is_fw.bin", + .master_node = 1, +}; + +static const struct of_device_id fimc_is_of_match[] = { { - .compatible = "samsung,exynos5250-fimc-is", - .data = &exynos5250_drvdata, + .compatible = "samsung,exynos5250-fimc-is", + .data = &exynos5250_drvdata, + }, { + .compatible = "samsung,exynos3250-fimc-is", + .data = &exynos3250_drvdata, }, - {}, + {/* sentinel */}, }; -MODULE_DEVICE_TABLE(of, exynos5_fimc_is_match); - -static void *fimc_is_get_drvdata(struct platform_device *pdev) -{ - struct fimc_is_drvdata *driver_data = NULL; - const struct of_device_id *match; - - match = of_match_node(exynos5_fimc_is_match, - pdev->dev.of_node); - if (match) - driver_data = (struct fimc_is_drvdata *)match->data; - return driver_data; -} +MODULE_DEVICE_TABLE(of, fimc_is_of_match); static int fimc_is_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; + const struct of_device_id *match; struct resource *res; struct fimc_is *is; void __iomem *regs; @@ -213,9 +212,12 @@ static int fimc_is_probe(struct platform_device *pdev) if (!is) return -ENOMEM; - is->pdev = pdev; + match = of_match_node(fimc_is_of_match, dev->of_node); + if (WARN_ON(!match)) + return -EINVAL; - is->drvdata = fimc_is_get_drvdata(pdev); + is->drvdata = match->data; + is->pdev = pdev; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); regs = devm_ioremap_resource(dev, res); @@ -226,6 +228,7 @@ static int fimc_is_probe(struct platform_device *pdev) node = of_parse_phandle(dev->of_node, "samsung,pmu", 0); if (!node) return -ENODEV; + is->pmu_regs = of_iomap(node, 0); if (!is->pmu_regs) return -ENOMEM; @@ -273,10 +276,17 @@ static int fimc_is_probe(struct platform_device *pdev) if (ret < 0) goto err_sd; + if (is->drvdata->master_node) { + ret = exynos_camera_register(dev, &is->md); + if (ret < 0) + goto err_cam; + } + dev_dbg(dev, "FIMC-IS registered successfully\n"); return 0; - +err_cam: + exynos_camera_unregister(is->md); err_sd: fimc_is_pipelines_destroy(is); err_vb: @@ -356,11 +366,14 @@ static int fimc_is_remove(struct platform_device *pdev) struct fimc_is *is = platform_get_drvdata(pdev); struct device *dev = &pdev->dev; + exynos_camera_unregister(is->md); + pm_runtime_disable(dev); pm_runtime_set_suspended(dev); fimc_is_pipelines_destroy(is); vb2_dma_contig_cleanup_ctx(is->alloc_ctx); fimc_is_put_clocks(is); + return 0; } @@ -377,11 +390,16 @@ static struct platform_driver fimc_is_driver = { .name = FIMC_IS_DRV_NAME, .owner = THIS_MODULE, .pm = &fimc_is_pm_ops, - .of_match_table = exynos5_fimc_is_match, + .of_match_table = fimc_is_of_match, } }; -module_platform_driver(fimc_is_driver); -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Arun Kumar K <arun.kk@samsung.com>"); -MODULE_DESCRIPTION("Samsung Exynos5 (FIMC-IS) Imaging Subsystem driver"); +int __init fimc_is_init(void) +{ + return platform_driver_register(&fimc_is_driver); +} + +void __exit fimc_is_cleanup(void) +{ + platform_driver_unregister(&fimc_is_driver); +} diff --git a/drivers/media/platform/exynos5-is/fimc-is-core.h b/drivers/media/platform/exynos5-is/fimc-is-core.h index ef80ed9d7ce..aba1e81a2c2 100644 --- a/drivers/media/platform/exynos5-is/fimc-is-core.h +++ b/drivers/media/platform/exynos5-is/fimc-is-core.h @@ -98,6 +98,7 @@ struct fimc_is_meminfo { struct fimc_is_drvdata { unsigned int num_instances; char *fw_name; + unsigned int master_node:1; }; /** @@ -114,4 +115,12 @@ struct fimc_is_fmt { unsigned int num_planes; }; +#ifdef CONFIG_VIDEO_SAMSUNG_EXYNOS5_FIMC_IS +int fimc_is_init(void); +void fimc_is_cleanup(void); +#else +int fimc_is_init(void) { return 0; } +void fimc_is_cleanup(void) { }; +#endif + #endif diff --git a/drivers/media/platform/exynos5-is/fimc-is.h b/drivers/media/platform/exynos5-is/fimc-is.h index 136f367e9d8..980c349ed64 100644 --- a/drivers/media/platform/exynos5-is/fimc-is.h +++ b/drivers/media/platform/exynos5-is/fimc-is.h @@ -59,6 +59,7 @@ */ struct fimc_is { struct platform_device *pdev; + struct fimc_md *md; struct vb2_alloc_ctx *alloc_ctx; struct clk *clock[IS_CLK_MAX_NUM]; @@ -67,7 +68,7 @@ struct fimc_is { struct fimc_is_meminfo minfo; - struct fimc_is_drvdata *drvdata; + const struct fimc_is_drvdata *drvdata; struct fimc_is_sensor sensor[FIMC_IS_NUM_SENSORS]; struct fimc_is_pipeline pipeline[FIMC_IS_NUM_PIPELINES]; struct fimc_is_interface interface; |