Commit 611097d5 authored by Bartosz Golaszewski's avatar Bartosz Golaszewski Committed by Sekhar Nori

fbdev: da8xx: add support for a regulator

We want to remove the hacky platform data callback for power control.
Add a regulator to the driver data and enable/disable it next to
the current panel_power_ctrl() calls. We will use it in subsequent
patch on da850-evm.
Signed-off-by: default avatarBartosz Golaszewski <bgolaszewski@baylibre.com>
Acked-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Signed-off-by: default avatarSekhar Nori <nsekhar@ti.com>
parent 7b5ab643
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/console.h> #include <linux/console.h>
#include <linux/regulator/consumer.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -165,6 +166,7 @@ struct da8xx_fb_par { ...@@ -165,6 +166,7 @@ struct da8xx_fb_par {
#endif #endif
unsigned int lcdc_clk_rate; unsigned int lcdc_clk_rate;
void (*panel_power_ctrl)(int); void (*panel_power_ctrl)(int);
struct regulator *lcd_supply;
u32 pseudo_palette[16]; u32 pseudo_palette[16];
struct fb_videomode mode; struct fb_videomode mode;
struct lcd_ctrl_config cfg; struct lcd_ctrl_config cfg;
...@@ -1066,6 +1068,7 @@ static void lcd_da8xx_cpufreq_deregister(struct da8xx_fb_par *par) ...@@ -1066,6 +1068,7 @@ static void lcd_da8xx_cpufreq_deregister(struct da8xx_fb_par *par)
static int fb_remove(struct platform_device *dev) static int fb_remove(struct platform_device *dev)
{ {
struct fb_info *info = dev_get_drvdata(&dev->dev); struct fb_info *info = dev_get_drvdata(&dev->dev);
int ret;
if (info) { if (info) {
struct da8xx_fb_par *par = info->par; struct da8xx_fb_par *par = info->par;
...@@ -1073,8 +1076,13 @@ static int fb_remove(struct platform_device *dev) ...@@ -1073,8 +1076,13 @@ static int fb_remove(struct platform_device *dev)
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
lcd_da8xx_cpufreq_deregister(par); lcd_da8xx_cpufreq_deregister(par);
#endif #endif
if (par->panel_power_ctrl) if (par->panel_power_ctrl) {
par->panel_power_ctrl(0); par->panel_power_ctrl(0);
} else if (par->lcd_supply) {
ret = regulator_disable(par->lcd_supply);
if (ret)
return ret;
}
lcd_disable_raster(DA8XX_FRAME_WAIT); lcd_disable_raster(DA8XX_FRAME_WAIT);
lcdc_write(0, LCD_RASTER_CTRL_REG); lcdc_write(0, LCD_RASTER_CTRL_REG);
...@@ -1179,15 +1187,25 @@ static int cfb_blank(int blank, struct fb_info *info) ...@@ -1179,15 +1187,25 @@ static int cfb_blank(int blank, struct fb_info *info)
case FB_BLANK_UNBLANK: case FB_BLANK_UNBLANK:
lcd_enable_raster(); lcd_enable_raster();
if (par->panel_power_ctrl) if (par->panel_power_ctrl) {
par->panel_power_ctrl(1); par->panel_power_ctrl(1);
} else if (par->lcd_supply) {
ret = regulator_enable(par->lcd_supply);
if (ret)
return ret;
}
break; break;
case FB_BLANK_NORMAL: case FB_BLANK_NORMAL:
case FB_BLANK_VSYNC_SUSPEND: case FB_BLANK_VSYNC_SUSPEND:
case FB_BLANK_HSYNC_SUSPEND: case FB_BLANK_HSYNC_SUSPEND:
case FB_BLANK_POWERDOWN: case FB_BLANK_POWERDOWN:
if (par->panel_power_ctrl) if (par->panel_power_ctrl) {
par->panel_power_ctrl(0); par->panel_power_ctrl(0);
} else if (par->lcd_supply) {
ret = regulator_disable(par->lcd_supply);
if (ret)
return ret;
}
lcd_disable_raster(DA8XX_FRAME_WAIT); lcd_disable_raster(DA8XX_FRAME_WAIT);
break; break;
...@@ -1400,6 +1418,20 @@ static int fb_probe(struct platform_device *device) ...@@ -1400,6 +1418,20 @@ static int fb_probe(struct platform_device *device)
par->panel_power_ctrl(1); par->panel_power_ctrl(1);
} }
par->lcd_supply = devm_regulator_get_optional(&device->dev, "lcd");
if (IS_ERR(par->lcd_supply)) {
if (PTR_ERR(par->lcd_supply) == -EPROBE_DEFER) {
ret = -EPROBE_DEFER;
goto err_pm_runtime_disable;
}
par->lcd_supply = NULL;
} else {
ret = regulator_enable(par->lcd_supply);
if (ret)
goto err_pm_runtime_disable;
}
fb_videomode_to_var(&da8xx_fb_var, lcdc_info); fb_videomode_to_var(&da8xx_fb_var, lcdc_info);
par->cfg = *lcd_cfg; par->cfg = *lcd_cfg;
...@@ -1603,10 +1635,16 @@ static int fb_suspend(struct device *dev) ...@@ -1603,10 +1635,16 @@ static int fb_suspend(struct device *dev)
{ {
struct fb_info *info = dev_get_drvdata(dev); struct fb_info *info = dev_get_drvdata(dev);
struct da8xx_fb_par *par = info->par; struct da8xx_fb_par *par = info->par;
int ret;
console_lock(); console_lock();
if (par->panel_power_ctrl) if (par->panel_power_ctrl) {
par->panel_power_ctrl(0); par->panel_power_ctrl(0);
} else if (par->lcd_supply) {
ret = regulator_disable(par->lcd_supply);
if (ret)
return ret;
}
fb_set_suspend(info, 1); fb_set_suspend(info, 1);
lcd_disable_raster(DA8XX_FRAME_WAIT); lcd_disable_raster(DA8XX_FRAME_WAIT);
...@@ -1620,6 +1658,7 @@ static int fb_resume(struct device *dev) ...@@ -1620,6 +1658,7 @@ static int fb_resume(struct device *dev)
{ {
struct fb_info *info = dev_get_drvdata(dev); struct fb_info *info = dev_get_drvdata(dev);
struct da8xx_fb_par *par = info->par; struct da8xx_fb_par *par = info->par;
int ret;
console_lock(); console_lock();
pm_runtime_get_sync(dev); pm_runtime_get_sync(dev);
...@@ -1627,8 +1666,13 @@ static int fb_resume(struct device *dev) ...@@ -1627,8 +1666,13 @@ static int fb_resume(struct device *dev)
if (par->blank == FB_BLANK_UNBLANK) { if (par->blank == FB_BLANK_UNBLANK) {
lcd_enable_raster(); lcd_enable_raster();
if (par->panel_power_ctrl) if (par->panel_power_ctrl) {
par->panel_power_ctrl(1); par->panel_power_ctrl(1);
} else if (par->lcd_supply) {
ret = regulator_enable(par->lcd_supply);
if (ret)
return ret;
}
} }
fb_set_suspend(info, 0); fb_set_suspend(info, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment