static int fimc_open(struct file *filp) { struct fimc_control *ctrl; struct s3c_platform_fimc *pdata; int ret; ctrl = video_get_drvdata(video_devdata(filp)); pdata = to_fimc_plat(ctrl->dev); mutex_lock(&ctrl->lock); if (atomic_read(&ctrl->in_use)) { ret = -EBUSY; goto resource_busy; } else { atomic_inc(&ctrl->in_use); } if (pdata->clk_on) pdata->clk_on(to_platform_device(ctrl->dev), ctrl->clk); #if defined(CONFIG_VIDEO_FIMC_FIFO) fimc_hwset_clksrc(ctrl,FIMC_SCLK); fimc_hwset_sclk_enable(ctrl); #endif if (pdata->hw_ver == 0x40) fimc_hw_reset_camera(ctrl); /* Apply things to interface register */ fimc_hwset_reset(ctrl); filp->private_data = ctrl; ctrl->fb.open_fifo = s3cfb_open_fifo; ctrl->fb.close_fifo = s3cfb_close_fifo; ret = s3cfb_direct_ioctl(ctrl->id, S3CFB_GET_LCD_WIDTH, (unsigned long)&ctrl->fb.lcd_hres); if (ret < 0) fimc_err("Fail: S3CFB_GET_LCD_WIDTH\n"); ret = s3cfb_direct_ioctl(ctrl->id, S3CFB_GET_LCD_HEIGHT, (unsigned long)&ctrl->fb.lcd_vres); if (ret < 0) fimc_err("Fail: S3CFB_GET_LCD_HEIGHT\n"); ctrl->mem.curr = ctrl->mem.base; ctrl->status = FIMC_STREAMOFF; mutex_unlock(&ctrl->lock); return 0; resource_busy: mutex_unlock(&ctrl->lock); return ret; }
static int fimc_open(struct file *filp) { struct fimc_control *ctrl; struct s3c_platform_fimc *pdata; unsigned long flags; int ret; u32 cfg; #ifdef VIEW_FUNCTION_CALL printk("[FIMC_DEV] %s(%d)\n", __func__, __LINE__); #endif /* An ugly hack to make the i2c pins output low */ if (unlikely(make_i2c_pin_low == 1)) { cfg = readl(S5P64XX_GPD1DAT); cfg &= ~(0x1 << 0); writel(cfg, S5P64XX_GPD1DAT); cfg = readl(S5P64XX_GPD1DAT); cfg &= ~(0x1 << 1); writel(cfg, S5P64XX_GPD1DAT); make_i2c_pin_low = 0; } ctrl = video_get_drvdata(video_devdata(filp)); #ifdef S5P6442_POWER_GATING_CAM del_timer(&g_fimc_domain_timer); // fimc0 controller for Camera if(ctrl->id == CAM_ID){ spin_lock_irqsave(&fimc_domain_lock, flags); gFIMC_CNT[CAM_ID]++; s5p6442_idle_pm_gpiocfg(S5P6442_CAM_ID, S5P6442_ACTIVE_MODE); s5p6442_pwrgate_config(S5P6442_CAM_ID, S5P6442_ACTIVE_MODE); spin_unlock_irqrestore(&fimc_domain_lock, flags); } // gFIMC_CNT++; // } #endif #ifdef CONFIG_CPU_FREQ if(ctrl->id == CAM_ID){ set_dvfs_level(0); } #endif /* CONFIG_CPU_FREQ */ pdata = to_fimc_plat(ctrl->dev); mutex_lock(&ctrl->lock); if (atomic_read(&ctrl->in_use)) { ret = -EBUSY; goto resource_busy; } else { atomic_inc(&ctrl->in_use); } if (pdata->clk_on) pdata->clk_on(to_platform_device(ctrl->dev), ctrl->clk); /* Apply things to interface register */ fimc_hwset_reset(ctrl); filp->private_data = ctrl; ctrl->fb.open_fifo = s3cfb_open_fifo; ctrl->fb.close_fifo = s3cfb_close_fifo; ret = s3cfb_direct_ioctl(ctrl->id, S3CFB_GET_LCD_WIDTH, (unsigned long)&ctrl->fb.lcd_hres); if (ret < 0) dev_err(ctrl->dev, "Fail: S3CFB_GET_LCD_WIDTH\n"); ret = s3cfb_direct_ioctl(ctrl->id, S3CFB_GET_LCD_HEIGHT, (unsigned long)&ctrl->fb.lcd_vres); if (ret < 0) dev_err(ctrl->dev, "Fail: S3CFB_GET_LCD_HEIGHT\n"); ctrl->status = FIMC_STREAMOFF; #if 0 /* To do : have to send ctrl to the fimd driver. */ ret = s3cfb_direct_ioctl(ctrl->id, S3CFB_SET_SUSPEND_FIFO, (unsigned long)fimc_sleep); if (ret < 0) dev_err(ctrl->dev, "s3cfb_direct_ioctl(S3CFB_SET_SUSPEND_FIFO) fail\n"); ret = s3cfb_direct_ioctl(ctrl->id, S3CFB_SET_RESUME_FIFO, (unsigned long)fimc_wakeup); if (ret < 0) dev_err(ctrl->dev, "s3cfb_direct_ioctl(S3CFB_SET_SUSPEND_FIFO) fail\n"); #endif mutex_unlock(&ctrl->lock); return 0; resource_busy: mutex_unlock(&ctrl->lock); return ret; }
static struct fimc_control *fimc_register_controller(struct platform_device *pdev) { struct s3c_platform_fimc *pdata; struct fimc_control *ctrl; struct resource *res; int id, mdev_id; id = pdev->id; mdev_id = S3C_MDEV_FIMC0 + id; pdata = to_fimc_plat(&pdev->dev); ctrl = get_fimc_ctrl(id); ctrl->id = id; ctrl->dev = &pdev->dev; ctrl->vd = &fimc_video_device[id]; ctrl->vd->minor = id; /* alloc from bank1 as default */ ctrl->mem.base = s3c_get_media_memory_bank(mdev_id, 1); ctrl->mem.size = s3c_get_media_memsize_bank(mdev_id, 1); ctrl->mem.curr = ctrl->mem.base; ctrl->status = FIMC_STREAMOFF; ctrl->limit = &fimc_limits[id]; ctrl->log = FIMC_LOG_DEFAULT; sprintf(ctrl->name, "%s%d", FIMC_NAME, id); strcpy(ctrl->vd->name, ctrl->name); atomic_set(&ctrl->in_use, 0); mutex_init(&ctrl->lock); mutex_init(&ctrl->v4l2_lock); spin_lock_init(&ctrl->lock_in); spin_lock_init(&ctrl->lock_out); init_waitqueue_head(&ctrl->wq); /* get resource for io memory */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { fimc_err("%s: failed to get io memory region\n", __func__); return NULL; } /* request mem region */ res = request_mem_region(res->start, res->end - res->start + 1, pdev->name); if (!res) { fimc_err("%s: failed to request io memory region\n", __func__); return NULL; } /* ioremap for register block */ ctrl->regs = ioremap(res->start, res->end - res->start + 1); if (!ctrl->regs) { fimc_err("%s: failed to remap io region\n", __func__); return NULL; } /* irq */ ctrl->irq = platform_get_irq(pdev, 0); if (request_irq(ctrl->irq, fimc_irq, IRQF_DISABLED, ctrl->name, ctrl)) fimc_err("%s: request_irq failed\n", __func__); fimc_hwset_reset(ctrl); return ctrl; }
static struct fimc_control *fimc_register_controller(struct platform_device *pdev) { struct s3c_platform_fimc *pdata; struct fimc_control *ctrl; struct resource *res; int id, mdev_id, irq; #ifdef VIEW_FUNCTION_CALL printk("[FIMC_DEV] %s(%d)\n", __func__, __LINE__); #endif id = pdev->id; mdev_id = S3C_MDEV_FIMC0 + id; pdata = to_fimc_plat(&pdev->dev); ctrl = get_fimc_ctrl(id); ctrl->id = id; ctrl->dev = &pdev->dev; ctrl->vd = &fimc_video_device[id]; ctrl->vd->minor = id; /* alloc from bank1 as default */ #if 0 ctrl->mem.base = s3c_get_media_memory_node(mdev_id, 1); ctrl->mem.size = s3c_get_media_memsize_node(mdev_id, 1); #else if(id == 0){ ctrl->mem.base = FIMC0_RESERVED_MEM_START; ctrl->mem.size = RESERVED_MEM_FIMC0; } else if(id == 1){ ctrl->mem.base = FIMC1_RESERVED_MEM_START; ctrl->mem.size = RESERVED_MEM_FIMC1; } else if(id == 2){ ctrl->mem.base = FIMC2_RESERVED_MEM_START; ctrl->mem.size = RESERVED_MEM_FIMC2; } #endif ctrl->mem.curr = ctrl->mem.base; ctrl->status = FIMC_STREAMOFF; ctrl->limit = &fimc_limits[id]; sprintf(ctrl->name, "%s%d", FIMC_NAME, id); strcpy(ctrl->vd->name, ctrl->name); atomic_set(&ctrl->in_use, 0); mutex_init(&ctrl->lock); mutex_init(&ctrl->v4l2_lock); spin_lock_init(&ctrl->lock_in); spin_lock_init(&ctrl->lock_out); init_waitqueue_head(&ctrl->wq); /* get resource for io memory */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(ctrl->dev, "%s: failed to get io memory region\n", __func__); return NULL; } /* request mem region */ res = request_mem_region(res->start, res->end - res->start + 1, pdev->name); if (!res) { dev_err(ctrl->dev, "%s: failed to request io memory region\n", __func__); return NULL; } /* ioremap for register block */ ctrl->regs = ioremap(res->start, res->end - res->start + 1); if (!ctrl->regs) { dev_err(ctrl->dev, "%s: failed to remap io region\n", __func__); return NULL; } /* irq */ irq = platform_get_irq(pdev, 0); if (request_irq(irq, fimc_irq, IRQF_DISABLED, ctrl->name, ctrl)) dev_err(ctrl->dev, "%s: request_irq failed\n", __func__); fimc_hwset_reset(ctrl); return ctrl; }