oneframe: v0.2.0
pingpong: v0.1.a
This commit is contained in:
dalon.zhang 2015-02-28 19:09:34 +08:00
parent 91b464e2f9
commit f6cc29031a
6 changed files with 292 additions and 255 deletions

79
arch/arm/mach-rockchip/rk_camera.c Normal file → Executable file
View File

@ -5,7 +5,6 @@
#include <linux/version.h>
#include <linux/moduleparam.h>
#include <linux/of_gpio.h>
/**********yzm***********/
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/kernel.h>
@ -14,14 +13,12 @@
#include <linux/of_fdt.h>
#include <linux/module.h>
#include <linux/regulator/consumer.h>
/**********yzm***********/
//#define PMEM_CAM_NECESSARY 0x00000000 /*yzm*/
static int camio_version = KERNEL_VERSION(0,1,9);/*yzm camio_version*/
static int camio_version = KERNEL_VERSION(0,1,9);
module_param(camio_version, int, S_IRUGO);
static int camera_debug = 0;/*yzm*/
static int camera_debug = 0;
module_param(camera_debug, int, S_IRUGO|S_IWUSR);
#undef CAMMODULE_NAME
@ -81,7 +78,7 @@ static struct resource rk_camera_resource_host_1[2] = {};
.name = RK29_CAM_DRV_NAME,
.id = RK_CAM_PLATFORM_DEV_ID_0, /* This is used to put cameras on this interface*/
.num_resources= 2,
.resource = rk_camera_resource_host_0,/*yzm*/
.resource = rk_camera_resource_host_0,
.dev = {
.dma_mask = &rockchip_device_camera_dmamask,
.coherent_dma_mask = 0xffffffffUL,
@ -95,7 +92,7 @@ static struct resource rk_camera_resource_host_1[2] = {};
.name = RK29_CAM_DRV_NAME,
.id = RK_CAM_PLATFORM_DEV_ID_1, /* This is used to put cameras on this interface */
.num_resources = ARRAY_SIZE(rk_camera_resource_host_1),
.resource = rk_camera_resource_host_1,/*yzm*/
.resource = rk_camera_resource_host_1,
.dev = {
.dma_mask = &rockchip_device_camera_dmamask,
.coherent_dma_mask = 0xffffffffUL,
@ -138,6 +135,8 @@ static struct platform_driver rk_sensor_driver =
.remove = rk_dts_sensor_remove,
};
unsigned long rk_cif_grf_base;
unsigned long rk_cif_cru_base;
static int rk_dts_sensor_remove(struct platform_device *pdev)
{
@ -250,9 +249,9 @@ static int rk_dts_sensor_probe(struct platform_device *pdev)
strcpy(new_camera->dev.i2c_cam_info.type, name);
new_camera->dev.i2c_cam_info.addr = i2c_add>>1;
new_camera->dev.desc_info.host_desc.bus_id = RK29_CAM_PLATFORM_DEV_ID+cif_chl;/*yzm*/
new_camera->dev.desc_info.host_desc.i2c_adapter_id = i2c_chl;/*yzm*/
new_camera->dev.desc_info.host_desc.module_name = name;/*const*/
new_camera->dev.desc_info.host_desc.bus_id = RK29_CAM_PLATFORM_DEV_ID+cif_chl;
new_camera->dev.desc_info.host_desc.i2c_adapter_id = i2c_chl;
new_camera->dev.desc_info.host_desc.module_name = name;
new_camera->dev.device_info.name = "soc-camera-pdrv";
if(is_front)
sprintf(new_camera->dev_name,"%s_%s",name,"front");
@ -323,13 +322,14 @@ static int rk_dts_cif_remove(struct platform_device *pdev)
return 0;
}
static int rk_dts_cif_probe(struct platform_device *pdev) /*yzm*/
static int rk_dts_cif_probe(struct platform_device *pdev)
{
int irq,err;
struct device *dev = &pdev->dev;
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;
@ -356,8 +356,20 @@ static int rk_dts_cif_probe(struct platform_device *pdev) /*yzm*/
of_node_put(vpu_node);
}else{
printk("get vpu_node failed,vpu_iommu_enabled == 0 !!!!!!\n");
}
}
if(strstr(rk_camera_platform_data.rockchip_name,"3368")){
//get cru base
vpu_node = of_parse_phandle(dev->of_node, "rockchip,cru", 0);
rk_cif_cru_base = (unsigned long)of_iomap(vpu_node, 0);
debug_printk(">>>>>>>rk_cif_cru_base=0x%lx",rk_cif_cru_base);
//get grf base
vpu_node = of_parse_phandle(dev->of_node, "rockchip,grf", 0);
rk_cif_grf_base = (unsigned long)of_iomap(vpu_node, 0);
debug_printk(">>>>>>>rk_cif_grf_base=0x%lx",rk_cif_grf_base);
}
if (err < 0){
printk(KERN_EMERG "Get rockchip compatible failed!!!!!!");
return -ENODEV;
@ -381,8 +393,6 @@ static int rk_cif_sensor_init(void)
return 0;
}
/************yzm**************end*/
static int sensor_power_default_cb (struct rk29camera_gpio_res *res, int on)
{
int camera_power = res->gpio_power;
@ -607,7 +617,7 @@ static int _rk_sensor_io_init_(struct rk29camera_gpio_res *gpio_res,struct devic
bool io_requested_in_camera;
enum of_gpio_flags flags;
struct rkcamera_platform_data *new_camera;/*yzm*/
struct rkcamera_platform_data *new_camera;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
@ -622,8 +632,8 @@ static int _rk_sensor_io_init_(struct rk29camera_gpio_res *gpio_res,struct devic
if (camera_power != INVALID_GPIO) {
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_power = %x\n", camera_power );
camera_power = of_get_named_gpio_flags(of_node,"rockchip,power",0,&flags);/*yzm*/
gpio_res->gpio_power = camera_power;/*yzm information back to the IO*/
camera_power = of_get_named_gpio_flags(of_node,"rockchip,power",0,&flags);
gpio_res->gpio_power = camera_power;/* information back to the IO*/
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_power = %x\n", camera_power );
@ -664,8 +674,8 @@ static int _rk_sensor_io_init_(struct rk29camera_gpio_res *gpio_res,struct devic
if (camera_reset != INVALID_GPIO) {
camera_power = of_get_named_gpio_flags(of_node,"rockchip,reset",0,&flags);/*yzm*/
gpio_res->gpio_reset = camera_reset;/*yzm information back to the IO*/
camera_power = of_get_named_gpio_flags(of_node,"rockchip,reset",0,&flags);
gpio_res->gpio_reset = camera_reset;/* information back to the IO*/
ret = gpio_request(camera_reset, "camera reset");
if (ret) {
io_requested_in_camera = false;
@ -702,8 +712,8 @@ static int _rk_sensor_io_init_(struct rk29camera_gpio_res *gpio_res,struct devic
if (camera_powerdown != INVALID_GPIO) {
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_powerdown = %x\n", camera_powerdown );
camera_powerdown = of_get_named_gpio_flags(of_node,"rockchip,powerdown",0,&flags);/*yzm*/
gpio_res->gpio_powerdown = camera_powerdown;/*yzm information back to the IO*/
camera_powerdown = of_get_named_gpio_flags(of_node,"rockchip,powerdown",0,&flags);
gpio_res->gpio_powerdown = camera_powerdown;/*information back to the IO*/
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_powerdown = %x\n", camera_powerdown );
ret = gpio_request(camera_powerdown, "camera powerdown");
@ -742,8 +752,8 @@ static int _rk_sensor_io_init_(struct rk29camera_gpio_res *gpio_res,struct devic
if (camera_flash != INVALID_GPIO) {
camera_flash = of_get_named_gpio_flags(of_node,"rockchip,flash",0,&flags);/*yzm*/
gpio_res->gpio_flash = camera_flash;/*yzm information back to the IO*/
camera_flash = of_get_named_gpio_flags(of_node,"rockchip,flash",0,&flags);
gpio_res->gpio_flash = camera_flash;/* information back to the IO*/
ret = gpio_request(camera_flash, "camera flash");
if (ret) {
io_requested_in_camera = false;
@ -780,8 +790,8 @@ static int _rk_sensor_io_init_(struct rk29camera_gpio_res *gpio_res,struct devic
if (camera_af != INVALID_GPIO) {
camera_af = of_get_named_gpio_flags(of_node,"rockchip,af",0,&flags);/*yzm*/
gpio_res->gpio_af = camera_af;/*yzm information back to the IO*/
camera_af = of_get_named_gpio_flags(of_node,"rockchip,af",0,&flags);
gpio_res->gpio_af = camera_af;/* information back to the IO*/
ret = gpio_request(camera_af, "camera af");
if (ret) {
io_requested_in_camera = false;
@ -896,7 +906,6 @@ static int rk_sensor_io_init(void)
if (sensor_ioctl_cb.sensor_af_cb == NULL)
sensor_ioctl_cb.sensor_af_cb = sensor_afpower_default_cb;
/**********yzm*********/
new_camera = new_camera_head;
while(new_camera != NULL)
{
@ -928,7 +937,7 @@ static int rk_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd, i
struct rkcamera_platform_data *new_cam_dev = NULL;
struct rk29camera_platform_data* plat_data = &rk_camera_platform_data;
int ret = RK29_CAM_IO_SUCCESS,i = 0;
struct soc_camera_desc *dev_icl = NULL;/*yzm*/
struct soc_camera_desc *dev_icl = NULL;
struct rkcamera_platform_data *new_camera;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
@ -939,7 +948,7 @@ static int rk_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd, i
if (strcmp(new_camera->dev_name, dev_name(dev)) == 0) {
res = (struct rk29camera_gpio_res *)&new_camera->io;
new_cam_dev = &new_camera[i];
dev_icl = &new_camera->dev.desc_info;/*yzm*/
dev_icl = &new_camera->dev.desc_info;
break;
}
new_camera = new_camera->next_camera;;
@ -1016,7 +1025,7 @@ static int rk_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd, i
case Cam_Mclk:
{
if (plat_data->sensor_mclk && dev_icl) {
plat_data->sensor_mclk(dev_icl->host_desc.bus_id,(on!=0)?1:0,on);/*yzm*/
plat_data->sensor_mclk(dev_icl->host_desc.bus_id,(on!=0)?1:0,on);
} else {
eprintk( "%s(%d): sensor_mclk(%p) or dev_icl(%p) is NULL",
__FUNCTION__,__LINE__,plat_data->sensor_mclk,dev_icl);
@ -1114,7 +1123,7 @@ static int rk_sensor_pwrseq(struct device *dev,int powerup_sequence, int on, int
return ret;
}
static int rk_sensor_power(struct device *dev, int on) /*icd->pdev*/
static int rk_sensor_power(struct device *dev, int on)
{
int powerup_sequence,mclk_rate;
@ -1126,7 +1135,7 @@ static int rk_sensor_power(struct device *dev, int on) /*icd->pdev*/
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
new_camera = plat_data->register_dev_new; /*new_camera[]*/
new_camera = plat_data->register_dev_new;
while (new_camera != NULL) {
@ -1135,8 +1144,8 @@ static int rk_sensor_power(struct device *dev, int on) /*icd->pdev*/
((new_camera->io.gpio_flag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
}
debug_printk( "new_camera->dev_name= %s \n", new_camera->dev_name); /*yzm*/
debug_printk( "dev_name(dev)= %s \n", dev_name(dev)); /*yzm*/
debug_printk( "new_camera->dev_name= %s \n", new_camera->dev_name);
debug_printk( "dev_name(dev)= %s \n", dev_name(dev));
if (strcmp(new_camera->dev_name,dev_name(dev))) {
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);
@ -1148,7 +1157,7 @@ static int rk_sensor_power(struct device *dev, int on) /*icd->pdev*/
} else {
new_device = new_camera;
dev_io = &new_camera->io;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);/*yzm*/
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);
if (!Sensor_Support_DirectResume(new_camera->pwdn_info))
real_pwroff = true;
else

View File

@ -116,8 +116,6 @@ int generic_sensor_write(struct i2c_client *client,struct rk_sensor_reg* sensor_
struct generic_sensor *sensor = to_generic_sensor(client);
i2c_speed = sensor->info_priv.gI2c_speed;
//debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
//debug_printk( "/~~~~~~~~~~~~/ %s:%i-------%s()client = %p\n", __FILE__, __LINE__,__FUNCTION__,client);
err = 0;
switch(sensor_reg->reg){
@ -728,9 +726,8 @@ int generic_sensor_check_id(struct i2c_client *client, struct rk_sensor_reg *ser
int generic_sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd cmd, int on)
{
//struct soc_camera_link *icl = to_soc_camera_link(icd);
struct soc_camera_desc *desc = to_soc_camera_desc(icd);
struct rk29camera_platform_data *pdata = desc->subdev_desc.drv_priv;/*yzm*/
struct rk29camera_platform_data *pdata = desc->subdev_desc.drv_priv;
struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
struct generic_sensor *sensor = to_generic_sensor(client);
int ret = 0;
@ -741,8 +738,8 @@ int generic_sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cm
case Sensor_Power:
{
//if (icl->power) {
if(desc->subdev_desc.power) {/*yzm*/
ret = desc->subdev_desc.power(icd->pdev, on);/*yzm*/
if(desc->subdev_desc.power) {
ret = desc->subdev_desc.power(icd->pdev, on);
} else {
SENSOR_TR("haven't power callback");
ret = -EINVAL;
@ -752,8 +749,8 @@ int generic_sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cm
case Sensor_PowerDown:
{
//if (icl->powerdown) {
if(desc->subdev_desc.powerdown) {/*yzm*/
ret = desc->subdev_desc.powerdown(icd->pdev, on);/*yzm*/
if(desc->subdev_desc.powerdown) {
ret = desc->subdev_desc.powerdown(icd->pdev, on);
} else {
SENSOR_TR("haven't power down callback");
ret = -EINVAL;
@ -799,19 +796,16 @@ int generic_sensor_init(struct v4l2_subdev *sd, u32 val)
struct generic_sensor *sensor = to_generic_sensor(client);
int array_index = 0;
int num = sensor->info_priv.num_series;
//struct soc_camera_link *icl = to_soc_camera_link(icd);
struct soc_camera_desc *desc = to_soc_camera_desc(icd);/*yzm*/
struct rk29camera_platform_data *pdata = desc->subdev_desc.drv_priv;/*yzm*/
struct soc_camera_desc *desc = to_soc_camera_desc(icd);
struct rk29camera_platform_data *pdata = desc->subdev_desc.drv_priv;
struct rkcamera_platform_data *sensor_device=NULL,*new_camera;
new_camera = pdata->register_dev_new;
//while (strstr(new_camera->dev_name,"end")==NULL) {
while(new_camera != NULL){
if (strcmp(dev_name(icd->pdev), new_camera->dev_name) == 0) {
sensor_device = new_camera;
break;
}
//new_camera++;
new_camera = new_camera->next_camera;
}
@ -884,16 +878,13 @@ int generic_sensor_init(struct v4l2_subdev *sd, u32 val)
unsigned long generic_sensor_query_bus_param(struct soc_camera_device *icd)
{
//struct soc_camera_link *icl = to_soc_camera_link(icd);
struct soc_camera_desc *desc = to_soc_camera_desc(icd);/*yzm*/
struct soc_camera_desc *desc = to_soc_camera_desc(icd);
struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
struct generic_sensor *sensor = to_generic_sensor(client);
/**************yzm************/
struct v4l2_mbus_config cfg;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
cfg.flags = sensor->info_priv.bus_parameter;
return soc_camera_apply_board_flags(&(desc->subdev_desc), &cfg);/*yzm*/
/**************yzm*************/
return soc_camera_apply_board_flags(&(desc->subdev_desc), &cfg);
}
int generic_sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
@ -1101,7 +1092,6 @@ int generic_sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_
struct i2c_client *client = v4l2_get_subdevdata(sd);
struct soc_camera_subdev_desc *ssdd = client->dev.platform_data;
struct soc_camera_device *icd = ssdd->socdev;
//struct generic_sensor *sensor = to_generic_sensor(client);
int i, error_cnt=0, error_idx=-1;
for (i=0; i<ext_ctrl->count; i++) {
@ -1126,7 +1116,6 @@ int generic_sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_contro
struct i2c_client *client = v4l2_get_subdevdata(sd);
struct soc_camera_subdev_desc *ssdd = client->dev.platform_data;
struct soc_camera_device *icd = ssdd->socdev;
//struct generic_sensor*sensor = to_generic_sensor(client);
int i, error_cnt=0, error_idx=-1;
@ -1194,7 +1183,6 @@ long generic_sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
}
new_camera = sensor->sensor_io_request->register_dev_new;
//while (strstr(new_camera->dev_name,"end")==NULL) {
while(new_camera != NULL){
if (strcmp(dev_name(icd->pdev), new_camera->dev_name) == 0) {
if (new_camera->flash){
@ -1204,7 +1192,6 @@ long generic_sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
}
break;
}
//new_camera++;
new_camera = new_camera->next_camera;
}
@ -1282,7 +1269,6 @@ int generic_sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
struct soc_camera_subdev_desc *ssdd = client->dev.platform_data;
struct soc_camera_device *icd = ssdd->socdev;
struct generic_sensor*sensor = to_generic_sensor(client);
//struct rk_sensor_focus_cmd_info cmdinfo;
int zone_tm_pos[4];
int ret = 0;

View File

@ -13,7 +13,7 @@
#include <media/soc_camera.h>
#include <linux/vmalloc.h>
#include <linux/module.h>
#include "../../../arch/arm/mach-rockchip/rk30_camera.h"/*yzm*/
#include "../../../arch/arm/mach-rockchip/rk30_camera.h"
#include <linux/kernel.h>
/* Camera Sensor driver */

View File

@ -28,19 +28,9 @@
#include <linux/rockchip/iomap.h>
#include "../../video/rockchip/rga/rga.h"
#include "../../../arch/arm/mach-rockchip/rk30_camera.h"/*yzm*/
#include "../../../arch/arm/mach-rockchip/rk30_camera.h"
#include <linux/rockchip/cru.h>
/*******yzm*********
#include <plat/efuse.h>
#if (defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3026))
#include <mach/rk2928_camera.h>
#include <mach/cru.h>
#include <mach/pmu.h>
#define SOFT_RST_CIF1 (SOFT_RST_MAX+1)
#endif
*/
#include <asm/cacheflush.h>
#include <linux/of_address.h>
@ -157,40 +147,22 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
#define ENABLE_32BIT_BYPASS (0x01<<6)
#define DISABLE_32BIT_BYPASS (0x00<<6)
extern unsigned long rk_cif_grf_base;
extern unsigned long rk_cif_cru_base;
#define MIN(x,y) ((x<y) ? x: y)
#define MAX(x,y) ((x>y) ? x: y)
#define RK_SENSOR_24MHZ 24*1000*1000 /* MHz */
#define RK_SENSOR_48MHZ 48
#define __raw_readl(p) (*(unsigned long *)(p))
#define __raw_writel(v,p) (*(unsigned long *)(p) = (v))
#define __raw_readl(p) (*(unsigned int *)(p))
#define __raw_writel(v,p) (*(unsigned int *)(p) = (v))
#define write_cif_reg(base,addr, val) __raw_writel(val, addr+(base))
#define read_cif_reg(base,addr) __raw_readl(addr+(base))
#define mask_cif_reg(addr, msk, val) write_cif_reg(addr, (val)|((~(msk))&read_cif_reg(addr)))
/*
#if defined(CONFIG_ARCH_RK30) || defined(CONFIG_ARCH_RK3188)
//CRU,PIXCLOCK
#define CRU_PCLK_REG30 0xbc
#define ENANABLE_INVERT_PCLK_CIF0 ((0x1<<24)|(0x1<<8))
#define DISABLE_INVERT_PCLK_CIF0 ((0x1<<24)|(0x0<<8))
#define ENANABLE_INVERT_PCLK_CIF1 ((0x1<<28)|(0x1<<12))
#define DISABLE_INVERT_PCLK_CIF1 ((0x1<<28)|(0x0<<12))
#define CRU_CIF_RST_REG30 0x128
#define MASK_RST_CIF0 (0x01 << 30)
#define MASK_RST_CIF1 (0x01 << 31)
#define RQUEST_RST_CIF0 (0x01 << 14)
#define RQUEST_RST_CIF1 (0x01 << 15)
#define write_cru_reg(addr, val) __raw_writel(val, addr+RK30_CRU_BASE)
#define read_cru_reg(addr) __raw_readl(addr+RK30_CRU_BASE)
#define mask_cru_reg(addr, msk, val) write_cru_reg(addr,(val)|((~(msk))&read_cru_reg(addr)))
#endif
*/
/*********yzm**********/
static u32 CRU_PCLK_REG30;
static u32 CRU_CLK_OUT;
@ -206,38 +178,11 @@ static u32 CHIP_NAME;
#define write_cru_reg(addr, val) __raw_writel(val, addr+RK_CRU_VIRT)
#define read_cru_reg(addr) __raw_readl(addr+RK_CRU_VIRT)
#define mask_cru_reg(addr, msk, val) write_cru_reg(addr,(val)|((~(msk))&read_cru_reg(addr)))
/*********yzm*********end*/
/*
#if defined(CONFIG_ARCH_RK2928)
#define write_cru_reg(addr, val)
#define read_cru_reg(addr) 0
#define mask_cru_reg(addr, msk, val)
#endif
*/
/*
#if defined(CONFIG_ARCH_RK3066B) || defined(CONFIG_ARCH_RK3188)
//GRF_IO_CON3 0x100
#define CIF_DRIVER_STRENGTH_2MA (0x00 << 12)
#define CIF_DRIVER_STRENGTH_4MA (0x01 << 12)
#define CIF_DRIVER_STRENGTH_8MA (0x02 << 12)
#define CIF_DRIVER_STRENGTH_12MA (0x03 << 12)
#define CIF_DRIVER_STRENGTH_MASK (0x03 << 28)
#define rk3368_write_cru_reg(addr, val) __raw_writel(val, addr+rk_cif_cru_base)
#define rk3368_read_cru_reg(addr) __raw_readl(addr+rk_cif_cru_base)
#define rk3368_mask_cru_reg(addr, msk, val) rk3368_write_cru_reg(addr,(val)|((~(msk))&rk3368_read_cru_reg(addr)))
//GRF_IO_CON4 0x104
#define CIF_CLKOUT_AMP_3V3 (0x00 << 10)
#define CIF_CLKOUT_AMP_1V8 (0x01 << 10)
#define CIF_CLKOUT_AMP_MASK (0x01 << 26)
#define write_grf_reg(addr, val) __raw_writel(val, addr+RK30_GRF_BASE)
#define read_grf_reg(addr) __raw_readl(addr+RK30_GRF_BASE)
#define mask_grf_reg(addr, msk, val) write_grf_reg(addr,(val)|((~(msk))&read_grf_reg(addr)))
#else
#define write_grf_reg(addr, val)
#define read_grf_reg(addr) 0
#define mask_grf_reg(addr, msk, val)
#endif
*/
#define CAM_WORKQUEUE_IS_EN() (true)
#define CAM_IPPWORK_IS_EN() (false)/*((pcdev->zoominfo.a.c.width != pcdev->icd->user_width) || (pcdev->zoominfo.a.c.height != pcdev->icd->user_height))*/
@ -295,8 +240,10 @@ static u32 CHIP_NAME;
1. support focus mode.
*v0.1.f:
1. focus mode have some bug,fix it.
*v0.2.0:
1. support rk3368.
*/
#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 0xf)
#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 2, 0)
static int version = RK_CAM_VERSION_CODE;
module_param(version, int, S_IRUGO);
@ -379,7 +326,7 @@ struct rk_camera_zoominfo
#if CAMERA_VIDEOBUF_ARM_ACCESS
struct rk29_camera_vbinfo
{
unsigned int phy_addr;
unsigned long phy_addr;
void __iomem *vir_addr;
unsigned int size;
};
@ -437,7 +384,7 @@ struct rk_camera_dev
unsigned long frame_interval;
unsigned int pixfmt;
/*for ipp */
unsigned int vipmem_phybase;
unsigned long vipmem_phybase;
void __iomem *vipmem_virbase;
unsigned int vipmem_size;
unsigned int vipmem_bsize;
@ -535,17 +482,34 @@ static void rk_camera_diffchips(const char *rockchip_name)
CRU_CLK_OUT = 0x16c;
CHIP_NAME = 3288;
}
else if(strstr(rockchip_name,"3368"))
{
CRU_PCLK_REG30 = 0x154;
ENANABLE_INVERT_PCLK_CIF0 = ((0x1<<29)|(0x1<<13));
DISABLE_INVERT_PCLK_CIF0 = ((0x1<<29)|(0x0<<13));
ENANABLE_INVERT_PCLK_CIF1 = ENANABLE_INVERT_PCLK_CIF0;
DISABLE_INVERT_PCLK_CIF1 = DISABLE_INVERT_PCLK_CIF0;
//CRU_CLK_OUT = 0x16c;
CHIP_NAME = 3368;
}
}
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 = 0;
void __iomem *reg;
if(CHIP_NAME == 3368)
reg = (void*)(rk_cif_cru_base + RK_CRU_SOFTRST_CON);
else
reg = (void*)(RK_CRU_VIRT + RK_CRU_SOFTRST_CON);
if(CHIP_NAME == 3126){
val = on ? 0x10001U << 14 : 0x10000U << 14;
}else if(CHIP_NAME == 3288){
val = on ? 0x10001U << 8 : 0x10000U << 8;
}else if(CHIP_NAME == 3368){
val = on ? 0x10001U << 8 : 0x10000U << 8;
}
writel_relaxed(val, reg);
dsb();
@ -560,6 +524,8 @@ static void rk_camera_cif_reset(struct rk_camera_dev *pcdev, int only_rst)
RK_CRU_SOFTRST_CON = RK312X_CRU_SOFTRSTS_CON(6);
}else if(CHIP_NAME == 3288){
RK_CRU_SOFTRST_CON = RK3288_CRU_SOFTRSTS_CON(6);
}else if(CHIP_NAME == 3368){
RK_CRU_SOFTRST_CON = RK3368_CRU_SOFTRSTS_CON(6);
}
if (only_rst == true) {
@ -712,7 +678,6 @@ static void rk_videobuf_free(struct videobuf_queue *vq, struct rk_camera_buffer
*/
videobuf_waiton(vq, &buf->vb, 0, 0);
videobuf_dma_contig_free(vq, &buf->vb);
/*dev_dbg(&icd->dev, "%s freed\n", __func__);*/ /*yzm*/
buf->vb.state = VIDEOBUF_NEEDS_INIT;
return;
}
@ -731,9 +696,6 @@ static int rk_videobuf_prepare(struct videobuf_queue *vq, struct videobuf_buffer
buf = container_of(vb, struct rk_camera_buffer, vb);
/*dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %zd\n", __func__,*/ /*yzm*/
/* vb, vb->baddr, vb->bsize);*/ /*yzm*/
/* Added list head initialization on alloc */
WARN_ON(!list_empty(&vb->queue));
@ -773,7 +735,7 @@ static int rk_videobuf_prepare(struct videobuf_queue *vq, struct videobuf_buffer
static inline void rk_videobuf_capture(struct videobuf_buffer *vb,struct rk_camera_dev *rk_pcdev)
{
unsigned int y_addr,uv_addr;
unsigned long y_addr,uv_addr;
struct rk_camera_dev *pcdev = rk_pcdev;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
@ -816,9 +778,6 @@ static void rk_videobuf_queue(struct videobuf_queue *vq,
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
/*dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %zd\n", __func__,
vb, vb->baddr, vb->bsize); */ /*yzm*/
vb->state = VIDEOBUF_QUEUED;
if (list_empty(&pcdev->capture)) {
list_add_tail(&vb->queue, &pcdev->capture);
@ -955,7 +914,6 @@ static void rk_camera_capture_process(struct work_struct *work)
struct rk_camera_work *camera_work = container_of(work, struct rk_camera_work, work);
struct videobuf_buffer *vb = camera_work->vb;
struct rk_camera_dev *pcdev = camera_work->pcdev;
/*enum v4l2_mbus_pixelcode icd_code = pcdev->icd->current_fmt->code; */
unsigned long flags = 0;
int err = 0;
@ -1202,7 +1160,7 @@ static void rk_videobuf_release(struct videobuf_queue *vq,
{
struct rk_camera_buffer *buf = container_of(vb, struct rk_camera_buffer, vb);
struct soc_camera_device *icd = vq->priv_data;
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
#if CAMERA_VIDEOBUF_ARM_ACCESS
struct rk29_camera_vbinfo *vb_info =NULL;
@ -1262,7 +1220,7 @@ static struct videobuf_queue_ops rk_videobuf_ops =
static void rk_camera_init_videobuf(struct videobuf_queue *q,
struct soc_camera_device *icd)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
@ -1303,8 +1261,10 @@ static int rk_camera_mclk_ctrl(int cif_idx, int on, int clk_rate)
}
//spin_lock(&clk->lock);
if (on && !clk->on) {
clk_prepare_enable(clk->pd_cif); /*yzm*/
if (on && !clk->on) {
if(CHIP_NAME != 3368)
clk_prepare_enable(clk->pd_cif);
clk_prepare_enable(clk->aclk_cif);
clk_prepare_enable(clk->hclk_cif);
clk_prepare_enable(clk->cif_clk_in);
@ -1312,7 +1272,7 @@ static int rk_camera_mclk_ctrl(int cif_idx, int on, int clk_rate)
clk_set_rate(clk->cif_clk_out,clk_rate);
clk->on = true;
} else if (!on && clk->on) {
clk_set_rate(clk->cif_clk_out,36000000);/*yzm :just for close clk which base on XIN24M */
clk_set_rate(clk->cif_clk_out,36000000);/*just for close clk which base on XIN24M */
clk_disable_unprepare(clk->aclk_cif);
clk_disable_unprepare(clk->hclk_cif);
clk_disable_unprepare(clk->cif_clk_in);
@ -1321,7 +1281,8 @@ static int rk_camera_mclk_ctrl(int cif_idx, int on, int clk_rate)
write_cru_reg(CRU_CLK_OUT, 0x00800080);
}
clk_disable_unprepare(clk->cif_clk_out);
clk_disable_unprepare(clk->pd_cif);
if(CHIP_NAME != 3368)
clk_disable_unprepare(clk->pd_cif);
clk->on = false;
}
@ -1357,7 +1318,7 @@ static void rk_camera_deactivate(struct rk_camera_dev *pcdev)
* there can be only one camera on RK28 quick capture interface */
static int rk_camera_add_device(struct soc_camera_device *icd)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv; /*Initialize in rk_camra_prob*/
struct device *control = to_soc_camera_control(icd);
struct v4l2_subdev *sd;
@ -1403,9 +1364,7 @@ static int rk_camera_add_device(struct soc_camera_device *icd)
if (ret)
goto ebusy;
#endif
/* call generic_sensor_ioctl*/
v4l2_subdev_call(sd, core, ioctl, RK29_CAM_SUBDEV_CB_REGISTER,(void*)(&pcdev->icd_cb));
/* call generic_sensor_cropcap*/
if (v4l2_subdev_call(sd, video, cropcap, &cropcap) == 0) {
memcpy(&pcdev->cropinfo.bounds ,&cropcap.bounds,sizeof(struct v4l2_rect));
} else {
@ -1455,9 +1414,8 @@ static int rk_camera_add_device(struct soc_camera_device *icd)
}
static void rk_camera_remove_device(struct soc_camera_device *icd)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
/*struct v4l2_subdev *sd = soc_camera_to_subdev(icd);*/
#if CAMERA_VIDEOBUF_ARM_ACCESS
struct rk29_camera_vbinfo *vb_info;
unsigned int i;
@ -1478,7 +1436,7 @@ static void rk_camera_remove_device(struct soc_camera_device *icd)
rk_camera_s_stream(icd,0);
}
/* move DEACTIVATE into generic_sensor_s_power*/
/* v4l2_subdev_call(sd, core, ioctl, RK29_CAM_SUBDEV_DEACTIVATE,NULL);*/ /*yzm*/
/* v4l2_subdev_call(sd, core, ioctl, RK29_CAM_SUBDEV_DEACTIVATE,NULL);*/
/* if stream off is not been executed,timer is running.*/
if(pcdev->fps_timer.istarted){
hrtimer_cancel(&pcdev->fps_timer.timer);
@ -1529,7 +1487,7 @@ static int rk_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt)
unsigned int cif_for = 0;
const struct soc_mbus_pixelfmt *fmt;
int ret = 0;
struct soc_camera_host *ici = to_soc_camera_host(icd->parent); /*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
@ -1582,15 +1540,27 @@ static int rk_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt)
if (common_flags & V4L2_MBUS_PCLK_SAMPLE_FALLING) {
if(IS_CIF0()) {
write_cru_reg(CRU_PCLK_REG30, read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF0);
if(CHIP_NAME == 3368)
rk3368_write_cru_reg(CRU_PCLK_REG30, rk3368_read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF0);
else
write_cru_reg(CRU_PCLK_REG30, read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF0);
} else {
write_cru_reg(CRU_PCLK_REG30, read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF1);
if(CHIP_NAME == 3368)
rk3368_write_cru_reg(CRU_PCLK_REG30, rk3368_read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF1);
else
write_cru_reg(CRU_PCLK_REG30, read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF1);
}
} else {
if(IS_CIF0()){
write_cru_reg(CRU_PCLK_REG30, (read_cru_reg(CRU_PCLK_REG30) & 0xFFFFFF7F ) | DISABLE_INVERT_PCLK_CIF0);
if(CHIP_NAME == 3368)
rk3368_write_cru_reg(CRU_PCLK_REG30, (rk3368_read_cru_reg(CRU_PCLK_REG30) & 0xFFFFFF7F ) | DISABLE_INVERT_PCLK_CIF0);
else
write_cru_reg(CRU_PCLK_REG30, (read_cru_reg(CRU_PCLK_REG30) & 0xFFFFFF7F ) | DISABLE_INVERT_PCLK_CIF0);
} else {
write_cru_reg(CRU_PCLK_REG30, (read_cru_reg(CRU_PCLK_REG30) & 0xFFFEFFF) | DISABLE_INVERT_PCLK_CIF1);
if(CHIP_NAME == 3368)
rk3368_write_cru_reg(CRU_PCLK_REG30, (rk3368_read_cru_reg(CRU_PCLK_REG30) & 0xFFFEFFF) | DISABLE_INVERT_PCLK_CIF1);
else
write_cru_reg(CRU_PCLK_REG30, (read_cru_reg(CRU_PCLK_REG30) & 0xFFFEFFF) | DISABLE_INVERT_PCLK_CIF1);
}
}
@ -1686,7 +1656,7 @@ static const struct soc_mbus_pixelfmt rk_camera_formats[] = {
static void rk_camera_setup_format(struct soc_camera_device *icd, __u32 host_pixfmt, enum v4l2_mbus_pixelcode icd_code, struct v4l2_rect *rect)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
unsigned int cif_fs = 0,cif_crop = 0;
unsigned int cif_fmt_val = read_cif_reg(pcdev->base,CIF_CIF_FOR) | INPUT_MODE_YUV|YUV_INPUT_422|INPUT_420_ORDER_EVEN|OUTPUT_420_ORDER_EVEN;
@ -1731,7 +1701,7 @@ static void rk_camera_setup_format(struct soc_camera_device *icd, __u32 host_pix
pcdev->frame_inval = RK_CAM_FRAME_INVAL_INIT;
pcdev->pixfmt = host_pixfmt;
break;
default: /* ddl@rock-chips.com : vip output format is hold when pixfmt is invalidate */
default: /* ddl@rock-chips.com : vip output format is hold when pixfmt is invalidate */
cif_fmt_val |= YUV_OUTPUT_422;
break;
}
@ -1786,7 +1756,7 @@ static int rk_camera_get_formats(struct soc_camera_device *icd, unsigned int idx
struct soc_camera_format_xlate *xlate)
{
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
struct device *dev = icd->parent;/*yzm*/
struct device *dev = icd->parent;
int formats = 0, ret;
enum v4l2_mbus_pixelcode code;
const struct soc_mbus_pixelfmt *fmt;
@ -1794,7 +1764,7 @@ static int rk_camera_get_formats(struct soc_camera_device *icd, unsigned int idx
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
ret = v4l2_subdev_call(sd, video, enum_mbus_fmt, idx, &code); /*call generic_sensor_enum_fmt()*/
ret = v4l2_subdev_call(sd, video, enum_mbus_fmt, idx, &code);
if (ret < 0)
/* No more formats */
return 0;
@ -1904,7 +1874,7 @@ static int rk_camera_cropcap(struct soc_camera_device *icd, struct v4l2_cropcap
}
static int rk_camera_get_crop(struct soc_camera_device *icd,struct v4l2_crop *crop)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
@ -1919,7 +1889,7 @@ static int rk_camera_get_crop(struct soc_camera_device *icd,struct v4l2_crop *cr
static int rk_camera_set_crop(struct soc_camera_device *icd,
const struct v4l2_crop *crop)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
@ -1962,10 +1932,10 @@ static bool rk_camera_fmt_capturechk(struct v4l2_format *f)
static int rk_camera_set_fmt(struct soc_camera_device *icd,
struct v4l2_format *f)
{
struct device *dev = icd->parent;/*yzm*/
struct device *dev = icd->parent;
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
const struct soc_camera_format_xlate *xlate = NULL;
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
struct v4l2_pix_format *pix = &f->fmt.pix;
struct v4l2_mbus_framefmt mf;
@ -1990,9 +1960,9 @@ static int rk_camera_set_fmt(struct soc_camera_device *icd,
/* ddl@rock-chips.com: sensor init code transmit in here after open */
if (pcdev->icd_init == 0) {
v4l2_subdev_call(sd,core, init, 0); /*call generic_sensor_init()*/
v4l2_subdev_call(sd,core, init, 0);
pcdev->icd_init = 1;
return 0; /*directly return !!!!!!*/
return 0;
}
stream_on = read_cif_reg(pcdev->base,CIF_CIF_CTRL);
if (stream_on & ENABLE_CAPTURE)
@ -2006,7 +1976,7 @@ static int rk_camera_set_fmt(struct soc_camera_device *icd,
mf.reserved[0] = pix->priv; /* ddl@rock-chips.com : v0.3.3 */
mf.reserved[1] = 0;
ret = v4l2_subdev_call(sd, video, s_mbus_fmt, &mf); /*generic_sensor_s_fmt*/
ret = v4l2_subdev_call(sd, video, s_mbus_fmt, &mf);
if (mf.code != xlate->code)
return -EINVAL;
@ -2201,7 +2171,7 @@ static int rk_camera_set_fmt(struct soc_camera_device *icd,
static int rk_camera_try_fmt(struct soc_camera_device *icd,
struct v4l2_format *f)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
const struct soc_camera_format_xlate *xlate;
@ -2221,7 +2191,7 @@ static int rk_camera_try_fmt(struct soc_camera_device *icd,
xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
if (!xlate) {
/*dev_err(icd->dev.parent, "Format (%c%c%c%c) not found\n", pixfmt & 0xFF, (pixfmt >> 8) & 0xFF,*/
dev_err(icd->parent, "Format (%c%c%c%c) not found\n", pixfmt & 0xFF, (pixfmt >> 8) & 0xFF,/*yzm*/
dev_err(icd->parent, "Format (%c%c%c%c) not found\n", pixfmt & 0xFF, (pixfmt >> 8) & 0xFF,
(pixfmt >> 16) & 0xFF, (pixfmt >> 24) & 0xFF);
ret = -EINVAL;
RKCAMERA_TR("%s(version:%c%c%c) support format:\n",rk_cam_driver_description,(RK_CAM_VERSION_CODE&0xff0000)>>16,
@ -2254,7 +2224,6 @@ static int rk_camera_try_fmt(struct soc_camera_device *icd,
if ((usr_w == 10000) && (usr_h == 10000)) {
mf.reserved[6] = 0xfefe5a5a;
}
/* call generic_sensor_try_fmt()*/
ret = v4l2_subdev_call(sd, video, try_mbus_fmt, &mf);
if (ret < 0)
goto RK_CAMERA_TRY_FMT_END;
@ -2281,7 +2250,7 @@ static int rk_camera_try_fmt(struct soc_camera_device *icd,
pix->width = usr_w;
pix->height = usr_h;
} else {
/*RKCAMERA_TR("vipmem for IPP is overflow, This resolution(%dx%d -> %dx%d) is invalidate!\n",mf.width,mf.height,usr_w,usr_h);*/ /*yzm*/
/*RKCAMERA_TR("vipmem for IPP is overflow, This resolution(%dx%d -> %dx%d) is invalidate!\n",mf.width,mf.height,usr_w,usr_h);*/
pix->width = mf.width;
pix->height = mf.height;
}
@ -2408,7 +2377,7 @@ static int rk_camera_querycap(struct soc_camera_host *ici,
}
static int rk_camera_suspend(struct soc_camera_device *icd, pm_message_t state)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
struct v4l2_subdev *sd;
int ret = 0;
@ -2444,7 +2413,7 @@ static int rk_camera_suspend(struct soc_camera_device *icd, pm_message_t state)
static int rk_camera_resume(struct soc_camera_device *icd)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
struct v4l2_subdev *sd;
int ret = 0;
@ -2490,7 +2459,6 @@ static void rk_camera_reinit_work(struct work_struct *work)
struct v4l2_subdev *sd;
struct rk_camera_work *camera_work = container_of(work, struct rk_camera_work, work);
struct rk_camera_dev *pcdev = camera_work->pcdev;
/*struct soc_camera_link *tmp_soc_cam_link;*/
struct v4l2_mbus_framefmt mf;
int index = 0;
unsigned long flags = 0;
@ -2502,28 +2470,30 @@ static void rk_camera_reinit_work(struct work_struct *work)
if(pcdev->icd == NULL)
return;
sd = soc_camera_to_subdev(pcdev->icd);
/*tmp_soc_cam_desc = to_soc_camera_link(pcdev->icd);*/ /*yzm*/
/*dump regs*/
{
RKCAMERA_TR("CIF_CIF_CTRL = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_CTRL));
RKCAMERA_TR("CIF_CIF_INTEN = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_INTEN));
RKCAMERA_TR("CIF_CIF_INTSTAT = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_INTSTAT));
RKCAMERA_TR("CIF_CIF_FOR = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_FOR));
RKCAMERA_TR("CIF_CIF_CROP = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_CROP));
RKCAMERA_TR("CIF_CIF_SET_SIZE = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_SET_SIZE));
RKCAMERA_TR("CIF_CIF_SCL_CTRL = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_CTRL));
RKCAMERA_TR("CRU_PCLK_REG30 = 0X%lx\n",read_cru_reg(CRU_PCLK_REG30));
RKCAMERA_TR("CIF_CIF_LAST_LINE = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_LINE));
RKCAMERA_TR("CIF_CIF_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CTRL));
RKCAMERA_TR("CIF_CIF_INTEN = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTEN));
RKCAMERA_TR("CIF_CIF_INTSTAT = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTSTAT));
RKCAMERA_TR("CIF_CIF_FOR = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_FOR));
RKCAMERA_TR("CIF_CIF_CROP = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CROP));
RKCAMERA_TR("CIF_CIF_SET_SIZE = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SET_SIZE));
RKCAMERA_TR("CIF_CIF_SCL_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_CTRL));
if(CHIP_NAME == 3368)
RKCAMERA_TR("CRU_PCLK_REG30 = 0X%x\n",rk3368_read_cru_reg(CRU_PCLK_REG30));
else
RKCAMERA_TR("CRU_PCLK_REG30 = 0X%x\n",read_cru_reg(CRU_PCLK_REG30));
RKCAMERA_TR("CIF_CIF_LAST_LINE = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_LINE));
RKCAMERA_TR("CIF_CIF_LAST_PIX = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_PIX));
RKCAMERA_TR("CIF_CIF_VIR_LINE_WIDTH = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH));
RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
RKCAMERA_TR("CIF_CIF_FRM0_ADDR_Y = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_Y));
RKCAMERA_TR("CIF_CIF_FRM0_ADDR_UV = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_UV));
RKCAMERA_TR("CIF_CIF_FRAME_STATUS = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS));
RKCAMERA_TR("CIF_CIF_SCL_VALID_NUM = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_VALID_NUM));
RKCAMERA_TR("CIF_CIF_CUR_DST = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_CUR_DST));
RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
RKCAMERA_TR("CIF_CIF_LAST_PIX = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_PIX));
RKCAMERA_TR("CIF_CIF_VIR_LINE_WIDTH = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH));
RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
RKCAMERA_TR("CIF_CIF_FRM0_ADDR_Y = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_Y));
RKCAMERA_TR("CIF_CIF_FRM0_ADDR_UV = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_UV));
RKCAMERA_TR("CIF_CIF_FRAME_STATUS = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS));
RKCAMERA_TR("CIF_CIF_SCL_VALID_NUM = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_VALID_NUM));
RKCAMERA_TR("CIF_CIF_CUR_DST = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_CUR_DST));
RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
}
ctrl = read_cif_reg(pcdev->base,CIF_CIF_CTRL); /*ddl@rock-chips.com v0.3.0x13*/
@ -2585,9 +2555,6 @@ static enum hrtimer_restart rk_camera_fps_func(struct hrtimer *timer)
struct rk_camera_timer *fps_timer = container_of(timer, struct rk_camera_timer, timer);
struct rk_camera_dev *pcdev = fps_timer->pcdev;
int rec_flag,i;
/*static unsigned int last_fps = 0;*/
/*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__);
@ -2611,7 +2578,7 @@ static enum hrtimer_restart rk_camera_fps_func(struct hrtimer *timer)
fival_pre = fival_nxt;
while (fival_nxt != NULL) {
RKCAMERA_DG1("%s %c%c%c%c %dx%d framerate : %d/%d\n", dev_name(pcdev->icd->control), /*yzm*/
RKCAMERA_DG1("%s %c%c%c%c %dx%d framerate : %d/%d\n", dev_name(pcdev->icd->control),
fival_nxt->fival.pixel_format & 0xFF, (fival_nxt->fival.pixel_format >> 8) & 0xFF,
(fival_nxt->fival.pixel_format >> 16) & 0xFF, (fival_nxt->fival.pixel_format >> 24),
fival_nxt->fival.width, fival_nxt->fival.height, fival_nxt->fival.discrete.denominator,
@ -2673,7 +2640,7 @@ static enum hrtimer_restart rk_camera_fps_func(struct hrtimer *timer)
}
static int rk_camera_s_stream(struct soc_camera_device *icd, int enable)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
int cif_ctrl_val;
int ret;
@ -2705,7 +2672,7 @@ static int rk_camera_s_stream(struct soc_camera_device *icd, int enable)
cif_ctrl_val |= ENABLE_CAPTURE;
write_cif_reg(pcdev->base,CIF_CIF_CTRL, cif_ctrl_val);
spin_unlock_irqrestore(&pcdev->lock,flags);
printk("%s:stream enable CIF_CIF_CTRL 0x%lx\n",__func__,read_cif_reg(pcdev->base,CIF_CIF_CTRL));
printk("%s:stream enable CIF_CIF_CTRL 0x%x\n",__func__,read_cif_reg(pcdev->base,CIF_CIF_CTRL));
hrtimer_start(&(pcdev->fps_timer.timer),ktime_set(3, 0),HRTIMER_MODE_REL);
pcdev->fps_timer.istarted = true;
} else {
@ -2735,12 +2702,12 @@ static int rk_camera_s_stream(struct soc_camera_device *icd, int enable)
pcdev->active = NULL;
INIT_LIST_HEAD(&pcdev->capture);
}
RKCAMERA_DG1("s_stream: enable : 0x%x , CIF_CIF_CTRL = 0x%lx\n",enable,read_cif_reg(pcdev->base,CIF_CIF_CTRL));
RKCAMERA_DG1("s_stream: enable : 0x%x , CIF_CIF_CTRL = 0x%x\n",enable,read_cif_reg(pcdev->base,CIF_CIF_CTRL));
return 0;
}
int rk_camera_enum_frameintervals(struct soc_camera_device *icd, struct v4l2_frmivalenum *fival)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
struct rk_camera_frmivalenum *fival_list = NULL;
@ -2874,7 +2841,7 @@ static int rk_camera_set_digit_zoom(struct soc_camera_device *icd,
const struct v4l2_queryctrl *qctrl, int zoom_rate)
{
struct v4l2_crop a;
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct rk_camera_dev *pcdev = ici->priv;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
@ -2962,7 +2929,7 @@ static inline struct v4l2_queryctrl const *rk_camera_soc_camera_find_qctrl(
static int rk_camera_set_ctrl(struct soc_camera_device *icd,
struct v4l2_control *sctrl)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);/*yzm*/
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
const struct v4l2_queryctrl *qctrl;
struct rk_camera_dev *pcdev = ici->priv;
@ -3026,7 +2993,6 @@ static struct soc_camera_host_ops rk_soc_camera_host_ops =
.num_controls = ARRAY_SIZE(rk_camera_controls)
};
/**********yzm***********/
static int rk_camera_cif_iomux(struct device *dev)
{
@ -3040,6 +3006,9 @@ static int rk_camera_cif_iomux(struct device *dev)
if(CHIP_NAME == 3288){
__raw_writel(((1<<1)|(1<<(1+16))),RK_GRF_VIRT+0x0380);
}else if(CHIP_NAME == 3368){
//__raw_writel(((1<<1)|(1<<(1+16))),RK_GRF_VIRT+0x0900);
__raw_writel(((1<<1)|(1<<(1+16))),rk_cif_grf_base+0x0900);
}
/*mux CIF0_CLKOUT*/
@ -3068,7 +3037,6 @@ static int rk_camera_cif_iomux(struct device *dev)
return 0;
}
/***********yzm***********/
static int rk_camera_probe(struct platform_device *pdev)
{
struct rk_camera_dev *pcdev;
@ -3077,7 +3045,7 @@ static int rk_camera_probe(struct platform_device *pdev)
int irq,i;
int err = 0;
struct rk_cif_clk *clk=NULL;
struct device *dev_cif = ((struct rk29camera_platform_data*)pdev->dev.platform_data)->cif_dev;/*yzm*/
struct device *dev_cif = ((struct rk29camera_platform_data*)pdev->dev.platform_data)->cif_dev;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
@ -3094,7 +3062,6 @@ static int rk_camera_probe(struct platform_device *pdev)
BUG();
}
/***********yzm**********/
rk_camera_diffchips(((struct rk29camera_platform_data*)pdev->dev.platform_data)->rockchip_name);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@ -3123,40 +3090,41 @@ static int rk_camera_probe(struct platform_device *pdev)
pcdev->chip_id = -1;
#endif
/***********yzm***********/
if (IS_CIF0()) {
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/is_cif0\n");
clk = &cif_clk[0];
cif_clk[0].pd_cif = devm_clk_get(dev_cif, "pd_cif0");
if(CHIP_NAME != 3368)
cif_clk[0].pd_cif = devm_clk_get(dev_cif, "pd_cif0");
cif_clk[0].aclk_cif = devm_clk_get(dev_cif, "aclk_cif0");
cif_clk[0].hclk_cif = devm_clk_get(dev_cif, "hclk_cif0");
cif_clk[0].cif_clk_in = devm_clk_get(dev_cif, "cif0_in");
cif_clk[0].cif_clk_out = devm_clk_get(dev_cif, "cif0_out");
//spin_lock_init(&cif_clk[0].lock);
cif_clk[0].on = false;
rk_camera_cif_iomux(dev_cif);/*yzm*/
rk_camera_cif_iomux(dev_cif);
} else {
clk = &cif_clk[1];
cif_clk[1].pd_cif = devm_clk_get(dev_cif, "pd_cif0");/*cif0 only yzm*/
if(CHIP_NAME != 3368)
cif_clk[1].pd_cif = devm_clk_get(dev_cif, "pd_cif0");/*cif0 only */
cif_clk[1].aclk_cif = devm_clk_get(dev_cif, "aclk_cif0");
cif_clk[1].hclk_cif = devm_clk_get(dev_cif, "hclk_cif0");
cif_clk[1].cif_clk_in = devm_clk_get(dev_cif, "cif0_in");
cif_clk[1].cif_clk_out = devm_clk_get(dev_cif, "cif0_out");
//spin_lock_init(&cif_clk[1].lock);
cif_clk[1].on = false;
rk_camera_cif_iomux(dev_cif);/*yzm*/
rk_camera_cif_iomux(dev_cif);
}
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
/***********yzm**********/
dev_set_drvdata(&pdev->dev, pcdev);
pcdev->res = res;
pcdev->pdata = pdev->dev.platform_data; /* ddl@rock-chips.com : Request IO in init function */
/*= rk_camera_platform_data */
if (pcdev->pdata && pcdev->pdata->io_init) {
pcdev->pdata->io_init();/* call rk_sensor_io_init()*/
pcdev->pdata->io_init();
if (pcdev->pdata->sensor_mclk == NULL)
pcdev->pdata->sensor_mclk = rk_camera_mclk_ctrl;
@ -3222,7 +3190,7 @@ static int rk_camera_probe(struct platform_device *pdev)
}
pcdev->soc_host.drv_name = RK29_CAM_DRV_NAME;
pcdev->soc_host.ops = &rk_soc_camera_host_ops;
pcdev->soc_host.priv = pcdev; /*to itself,csll in rk_camera_add_device*/
pcdev->soc_host.priv = pcdev;
pcdev->soc_host.v4l2_dev.dev = &pdev->dev;
pcdev->soc_host.nr = pdev->id;
debug_printk("/$$$$$$$$$$$$$$$$$$$$$$/next soc_camera_host_register\n");
@ -3272,8 +3240,10 @@ static int rk_camera_probe(struct platform_device *pdev)
release_mem_region(res->start, res->end - res->start + 1);
exit_reqmem_vip:
if (clk) {
if (clk->pd_cif)
clk_put(clk->pd_cif);
if(CHIP_NAME != 3368){
if (clk->pd_cif)
clk_put(clk->pd_cif);
}
if (clk->aclk_cif)
clk_put(clk->aclk_cif);
if (clk->hclk_cif)

View File

@ -161,13 +161,16 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
#define CIF_F0_READY (0x01<<0)
#define CIF_F1_READY (0x01<<1)
extern unsigned long rk_cif_grf_base;
extern unsigned long rk_cif_cru_base;
#define MIN(x,y) ((x<y) ? x: y)
#define MAX(x,y) ((x>y) ? x: y)
#define RK_SENSOR_24MHZ 24*1000*1000 /* MHz */
#define RK_SENSOR_48MHZ 48
#define __raw_readl(p) (*(unsigned long *)(p))
#define __raw_writel(v,p) (*(unsigned long *)(p) = (v))
#define __raw_readl(p) (*(unsigned int *)(p))
#define __raw_writel(v,p) (*(unsigned int *)(p) = (v))
#define write_cif_reg(base,addr, val) __raw_writel(val, addr+(base))
#define read_cif_reg(base,addr) __raw_readl(addr+(base))
@ -207,6 +210,11 @@ static u32 CHIP_NAME;
#define write_cru_reg(addr, val) __raw_writel(val, addr+RK_CRU_VIRT)
#define read_cru_reg(addr) __raw_readl(addr+RK_CRU_VIRT)
#define mask_cru_reg(addr, msk, val) write_cru_reg(addr,(val)|((~(msk))&read_cru_reg(addr)))
#define rk3368_write_cru_reg(addr, val) __raw_writel(val, addr+rk_cif_cru_base)
#define rk3368_read_cru_reg(addr) __raw_readl(addr+rk_cif_cru_base)
#define rk3368_mask_cru_reg(addr, msk, val) rk3368_write_cru_reg(addr,(val)|((~(msk))&rk3368_read_cru_reg(addr)))
/*********yzm*********end*/
/*
#if defined(CONFIG_ARCH_RK2928)
@ -282,8 +290,10 @@ static u32 CHIP_NAME;
1. Support pingpong mode.
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
*v0.1.a:
1. Support rk3368.
*/
#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);
@ -366,7 +376,7 @@ struct rk_camera_zoominfo
#if CAMERA_VIDEOBUF_ARM_ACCESS
struct rk29_camera_vbinfo
{
unsigned int phy_addr;
unsigned long phy_addr;
void __iomem *vir_addr;
unsigned int size;
};
@ -424,7 +434,7 @@ struct rk_camera_dev
unsigned long frame_interval;
unsigned int pixfmt;
/*for ipp */
unsigned int vipmem_phybase;
unsigned long vipmem_phybase;
void __iomem *vipmem_virbase;
unsigned int vipmem_size;
unsigned int vipmem_bsize;
@ -508,12 +518,33 @@ static void rk_camera_diffchips(const char *rockchip_name)
CRU_CLKSEL29_CON = 0xb8;
CHIP_NAME = 3126;
}else if(strstr(rockchip_name,"3368"))
{
CRU_PCLK_REG30 = 0x154;
ENANABLE_INVERT_PCLK_CIF0 = ((0x1<<29)|(0x1<<13));
DISABLE_INVERT_PCLK_CIF0 = ((0x1<<29)|(0x0<<13));
ENANABLE_INVERT_PCLK_CIF1 = ENANABLE_INVERT_PCLK_CIF0;
DISABLE_INVERT_PCLK_CIF1 = DISABLE_INVERT_PCLK_CIF0;
//CRU_CLK_OUT = 0x16c;
CHIP_NAME = 3368;
}
}
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;
void __iomem *reg;
if(CHIP_NAME == 3368)
reg = (void*)(rk_cif_cru_base + RK_CRU_SOFTRST_CON);
else
reg = (void*)(RK_CRU_VIRT + RK_CRU_SOFTRST_CON);
if(CHIP_NAME == 3126){
val = on ? 0x10001U << 14 : 0x10000U << 14;
}else if(CHIP_NAME == 3368){
val = on ? 0x10001U << 8 : 0x10000U << 8;
}
writel_relaxed(val, reg);
dsb();
}
@ -525,6 +556,8 @@ static void rk_camera_cif_reset(struct rk_camera_dev *pcdev, int only_rst)
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"))
RK_CRU_SOFTRST_CON = RK312X_CRU_SOFTRSTS_CON(6);
else if(strstr(pcdev->pdata->rockchip_name,"3368"))
RK_CRU_SOFTRST_CON = RK3368_CRU_SOFTRSTS_CON(6);
if (only_rst == true) {
rk_cru_set_soft_reset(0, true ,RK_CRU_SOFTRST_CON);
@ -737,7 +770,7 @@ static int rk_videobuf_prepare(struct videobuf_queue *vq, struct videobuf_buffer
static inline void rk_videobuf_capture(struct videobuf_buffer *vb,struct rk_camera_dev *rk_pcdev, int fmt_ready)
{
unsigned int y_addr,uv_addr;
unsigned long y_addr,uv_addr;
struct rk_camera_dev *pcdev = rk_pcdev;
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
@ -1302,8 +1335,9 @@ static int rk_camera_mclk_ctrl(int cif_idx, int on, int clk_rate)
}
//spin_lock(&clk->lock);
if (on && !clk->on) {
clk_prepare_enable(clk->pd_cif); /*yzm*/
if (on && !clk->on) {
if(CHIP_NAME != 3368)
clk_prepare_enable(clk->pd_cif); /*yzm*/
clk_prepare_enable(clk->aclk_cif);
clk_prepare_enable(clk->hclk_cif);
clk_prepare_enable(clk->cif_clk_in);
@ -1321,7 +1355,8 @@ static int rk_camera_mclk_ctrl(int cif_idx, int on, int clk_rate)
write_cru_reg(CRU_CLK_OUT, 0x00800080);
}
clk_disable_unprepare(clk->cif_clk_out);
clk_disable_unprepare(clk->pd_cif);
if(CHIP_NAME != 3368)
clk_disable_unprepare(clk->pd_cif);
clk->on = false;
}
//spin_unlock(&clk->lock);
@ -1587,15 +1622,27 @@ static int rk_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt)
if (common_flags & V4L2_MBUS_PCLK_SAMPLE_FALLING) {
if(IS_CIF0()) {
write_cru_reg(CRU_PCLK_REG30, read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF0);
if(CHIP_NAME == 3368)
rk3368_write_cru_reg(CRU_PCLK_REG30, rk3368_read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF0);
else
write_cru_reg(CRU_PCLK_REG30, read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF0);
} else {
write_cru_reg(CRU_PCLK_REG30, read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF1);
if(CHIP_NAME == 3368)
rk3368_write_cru_reg(CRU_PCLK_REG30, rk3368_read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF1);
else
write_cru_reg(CRU_PCLK_REG30, read_cru_reg(CRU_PCLK_REG30) | ENANABLE_INVERT_PCLK_CIF1);
}
} else {
if(IS_CIF0()){
write_cru_reg(CRU_PCLK_REG30, (read_cru_reg(CRU_PCLK_REG30) & 0xFFFFEFF ) | DISABLE_INVERT_PCLK_CIF0);
if(CHIP_NAME == 3368)
rk3368_write_cru_reg(CRU_PCLK_REG30, (rk3368_read_cru_reg(CRU_PCLK_REG30) & 0xFFFFEFF ) | DISABLE_INVERT_PCLK_CIF0);
else
write_cru_reg(CRU_PCLK_REG30, (read_cru_reg(CRU_PCLK_REG30) & 0xFFFFEFF ) | DISABLE_INVERT_PCLK_CIF0);
} else {
write_cru_reg(CRU_PCLK_REG30, (read_cru_reg(CRU_PCLK_REG30) & 0xFFFEFFF) | DISABLE_INVERT_PCLK_CIF1);
if(CHIP_NAME == 3368)
rk3368_write_cru_reg(CRU_PCLK_REG30, (rk3368_read_cru_reg(CRU_PCLK_REG30) & 0xFFFEFFF) | DISABLE_INVERT_PCLK_CIF1);
else
write_cru_reg(CRU_PCLK_REG30, (read_cru_reg(CRU_PCLK_REG30) & 0xFFFEFFF) | DISABLE_INVERT_PCLK_CIF1);
}
}
@ -2511,25 +2558,28 @@ static void rk_camera_reinit_work(struct work_struct *work)
/*tmp_soc_cam_desc = to_soc_camera_link(pcdev->icd);*/ /*yzm*/
/*dump regs*/
{
RKCAMERA_TR("CIF_CIF_CTRL = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_CTRL));
RKCAMERA_TR("CIF_CIF_INTEN = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_INTEN));
RKCAMERA_TR("CIF_CIF_INTSTAT = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_INTSTAT));
RKCAMERA_TR("CIF_CIF_FOR = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_FOR));
RKCAMERA_TR("CIF_CIF_CROP = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_CROP));
RKCAMERA_TR("CIF_CIF_SET_SIZE = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_SET_SIZE));
RKCAMERA_TR("CIF_CIF_SCL_CTRL = 0x%lx\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_CTRL));
RKCAMERA_TR("CRU_PCLK_REG30 = 0X%lx\n",read_cru_reg(CRU_PCLK_REG30));
RKCAMERA_TR("CIF_CIF_LAST_LINE = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_LINE));
RKCAMERA_TR("CIF_CIF_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CTRL));
RKCAMERA_TR("CIF_CIF_INTEN = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTEN));
RKCAMERA_TR("CIF_CIF_INTSTAT = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTSTAT));
RKCAMERA_TR("CIF_CIF_FOR = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_FOR));
RKCAMERA_TR("CIF_CIF_CROP = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CROP));
RKCAMERA_TR("CIF_CIF_SET_SIZE = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SET_SIZE));
RKCAMERA_TR("CIF_CIF_SCL_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_CTRL));
if(CHIP_NAME == 3368)
RKCAMERA_TR("CRU_PCLK_REG30 = 0X%x\n",rk3368_read_cru_reg(CRU_PCLK_REG30));
else
RKCAMERA_TR("CRU_PCLK_REG30 = 0X%x\n",read_cru_reg(CRU_PCLK_REG30));
RKCAMERA_TR("CIF_CIF_LAST_LINE = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_LINE));
RKCAMERA_TR("CIF_CIF_LAST_PIX = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_PIX));
RKCAMERA_TR("CIF_CIF_VIR_LINE_WIDTH = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH));
RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
RKCAMERA_TR("CIF_CIF_FRM0_ADDR_Y = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_Y));
RKCAMERA_TR("CIF_CIF_FRM0_ADDR_UV = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_UV));
RKCAMERA_TR("CIF_CIF_FRAME_STATUS = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS));
RKCAMERA_TR("CIF_CIF_SCL_VALID_NUM = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_VALID_NUM));
RKCAMERA_TR("CIF_CIF_CUR_DST = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_CUR_DST));
RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%lx\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
RKCAMERA_TR("CIF_CIF_LAST_PIX = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_PIX));
RKCAMERA_TR("CIF_CIF_VIR_LINE_WIDTH = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH));
RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
RKCAMERA_TR("CIF_CIF_FRM0_ADDR_Y = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_Y));
RKCAMERA_TR("CIF_CIF_FRM0_ADDR_UV = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_UV));
RKCAMERA_TR("CIF_CIF_FRAME_STATUS = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS));
RKCAMERA_TR("CIF_CIF_SCL_VALID_NUM = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_VALID_NUM));
RKCAMERA_TR("CIF_CIF_CUR_DST = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_CUR_DST));
RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
}
ctrl = read_cif_reg(pcdev->base,CIF_CIF_CTRL); /*ddl@rock-chips.com v0.3.0x13*/
@ -2736,7 +2786,7 @@ static int rk_camera_s_stream(struct soc_camera_device *icd, int enable)
pcdev->active_buf = 0;
INIT_LIST_HEAD(&pcdev->capture);
}
RKCAMERA_DG1("s_stream: enable : 0x%x , CIF_CIF_CTRL = 0x%lx\n",enable,read_cif_reg(pcdev->base,CIF_CIF_CTRL));
RKCAMERA_DG1("s_stream: enable : 0x%x , CIF_CIF_CTRL = 0x%x\n",enable,read_cif_reg(pcdev->base,CIF_CIF_CTRL));
return 0;
}
int rk_camera_enum_frameintervals(struct soc_camera_device *icd, struct v4l2_frmivalenum *fival)
@ -3041,7 +3091,10 @@ 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");
if(CHIP_NAME == 3368)
strcpy(state_str,"cif_pin_all");
else
strcpy(state_str,"cif_pin_jpe");
/*__raw_writel(((1<<1)|(1<<(1+16))),RK_GRF_VIRT+0x0380);*/
@ -3131,7 +3184,8 @@ static int rk_camera_probe(struct platform_device *pdev)
if (IS_CIF0()) {
debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/is_cif0\n");
clk = &cif_clk[0];
cif_clk[0].pd_cif = devm_clk_get(dev_cif, "pd_cif0");
if(CHIP_NAME != 3368)
cif_clk[0].pd_cif = devm_clk_get(dev_cif, "pd_cif0");
cif_clk[0].aclk_cif = devm_clk_get(dev_cif, "aclk_cif0");
cif_clk[0].hclk_cif = devm_clk_get(dev_cif, "hclk_cif0");
cif_clk[0].cif_clk_in = devm_clk_get(dev_cif, "cif0_in");
@ -3141,7 +3195,8 @@ static int rk_camera_probe(struct platform_device *pdev)
rk_camera_cif_iomux(dev_cif);/*yzm*/
} else {
clk = &cif_clk[1];
cif_clk[1].pd_cif = devm_clk_get(dev_cif, "pd_cif0");/*cif0 only yzm*/
if(CHIP_NAME != 3368)
cif_clk[1].pd_cif = devm_clk_get(dev_cif, "pd_cif0");/*cif0 only yzm*/
cif_clk[1].aclk_cif = devm_clk_get(dev_cif, "aclk_cif0");
cif_clk[1].hclk_cif = devm_clk_get(dev_cif, "hclk_cif0");
cif_clk[1].cif_clk_in = devm_clk_get(dev_cif, "cif0_in");
@ -3276,8 +3331,10 @@ static int rk_camera_probe(struct platform_device *pdev)
release_mem_region(res->start, res->end - res->start + 1);
exit_reqmem_vip:
if (clk) {
if (clk->pd_cif)
clk_put(clk->pd_cif);
if(CHIP_NAME != 3368){
if (clk->pd_cif)
clk_put(clk->pd_cif);
}
if (clk->aclk_cif)
clk_put(clk->aclk_cif);
if (clk->hclk_cif)

View File

@ -241,4 +241,19 @@ enum rk312x_cru_clk_gate {
RK312X_CLKGATE_PCLK_UART1,
RK312X_CLKGATE_PCLK_UART2,
};
/*************************RK3368********************************/
/*******************CRU OFFSET*********************/
#define RK3368_CRU_CLKSEL_CON 0x100
#define RK3368_CRU_CLKGATE_CON 0x200
#define RK3368_PLL_CONS(id, i) ((id) * 0x10 + ((i) * 4))
#define RK3368_CRU_CLKSELS_CON(i) (RK3368_CRU_CLKSEL_CON + ((i) * 4))
#define RK3368_CRU_CLKGATES_CON(i) (RK3368_CRU_CLKGATE_CON + ((i) * 4))
#define RK3368_CRU_SOFTRSTS_CON_CNT (15)
#define RK3368_CRU_SOFTRST_CON 0x300
#define RK3368_CRU_SOFTRSTS_CON(i) (RK3368_CRU_SOFTRST_CON + ((i) * 4))
#endif