static int s3cfb_sysfs_store_mdnie_power(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { u32 reg, i, enable; struct s3cfb_global *fbdev[2]; sscanf(buf, "%d", &enable); if (enable) { for (i = 0; i < FIMD_MAX; i++) { fbdev[i] = fbfimd->fbdev[i]; reg = readl(S3C_VA_SYS + 0x0210); reg &= ~(1<<13); reg &= ~(1<<12); reg &= ~(3<<10); reg |= (1<<0); reg &= ~(1<<1); writel(reg, S3C_VA_SYS + 0x0210); writel(3, fbdev[i]->regs + 0x27c); s3c_mdnie_init_global(fbdev[i]); s3c_mdnie_start(fbdev[i]); } printk("s3cfb_sysfs_store_mdnie_power() is called : mDNIE is ON \n"); } else { for (i = 0; i < FIMD_MAX; i++) { fbdev[i] = fbfimd->fbdev[i]; writel(0, fbdev[i]->regs + 0x27c); msleep(20); reg = readl(S3C_VA_SYS + 0x0210); reg |= (1<<1); writel(reg, S3C_VA_SYS + 0x0210); s3c_mdnie_stop(); s3c_mdnie_off(); } printk("s3cfb_sysfs_store_mdnie_power() is called : mDNIE is OFF \n"); } return len; }
void init_mdnie_class(void) { mdnieset_ui_class = class_create(THIS_MODULE, "mdnieset_ui"); if (IS_ERR(mdnieset_ui_class)) pr_err("Failed to create class(mdnieset_ui_class)!\n"); switch_mdnieset_ui_dev = device_create(mdnieset_ui_class, NULL, 0, NULL, "switch_mdnieset_ui"); if (IS_ERR(switch_mdnieset_ui_dev)) pr_err("Failed to create device(switch_mdnieset_ui_dev)!\n"); if (device_create_file(switch_mdnieset_ui_dev, &dev_attr_mdnieset_ui_file_cmd) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_mdnieset_ui_file_cmd.attr.name); if (device_create_file(switch_mdnieset_ui_dev, &dev_attr_mdnieset_user_select_file_cmd) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_mdnieset_user_select_file_cmd.attr.name); if (device_create_file(switch_mdnieset_ui_dev, &dev_attr_mdnieset_init_file_cmd) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_mdnieset_init_file_cmd.attr.name); mdnieset_outdoor_class = class_create(THIS_MODULE, "mdnieset_outdoor"); if (IS_ERR(mdnieset_outdoor_class)) pr_err("Failed to create class(mdnieset_outdoor_class)!\n"); switch_mdnieset_outdoor_dev = device_create(mdnieset_outdoor_class, NULL, 0, NULL, "switch_mdnieset_outdoor"); if (IS_ERR(switch_mdnieset_outdoor_dev)) pr_err("Failed to create device(switch_mdnieset_outdoor_dev)!\n"); if (device_create_file(switch_mdnieset_outdoor_dev, &dev_attr_mdnieset_outdoor_file_cmd) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_mdnieset_outdoor_file_cmd.attr.name); #ifdef MDP4_VIDEO_ENHANCE_TUNING if (device_create_file(switch_mdnieset_ui_dev, &dev_attr_tuning) < 0) { pr_err("Failed to create device file(%s)!\n",dev_attr_tuning.attr.name); } #endif s3c_mdnie_start(); sharpness_tune(0); }
void init_mdnie_class(void) { mdnie_class = class_create(THIS_MODULE, "mdnie"); if (IS_ERR(mdnie_class)) pr_err("Failed to create class(mdnie)!\n"); tune_mdnie_dev = device_create(mdnie_class, NULL, 0, NULL, "mdnie"); if (IS_ERR(tune_mdnie_dev)) pr_err("Failed to create device(mdnie)!\n"); if (device_create_file (tune_mdnie_dev, &dev_attr_scenario) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_scenario.attr.name); if (device_create_file (tune_mdnie_dev, &dev_attr_mdnieset_user_select_file_cmd) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_mdnieset_user_select_file_cmd.attr.name); if (device_create_file (tune_mdnie_dev, &dev_attr_mdnieset_init_file_cmd) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_mdnieset_init_file_cmd.attr.name); /* mdnieset_outdoor_class = class_create(THIS_MODULE, "mdnieset_outdoor"); if (IS_ERR(mdnieset_outdoor_class)) pr_err("Failed to create class( mdnieset_outdoor_class)!\n"); switch_mdnieset_outdoor_dev = device_create(mdnieset_outdoor_class, NULL, 0, NULL, "outdoor"); if (IS_ERR(switch_mdnieset_outdoor_dev)) pr_err ("Failed to create device( switch_mdnieset_outdoor_dev)!\n"); */ if (device_create_file (tune_mdnie_dev, &dev_attr_outdoor) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_outdoor.attr.name); if (device_create_file (tune_mdnie_dev, &dev_attr_negative) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_negative.attr.name); if (device_create_file (tune_mdnie_dev, &dev_attr_playspeed) < 0) pr_err("Failed to create device file(%s)!=n", dev_attr_playspeed.attr.name); #ifdef MDP4_VIDEO_ENHANCE_TUNING if (device_create_file(tune_mdnie_dev, &dev_attr_tuning) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_tuning.attr.name); } #endif s3c_mdnie_start(); sharpness_tune(0); }
void s3cfb_late_resume(struct early_suspend *h) { struct s3cfb_global *fbdev = container_of(h, struct s3cfb_global, early_suspend); struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev); struct platform_device *pdev = to_platform_device(fbdev->dev); struct fb_info *fb; struct s3cfb_window *win; int i, j, ret; pr_info("s3cfb_late_resume is called\n"); ret = regulator_enable(fbdev->regulator); if (ret < 0) dev_err(fbdev->dev, "failed to enable regulator\n"); ret = regulator_enable(fbdev->vcc_lcd); if (ret < 0) dev_err(fbdev->dev, "failed to enable vcc_lcd\n"); ret = regulator_enable(fbdev->vlcd); if (ret < 0) dev_err(fbdev->dev, "failed to enable vlcd\n"); #if defined(CONFIG_FB_S3C_TL2796) lcd_cfg_gpio_late_resume(); #endif dev_dbg(fbdev->dev, "wake up from suspend\n"); if (pdata->cfg_gpio) pdata->cfg_gpio(pdev); clk_enable(fbdev->clock); #ifdef CONFIG_FB_S3C_MDNIE writel(0x1, S5P_MDNIE_SEL); writel(3,fbdev->regs + 0x27c); #endif s3cfb_init_global(fbdev); s3cfb_set_clock(fbdev); #ifdef CONFIG_FB_S3C_MDNIE s3c_mdnie_init_global(fbdev); s3c_mdnie_start(fbdev); #endif s3cfb_set_alpha_value_width(fbdev, pdata->default_win); s3cfb_display_on(fbdev); for (i = pdata->default_win; i < pdata->nr_wins + pdata->default_win; i++) { j = i % pdata->nr_wins; fb = fbdev->fb[j]; win = fb->par; if ((win->path == DATA_PATH_DMA) && (win->enabled)) { s3cfb_set_par(fb); s3cfb_set_window(fbdev, win->id, 1); } } s3cfb_set_vsync_interrupt(fbdev, 1); s3cfb_set_global_interrupt(fbdev, 1); if (pdata->backlight_on) pdata->backlight_on(pdev); if (pdata->reset_lcd) pdata->reset_lcd(pdev); pr_info("s3cfb_late_resume is complete\n"); return ; }
static int s3cfb_probe(struct platform_device *pdev) { struct s3c_platform_fb *pdata = NULL; struct resource *res = NULL; struct s3cfb_global *fbdev[2]; int ret = 0; int i = 0; u32 reg; #ifdef CONFIG_EXYNOS_DEV_PD /* to use the runtime PM helper functions */ pm_runtime_enable(&pdev->dev); /* enable the power domain */ pm_runtime_get_sync(&pdev->dev); #endif fbfimd = kzalloc(sizeof(struct s3cfb_fimd_desc), GFP_KERNEL); if (FIMD_MAX == 2) fbfimd->dual = 1; else fbfimd->dual = 0; for (i = 0; i < FIMD_MAX; i++) { /* global structure */ fbfimd->fbdev[i] = kzalloc(sizeof(struct s3cfb_global), GFP_KERNEL); fbdev[i] = fbfimd->fbdev[i]; if (!fbdev[i]) { dev_err(fbdev[i]->dev, "failed to allocate for \ global fb structure fimd[%d]!\n", i); ret = -ENOMEM; goto err0; } fbdev[i]->dev = &pdev->dev; #if defined(CONFIG_MACH_SMDK4X12) || defined(CONFIG_FB_S5P_AMS369FG06) s3cfb_set_lcd_info(fbdev[i]); #endif /* platform_data*/ pdata = to_fb_plat(&pdev->dev); if (pdata->lcd) fbdev[i]->lcd = (struct s3cfb_lcd *)pdata->lcd; if (pdata->cfg_gpio) pdata->cfg_gpio(pdev); if (pdata->clk_on) pdata->clk_on(pdev, &fbdev[i]->clock); /* io memory */ res = platform_get_resource(pdev, IORESOURCE_MEM, i); if (!res) { dev_err(fbdev[i]->dev, "failed to get io memory region\n"); ret = -EINVAL; goto err1; } res = request_mem_region(res->start, res->end - res->start + 1, pdev->name); if (!res) { dev_err(fbdev[i]->dev, "failed to request io memory region\n"); ret = -EINVAL; goto err1; } fbdev[i]->regs = ioremap(res->start, res->end - res->start + 1); fbdev[i]->regs_org = fbdev[i]->regs; if (!fbdev[i]->regs) { dev_err(fbdev[i]->dev, "failed to remap io region\n"); ret = -EINVAL; goto err1; } /* irq */ fbdev[i]->irq = platform_get_irq(pdev, 0); if (request_irq(fbdev[i]->irq, s3cfb_irq_frame, IRQF_SHARED, pdev->name, fbdev[i])) { dev_err(fbdev[i]->dev, "request_irq failed\n"); ret = -EINVAL; goto err2; } #ifdef CONFIG_FB_S5P_TRACE_UNDERRUN if (request_irq(platform_get_irq(pdev, 1), s3cfb_irq_fifo, IRQF_DISABLED, pdev->name, fbdev[i])) { dev_err(fbdev[i]->dev, "request_irq failed\n"); ret = -EINVAL; goto err2; } s3cfb_set_fifo_interrupt(fbdev[i], 1); dev_info(fbdev[i]->dev, "fifo underrun trace\n"); #endif #ifdef CONFIG_FB_S5P_MDNIE /* only FIMD0 is supported */ if (i == 0) s3c_mdnie_setup(); #endif /* hw setting */ s3cfb_init_global(fbdev[i]); fbdev[i]->system_state = POWER_ON; /* alloc fb_info */ if (s3cfb_alloc_framebuffer(fbdev[i], i)) { dev_err(fbdev[i]->dev, "alloc error fimd[%d]\n", i); ret = -ENOMEM; goto err3; } /* register fb_info */ if (s3cfb_register_framebuffer(fbdev[i])) { dev_err(fbdev[i]->dev, "register error fimd[%d]\n", i); return -EINVAL; goto err3; } /* enable display */ s3cfb_set_clock(fbdev[i]); #ifdef CONFIG_FB_S5P_MDNIE /* only FIMD0 is supported */ if (i == 0) { reg = readl(S3C_VA_SYS + 0x0210); reg &= ~(1<<13); reg &= ~(1<<12); reg &= ~(3<<10); reg |= (1<<0); reg &= ~(1<<1); writel(reg, S3C_VA_SYS + 0x0210); writel(3, fbdev[i]->regs + 0x27c); s3c_mdnie_init_global(fbdev[i]); s3c_mdnie_start(fbdev[i]); } #endif s3cfb_enable_window(fbdev[0], pdata->default_win); s3cfb_update_power_state(fbdev[i], pdata->default_win, FB_BLANK_UNBLANK); /* Set alpha value width to 8-bit */ s3cfb_set_alpha_value_width(fbdev[i], i); #ifndef CONFIG_MACH_JENGA s3cfb_display_on(fbdev[i]); #endif #if defined(CONFIG_CPU_EXYNOS4212) || defined(CONFIG_CPU_EXYNOS4412) #ifdef CONFIG_BUSFREQ_OPP /* To lock bus frequency in OPP mode */ fbdev[i]->bus_dev = dev_get("exynos-busfreq"); #endif #endif #ifdef CONFIG_HAS_WAKELOCK #ifdef CONFIG_HAS_EARLYSUSPEND fbdev[i]->early_suspend.suspend = s3cfb_early_suspend; fbdev[i]->early_suspend.resume = s3cfb_late_resume; fbdev[i]->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; register_early_suspend(&fbdev[i]->early_suspend); #endif #endif ret = device_create_file(fbdev[i]->dev, &dev_attr_fimd_dump); if (ret < 0) dev_err(fbdev[0]->dev, "failed to add sysfs entries\n"); ret = device_create_file(fbdev[i]->dev, &dev_attr_ielcd_dump); if (ret < 0) dev_err(fbdev[0]->dev, "failed to add sysfs entries\n"); }