camera : cif : v0.1.a Support rk3288 cif driver
authordalon.zhang <dalon.zhang@rock-chips.com>
Sat, 29 Nov 2014 11:38:54 +0000 (19:38 +0800)
committerdalon.zhang <dalon.zhang@rock-chips.com>
Sat, 29 Nov 2014 11:38:54 +0000 (19:38 +0800)
arch/arm/boot/dts/rk3288-cif-sensor.dtsi [new file with mode: 0755]
arch/arm/boot/dts/rk3288-tb_8846.dts
arch/arm/boot/dts/rk3288.dtsi
arch/arm/mach-rockchip/rk_camera.c
arch/arm/mach-rockchip/rk_camera.h
drivers/media/video/rk30_camera_oneframe.c
include/uapi/linux/v4l2-controls.h
include/uapi/linux/videodev2.h

diff --git a/arch/arm/boot/dts/rk3288-cif-sensor.dtsi b/arch/arm/boot/dts/rk3288-cif-sensor.dtsi
new file mode 100755 (executable)
index 0000000..70bbc14
--- /dev/null
@@ -0,0 +1,67 @@
+#include "rk3288.dtsi" 
+#include "rk3288-pinctrl.dtsi"
+#include "../../mach-rockchip/rk_camera_sensor_info.h"
+/{
+       rk3288_cif_sensor: rk3288_cif_sensor{
+                       compatible = "rockchip,sensor";
+                       status = "disabled";
+                       
+        gc0329{
+               is_front = <0>;
+               rockchip,power = <&gpio0 GPIO_C1 GPIO_ACTIVE_HIGH>;
+               //rockchip,power_pmu_name1 = "rk818_ldo4";
+               //rockchip,power_pmu_voltage1 = <2800000>;
+               //rockchip,power_pmu_name2 = "rk818_ldo8";
+               //rockchip,power_pmu_voltage2 = <1800000>;
+               rockchip,powerdown = <&gpio2 GPIO_B4 GPIO_ACTIVE_HIGH>;
+               //rockchip,powerdown_pmu = "";
+               //rockchip,powerdown_pmu_voltage = <3000000>;
+               pwdn_active = <gc0329_PWRDN_ACTIVE>;
+               pwr_active = <PWR_ACTIVE_HIGH>;
+               mir = <0>;
+               flash_attach = <1>;
+               //rockchip,flash = <>;
+               flash_active = <1>;
+               resolution = <gc0329_FULL_RESOLUTION>;
+               powerup_sequence = <gc0329_PWRSEQ>;
+               orientation = <0>;              
+               i2c_add = <gc0329_I2C_ADDR>;
+               i2c_rata = <100000>;
+               i2c_chl = <3>;
+               cif_chl = <0>;
+               mclk_rate = <24>;
+               };
+/*      ov8858{
+               is_front = <0>;
+               rockchip,power = <&gpio0 GPIO_C1 GPIO_ACTIVE_HIGH>;
+               //rockchip,power_pmu_name1 = "rk818_ldo4";
+               //rockchip,power_pmu_voltage1 = <2800000>;
+               //rockchip,power_pmu_name2 = "rk818_ldo8";
+               //rockchip,power_pmu_voltage2 = <1800000>;
+               rockchip,powerdown = <&gpio2 GPIO_B4 GPIO_ACTIVE_HIGH>;
+               //rockchip,powerdown_pmu = "";
+               //rockchip,powerdown_pmu_voltage = <3000000>;
+               pwdn_active = <ov8858_PWRDN_ACTIVE>;
+               pwr_active = <PWR_ACTIVE_HIGH>;
+               mir = <0>;
+               flash_attach = <1>;
+               //rockchip,flash = <>;
+               flash_active = <1>;
+               resolution = <ov8858_FULL_RESOLUTION>;
+               powerup_sequence = <ov8858_PWRSEQ>;
+               orientation = <0>;              
+               i2c_add = <ov8858_I2C_ADDR>;
+               i2c_rata = <100000>;
+               i2c_chl = <3>;
+               cif_chl = <0>;
+               mclk_rate = <24>;
+               };
+*/
+       };
+};
+
+
+
+
+
+
index e2e2902205a6270515ae4352a5144461d3105ac2..e8e718edb33730ab6b2ac7c3cd9604a1fed6b548 100644 (file)
@@ -4,7 +4,7 @@
 //#include "lcd-b101ew05.dtsi"
 #include "lcd-F402.dtsi"
 #include "vtl_ts_sdk8846.dtsi"
-
+#include "rk3288-cif-sensor.dtsi"
 / {
        fiq-debugger {
                status = "okay";
                status = "disabled";
        };
 };
+
+&rk3288_cif_sensor{
+       status = "okay";
+};
+
index a15825a4e90eac07f675d6c894ae299630318ba7..8a1bf4bf67b701fd9df51a6eb1c527ac67d797bf 100755 (executable)
                rockchip,isp,iommu_enable = <1>;
                status = "okay";
        };
+       cif: cif@ff950000 {
+            compatible = "rockchip,cif";
+            reg = <0xff950000 0x10000>;
+            interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+            clocks = <&pd_isp>,<&clk_gates15 14>,<&clk_gates15 15>,<&clkin_cif>,<&clk_gates16 0>,<&clk_cif_out>;
+            clock-names = "pd_cif0", "aclk_cif0","hclk_cif0","cif0_in","g_pclkin_cif","cif0_out";
+            pinctrl-names = "cif_pin_all";
+            pinctrl-0 = <&isp_mipi &isp_dvp_d2d9 &isp_dvp_d10d11>;
+            status = "okay";
+            };
 
        tsadc: tsadc@ff280000 {
                compatible = "rockchip,tsadc";
index 0eed737a56826b8662177098433170c06957a0c2..467ec9470aaa08f1af6d90eba2e759758f47d248 100644 (file)
@@ -327,7 +327,9 @@ static int rk_dts_cif_probe(struct platform_device *pdev) /*yzm*/
 {
        int irq,err;
        struct device *dev = &pdev->dev;
-       const char *compatible = NULL;
+       const char *compatible = NULL;  
+       struct device_node * vpu_node =NULL;    
+    int vpu_iommu_enabled = 0;
        debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
        
        rk_camera_platform_data.cif_dev = &pdev->dev;
@@ -347,6 +349,12 @@ static int rk_dts_cif_probe(struct platform_device *pdev) /*yzm*/
        err = of_property_read_string(dev->of_node->parent,"compatible",&compatible);   
        rk_camera_platform_data.rockchip_name = compatible;
 
+    vpu_node = of_find_compatible_node(NULL,NULL, "vpu_service");
+    if(vpu_node){
+        err = of_property_read_u32(vpu_node, "iommu_enabled", &vpu_iommu_enabled);
+               rk_camera_platform_data.iommu_enabled = vpu_iommu_enabled;
+    }
+
        if (err < 0){
                printk(KERN_EMERG "Get rockchip compatible failed!!!!!!");
                return -ENODEV;
index 02db4b0aef43c60a6bd579dcbf92ba9ec684268a..784d1229eec31b7a55b224d9e386c1163d147866 100644 (file)
@@ -249,6 +249,7 @@ struct rk29camera_platform_data {
     struct rkcamera_platform_data *register_dev_new;  //sensor   
        struct device *cif_dev;/*yzm host*/  
        const char *rockchip_name;
+       int iommu_enabled;
 };
 
 struct rk29camera_platform_ioctl_cb {
index e1ffdc1a1bd0be098686010e61a874513c99e23a..982872864bbfd14c64681e912dbcef29913322f9 100755 (executable)
@@ -51,7 +51,7 @@
 #include <linux/of.h>
 #include <linux/of_irq.h>
  
-static int debug;
+static int debug = 0;
 module_param(debug, int, S_IRUGO|S_IWUSR);
 
 #define CAMMODULE_NAME     "rk_cam_cif"   
@@ -282,8 +282,11 @@ static u32 CHIP_NAME;
                 2. Fix cif_clk_out cannot close which base on XIN24M and cannot turn to 0
                 3. Move Camera Sensor Macro from rk_camera.h to rk_camera_sensor_info.h
                 4. Support flash control when preview size == picture size
+*v0.1.a:
+                1. Support rk3288 cif driver
+                2. Query and upload iommu info
 */
-#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 0x9)
+#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 0xa)
 static int version = RK_CAM_VERSION_CODE;
 module_param(version, int, S_IRUGO);
 
@@ -509,11 +512,29 @@ static void rk_camera_diffchips(const char *rockchip_name)
 
                CHIP_NAME = 3126;
        }
+       else if(strstr(rockchip_name,"3288"))
+       {       
+               CRU_PCLK_REG30 = 0xd4;
+               ENANABLE_INVERT_PCLK_CIF0 = ((0x1<<20)|(0x1<<4));
+               DISABLE_INVERT_PCLK_CIF0  = ((0x1<<20)|(0x0<<4));
+               ENANABLE_INVERT_PCLK_CIF1 = ENANABLE_INVERT_PCLK_CIF0;
+               DISABLE_INVERT_PCLK_CIF1  = DISABLE_INVERT_PCLK_CIF0;
+
+               CRU_CLK_OUT = 0x16c;
+               CHIP_NAME = 3288;
+       }
+
+       
 }
 static inline void rk_cru_set_soft_reset(u32 idx, bool on , u32 RK_CRU_SOFTRST_CON)
 {
        void __iomem *reg = RK_CRU_VIRT + RK_CRU_SOFTRST_CON;
-       u32 val = on ? 0x10001U << 14 : 0x10000U << 14;
+       u32 val = 0;
+       if(CHIP_NAME == 3126){
+               val = on ? 0x10001U << 14 : 0x10000U << 14;
+       }else if(CHIP_NAME == 3288){
+               val = on ? 0x10001U << 8 : 0x10000U << 8;
+       }
        writel_relaxed(val, reg);
        dsb();
 }
@@ -523,8 +544,11 @@ static void rk_camera_cif_reset(struct rk_camera_dev *pcdev, int only_rst)
     int ctrl_reg,inten_reg,crop_reg,set_size_reg,for_reg,vir_line_width_reg,scl_reg,y_reg,uv_reg;
        u32 RK_CRU_SOFTRST_CON = 0;
        debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
-       if(strstr(pcdev->pdata->rockchip_name,"3128")||strstr(pcdev->pdata->rockchip_name,"3126"))
+       if(CHIP_NAME == 3126){
                RK_CRU_SOFTRST_CON = RK312X_CRU_SOFTRSTS_CON(6);
+       }else if(CHIP_NAME == 3288){
+               RK_CRU_SOFTRST_CON = RK3288_CRU_SOFTRSTS_CON(6);
+       }
        
        if (only_rst == true) {
         rk_cru_set_soft_reset(0, true ,RK_CRU_SOFTRST_CON);
@@ -1126,7 +1150,6 @@ static irqreturn_t rk_camera_irq(int irq, void *data)
     unsigned long reg_intstat;
 
 
-
     spin_lock(&pcdev->lock);
 
     if(atomic_read(&pcdev->stop_cif) == true) {
@@ -2353,6 +2376,7 @@ static int rk_camera_querycap(struct soc_camera_host *ici,
     strcat(cap->card,fov);                          /* ddl@rock-chips.com: v0.3.f */
     cap->version = RK_CAM_VERSION_CODE;
     cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
+       cap->reserved[0] = pcdev->pdata->iommu_enabled;
        debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
 
     return 0;
@@ -2540,7 +2564,7 @@ static enum hrtimer_restart rk_camera_fps_func(struct hrtimer *timer)
        /*struct soc_camera_link *tmp_soc_cam_link;*/ /*yzm*/
        /*tmp_soc_cam_link = to_soc_camera_link(pcdev->icd);*/ /*yzm*/
 
-       debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+       debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
 
        RKCAMERA_DG1("rk_camera_fps_func fps:0x%x\n",pcdev->fps);
        if ((pcdev->fps < 1) || (pcdev->last_fps == pcdev->fps)) {
@@ -2979,10 +3003,11 @@ static int rk_camera_cif_iomux(struct device *dev)
     char state_str[20] = {0};
 
        debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
-    strcpy(state_str,"cif_pin_jpe");
-
-       /*__raw_writel(((1<<1)|(1<<(1+16))),RK_GRF_VIRT+0x0380);*/
+    strcpy(state_str,"cif_pin_all");
 
+       if(CHIP_NAME == 3288){
+               __raw_writel(((1<<1)|(1<<(1+16))),RK_GRF_VIRT+0x0380);
+       }
 
     /*mux CIF0_CLKOUT*/
 
@@ -3136,7 +3161,7 @@ static int rk_camera_probe(struct platform_device *pdev)
     /* config buffer address */
     /* request irq */
     if(irq > 0){
-        err = request_irq(pcdev->irqinfo.irq, rk_camera_irq, 0, RK29_CAM_DRV_NAME,
+               err = request_irq(pcdev->irqinfo.irq, rk_camera_irq, IRQF_DISABLED | IRQF_SHARED , RK29_CAM_DRV_NAME,
                           pcdev);
         if (err) {
             dev_err(pcdev->dev, "Camera interrupt register failed \n");
index 83ea2656a6c6775c0a1e02cc917e9252231e5fae..0523d270a9b5c2c610dca9e534112be036937267 100644 (file)
@@ -620,7 +620,7 @@ enum  v4l2_exposure_auto_type {
 
 /**************yzm**************/
 /* ddl@rock-chips.com : Add ioctrl -  V4L2_CID_SCENE for camera scene control */
-#define V4L2_CID_CAMERA_CLASS_BASE_ROCK                (V4L2_CID_CAMERA_CLASS_BASE + 30)
+#define V4L2_CID_CAMERA_CLASS_BASE_ROCK                (V4L2_CID_CAMERA_CLASS_BASE + 40)
 #define V4L2_CID_SCENE                         (V4L2_CID_CAMERA_CLASS_BASE_ROCK+1)
 #define V4L2_CID_EFFECT                                (V4L2_CID_CAMERA_CLASS_BASE_ROCK+2)
 #define V4L2_CID_FLASH                         (V4L2_CID_CAMERA_CLASS_BASE_ROCK+3)
index f40b41c7e10891c01234e5e24b42f534db4631f9..6bf7ffcac13e651c2700056e79bf4d55004faf4d 100644 (file)
@@ -1217,6 +1217,7 @@ struct v4l2_ext_control {
                __s64 value64;
                char *string;
        };
+    __s32 rect[4];/*rockchip add for focus zone*/
 } __attribute__ ((packed));
 
 struct v4l2_ext_controls {