//enable/disable master clock
int vfe_set_mclk(struct v4l2_subdev *sd, enum on_off on_off)
{
#ifdef VFE_CLK
	struct vfe_dev *dev=(struct vfe_dev *)dev_get_drvdata(sd->v4l2_dev->dev);
	switch(on_off) {
	case ON:
		vfe_print("mclk on\n");
		if(dev->clock.vfe_master_clk) {
			if(os_clk_prepare_enable(dev->clock.vfe_master_clk)) {
				vfe_err("vip%d master clock enable error\n",dev->vip_sel);
				return -1;
			}
		} else {
			vfe_err("vip%d master clock is null\n",dev->vip_sel);
			return -1;
		}
		break;
	case OFF:
		vfe_print("mclk off\n");
		if(dev->clock.vfe_master_clk) {
			os_clk_disable_unprepare(dev->clock.vfe_master_clk);
		} else {
			vfe_err("vip%d master clock is null\n",dev->vip_sel);
			return -1;
		}
		break;
	default:
		return -1;
	}
#endif
	return 0;
}
static void __exit cci_exit(void)
{
	int i;
	vfe_print("cci_exit start\n");
	for(i=0; i<ARRAY_SIZE(cci_device); i++)
	{
		platform_device_unregister(&cci_device[i]);
	}
	platform_driver_unregister(&cci_platform_driver);
	vfe_print("cci_exit end\n");
}
Beispiel #3
0
int read_ini_info(struct vfe_dev *dev,int isp_id)
{
	int i, ret = 0;
	char isp_cfg_path[128],isp_tbl_path[128],file_name_path[128];
	struct cfg_section *cfg_section;

	vfe_print("read ini start\n");
	if(dev->ccm_cfg[isp_id]->ccm != NULL)
	{
		sprintf(isp_cfg_path, "/system/etc/hawkview/%s/", dev->ccm_cfg[isp_id]->ccm);
		sprintf(isp_tbl_path, "/system/etc/hawkview/%s/bin/", dev->ccm_cfg[isp_id]->ccm);
	}
	else
	{
		sprintf(isp_cfg_path, "/system/etc/hawkview/camera.ini");
		sprintf(isp_tbl_path, "/system/etc/hawkview/bin/");
	}
	dev->isp_gen_set[isp_id].isp_ini_cfg = isp_init_def_cfg;
	for(i=0; i< ARRAY_SIZE(FileAttr); i++)
	{
		sprintf(file_name_path,"%s%s",isp_cfg_path,FileAttr[i].file_name);
		vfe_print("read %s start! \n",file_name_path);
		cfg_section_init(&cfg_section);
		ret = cfg_read_ini(file_name_path, &cfg_section);
		if(ret == -1)
		{
			cfg_section_release(&cfg_section);
			goto read_ini_info_end;
		}
		fetch_isp_cfg(&dev->isp_gen_set[isp_id].isp_ini_cfg, cfg_section,&FileAttr[i]);
		cfg_section_release(&cfg_section);
	}
	ret = fetch_isp_tbl(&dev->isp_gen_set[isp_id].isp_ini_cfg, &isp_tbl_path[0]);
	if(ret == -1)
    	{
    		dev->isp_gen_set[isp_id].isp_ini_cfg = isp_init_def_cfg;
        }
read_ini_info_end:
	vfe_dbg(0,"read ini end\n");
	return ret;
}
Beispiel #4
0
//enable/disable master clock
int vfe_set_mclk(struct v4l2_subdev *sd, enum on_off on_off)
{
#ifdef VFE_CLK
	struct vfe_gpio_cfg gpio_list;
	struct vfe_dev *dev=(struct vfe_dev *)dev_get_drvdata(sd->v4l2_dev->dev);
	switch(on_off) {
	case ON:
		vfe_print("mclk on\n");
		os_gpio_set(&dev->gpio->mclk, 1);  //set mclk PIN to MCLKt.
		usleep_range(10000,12000);
		if(dev->clock.vfe_master_clk) {
			if(os_clk_prepare_enable(dev->clock.vfe_master_clk)) {
				vfe_err("vip%d master clock enable error\n",dev->vip_sel);
				return -1;
			}
		} else {
			vfe_err("vip%d master clock is null\n",dev->vip_sel);
			return -1;
		}
		break;
	case OFF:
		vfe_print("mclk off\n");
		if(dev->clock.vfe_master_clk) {
			os_clk_disable_unprepare(dev->clock.vfe_master_clk);
		} else {
			vfe_err("vip%d master clock is null\n",dev->vip_sel);
			return -1;
		}
		usleep_range(10000,12000);
		memcpy(&gpio_list, &dev->gpio->mclk, sizeof(struct vfe_gpio_cfg));
		gpio_list.mul_sel = GPIO_OUTPUT; //set mclk PIN to output.
		os_gpio_set(&gpio_list, 1);
		vfe_gpio_write(sd, MCLK_PIN, 0);
		break;
	default:
		return -1;
	}
#endif
	return 0;
}
static int __init cci_init(void)
{
	int ret,i;
	for(i=0; i<ARRAY_SIZE(cci_device); i++) 
	{
		ret = platform_device_register(&cci_device[i]);
		if (ret)
			vfe_err("cci device %d register failed\n",i);
	}
	ret = platform_driver_register(&cci_platform_driver);
	if (ret) {
		vfe_err("platform driver register failed\n");
		return ret;
	}
	vfe_print("cci_init end\n");
	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;
}
static void cci_release(struct device *dev)
{
	//struct vfe_dev *vfe_dev = (struct vfe_dev *)dev_get_drvdata(dev);
	vfe_print("cci_device_release\n");
};