fimc-is: Read fimc-lite and csis regs and irqs from dt
authorMarek Szyprowski <m.szyprowski@samsung.com>
Fri, 7 Aug 2015 08:36:35 +0000 (10:36 +0200)
committerJunghoon Kim <jhoon20.kim@samsung.com>
Thu, 14 Feb 2019 05:57:01 +0000 (14:57 +0900)
Change-Id: I94a94d3e85c640cdec3f20289e97cb450e359252
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
drivers/media/platform/exynos/fimc-is/fimc-is-core.c
drivers/media/platform/exynos/fimc-is/fimc-is-core.h
drivers/media/platform/exynos/fimc-is/fimc-is-device-csi.c
drivers/media/platform/exynos/fimc-is/fimc-is-device-flite.c
drivers/media/platform/exynos/fimc-is/fimc-is-dt.c
drivers/media/platform/exynos/fimc-is/fimc-is-dt.h
drivers/media/platform/exynos/fimc-is/fimc-is-regs.h

index ac8daa4..2d6fbdc 100644 (file)
@@ -852,6 +852,8 @@ static int fimc_is_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
+       fimc_is_parse_children_dt(&pdev->dev, core);
+
        fimc_is_dev = &pdev->dev;
        ret = dev_set_drvdata(fimc_is_dev, core);
        if (ret) {
index 3130545..7d28be6 100644 (file)
@@ -233,6 +233,9 @@ struct fimc_is_core {
        /* depended on isp */
        struct exynos_platform_fimc_is          *pdata;
 
+       struct device_node                      *lite_np[FIMC_IS_MAX_NODES];
+       struct device_node                      *csis_np[FIMC_IS_MAX_NODES];
+
        struct fimc_is_resourcemgr              resourcemgr;
        struct fimc_is_groupmgr                 groupmgr;
 
index 2084c56..83cc2f1 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/delay.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
+#include <linux/of_address.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 
@@ -26,7 +27,7 @@
 #include "fimc-is-hw.h"
 #include "fimc-is-device-csi.h"
 #include "fimc-is-device-sensor.h"
-
+#include "fimc-is-core.h"
 extern void s5pcsis_enable_interrupts(unsigned long __iomem *base_reg, struct fimc_is_image *image, bool on);
 extern void s5pcsis_set_hsync_settle(unsigned long __iomem *base_reg, int settle);
 extern void s5pcsis_set_params(unsigned long __iomem *base_reg, struct fimc_is_image *image, u32 lanes);
@@ -342,7 +343,11 @@ int fimc_is_csi_probe(void *parent, u32 instance)
        struct v4l2_subdev *subdev_csi;
        struct fimc_is_device_csi *csi;
        struct fimc_is_device_sensor *device = parent;
+       struct fimc_is_core *core;
+
+       core = dev_get_drvdata(fimc_is_dev);
 
+       BUG_ON(!core);
        BUG_ON(!device);
 
        subdev_csi = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
@@ -361,43 +366,10 @@ int fimc_is_csi_probe(void *parent, u32 instance)
        }
 
        csi->instance = instance;
-       switch(instance) {
-       case CSI_ID_A:
-               csi->base_reg = (unsigned long *)MIPICSI0_REG_BASE;
-#ifdef DBG_CSIISR
-               ret = request_irq(IRQ_MIPICSI0,
-                       fimc_is_csi_isr,
-                       IRQF_SHARED,
-                       "mipi-csi0",
-                       csi);
-               if (ret) {
-                       err("request_irq(IRQ_MIPICSI0) is fail(%d)", ret);
-                       goto p_err_free2;
-               }
-#endif
-               break;
-       case CSI_ID_B:
-               csi->base_reg = (unsigned long *)MIPICSI1_REG_BASE;
-#ifdef DBG_CSIISR
-               ret = request_irq(IRQ_MIPICSI1,
-                       fimc_is_csi_isr,
-                       IRQF_SHARED,
-                       "mipi-csi1",
-                       csi);
-               if (ret) {
-                       err("request_irq(IRQ_MIPICSI1) is fail(%d)", ret);
-                       goto p_err_free2;
-               }
-#endif
-               break;
-       case CSI_ID_C:
-               csi->base_reg = (unsigned long *)MIPICSI2_REG_BASE;
-               break;
-       default:
-               err("instance is invalid(%d)", instance);
-               ret = -EINVAL;
+
+       csi->base_reg = of_iomap(core->csis_np[instance], 0);
+       if (!csi->base_reg)
                goto p_err_free2;
-       }
 
        v4l2_subdev_init(subdev_csi, &subdev_ops);
        v4l2_set_subdevdata(subdev_csi, csi);
index 25cbe16..6611b30 100644 (file)
@@ -16,6 +16,9 @@
 #include <linux/errno.h>
 #include <linux/interrupt.h>
 #include <linux/device.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <mach/videonode.h>
@@ -1435,7 +1438,11 @@ int fimc_is_flite_open(struct v4l2_subdev *subdev,
 {
        int ret = 0;
        struct fimc_is_device_flite *flite;
+       struct fimc_is_core *core;
 
+       core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+
+       BUG_ON(!core);
        BUG_ON(!subdev);
        BUG_ON(!framemgr);
 
@@ -1457,41 +1464,13 @@ int fimc_is_flite_open(struct v4l2_subdev *subdev,
        clear_bit(FLITE_A_SLOT_VALID, &flite->state);
        clear_bit(FLITE_B_SLOT_VALID, &flite->state);
 
-       switch(flite->instance) {
-       case FLITE_ID_A:
-               ret = request_irq(IRQ_FIMC_LITE0,
-                       fimc_is_flite_isr,
-                       IRQF_SHARED,
-                       "fimc-lite0",
-                       flite);
-               if (ret)
-                       err("request_irq(L0) failed\n");
-               break;
-       case FLITE_ID_B:
-               ret = request_irq(IRQ_FIMC_LITE1,
-                       fimc_is_flite_isr,
-                       IRQF_SHARED,
-                       "fimc-lite1",
-                       flite);
-               if (ret)
-                       err("request_irq(L1) failed\n");
-               break;
-#ifdef IRQ_FIMC_LITE2
-       case FLITE_ID_C:
-               ret = request_irq(IRQ_FIMC_LITE2,
-                       fimc_is_flite_isr,
-                       IRQF_SHARED,
-                       "fimc-lite2",
+       ret = of_irq_get(core->lite_np[flite->instance], 0);
+       if (ret > 0)
+               ret = request_irq(ret, fimc_is_flite_isr,
+                       IRQF_SHARED, "fimc-lite",
                        flite);
-               if (ret)
-                       err("request_irq(L2) failed\n");
-               break;
-#endif
-       default:
-               err("instance is invalid(%d)", flite->instance);
-               ret = -EINVAL;
-               goto p_err;
-       }
+       if (ret)
+               err("request_irq(L%d) failed\n", flite->instance);
 
 p_err:
        return ret;
@@ -1501,7 +1480,11 @@ int fimc_is_flite_close(struct v4l2_subdev *subdev)
 {
        int ret = 0;
        struct fimc_is_device_flite *flite;
+       struct fimc_is_core *core;
+
+       core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
 
+       BUG_ON(!core);
        BUG_ON(!subdev);
 
        flite = v4l2_get_subdevdata(subdev);
@@ -1511,23 +1494,7 @@ int fimc_is_flite_close(struct v4l2_subdev *subdev)
                goto p_err;
        }
 
-       switch(flite->instance) {
-       case FLITE_ID_A:
-               free_irq(IRQ_FIMC_LITE0, flite);
-               break;
-       case FLITE_ID_B:
-               free_irq(IRQ_FIMC_LITE1, flite);
-               break;
-#ifdef IRQ_FIMC_LITE2
-       case FLITE_ID_C:
-               free_irq(IRQ_FIMC_LITE2, flite);
-               break;
-#endif
-       default:
-               err("instance is invalid(%d)", flite->instance);
-               ret = -EINVAL;
-               goto p_err;
-       }
+       free_irq(of_irq_get(core->lite_np[flite->instance], 0), flite);
 
 p_err:
        return ret;
@@ -1901,7 +1868,11 @@ int fimc_is_flite_probe(struct fimc_is_device_sensor *device,
        int ret = 0;
        struct v4l2_subdev *subdev_flite;
        struct fimc_is_device_flite *flite;
+       struct fimc_is_core *core;
+
+       core = dev_get_drvdata(fimc_is_dev);
 
+       BUG_ON(!core);
        BUG_ON(!device);
 
        subdev_flite = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
@@ -1923,21 +1894,10 @@ int fimc_is_flite_probe(struct fimc_is_device_sensor *device,
        flite->subdev = &device->subdev_flite;
        flite->instance = instance;
        init_waitqueue_head(&flite->wait_queue);
-       switch(instance) {
-       case FLITE_ID_A:
-               flite->base_reg = (unsigned long *)FIMCLITE0_REG_BASE;
-               break;
-       case FLITE_ID_B:
-               flite->base_reg = (unsigned long *)FIMCLITE1_REG_BASE;
-               break;
-       case FLITE_ID_C:
-               flite->base_reg = (unsigned long *)FIMCLITE2_REG_BASE;
-               break;
-       default:
-               err("instance is invalid(%d)", instance);
-               ret = -EINVAL;
-               goto err_invalid_instance;
-       }
+
+       flite->base_reg = of_iomap(core->lite_np[instance], 0);
+       if (!flite->base_reg)
+               goto err_reg_v4l2_subdev;
 
        v4l2_subdev_init(subdev_flite, &subdev_ops);
        v4l2_set_subdevdata(subdev_flite, (void *)flite);
@@ -1967,7 +1927,6 @@ int fimc_is_flite_probe(struct fimc_is_device_sensor *device,
        return 0;
 
 err_reg_v4l2_subdev:
-err_invalid_instance:
        kfree(flite);
 
 err_alloc_flite:
index 129f757..4ab888b 100644 (file)
@@ -260,6 +260,25 @@ p_err:
        return ret;
 }
 
+int fimc_is_parse_children_dt(struct device *dev, struct fimc_is_core *core)
+{
+       struct device_node *np = dev->of_node;
+       struct device_node *child;
+
+       for_each_available_child_of_node(np, child) {
+               int i;
+
+               i = of_alias_get_id(child, "fimc-lite");
+               if (i >= 0 || i < FIMC_IS_MAX_NODES)
+                       core->lite_np[i] = child;
+
+               i = of_alias_get_id(child, "csis");
+               if (i >= 0 || i < FIMC_IS_MAX_NODES)
+                       core->csis_np[i] = child;
+       }
+       return 0;
+}
+
 int fimc_is_sensor_parse_dt(struct platform_device *pdev)
 {
        int ret = 0;
index d3d18d5..3819c04 100644 (file)
@@ -33,5 +33,6 @@ int get_pin_lookup_state(struct device *dev, struct exynos_platform_fimc_is_sens
 int fimc_is_power_initpin(struct device *dev);
 int fimc_is_power_setpin(struct device *dev, int position, int sensor_id);
 struct exynos_platform_fimc_is *fimc_is_parse_dt(struct device *dev);
+int fimc_is_parse_children_dt(struct device *dev, struct fimc_is_core *core);
 int fimc_is_sensor_parse_dt(struct platform_device *pdev);
 #endif
index 90888c6..7fa1a13 100644 (file)
 #define ISSR62                 (MCUCTL+0x178)
 #define ISSR63                 (MCUCTL+0x17c)
 
-/* PMU for FIMC-IS*/
-#define MIPICSI0_REG_BASE                       (S5P_VA_MIPICSI0)
-#define MIPICSI1_REG_BASE                       (S5P_VA_MIPICSI1)
-#define MIPICSI2_REG_BASE                      (S5P_VA_MIPICSI2)
-
-#define FIMCLITE0_REG_BASE                      (S5P_VA_FIMCLITE0)
-#define FIMCLITE1_REG_BASE                      (S5P_VA_FIMCLITE1)
-#define FIMCLITE2_REG_BASE                      (S5P_VA_FIMCLITE2)
-
 #define PMUREG_ISP_ARM_CONFIGURATION           (S5P_VA_PMU  + 0x2580)
 #define PMUREG_ISP_ARM_STATUS                  (S5P_VA_PMU  + 0x2584)
 #define PMUREG_ISP_ARM_OPTION                  (S5P_VA_PMU  + 0x2588)