From 8a297b0552ba7b5a0a9a58b8a383d7c80a04d91b Mon Sep 17 00:00:00 2001 From: "dalon.zhang" Date: Sat, 29 Nov 2014 19:38:54 +0800 Subject: [PATCH] camera : cif : v0.1.a Support rk3288 cif driver --- arch/arm/boot/dts/rk3288-cif-sensor.dtsi | 67 ++++++++++++++++++++++ arch/arm/boot/dts/rk3288-tb_8846.dts | 7 ++- arch/arm/boot/dts/rk3288.dtsi | 10 ++++ arch/arm/mach-rockchip/rk_camera.c | 10 +++- arch/arm/mach-rockchip/rk_camera.h | 1 + drivers/media/video/rk30_camera_oneframe.c | 45 +++++++++++---- include/uapi/linux/v4l2-controls.h | 2 +- include/uapi/linux/videodev2.h | 1 + 8 files changed, 130 insertions(+), 13 deletions(-) create mode 100755 arch/arm/boot/dts/rk3288-cif-sensor.dtsi diff --git a/arch/arm/boot/dts/rk3288-cif-sensor.dtsi b/arch/arm/boot/dts/rk3288-cif-sensor.dtsi new file mode 100755 index 000000000000..70bbc142b0d4 --- /dev/null +++ b/arch/arm/boot/dts/rk3288-cif-sensor.dtsi @@ -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 = ; + pwr_active = ; + mir = <0>; + flash_attach = <1>; + //rockchip,flash = <>; + flash_active = <1>; + resolution = ; + powerup_sequence = ; + orientation = <0>; + i2c_add = ; + 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 = ; + pwr_active = ; + mir = <0>; + flash_attach = <1>; + //rockchip,flash = <>; + flash_active = <1>; + resolution = ; + powerup_sequence = ; + orientation = <0>; + i2c_add = ; + i2c_rata = <100000>; + i2c_chl = <3>; + cif_chl = <0>; + mclk_rate = <24>; + }; +*/ + }; +}; + + + + + + diff --git a/arch/arm/boot/dts/rk3288-tb_8846.dts b/arch/arm/boot/dts/rk3288-tb_8846.dts index e2e2902205a6..e8e718edb337 100644 --- a/arch/arm/boot/dts/rk3288-tb_8846.dts +++ b/arch/arm/boot/dts/rk3288-tb_8846.dts @@ -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"; @@ -1064,3 +1064,8 @@ status = "disabled"; }; }; + +&rk3288_cif_sensor{ + status = "okay"; +}; + diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index a15825a4e90e..8a1bf4bf67b7 100755 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -1254,6 +1254,16 @@ rockchip,isp,iommu_enable = <1>; status = "okay"; }; + cif: cif@ff950000 { + compatible = "rockchip,cif"; + reg = <0xff950000 0x10000>; + interrupts = ; + 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"; diff --git a/arch/arm/mach-rockchip/rk_camera.c b/arch/arm/mach-rockchip/rk_camera.c index 0eed737a5682..467ec9470aaa 100644 --- a/arch/arm/mach-rockchip/rk_camera.c +++ b/arch/arm/mach-rockchip/rk_camera.c @@ -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; diff --git a/arch/arm/mach-rockchip/rk_camera.h b/arch/arm/mach-rockchip/rk_camera.h index 02db4b0aef43..784d1229eec3 100644 --- a/arch/arm/mach-rockchip/rk_camera.h +++ b/arch/arm/mach-rockchip/rk_camera.h @@ -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 { diff --git a/drivers/media/video/rk30_camera_oneframe.c b/drivers/media/video/rk30_camera_oneframe.c index e1ffdc1a1bd0..982872864bbf 100755 --- a/drivers/media/video/rk30_camera_oneframe.c +++ b/drivers/media/video/rk30_camera_oneframe.c @@ -51,7 +51,7 @@ #include #include -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"); diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index 83ea2656a6c6..0523d270a9b5 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -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) diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index f40b41c7e108..6bf7ffcac13e 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -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 { -- 2.34.1