//set frequency of master clock int vfe_set_mclk_freq(struct v4l2_subdev *sd, unsigned long freq) { #ifdef VFE_CLK struct vfe_dev *dev=(struct vfe_dev *)dev_get_drvdata(sd->v4l2_dev->dev); struct clk *master_clk_src; if(freq==24000000 || freq==12000000 || freq==6000000) { if(dev->clock.vfe_master_clk_24M_src) { master_clk_src = dev->clock.vfe_master_clk_24M_src; } else { vfe_err("vfe master clock 24M source is null\n"); return -1; } } else { if(dev->clock.vfe_master_clk_pll_src) { master_clk_src = dev->clock.vfe_master_clk_pll_src; } else { vfe_err("vfe master clock pll source is null\n"); return -1; } } if(dev->clock.vfe_master_clk) { if(os_clk_set_parent(dev->clock.vfe_master_clk, master_clk_src)) { vfe_err("set vfe master clock source failed \n"); return -1; } } else { vfe_err("vfe master clock is null\n"); return -1; } if(dev->clock.vfe_master_clk) { if(os_clk_set_rate(dev->clock.vfe_master_clk, freq)) { vfe_err("set vip%d master clock error\n",dev->vip_sel); return -1; } } else { vfe_err("vfe master clock is null\n"); return -1; } #endif return 0; }
static int __devinit cci_probe(struct platform_device *pdev) { struct cci_dev *cci = NULL; struct resource *res = NULL; struct cci_platform_data *pdata = NULL; int ret, irq = 0; if(pdev->dev.platform_data == NULL) { return -ENODEV; } pdata = pdev->dev.platform_data; vfe_print("cci probe start cci_sel = %d!\n",pdata->cci_sel); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); irq = platform_get_irq(pdev, 0); if (res == NULL || irq < 0) { return -ENODEV; } if (!request_mem_region(res->start, resource_size(res), res->name)) { return -ENOMEM; } cci = kzalloc(sizeof(struct cci_dev), GFP_KERNEL); if (!cci) { ret = -ENOMEM; goto ekzalloc; } cci->irq = irq; cci->cci_sel = pdata->cci_sel; spin_lock_init(&cci->slock); init_waitqueue_head(&cci->wait); cci->base = ioremap(res->start, resource_size(res)); if (!cci->base) { ret = -EIO; goto eremap; } ret = request_irq(irq, cci_irq_handler, IRQF_DISABLED, CCI_MODULE_NAME, cci); if (ret) { vfe_err("[cci_%d] requeset irq failed!\n", cci->cci_sel); goto ereqirq; } #if defined (CONFIG_ARCH_SUN9IW1P1) ret = bsp_csi_cci_set_base_addr(cci->cci_sel, (unsigned int)cci->base); if(ret < 0) goto ehwinit; #else ret = bsp_csi_cci_set_base_addr(0, (unsigned int)cci->base); if(ret < 0) goto ehwinit; ret = bsp_csi_cci_set_base_addr(1, (unsigned int)cci->base); if(ret < 0) goto ehwinit; #endif platform_set_drvdata(pdev, cci); vfe_print("cci probe end cci_sel = %d!\n",pdata->cci_sel); return 0; ehwinit: free_irq(irq, cci); ereqirq: iounmap(cci->base); eremap: kfree(cci); ekzalloc: vfe_print("cci probe err!\n"); return ret; }
int fetch_config(struct vfe_dev *dev) { #ifndef FPGA_VER int ret; unsigned int i,j; char vfe_para[16] = {0}; char dev_para[16] = {0}; script_item_u val; script_item_value_type_e type; sprintf(vfe_para, "vip%d_para", dev->id); /* fetch device quatity issue */ type = script_get_item(vfe_para,"vip_dev_qty", &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { dev->dev_qty=1; vfe_err("fetch csi_dev_qty from sys_config failed\n"); } else { dev->dev_qty=val.val; vfe_dbg(0,"vip%d_para vip_dev_qty=%d\n",dev->id, dev->dev_qty); } for(i=0; i<dev->dev_qty; i++) { /* i2c and module name*/ sprintf(dev_para, "vip_dev%d_twi_id", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { vfe_err("fetch vip_dev%d_twi_id from sys_config failed\n", i); } else { dev->ccm_cfg[i]->twi_id = val.val; } ret = strcmp(dev->ccm_cfg[i]->ccm,""); if((dev->ccm_cfg[i]->i2c_addr == 0xff) && (ret == 0)) //when insmod without parm { sprintf(dev_para, "vip_dev%d_twi_addr", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { vfe_err("fetch vip_dev%d_twi_addr from sys_config failed\n", i); } else { dev->ccm_cfg[i]->i2c_addr = val.val; } sprintf(dev_para, "vip_dev%d_mname", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_STR != type) { char tmp_str[]="ov5650"; strcpy(dev->ccm_cfg[i]->ccm,tmp_str); vfe_err("fetch vip_dev%d_mname from sys_config failed\n", i); } else { strcpy(dev->ccm_cfg[i]->ccm,val.str); } } /* isp used mode */ sprintf(dev_para, "vip_dev%d_isp_used", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { vfe_dbg(0,"fetch vip_dev%d_isp_used from sys_config failed\n", i); } else { dev->ccm_cfg[i]->is_isp_used = val.val; } /* fmt */ sprintf(dev_para, "vip_dev%d_fmt", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { vfe_dbg(0,"fetch vip_dev%d_fmt from sys_config failed\n", i); } else { dev->ccm_cfg[i]->is_bayer_raw = val.val; } /* standby mode */ sprintf(dev_para, "vip_dev%d_stby_mode", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { vfe_dbg(0,"fetch vip_dev%d_stby_mode from sys_config failed\n", i); } else { dev->ccm_cfg[i]->power.stby_mode = val.val; } /* fetch flip issue */ sprintf(dev_para, "vip_dev%d_vflip", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { vfe_dbg(0,"fetch vip_dev%d_vflip from sys_config failed\n", i); } else { dev->ccm_cfg[i]->vflip = val.val; } sprintf(dev_para, "vip_dev%d_hflip", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { vfe_dbg(0,"fetch vip_dev%d_hflip from sys_config failed\n", i); } else { dev->ccm_cfg[i]->hflip = val.val; } /* fetch power issue*/ sprintf(dev_para, "vip_dev%d_iovdd", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_STR != type) { char null_str[]=""; strcpy(dev->ccm_cfg[i]->iovdd_str,null_str); vfe_dbg(0,"fetch vip_dev%d_iovdd from sys_config failed\n", i); } else { strcpy(dev->ccm_cfg[i]->iovdd_str,val.str); } sprintf(dev_para, "vip_dev%d_iovdd_vol", i); type = script_get_item(vfe_para,dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { dev->ccm_cfg[i]->power.iovdd_vol=0; vfe_dbg(0,"fetch vip_dev%d_iovdd_vol from sys_config failed, default =0\n",i); } else { dev->ccm_cfg[i]->power.iovdd_vol=val.val; } sprintf(dev_para, "vip_dev%d_avdd", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_STR != type) { char null_str[]=""; strcpy(dev->ccm_cfg[i]->avdd_str,null_str); vfe_dbg(0,"fetch vip_dev%d_avdd from sys_config failed\n", i); } else { strcpy(dev->ccm_cfg[i]->avdd_str,val.str); } sprintf(dev_para, "vip_dev%d_avdd_vol", i); type = script_get_item(vfe_para,dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { dev->ccm_cfg[i]->power.avdd_vol=0; vfe_dbg(0,"fetch vip_dev%d_avdd_vol from sys_config failed, default =0\n",i); } else { dev->ccm_cfg[i]->power.avdd_vol=val.val; } sprintf(dev_para, "vip_dev%d_dvdd", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_STR != type){ char null_str[]=""; strcpy(dev->ccm_cfg[i]->dvdd_str,null_str); vfe_dbg(0,"fetch vip_dev%d_dvdd from sys_config failed\n", i); } else { strcpy(dev->ccm_cfg[i]->dvdd_str, val.str); } sprintf(dev_para, "vip_dev%d_dvdd_vol", i); type = script_get_item(vfe_para,dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { dev->ccm_cfg[i]->power.dvdd_vol=0; vfe_dbg(0,"fetch vip_dev%d_dvdd_vol from sys_config failed, default =0\n",i); } else { dev->ccm_cfg[i]->power.dvdd_vol=val.val; } sprintf(dev_para, "vip_dev%d_afvdd", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_STR != type) { char null_str[]=""; strcpy(dev->ccm_cfg[i]->afvdd_str,null_str); vfe_dbg(0,"fetch vip_dev%d_afvdd from sys_config failed\n", i); } else { strcpy(dev->ccm_cfg[i]->afvdd_str, val.str); } sprintf(dev_para, "vip_dev%d_afvdd_vol", i); type = script_get_item(vfe_para,dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { dev->ccm_cfg[i]->power.afvdd_vol=0; vfe_dbg(0,"fetch vip_dev%d_afvdd_vol from sys_config failed, default =0\n",i); } else { dev->ccm_cfg[i]->power.afvdd_vol=val.val; } /* fetch reset/power/standby/flash/af io issue */ sprintf(dev_para, "vip_dev%d_reset", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) { dev->ccm_cfg[i]->gpio.reset_io.gpio = GPIO_INDEX_INVALID; vfe_dbg(0,"fetch vip_dev%d_reset from sys_config failed\n", i); } else { dev->ccm_cfg[i]->gpio.reset_io.gpio=val.gpio.gpio; dev->ccm_cfg[i]->gpio.reset_io.mul_sel=val.gpio.mul_sel; } sprintf(dev_para, "vip_dev%d_pwdn", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_PIO != type){ dev->ccm_cfg[i]->gpio.pwdn_io.gpio = GPIO_INDEX_INVALID; vfe_dbg(0,"fetch vip_dev%d_stby from sys_config failed\n", i); } else { dev->ccm_cfg[i]->gpio.pwdn_io.gpio=val.gpio.gpio; dev->ccm_cfg[i]->gpio.pwdn_io.mul_sel=val.gpio.mul_sel; } sprintf(dev_para, "vip_dev%d_power_en", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) { dev->ccm_cfg[i]->gpio.power_en_io.gpio = GPIO_INDEX_INVALID; vfe_dbg(0,"fetch vip_dev%d_power_en from sys_config failed\n", i); } else { dev->ccm_cfg[i]->gpio.power_en_io.gpio=val.gpio.gpio; dev->ccm_cfg[i]->gpio.power_en_io.mul_sel=val.gpio.mul_sel; } sprintf(dev_para, "vip_dev%d_flash_en", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) { dev->ccm_cfg[i]->gpio.flash_en_io.gpio = GPIO_INDEX_INVALID; dev->ccm_cfg[i]->flash_used=0; vfe_dbg(0,"fetch vip_dev%d_flash_en from sys_config failed\n", i); } else { dev->ccm_cfg[i]->gpio.flash_en_io.gpio=val.gpio.gpio; dev->ccm_cfg[i]->gpio.flash_en_io.mul_sel=val.gpio.mul_sel; dev->ccm_cfg[i]->flash_used=1; } sprintf(dev_para, "vip_dev%d_flash_mode", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) { dev->ccm_cfg[i]->gpio.flash_mode_io.gpio = GPIO_INDEX_INVALID; vfe_dbg(0,"fetch vip_dev%d_flash_mode from sys_config failed\n", i); } else { dev->ccm_cfg[i]->gpio.flash_mode_io.gpio=val.gpio.gpio; dev->ccm_cfg[i]->gpio.flash_mode_io.mul_sel=val.gpio.mul_sel; } sprintf(dev_para, "vip_dev%d_af_pwdn", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) { dev->ccm_cfg[i]->gpio.af_pwdn_io.gpio = GPIO_INDEX_INVALID; vfe_dbg(0,"fetch vip_dev%d_af_pwdn from sys_config failed\n", i); } else { dev->ccm_cfg[i]->gpio.af_pwdn_io.gpio=val.gpio.gpio; dev->ccm_cfg[i]->gpio.af_pwdn_io.mul_sel=val.gpio.mul_sel; } /* fetch actuator issue */ sprintf(dev_para, "vip_dev%d_act_used", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { dev->ccm_cfg[i]->act_used= 0; vfe_dbg(0,"fetch vip_dev%d_act_used from sys_config failed\n", i); } else { dev->ccm_cfg[i]->act_used=val.val; } ret = strcmp(dev->ccm_cfg[i]->act_name,""); if((dev->ccm_cfg[i]->act_slave == 0xff) && (ret == 0)) //when insmod without parm { sprintf(dev_para, "vip_dev%d_act_name", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_STR != type) { char null_str[]=""; strcpy(dev->ccm_cfg[i]->act_name,null_str); vfe_dbg(0,"fetch vip_dev%d_act_name from sys_config failed\n", i); } else { strcpy(dev->ccm_cfg[i]->act_name,val.str); } sprintf(dev_para, "vip_dev%d_act_slave", i); type = script_get_item(vfe_para, dev_para, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { dev->ccm_cfg[i]->act_slave= 0; vfe_dbg(0,"fetch vip_dev%d_act_slave from sys_config failed\n", i); } else { dev->ccm_cfg[i]->act_slave=val.val; } } else { dev->ccm_cfg[i]->act_used=1;//manual set used } #ifdef _SUNXI_CAM_DETECT_ /*fetch cam detect para*/ type = script_get_item("camera_list_para", "camera_list_para_used", &val); if ((SCIRPT_ITEM_VALUE_TYPE_INT == type) && (val.val == 1)) { //camera_export_info(dev->ccm_cfg[i]->ccm, &dev->ccm_cfg[i]->i2c_addr,i); unsigned char cam_name[20]; unsigned int address; camera_export_info(cam_name, &address,i); if( (strcmp(cam_name,"")!=0)&&(address!=0) ) { strcpy(dev->ccm_cfg[i]->ccm, cam_name); dev->ccm_cfg[i]->i2c_addr=address; } else { vfe_warn("detect none sensor in list, use sysconfig setting!\n"); } for(j=0;j<ARRAY_SIZE(camera_info_list);j++) { if(strcmp(camera_info_list[j].name,dev->ccm_cfg[i]->ccm) == 0) { dev->ccm_cfg[i]->is_bayer_raw = camera_info_list[j].is_raw_sensor; dev->ccm_cfg[i]->is_isp_used = camera_info_list[j].is_isp_used; if(camera_info_list[j].vfilp) { dev->ccm_cfg[i]->vflip = (~dev->ccm_cfg[i]->vflip)&0x1; } if(camera_info_list[j].hfilp) { dev->ccm_cfg[i]->hflip= (~dev->ccm_cfg[i]->hflip)&0x1; } printk("dev->ccm_cfg[%d] = %s\n",i,dev->ccm_cfg[i]->ccm); } } } #endif //vfe_dbg(0,"act_used=%d, name=%s, slave=0x%x\n",dev->ccm_cfg[0]->act_used, // dev->ccm_cfg[0]->act_name, dev->ccm_cfg[0]->act_slave); } #else int type; unsigned int i2c_addr_vip0[2] = {0x6c,0x00}; unsigned int i2c_addr_vip1[2] = {0x78,0x42}; unsigned int i; unsigned char ccm_vip0_dev0[] = {"ov8825",}; unsigned char ccm_vip0_dev1[] = {"",}; unsigned char ccm_vip1_dev0[] = {"ov5650",}; unsigned char ccm_vip1_dev1[] = {"gc0308",}; unsigned int i2c_addr[2]; unsigned char *ccm_name[2]; if(dev->id==0) { dev->dev_qty = 1; i2c_addr[0] = i2c_addr_vip0[0]; i2c_addr[1] = i2c_addr_vip0[1]; ccm_name[0] = ccm_vip0_dev0; ccm_name[1] = ccm_vip0_dev1; } else if (dev->id == 1) { dev->dev_qty = 1; i2c_addr[0] = i2c_addr_vip1[0]; i2c_addr[1] = i2c_addr_vip1[1]; ccm_name[0] = ccm_vip1_dev0; ccm_name[1] = ccm_vip1_dev1; } for(i=0; i<dev->dev_qty; i++) { dev->ccm_cfg[i]->twi_id = 1; type = strcmp(dev->ccm_cfg[i]->ccm,""); if((dev->ccm_cfg[i]->i2c_addr == 0xff) && (ret == 0)) //when insmod without parm { dev->ccm_cfg[i]->i2c_addr = i2c_addr[i]; strcpy(dev->ccm_cfg[i]->ccm, ccm_name[i]); } dev->ccm_cfg[i]->power.stby_mode = 0; dev->ccm_cfg[i]->vflip = 0; dev->ccm_cfg[i]->hflip = 0; } #endif for(i=0; i<dev->dev_qty; i++) { vfe_dbg(0,"dev->ccm_cfg[%d]->ccm = %s\n",i,dev->ccm_cfg[i]->ccm); vfe_dbg(0,"dev->ccm_cfg[%d]->twi_id = %x\n",i,dev->ccm_cfg[i]->twi_id); vfe_dbg(0,"dev->ccm_cfg[%d]->i2c_addr = %x\n",i,dev->ccm_cfg[i]->i2c_addr); vfe_dbg(0,"dev->ccm_cfg[%d]->vflip = %x\n",i,dev->ccm_cfg[i]->vflip); vfe_dbg(0,"dev->ccm_cfg[%d]->hflip = %x\n",i,dev->ccm_cfg[i]->hflip); vfe_dbg(0,"dev->ccm_cfg[%d]->iovdd_str = %s\n",i,dev->ccm_cfg[i]->iovdd_str); vfe_dbg(0,"dev->ccm_cfg[%d]->avdd_str = %s\n",i,dev->ccm_cfg[i]->avdd_str); vfe_dbg(0,"dev->ccm_cfg[%d]->dvdd_str = %s\n",i,dev->ccm_cfg[i]->dvdd_str); vfe_dbg(0,"dev->ccm_cfg[%d]->afvdd_str = %s\n",i,dev->ccm_cfg[i]->afvdd_str); vfe_dbg(0,"dev->ccm_cfg[%d]->act_used = %d\n",i,dev->ccm_cfg[i]->act_used); vfe_dbg(0,"dev->ccm_cfg[%d]->act_name = %s\n",i,dev->ccm_cfg[i]->act_name); vfe_dbg(0,"dev->ccm_cfg[%d]->act_slave = 0x%x\n",i,dev->ccm_cfg[i]->act_slave); } return 0; }