summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2014-02-21 19:36:18 +0100
committerSylwester Nawrocki <s.nawrocki@samsung.com>2014-11-27 03:37:00 -0800
commite53c708f791c5234b0ab666661480db3bbb2bae1 (patch)
treed1a7a391bcb70140cac40fedd7db550d3c72f049 /drivers
parentc28f5dd0b9b73130a4c93f33a7d1fd6296b2d8be (diff)
downloadlinux-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/Kconfig17
-rw-r--r--drivers/media/platform/exynos5-is/Makefile13
-rw-r--r--drivers/media/platform/exynos5-is/exynos5-mdev.c217
-rw-r--r--drivers/media/platform/exynos5-is/exynos5-mdev.h8
-rw-r--r--drivers/media/platform/exynos5-is/fimc-is-core.c68
-rw-r--r--drivers/media/platform/exynos5-is/fimc-is-core.h9
-rw-r--r--drivers/media/platform/exynos5-is/fimc-is.h3
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;