Newer Exynos4 SoC are equipped with a local camera ISP that
controls external raw image sensor directly. Such sensors
can be connected through FIMC-LITEn (and MIPI-CSISn) IPs to
the ISP, which then feeds image data to the FIMCn IP. Thus
there can be two busses associated with an image source
(sensor). Rename struct s5p_fimc_isp_info describing external
image sensor (video decoder) to struct fimc_source_info to
avoid confusion. bus_type is split into fimc_bus_type and
sensor_bus_type. The bus type enumeration is extended to
include both FIMC Writeback input types.

The bus_type enumeration and the data structure name in the
board files are modified according to the above changes.

Cc: Kukjin Kim <[email protected]>
Cc: [email protected]
Signed-off-by: Sylwester Nawrocki <[email protected]>
Signed-off-by: Kyungmin Park <[email protected]>
---
 arch/arm/mach-exynos/mach-nuri.c                |    8 ++--
 arch/arm/mach-exynos/mach-universal_c210.c      |    8 ++--
 arch/arm/mach-s5pv210/mach-goni.c               |    6 +--
 drivers/media/platform/s5p-fimc/fimc-lite-reg.c |    8 ++--
 drivers/media/platform/s5p-fimc/fimc-lite-reg.h |    4 +-
 drivers/media/platform/s5p-fimc/fimc-mdevice.c  |   16 ++++----
 drivers/media/platform/s5p-fimc/fimc-mdevice.h  |    2 +-
 drivers/media/platform/s5p-fimc/fimc-reg.c      |   34 +++++++++-------
 drivers/media/platform/s5p-fimc/fimc-reg.h      |    6 +--
 include/media/s5p_fimc.h                        |   49 ++++++++++++++---------
 10 files changed, 79 insertions(+), 62 deletions(-)

diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c
index 27d4ed8..7c2600e 100644
--- a/arch/arm/mach-exynos/mach-nuri.c
+++ b/arch/arm/mach-exynos/mach-nuri.c
@@ -1209,25 +1209,25 @@ static struct i2c_board_info m5mols_board_info = {
        .platform_data  = &m5mols_platdata,
 };

-static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
+static struct fimc_source_info nuri_camera_sensors[] = {
        {
                .flags          = V4L2_MBUS_PCLK_SAMPLE_RISING |
                                  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-               .bus_type       = FIMC_ITU_601,
+               .fimc_bus_type  = FIMC_BUS_TYPE_ITU_601,
                .board_info     = &s5k6aa_board_info,
                .clk_frequency  = 24000000UL,
                .i2c_bus_num    = 6,
        }, {
                .flags          = V4L2_MBUS_PCLK_SAMPLE_FALLING |
                                  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-               .bus_type       = FIMC_MIPI_CSI2,
+               .fimc_bus_type  = FIMC_BUS_TYPE_MIPI_CSI2,
                .board_info     = &m5mols_board_info,
                .clk_frequency  = 24000000UL,
        },
 };

 static struct s5p_platform_fimc fimc_md_platdata = {
-       .isp_info       = nuri_camera_sensors,
+       .source_info    = nuri_camera_sensors,
        .num_clients    = ARRAY_SIZE(nuri_camera_sensors),
 };

diff --git a/arch/arm/mach-exynos/mach-universal_c210.c 
b/arch/arm/mach-exynos/mach-universal_c210.c
index 9e3340f..c09290a 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -988,12 +988,12 @@ static struct i2c_board_info m5mols_board_info = {
        .platform_data = &m5mols_platdata,
 };

-static struct s5p_fimc_isp_info universal_camera_sensors[] = {
+static struct fimc_source_info universal_camera_sensors[] = {
        {
                .mux_id         = 0,
                .flags          = V4L2_MBUS_PCLK_SAMPLE_FALLING |
                                  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-               .bus_type       = FIMC_ITU_601,
+               .fimc_bus_type  = FIMC_BUS_TYPE_ITU_601,
                .board_info     = &s5k6aa_board_info,
                .i2c_bus_num    = 0,
                .clk_frequency  = 24000000UL,
@@ -1001,7 +1001,7 @@ static struct s5p_fimc_isp_info 
universal_camera_sensors[] = {
                .mux_id         = 0,
                .flags          = V4L2_MBUS_PCLK_SAMPLE_FALLING |
                                  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-               .bus_type       = FIMC_MIPI_CSI2,
+               .fimc_bus_type  = FIMC_BUS_TYPE_MIPI_CSI2,
                .board_info     = &m5mols_board_info,
                .i2c_bus_num    = 0,
                .clk_frequency  = 24000000UL,
@@ -1009,7 +1009,7 @@ static struct s5p_fimc_isp_info 
universal_camera_sensors[] = {
 };

 static struct s5p_platform_fimc fimc_md_platdata = {
-       .isp_info       = universal_camera_sensors,
+       .source_info    = universal_camera_sensors,
        .num_clients    = ARRAY_SIZE(universal_camera_sensors),
 };

diff --git a/arch/arm/mach-s5pv210/mach-goni.c 
b/arch/arm/mach-s5pv210/mach-goni.c
index c72b310..423f6b6 100644
--- a/arch/arm/mach-s5pv210/mach-goni.c
+++ b/arch/arm/mach-s5pv210/mach-goni.c
@@ -841,12 +841,12 @@ static struct i2c_board_info noon010pc30_board_info = {
        .platform_data = &noon010pc30_pldata,
 };

-static struct s5p_fimc_isp_info goni_camera_sensors[] = {
+static struct fimc_source_info goni_camera_sensors[] = {
        {
                .mux_id         = 0,
                .flags          = V4L2_MBUS_PCLK_SAMPLE_FALLING |
                                  V4L2_MBUS_VSYNC_ACTIVE_LOW,
-               .bus_type       = FIMC_ITU_601,
+               .bus_type       = FIMC_BUS_TYPE_ITU_601,
                .board_info     = &noon010pc30_board_info,
                .i2c_bus_num    = 0,
                .clk_frequency  = 16000000UL,
@@ -854,7 +854,7 @@ static struct s5p_fimc_isp_info goni_camera_sensors[] = {
 };

 static struct s5p_platform_fimc goni_fimc_md_platdata __initdata = {
-       .isp_info       = goni_camera_sensors,
+       .source_info    = goni_camera_sensors,
        .num_clients    = ARRAY_SIZE(goni_camera_sensors),
 };

diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c 
b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
index 962652d..f0af075 100644
--- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
+++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c
@@ -187,12 +187,12 @@ static void flite_hw_set_camera_port(struct fimc_lite 
*dev, int id)

 /* Select serial or parallel bus, camera port (A,B) and set signals polarity */
 void flite_hw_set_camera_bus(struct fimc_lite *dev,
-                            struct s5p_fimc_isp_info *s_info)
+                            struct fimc_source_info *si)
 {
        u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
-       unsigned int flags = s_info->flags;
+       unsigned int flags = si->flags;

-       if (s_info->bus_type != FIMC_MIPI_CSI2) {
+       if (si->sensor_bus_type != FIMC_BUS_TYPE_MIPI_CSI2) {
                cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI |
                         FLITE_REG_CIGCTRL_INVPOLPCLK |
                         FLITE_REG_CIGCTRL_INVPOLVSYNC |
@@ -212,7 +212,7 @@ void flite_hw_set_camera_bus(struct fimc_lite *dev,

        writel(cfg, dev->regs + FLITE_REG_CIGCTRL);

-       flite_hw_set_camera_port(dev, s_info->mux_id);
+       flite_hw_set_camera_port(dev, si->mux_id);
 }

 static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame 
*f)
diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h 
b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
index adb9e9e..0e34584 100644
--- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
+++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h
@@ -131,9 +131,9 @@ void flite_hw_set_interrupt_mask(struct fimc_lite *dev);
 void flite_hw_capture_start(struct fimc_lite *dev);
 void flite_hw_capture_stop(struct fimc_lite *dev);
 void flite_hw_set_camera_bus(struct fimc_lite *dev,
-                            struct s5p_fimc_isp_info *s_info);
+                            struct fimc_source_info *s_info);
 void flite_hw_set_camera_polarity(struct fimc_lite *dev,
-                                 struct s5p_fimc_isp_info *cam);
+                                 struct fimc_source_info *cam);
 void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f);
 void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f);

diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c 
b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
index d940454..f49f6f1 100644
--- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c
+++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c
@@ -290,7 +290,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md 
*fmd)
        for (i = 0; i < num_clients; i++) {
                struct v4l2_subdev *sd;

-               fmd->sensor[i].pdata = pdata->isp_info[i];
+               fmd->sensor[i].pdata = pdata->source_info[i];
                ret = __fimc_md_set_camclk(fmd, &fmd->sensor[i], true);
                if (ret)
                        break;
@@ -504,7 +504,7 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md 
*fmd,
                                            struct v4l2_subdev *sensor,
                                            int pad, int link_mask)
 {
-       struct fimc_sensor_info *s_info;
+       struct fimc_sensor_info *s_info = NULL;
        struct media_entity *sink;
        unsigned int flags = 0;
        int ret, i;
@@ -614,7 +614,7 @@ static int fimc_md_create_links(struct fimc_md *fmd)
 {
        struct v4l2_subdev *csi_sensors[CSIS_MAX_ENTITIES] = { NULL };
        struct v4l2_subdev *sensor, *csis;
-       struct s5p_fimc_isp_info *pdata;
+       struct fimc_source_info *pdata;
        struct fimc_sensor_info *s_info;
        struct media_entity *source, *sink;
        int i, pad, fimc_id = 0, ret = 0;
@@ -632,8 +632,8 @@ static int fimc_md_create_links(struct fimc_md *fmd)
                source = NULL;
                pdata = &s_info->pdata;

-               switch (pdata->bus_type) {
-               case FIMC_MIPI_CSI2:
+               switch (pdata->sensor_bus_type) {
+               case FIMC_BUS_TYPE_MIPI_CSI2:
                        if (WARN(pdata->mux_id >= CSIS_MAX_ENTITIES,
                                "Wrong CSI channel id: %d\n", pdata->mux_id))
                                return -EINVAL;
@@ -659,14 +659,14 @@ static int fimc_md_create_links(struct fimc_md *fmd)
                        csi_sensors[pdata->mux_id] = sensor;
                        break;

-               case FIMC_ITU_601...FIMC_ITU_656:
+               case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656:
                        source = &sensor->entity;
                        pad = 0;
                        break;

                default:
                        v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n",
-                                pdata->bus_type);
+                                pdata->sensor_bus_type);
                        return -EINVAL;
                }
                if (source == NULL)
@@ -762,7 +762,7 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd,
                                struct fimc_sensor_info *s_info,
                                bool on)
 {
-       struct s5p_fimc_isp_info *pdata = &s_info->pdata;
+       struct fimc_source_info *pdata = &s_info->pdata;
        struct fimc_camclk_info *camclk;
        int ret = 0;

diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.h 
b/drivers/media/platform/s5p-fimc/fimc-mdevice.h
index da7d992..06b0d82 100644
--- a/drivers/media/platform/s5p-fimc/fimc-mdevice.h
+++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.h
@@ -53,7 +53,7 @@ struct fimc_camclk_info {
  * This data structure applies to image sensor and the writeback subdevs.
  */
 struct fimc_sensor_info {
-       struct s5p_fimc_isp_info pdata;
+       struct fimc_source_info pdata;
        struct v4l2_subdev *subdev;
        struct fimc_dev *host;
 };
diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.c 
b/drivers/media/platform/s5p-fimc/fimc-reg.c
index c05d044..50b97c7 100644
--- a/drivers/media/platform/s5p-fimc/fimc-reg.c
+++ b/drivers/media/platform/s5p-fimc/fimc-reg.c
@@ -554,7 +554,7 @@ void fimc_hw_set_output_addr(struct fimc_dev *dev,
 }

 int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
-                               struct s5p_fimc_isp_info *cam)
+                               struct fimc_source_info *cam)
 {
        u32 cfg = readl(fimc->regs + FIMC_REG_CIGCTRL);

@@ -596,14 +596,15 @@ static const struct mbus_pixfmt_desc pix_desc[] = {
 };

 int fimc_hw_set_camera_source(struct fimc_dev *fimc,
-                             struct s5p_fimc_isp_info *cam)
+                             struct fimc_source_info *source)
 {
        struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame;
-       u32 cfg = 0;
-       u32 bus_width;
+       u32 bus_width, cfg = 0;
        int i;

-       if (cam->bus_type == FIMC_ITU_601 || cam->bus_type == FIMC_ITU_656) {
+       switch (source->fimc_bus_type) {
+       case FIMC_BUS_TYPE_ITU_601:
+       case FIMC_BUS_TYPE_ITU_656:
                for (i = 0; i < ARRAY_SIZE(pix_desc); i++) {
                        if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) {
                                cfg = pix_desc[i].cisrcfmt;
@@ -619,15 +620,17 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc,
                        return -EINVAL;
                }

-               if (cam->bus_type == FIMC_ITU_601) {
+               if (source->fimc_bus_type == FIMC_BUS_TYPE_ITU_601) {
                        if (bus_width == 8)
                                cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT;
                        else if (bus_width == 16)
                                cfg |= FIMC_REG_CISRCFMT_ITU601_16BIT;
                } /* else defaults to ITU-R BT.656 8-bit */
-       } else if (cam->bus_type == FIMC_MIPI_CSI2) {
+               break;
+       case FIMC_BUS_TYPE_MIPI_CSI2:
                if (fimc_fmt_is_user_defined(f->fmt->color))
                        cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT;
+               break;
        }

        cfg |= (f->o_width << 16) | f->o_height;
@@ -655,7 +658,7 @@ void fimc_hw_set_camera_offset(struct fimc_dev *fimc, 
struct fimc_frame *f)
 }

 int fimc_hw_set_camera_type(struct fimc_dev *fimc,
-                           struct s5p_fimc_isp_info *cam)
+                           struct fimc_source_info *source)
 {
        u32 cfg, tmp;
        struct fimc_vid_cap *vid_cap = &fimc->vid_cap;
@@ -668,11 +671,11 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
                FIMC_REG_CIGCTRL_SELCAM_MIPI | FIMC_REG_CIGCTRL_CAMIF_SELWB |
                FIMC_REG_CIGCTRL_SELCAM_MIPI_A | FIMC_REG_CIGCTRL_CAM_JPEG);

-       switch (cam->bus_type) {
-       case FIMC_MIPI_CSI2:
+       switch (source->fimc_bus_type) {
+       case FIMC_BUS_TYPE_MIPI_CSI2:
                cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI;

-               if (cam->mux_id == 0)
+               if (source->mux_id == 0)
                        cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI_A;

                /* TODO: add remaining supported formats. */
@@ -695,15 +698,16 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,

                writel(tmp, fimc->regs + FIMC_REG_CSIIMGFMT);
                break;
-       case FIMC_ITU_601...FIMC_ITU_656:
-               if (cam->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */
+       case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656:
+               if (source->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */
                        cfg |= FIMC_REG_CIGCTRL_SELCAM_ITU_A;
                break;
-       case FIMC_LCD_WB:
+       case FIMC_BUS_TYPE_LCD_WRITEBACK_A:
                cfg |= FIMC_REG_CIGCTRL_CAMIF_SELWB;
                break;
        default:
-               v4l2_err(&vid_cap->vfd, "Invalid camera bus type selected\n");
+               v4l2_err(&vid_cap->vfd, "Invalid FIMC bus type selected: %d\n",
+                        source->fimc_bus_type);
                return -EINVAL;
        }
        writel(cfg, fimc->regs + FIMC_REG_CIGCTRL);
diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.h 
b/drivers/media/platform/s5p-fimc/fimc-reg.h
index f3e0b78..1a40df6 100644
--- a/drivers/media/platform/s5p-fimc/fimc-reg.h
+++ b/drivers/media/platform/s5p-fimc/fimc-reg.h
@@ -297,12 +297,12 @@ void fimc_hw_set_input_addr(struct fimc_dev *fimc, struct 
fimc_addr *paddr);
 void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr,
                             int index);
 int fimc_hw_set_camera_source(struct fimc_dev *fimc,
-                             struct s5p_fimc_isp_info *cam);
+                             struct fimc_source_info *cam);
 void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f);
 int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
-                               struct s5p_fimc_isp_info *cam);
+                               struct fimc_source_info *cam);
 int fimc_hw_set_camera_type(struct fimc_dev *fimc,
-                           struct s5p_fimc_isp_info *cam);
+                           struct fimc_source_info *cam);
 void fimc_hw_clear_irq(struct fimc_dev *dev);
 void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on);
 void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on);
diff --git a/include/media/s5p_fimc.h b/include/media/s5p_fimc.h
index eaea62a..28f3590 100644
--- a/include/media/s5p_fimc.h
+++ b/include/media/s5p_fimc.h
@@ -1,8 +1,8 @@
 /*
- * Samsung S5P SoC camera interface driver header
+ * Samsung S5P/Exynos4 SoC series camera interface driver header
  *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd
- * Author: Sylwester Nawrocki, <[email protected]>
+ * Copyright (C) 2010 - 2013 Samsung Electronics Co., Ltd.
+ * Sylwester Nawrocki <[email protected]>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -14,45 +14,58 @@

 #include <media/media-entity.h>

-enum cam_bus_type {
-       FIMC_ITU_601 = 1,
-       FIMC_ITU_656,
-       FIMC_MIPI_CSI2,
-       FIMC_LCD_WB, /* FIFO link from LCD mixer */
+/*
+ * Enumeration of the FIMC data bus types.
+ */
+enum fimc_bus_type {
+       /* Camera parallel bus */
+       FIMC_BUS_TYPE_ITU_601 = 1,
+       /* Camera parallel bus with embedded synchronization */
+       FIMC_BUS_TYPE_ITU_656,
+       /* Camera MIPI-CSI2 serial bus */
+       FIMC_BUS_TYPE_MIPI_CSI2,
+       /* FIFO link from LCD controller (WriteBack A) */
+       FIMC_BUS_TYPE_LCD_WRITEBACK_A,
+       /* FIFO link from LCD controller (WriteBack B) */
+       FIMC_BUS_TYPE_LCD_WRITEBACK_B,
+       /* FIFO link from FIMC-IS */
+       FIMC_BUS_TYPE_ISP_WRITEBACK = FIMC_BUS_TYPE_LCD_WRITEBACK_B,
 };

 struct i2c_board_info;

 /**
- * struct s5p_fimc_isp_info - image sensor information required for host
- *                           interace configuration.
+ * struct fimc_source_info - video source description required for the host
+ *                          interface configuration
  *
  * @board_info: pointer to I2C subdevice's board info
  * @clk_frequency: frequency of the clock the host interface provides to sensor
- * @bus_type: determines bus type, MIPI, ITU-R BT.601 etc.
+ * @fimc_bus_type: FIMC camera input type
+ * @sensor_bus_type: image sensor bus type, MIPI, ITU-R BT.601 etc.
+ * @flags: the parallel sensor bus flags defining signals polarity 
(V4L2_MBUS_*)
  * @i2c_bus_num: i2c control bus id the sensor is attached to
  * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU)
  * @clk_id: index of the SoC peripheral clock for sensors
- * @flags: the parallel bus flags defining signals polarity (V4L2_MBUS_*)
  */
-struct s5p_fimc_isp_info {
+struct fimc_source_info {
        struct i2c_board_info *board_info;
        unsigned long clk_frequency;
-       enum cam_bus_type bus_type;
+       enum fimc_bus_type fimc_bus_type;
+       enum fimc_bus_type sensor_bus_type;
+       u16 flags;
        u16 i2c_bus_num;
        u16 mux_id;
-       u16 flags;
        u8 clk_id;
 };

 /**
  * struct s5p_platform_fimc - camera host interface platform data
  *
- * @isp_info: properties of camera sensor required for host interface setup
- * @num_clients: the number of attached image sensors
+ * @source_info: properties of an image source for the host interface setup
+ * @num_clients: the number of attached image sources
  */
 struct s5p_platform_fimc {
-       struct s5p_fimc_isp_info *isp_info;
+       struct fimc_source_info *source_info;
        int num_clients;
 };

--
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to