static int s5p_dp_set_power(struct lcd_device *lcd, int power) { struct s5p_dp_device *dp = lcd_get_data(lcd); int retval; #ifdef CONFIG_S5P_DP_PSR if (dp->user_disabled) return 0; #endif #ifdef CONFIG_S5P_DP_ESD_RECOVERY dp->set_power_state = power; #endif if (power == FB_BLANK_UNBLANK) { retval = s5p_dp_enable(dp); if (retval < 0) return retval; } else { #ifdef CONFIG_S5P_DP_ESD_RECOVERY if (dp->enabled) s5p_dp_disable_esd_interrupt(dp); flush_delayed_work_sync(&dp->esd_recovery); #endif s5p_dp_disable(dp); } return 0; }
static int s5p_dp_set_power(struct lcd_device *lcd, int power) { struct s5p_dp_device *dp = lcd_get_data(lcd); int retval; if (power == FB_BLANK_UNBLANK) { retval = s5p_dp_enable(dp); if (retval < 0) return retval; } else { s5p_dp_disable(dp); } return 0; }
void esd_recover_handler(struct work_struct *work) { struct s5p_dp_device *dp = container_of(work, struct s5p_dp_device, esd_recovery.work); struct s5p_dp_platdata *pdata = dp->dev->platform_data; if (!dp->enabled) return; dp->esd_count++; dev_info(dp->dev, "esd_recovery start. (%d) \n", dp->esd_count); #ifdef CONFIG_S5P_DP_PSR s3c_fb_psr_exit_from_touch(); usleep_range(40000, 40000); #endif if (dp->set_power_state != FB_BLANK_UNBLANK) goto esd_done; #ifdef CONFIG_S5P_DP_PSR dev_info(dp->dev, "esd_recovery state (%d, %d) \n", dp->psr_enter_state, dp->psr_exit_state); #endif s5p_dp_disable(dp); if (pdata->phy_exit) pdata->phy_exit(); if (pdata->lcd_off) pdata->lcd_off(); if (pdata->lcd_on) pdata->lcd_on(); if (dp->set_power_state != FB_BLANK_UNBLANK) goto esd_done; s5p_dp_enable(dp); esd_done: dev_info(dp->dev, "esd_recovery done. \n"); }
static int __devinit s5p_dp_probe(struct platform_device *pdev) { struct resource *res; struct s5p_dp_device *dp; struct s5p_dp_platdata *pdata; int ret = 0; printk("############ start to dp_probe\n #############\n"); pdata = pdev->dev.platform_data; if (!pdata) { dev_err(&pdev->dev, "no platform data\n"); return -EINVAL; } dp = kzalloc(sizeof(struct s5p_dp_device), GFP_KERNEL); if (!dp) { dev_err(&pdev->dev, "no memory for device data\n"); return -ENOMEM; } mutex_init(&dp->lock); dp->dev = &pdev->dev; printk("1\n"); dp->clock = clk_get(&pdev->dev, "dp"); if (IS_ERR(dp->clock)) { dev_err(&pdev->dev, "failed to get clock\n"); ret = PTR_ERR(dp->clock); goto err_dp; } pm_runtime_enable(dp->dev); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "failed to get registers\n"); ret = -EINVAL; goto err_clock; } printk("2\n"); res = request_mem_region(res->start, resource_size(res), dev_name(&pdev->dev)); if (!res) { dev_err(&pdev->dev, "failed to request registers region\n"); ret = -EINVAL; goto err_clock; } dp->res = res; dp->reg_base = ioremap(res->start, resource_size(res)); if (!dp->reg_base) { dev_err(&pdev->dev, "failed to ioremap\n"); ret = -ENOMEM; goto err_req_region; } printk("3\n"); dp->irq = platform_get_irq(pdev, 0); if (!dp->irq) { dev_err(&pdev->dev, "failed to get irq\n"); ret = -ENODEV; goto err_ioremap; } ret = request_irq(dp->irq, s5p_dp_irq_handler, 0, "s5p-dp", dp); if (ret) { dev_err(&pdev->dev, "failed to request irq\n"); goto err_ioremap; } dp->video_info = pdata->video_info; platform_set_drvdata(pdev, dp); printk("4\n"); dp->lcd = lcd_device_register("s5p_dp", &pdev->dev, dp, &s5p_dp_lcd_ops); if (IS_ERR(dp->lcd)) { ret = PTR_ERR(dp->lcd); goto err_irq; } printk("5\n"); ret = s5p_dp_enable(dp); if (ret) goto err_fb; return 0; err_fb: lcd_device_unregister(dp->lcd); err_irq: free_irq(dp->irq, dp); err_ioremap: iounmap(dp->reg_base); err_req_region: release_mem_region(res->start, resource_size(res)); err_clock: clk_put(dp->clock); err_dp: mutex_destroy(&dp->lock); kfree(dp); return ret; }
static int __devinit s5p_dp_probe(struct platform_device *pdev) { struct resource *res; struct s5p_dp_device *dp; struct s5p_dp_platdata *pdata; int ret = 0; pdata = pdev->dev.platform_data; if (!pdata) { dev_err(&pdev->dev, "no platform data\n"); return -EINVAL; } dp = kzalloc(sizeof(struct s5p_dp_device), GFP_KERNEL); if (!dp) { dev_err(&pdev->dev, "no memory for device data\n"); return -ENOMEM; } mutex_init(&dp->lock); dp->dev = &pdev->dev; dp->clock = clk_get(&pdev->dev, "dp"); if (IS_ERR(dp->clock)) { dev_err(&pdev->dev, "failed to get clock\n"); ret = PTR_ERR(dp->clock); goto err_dp; } pm_runtime_enable(dp->dev); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "failed to get registers\n"); ret = -EINVAL; goto err_clock; } res = request_mem_region(res->start, resource_size(res), dev_name(&pdev->dev)); if (!res) { dev_err(&pdev->dev, "failed to request registers region\n"); ret = -EINVAL; goto err_clock; } dp->res = res; dp->reg_base = ioremap(res->start, resource_size(res)); if (!dp->reg_base) { dev_err(&pdev->dev, "failed to ioremap\n"); ret = -ENOMEM; goto err_req_region; } dp->irq = platform_get_irq(pdev, 0); if (!dp->irq) { dev_err(&pdev->dev, "failed to get irq\n"); ret = -ENODEV; goto err_ioremap; } ret = request_irq(dp->irq, s5p_dp_irq_handler, 0, "s5p-dp", dp); if (ret) { dev_err(&pdev->dev, "failed to request irq\n"); goto err_ioremap; } dp->video_info = pdata->video_info; platform_set_drvdata(pdev, dp); dp->lcd = lcd_device_register("s5p_dp", &pdev->dev, dp, &s5p_dp_lcd_ops); if (IS_ERR(dp->lcd)) { ret = PTR_ERR(dp->lcd); goto err_irq; } #ifdef CONFIG_S5P_DP_ESD_RECOVERY INIT_DELAYED_WORK(&dp->esd_recovery, esd_recover_handler); #endif #ifdef CONFIG_LCD_LSL122DL01 ret = s5p_dp_enable_boot(dp); #else ret = s5p_dp_enable(dp); #endif if (ret) goto err_fb; #ifdef CONFIG_S5P_DP_PSR dp->user_disabled = false; dp->psr_enter_state = PSR_NONE; dp->psr_exit_state = PSR_NONE; dp->notifier.notifier_call = s5p_dp_notify; fb_register_client(&dp->notifier); #endif return 0; err_fb: lcd_device_unregister(dp->lcd); err_irq: free_irq(dp->irq, dp); err_ioremap: iounmap(dp->reg_base); err_req_region: release_mem_region(res->start, resource_size(res)); err_clock: clk_put(dp->clock); err_dp: mutex_destroy(&dp->lock); kfree(dp); return ret; }