X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=drivers%2Fmedia%2Fvideo%2Frk_camsys%2Fcamsys_cif.c;h=22753b3f50f4c728ee46d523c00aab51218f3c21;hb=45cd824a30a8f289e9f7786574a9f29dbded8211;hp=fb75953b3fb5849c5cb8f8b101caf89b2306e83f;hpb=44f48d3af93111f35d3ed95005448ab4afa45695;p=firefly-linux-kernel-4.4.55.git diff --git a/drivers/media/video/rk_camsys/camsys_cif.c b/drivers/media/video/rk_camsys/camsys_cif.c index fb75953b3fb5..22753b3f50f4 100755 --- a/drivers/media/video/rk_camsys/camsys_cif.c +++ b/drivers/media/video/rk_camsys/camsys_cif.c @@ -3,24 +3,24 @@ static const char miscdev_cif0_name[] = CAMSYS_CIF0_DEVNAME; static const char miscdev_cif1_name[] = CAMSYS_CIF1_DEVNAME; -static int camsys_cif_iomux_cb(camsys_extdev_t *extdev,void *ptr) +static int camsys_cif_iomux_cb(camsys_extdev_t *extdev, void *ptr) { - unsigned int cif_vol_sel; -#if 0 + unsigned int cif_vol_sel; +#if 0 if (extdev->dev_cfg & CAMSYS_DEVCFG_FLASHLIGHT) { - iomux_set(ISP_FLASH_TRIG); - if (extdev->fl.fl.io != 0xffffffff) { - iomux_set(ISP_FL_TRIG); - } - } + iomux_set(ISP_FLASH_TRIG); + if (extdev->fl.fl.io != 0xffffffff) { + iomux_set(ISP_FL_TRIG); + } + } if (extdev->dev_cfg & CAMSYS_DEVCFG_PREFLASHLIGHT) { - iomux_set(ISP_PRELIGHT_TRIG); + iomux_set(ISP_PRELIGHT_TRIG); } - + if (extdev->dev_cfg & CAMSYS_DEVCFG_SHUTTER) { - iomux_set(ISP_SHUTTER_OPEN); - iomux_set(ISP_SHUTTER_TRIG); + iomux_set(ISP_SHUTTER_OPEN); + iomux_set(ISP_SHUTTER_TRIG); } iomux_set(CIF0_CLKOUT); @@ -32,323 +32,353 @@ static int camsys_cif_iomux_cb(camsys_extdev_t *extdev,void *ptr) char state_str[20] = {0}; struct device *dev = &(extdev->pdev->dev); - + if (extdev->phy.type == CamSys_Phy_Cif) { - if ((extdev->phy.info.cif.fmt >= CamSys_Fmt_Raw_8b)&& (extdev->phy.info.cif.fmt <= CamSys_Fmt_Raw_12b)) { + if ((extdev->phy.info.cif.fmt >= CamSys_Fmt_Raw_8b) && + (extdev->phy.info.cif.fmt <= CamSys_Fmt_Raw_12b)) { - strcpy(state_str,"isp_dvp8bit"); + strcpy(state_str, "isp_dvp8bit"); - } + } - if ((extdev->phy.info.cif.fmt >= CamSys_Fmt_Raw_10b)&& (extdev->phy.info.cif.fmt <= CamSys_Fmt_Raw_12b)) { - strcpy(state_str,"isp_dvp10bit"); - } + if ((extdev->phy.info.cif.fmt >= CamSys_Fmt_Raw_10b) && + (extdev->phy.info.cif.fmt <= CamSys_Fmt_Raw_12b)) { + strcpy(state_str, "isp_dvp10bit"); + } - if (extdev->phy.info.cif.fmt == CamSys_Fmt_Raw_12b) { - strcpy(state_str,"isp_dvp12bit"); + if (extdev->phy.info.cif.fmt == CamSys_Fmt_Raw_12b) { + strcpy(state_str, "isp_dvp12bit"); - } - }else{ - strcpy(state_str,"default"); + } + } else { + strcpy(state_str, "default"); } - //mux CIF0_CLKOUT + /*mux CIF0_CLKOUT*/ pinctrl = devm_pinctrl_get(dev); if (IS_ERR(pinctrl)) { - camsys_err("%s:Get pinctrl failed!\n",__func__); - return -1; + camsys_err("%s:Get pinctrl failed!\n", __func__); + return -1; } state = pinctrl_lookup_state(pinctrl, - state_str); - if (IS_ERR(state)){ - dev_err(dev, "%s:could not get %s pinstate\n",__func__,state_str); - return -1; - } + state_str); + if (IS_ERR(state)) { + dev_err(dev, + "%s:could not get %s pinstate\n", + __func__, state_str); + return -1; + } if (!IS_ERR(state)) { - retval = pinctrl_select_state(pinctrl, state); - if (retval){ - dev_err(dev, - "%s:could not set %s pins\n",__func__,state_str); - return -1; - - } + retval = pinctrl_select_state(pinctrl, state); + if (retval) { + dev_err(dev, + "%s:could not set %s pins\n", + __func__, state_str); + return -1; + + } } - //set 1.8v vol domain for rk32 - __raw_writel(((1<<1)|(1<<(1+16))),RK_GRF_VIRT+0x0380); - __raw_writel(0xffffffff, RK_GRF_VIRT+0x01d4); + /*set 1.8v vol domain for rk32*/ + __raw_writel(((1<<1)|(1<<(1+16))), RK_GRF_VIRT+0x0380); + __raw_writel(0xffffffff, RK_GRF_VIRT+0x01d4); - //set cif vol domain + /*set cif vol domain*/ if (extdev->phy.type == CamSys_Phy_Cif) { - #if 0 - if (!IS_ERR_OR_NULL(extdev->dovdd.ldo)) { - if (extdev->dovdd.max_uv >= 25000000) { - __raw_writel(((1<<1)|(1<<(1+16))),RK30_GRF_BASE+0x018c); - } else { - __raw_writel((1<<(1+16)),RK30_GRF_BASE+0x018c); - } - } else { - __raw_writel(((1<<1)|(1<<(1+16))),RK30_GRF_BASE+0x018c); - } - #else - - //set 1.8v vol domain - __raw_writel(((1<<1)|(1<<(1+16))),RK_GRF_VIRT+0x0380); - #endif - - //set driver strength - // __raw_writel(0xffffffff, RK_GRF_VIRT+0x01dc); - } - - + #if 0 + if (!IS_ERR_OR_NULL(extdev->dovdd.ldo)) { + if (extdev->dovdd.max_uv >= 25000000) { + __raw_writel(((1<<1)|(1<<(1+16))), + RK30_GRF_BASE+0x018c); + } else { + __raw_writel((1<<(1+16)), RK30_GRF_BASE+0x018c); + } + } else { + __raw_writel(((1<<1)|(1<<(1+16))), + RK30_GRF_BASE+0x018c); + } + #else + + /*set 1.8v vol domain*/ + __raw_writel(((1<<1)|(1<<(1+16))), RK_GRF_VIRT+0x0380); + #endif + + /*set driver strength*/ + /* __raw_writel(0xffffffff, RK_GRF_VIRT+0x01dc);*/ + } + return 0; } -static int camsys_cif_clkin_cb(void *ptr, unsigned int on) +static int camsys_cif_clkin_cb(void *ptr, unsigned int on) { - camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr; - camsys_cif_clk_t *clk = (camsys_cif_clk_t*)camsys_dev->clk; - + camsys_dev_t *camsys_dev = (camsys_dev_t *)ptr; + camsys_cif_clk_t *clk = (camsys_cif_clk_t *)camsys_dev->clk; + spin_lock(&clk->lock); - if (on && !clk->in_on) { - clk_prepare_enable(clk->aclk_cif); - clk_prepare_enable(clk->hclk_cif); - clk_prepare_enable(clk->cif_clk_in); - - clk->in_on = true; - camsys_trace(1, "%s clock in turn on",dev_name(camsys_dev->miscdev.this_device)); + if (on && !clk->in_on) { + clk_prepare_enable(clk->aclk_cif); + clk_prepare_enable(clk->hclk_cif); + clk_prepare_enable(clk->cif_clk_in); + + clk->in_on = true; + camsys_trace(1, "%s clock in turn on", + dev_name(camsys_dev->miscdev.this_device)); } else if (!on && clk->in_on) { - clk_disable_unprepare(clk->hclk_cif); - clk_disable_unprepare(clk->cif_clk_in); - clk_disable_unprepare(clk->pd_cif); - clk->in_on = false; - camsys_trace(1, "%s clock in turn off",dev_name(camsys_dev->miscdev.this_device)); - } - spin_unlock(&clk->lock); - return 0; + clk_disable_unprepare(clk->hclk_cif); + clk_disable_unprepare(clk->cif_clk_in); + clk_disable_unprepare(clk->pd_cif); + clk->in_on = false; + camsys_trace(1, "%s clock in turn off", + dev_name(camsys_dev->miscdev.this_device)); + } + spin_unlock(&clk->lock); + return 0; } -static int camsys_cif_clkout_cb(void *ptr, unsigned int on,unsigned int clkin) +static int camsys_cif_clkout_cb(void *ptr, unsigned int on, unsigned int clkin) { - camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr; - camsys_cif_clk_t *clk = (camsys_cif_clk_t*)camsys_dev->clk; + camsys_dev_t *camsys_dev = (camsys_dev_t *)ptr; + camsys_cif_clk_t *clk = (camsys_cif_clk_t *)camsys_dev->clk; struct clk *cif_clk_out_div; - - - spin_lock(&clk->lock); - if (on && (clk->out_on != on)) { - clk_prepare_enable(clk->cif_clk_out); - clk_set_rate(clk->cif_clk_out,clkin); - - clk->out_on = on; - camsys_trace(1, "%s clock out(rate: %dHz) turn on",dev_name(camsys_dev->miscdev.this_device), - clk->out_on); - } else if (!on && clk->out_on) { - if (strcmp(dev_name(camsys_dev->miscdev.this_device),miscdev_cif1_name)==0) { - cif_clk_out_div = clk_get(NULL, "cif1_out_div"); - } else{ - cif_clk_out_div = clk_get(NULL, "cif0_out_div"); - if(IS_ERR_OR_NULL(cif_clk_out_div)) { - cif_clk_out_div = clk_get(NULL, "cif_out_div"); - } - } - - if(!IS_ERR_OR_NULL(cif_clk_out_div)) { - clk_set_parent(clk->cif_clk_out, cif_clk_out_div); - clk_put(cif_clk_out_div); - } else { - camsys_warn("%s clock out may be not off!", dev_name(camsys_dev->miscdev.this_device)); - } - clk_disable_unprepare(clk->cif_clk_out); - clk->out_on = 0; - - camsys_trace(1, "%s clock out turn off",dev_name(camsys_dev->miscdev.this_device)); - } - spin_unlock(&clk->lock); - - { - // __raw_writel(0x00, CRU_PCLK_REG30+RK30_CRU_BASE); - } - return 0; + spin_lock(&clk->lock); + if (on && (clk->out_on != on)) { + clk_prepare_enable(clk->cif_clk_out); + clk_set_rate(clk->cif_clk_out, clkin); + + clk->out_on = on; + camsys_trace(1, "%s clock out(rate: %dHz) turn on", + dev_name(camsys_dev->miscdev.this_device), + clk->out_on); + } else if (!on && clk->out_on) { + if (strcmp(dev_name(camsys_dev->miscdev.this_device), + miscdev_cif1_name) == 0) { + cif_clk_out_div = clk_get(NULL, "cif1_out_div"); + } else{ + cif_clk_out_div = clk_get(NULL, "cif0_out_div"); + if (IS_ERR_OR_NULL(cif_clk_out_div)) { + cif_clk_out_div = + clk_get(NULL, "cif_out_div"); + } + } + + if (!IS_ERR_OR_NULL(cif_clk_out_div)) { + clk_set_parent(clk->cif_clk_out, cif_clk_out_div); + clk_put(cif_clk_out_div); + } else { + camsys_warn("%s clock out may be not off!", + dev_name(camsys_dev->miscdev.this_device)); + } + clk_disable_unprepare(clk->cif_clk_out); + clk->out_on = 0; + + camsys_trace(1, "%s clock out turn off", + dev_name(camsys_dev->miscdev.this_device)); + } + spin_unlock(&clk->lock); + + /* __raw_writel(0x00, CRU_PCLK_REG30+RK30_CRU_BASE);*/ + + return 0; } -static irqreturn_t camsys_cif_irq(int irq, void *data) +static irqreturn_t camsys_cif_irq(int irq, void *data) { - camsys_dev_t *camsys_dev = (camsys_dev_t*)data; + camsys_dev_t *camsys_dev = (camsys_dev_t *)data; camsys_irqstas_t *irqsta; camsys_irqpool_t *irqpool; - unsigned int intsta,frmsta; + unsigned int intsta, frmsta; - intsta = __raw_readl(camsys_dev->devmems.registermem->vir_base + CIF_INITSTA); - frmsta = __raw_readl(camsys_dev->devmems.registermem->vir_base + CIF_FRAME_STATUS); - printk("get oneframe,intsta = 0x%x \n",intsta); - - if (intsta & 0x200) { - __raw_writel(0x200,camsys_dev->devmems.registermem->vir_base + CIF_INITSTA); - __raw_writel(0xf000,camsys_dev->devmems.registermem->vir_base + CIF_CTRL); - } + intsta = __raw_readl(camsys_dev->devmems.registermem->vir_base + + CIF_INITSTA); + frmsta = __raw_readl(camsys_dev->devmems.registermem->vir_base + + CIF_FRAME_STATUS); + printk("get oneframe, intsta = 0x%x \n", intsta); - if (intsta &0x01) { - __raw_writel(0x01,camsys_dev->devmems.registermem->vir_base + CIF_INITSTA); - __raw_writel(0x02,camsys_dev->devmems.registermem->vir_base + CIF_FRAME_STATUS); - __raw_writel(0xf001,camsys_dev->devmems.registermem->vir_base + CIF_CTRL); - } - - spin_lock(&camsys_dev->irq.lock); - list_for_each_entry(irqpool, &camsys_dev->irq.irq_pool, list) { - spin_lock(&irqpool->lock); - if (!list_empty(&irqpool->deactive)) { - irqsta = list_first_entry(&irqpool->deactive, camsys_irqstas_t, list); - irqsta->sta.mis = intsta; - irqsta->sta.ris = intsta; - list_del_init(&irqsta->list); - list_add_tail(&irqsta->list,&irqpool->active); - irqsta = list_first_entry(&irqpool->active, camsys_irqstas_t, list); - //wake_up_all(&camsys_dev->irq.irq_done); - wake_up(&irqpool->done); - } - spin_unlock(&irqpool->lock); - } - spin_unlock(&camsys_dev->irq.lock); - - return IRQ_HANDLED; + if (intsta & 0x200) { + __raw_writel(0x200, + camsys_dev->devmems.registermem->vir_base + + CIF_INITSTA); + __raw_writel(0xf000, + camsys_dev->devmems.registermem->vir_base + + CIF_CTRL); + } + + if (intsta &0x01) { + __raw_writel(0x01, + camsys_dev->devmems.registermem->vir_base + + CIF_INITSTA); + __raw_writel(0x02, + camsys_dev->devmems.registermem->vir_base + + CIF_FRAME_STATUS); + __raw_writel(0xf001, + camsys_dev->devmems.registermem->vir_base + + CIF_CTRL); + } + + spin_lock(&camsys_dev->irq.lock); + list_for_each_entry(irqpool, &camsys_dev->irq.irq_pool, list) { + spin_lock(&irqpool->lock); + if (!list_empty(&irqpool->deactive)) { + irqsta = list_first_entry + (&irqpool->deactive, camsys_irqstas_t, list); + irqsta->sta.mis = intsta; + irqsta->sta.ris = intsta; + list_del_init(&irqsta->list); + list_add_tail(&irqsta->list, &irqpool->active); + irqsta = list_first_entry + (&irqpool->active, camsys_irqstas_t, list); + /*wake_up_all(&camsys_dev->irq.irq_done);*/ + wake_up(&irqpool->done); + } + spin_unlock(&irqpool->lock); + } + spin_unlock(&camsys_dev->irq.lock); + + return IRQ_HANDLED; } static int camsys_cif_remove(struct platform_device *pdev) { - camsys_dev_t *camsys_dev = platform_get_drvdata(pdev); - camsys_cif_clk_t *cif_clk; - - if (camsys_dev->clk != NULL) { - cif_clk = (camsys_cif_clk_t*)camsys_dev->clk; - if (cif_clk->out_on) - camsys_cif_clkout_cb(camsys_dev->clk, 0,0); - if (cif_clk->in_on) - camsys_cif_clkin_cb(camsys_dev->clk, 0); - - if (cif_clk->pd_cif) - clk_put(cif_clk->pd_cif); - if (cif_clk->aclk_cif) - clk_put(cif_clk->aclk_cif); - if (cif_clk->hclk_cif) - clk_put(cif_clk->hclk_cif); - if (cif_clk->cif_clk_in) - clk_put(cif_clk->cif_clk_in); - if (cif_clk->cif_clk_out) - clk_put(cif_clk->cif_clk_out); - - kfree(cif_clk); - cif_clk = NULL; - } - - return 0; + camsys_dev_t *camsys_dev = platform_get_drvdata(pdev); + camsys_cif_clk_t *cif_clk; + + if (camsys_dev->clk != NULL) { + cif_clk = (camsys_cif_clk_t *)camsys_dev->clk; + if (cif_clk->out_on) + camsys_cif_clkout_cb(camsys_dev->clk, 0, 0); + if (cif_clk->in_on) + camsys_cif_clkin_cb(camsys_dev->clk, 0); + + if (cif_clk->pd_cif) + clk_put(cif_clk->pd_cif); + if (cif_clk->aclk_cif) + clk_put(cif_clk->aclk_cif); + if (cif_clk->hclk_cif) + clk_put(cif_clk->hclk_cif); + if (cif_clk->cif_clk_in) + clk_put(cif_clk->cif_clk_in); + if (cif_clk->cif_clk_out) + clk_put(cif_clk->cif_clk_out); + + kfree(cif_clk); + cif_clk = NULL; + } + + return 0; } int camsys_cif_probe_cb(struct platform_device *pdev, camsys_dev_t *camsys_dev) { - int err = 0; - camsys_cif_clk_t *cif_clk; - - //Irq init - err = request_irq(camsys_dev->irq.irq_id, camsys_cif_irq, 0, CAMSYS_CIF_IRQNAME,camsys_dev); - if (err) { - camsys_err("request irq for %s failed",CAMSYS_CIF_IRQNAME); - goto end; - } - - //Clk and Iomux init - cif_clk = kzalloc(sizeof(camsys_cif_clk_t),GFP_KERNEL); - if (cif_clk == NULL) { - camsys_err("Allocate camsys_cif_clk_t failed!"); - err = -EINVAL; - goto end; - } - - if (strcmp(dev_name(&pdev->dev),CAMSYS_PLATFORM_CIF1_NAME) == 0) { - cif_clk->aclk_cif = devm_clk_get(&pdev->dev, "g_aclk_vip"); - cif_clk->hclk_cif = devm_clk_get(&pdev->dev, "g_hclk_vip"); - cif_clk->cif_clk_in = devm_clk_get(&pdev->dev, "g_pclkin_cif"); - cif_clk->cif_clk_out = devm_clk_get(&pdev->dev, "clk_cif_out"); - spin_lock_init(&cif_clk->lock); - cif_clk->in_on = false; - cif_clk->out_on = false; - } else { - cif_clk->aclk_cif = devm_clk_get(&pdev->dev, "g_aclk_vip"); - cif_clk->hclk_cif = devm_clk_get(&pdev->dev, "g_hclk_vip"); - cif_clk->cif_clk_in = devm_clk_get(&pdev->dev, "g_pclkin_ci"); - cif_clk->cif_clk_out = devm_clk_get(&pdev->dev, "clk_cif_out"); - spin_lock_init(&cif_clk->lock); - cif_clk->in_on = false; - cif_clk->out_on = false; - } - - // clk_prepare_enable(cif_clk->aclk_cif); - // clk_prepare_enable(cif_clk->hclk_cif); - // clk_prepare_enable(cif_clk->cif_clk_in); - // clk_prepare_enable(cif_clk->cif_clk_out); - - - - camsys_dev->clk = (void*)cif_clk; - camsys_dev->clkin_cb = camsys_cif_clkin_cb; - camsys_dev->clkout_cb = camsys_cif_clkout_cb; - camsys_dev->iomux = camsys_cif_iomux_cb; - - //Misc device init - camsys_dev->miscdev.minor = MISC_DYNAMIC_MINOR; - if (strcmp(dev_name(&pdev->dev),CAMSYS_PLATFORM_CIF1_NAME) == 0) { - camsys_dev->miscdev.name = miscdev_cif1_name; - camsys_dev->miscdev.nodename = miscdev_cif1_name; - } else { - camsys_dev->miscdev.name = miscdev_cif0_name; - camsys_dev->miscdev.nodename = miscdev_cif0_name; - } - camsys_dev->miscdev.fops = &camsys_fops; - err = misc_register(&camsys_dev->miscdev); - if (err < 0) { - camsys_trace(1,"Register /dev/%s misc device failed",camsys_dev->miscdev.name); - goto misc_register_failed; - } else { - camsys_trace(1,"Register /dev/%s misc device success",camsys_dev->miscdev.name); - } - - //Variable init - if (strcmp(dev_name(&pdev->dev),CAMSYS_PLATFORM_CIF1_NAME) == 0) { - camsys_dev->dev_id = CAMSYS_DEVID_CIF_1; - } else { - camsys_dev->dev_id = CAMSYS_DEVID_CIF_0; - } - camsys_dev->platform_remove = camsys_cif_remove; - - return 0; + int err = 0; + camsys_cif_clk_t *cif_clk; + + /*Irq init*/ + err = request_irq(camsys_dev->irq.irq_id, + camsys_cif_irq, 0, CAMSYS_CIF_IRQNAME, + camsys_dev); + if (err) { + camsys_err("request irq for %s failed", CAMSYS_CIF_IRQNAME); + goto end; + } + + /*Clk and Iomux init*/ + cif_clk = kzalloc(sizeof(camsys_cif_clk_t), GFP_KERNEL); + if (cif_clk == NULL) { + camsys_err("Allocate camsys_cif_clk_t failed!"); + err = -EINVAL; + goto end; + } + + if (strcmp(dev_name(&pdev->dev), CAMSYS_PLATFORM_CIF1_NAME) == 0) { + cif_clk->aclk_cif = devm_clk_get(&pdev->dev, "g_aclk_vip"); + cif_clk->hclk_cif = devm_clk_get(&pdev->dev, "g_hclk_vip"); + cif_clk->cif_clk_in = devm_clk_get(&pdev->dev, "g_pclkin_cif"); + cif_clk->cif_clk_out = devm_clk_get(&pdev->dev, "clk_cif_out"); + spin_lock_init(&cif_clk->lock); + cif_clk->in_on = false; + cif_clk->out_on = false; + } else { + cif_clk->aclk_cif = devm_clk_get(&pdev->dev, "g_aclk_vip"); + cif_clk->hclk_cif = devm_clk_get(&pdev->dev, "g_hclk_vip"); + cif_clk->cif_clk_in = devm_clk_get(&pdev->dev, "g_pclkin_ci"); + cif_clk->cif_clk_out = devm_clk_get(&pdev->dev, "clk_cif_out"); + spin_lock_init(&cif_clk->lock); + cif_clk->in_on = false; + cif_clk->out_on = false; + } + + /* + *clk_prepare_enable(cif_clk->aclk_cif); + clk_prepare_enable(cif_clk->hclk_cif); + clk_prepare_enable(cif_clk->cif_clk_in); + clk_prepare_enable(cif_clk->cif_clk_out); + */ + + camsys_dev->clk = (void *)cif_clk; + camsys_dev->clkin_cb = camsys_cif_clkin_cb; + camsys_dev->clkout_cb = camsys_cif_clkout_cb; + camsys_dev->iomux = camsys_cif_iomux_cb; + + /*Misc device init*/ + camsys_dev->miscdev.minor = MISC_DYNAMIC_MINOR; + if (strcmp(dev_name(&pdev->dev), CAMSYS_PLATFORM_CIF1_NAME) == 0) { + camsys_dev->miscdev.name = miscdev_cif1_name; + camsys_dev->miscdev.nodename = miscdev_cif1_name; + } else { + camsys_dev->miscdev.name = miscdev_cif0_name; + camsys_dev->miscdev.nodename = miscdev_cif0_name; + } + camsys_dev->miscdev.fops = &camsys_fops; + err = misc_register(&camsys_dev->miscdev); + if (err < 0) { + camsys_trace(1, + "Register /dev/%s misc device failed", + camsys_dev->miscdev.name); + goto misc_register_failed; + } else { + camsys_trace(1, + "Register /dev/%s misc device success", + camsys_dev->miscdev.name); + } + + /*Variable init*/ + if (strcmp(dev_name(&pdev->dev), CAMSYS_PLATFORM_CIF1_NAME) == 0) { + camsys_dev->dev_id = CAMSYS_DEVID_CIF_1; + } else { + camsys_dev->dev_id = CAMSYS_DEVID_CIF_0; + } + camsys_dev->platform_remove = camsys_cif_remove; + + return 0; misc_register_failed: - if (!IS_ERR(camsys_dev->miscdev.this_device)) { - misc_deregister(&camsys_dev->miscdev); - } + if (!IS_ERR(camsys_dev->miscdev.this_device)) { + misc_deregister(&camsys_dev->miscdev); + } + + if (cif_clk) { + + if (cif_clk->pd_cif) + clk_put(cif_clk->pd_cif); + if (cif_clk->aclk_cif) + clk_put(cif_clk->aclk_cif); + if (cif_clk->hclk_cif) + clk_put(cif_clk->hclk_cif); + if (cif_clk->cif_clk_in) + clk_put(cif_clk->cif_clk_in); + if (cif_clk->cif_clk_out) + clk_put(cif_clk->cif_clk_out); + + kfree(cif_clk); + cif_clk = NULL; + } - if (cif_clk) { - - if (cif_clk->pd_cif) - clk_put(cif_clk->pd_cif); - if (cif_clk->aclk_cif) - clk_put(cif_clk->aclk_cif); - if (cif_clk->hclk_cif) - clk_put(cif_clk->hclk_cif); - if (cif_clk->cif_clk_in) - clk_put(cif_clk->cif_clk_in); - if (cif_clk->cif_clk_out) - clk_put(cif_clk->cif_clk_out); - - kfree(cif_clk); - cif_clk = NULL; - } - end: - return err; + return err; } EXPORT_SYMBOL_GPL(camsys_cif_probe_cb);