video: fbdev: pxafb: Add support for lcd-supply regulator
Optionally obtain a lcd-supply regulator during probe and use it in __pxafb_lcd_power() to switch the power supply of LCD panels. This helps boards booted from DT to control such voltages without callbacks. Signed-off-by: Daniel Mack <daniel@zonque.org> Reviewed-by: Robert Jarzmik <robert.jarzmik@free.fr> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
This commit is contained in:
parent
a2f2058e3d
commit
31e1391af2
|
@ -10,6 +10,9 @@ Required properties:
|
|||
- interrupts : framebuffer controller interrupt.
|
||||
- clocks: phandle to input clocks
|
||||
|
||||
Optional properties:
|
||||
- lcd-supply: A phandle to a power regulator that controls the LCD voltage.
|
||||
|
||||
Required nodes:
|
||||
- port: connection to the LCD panel (see video-interfaces.txt)
|
||||
This node must have its properties bus-width and remote-endpoint set.
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
#include <linux/freezer.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <video/of_display_timing.h>
|
||||
#include <video/videomode.h>
|
||||
|
||||
|
@ -1423,6 +1424,21 @@ static inline void __pxafb_lcd_power(struct pxafb_info *fbi, int on)
|
|||
|
||||
if (fbi->lcd_power)
|
||||
fbi->lcd_power(on, &fbi->fb.var);
|
||||
|
||||
if (fbi->lcd_supply && fbi->lcd_supply_enabled != on) {
|
||||
int ret;
|
||||
|
||||
if (on)
|
||||
ret = regulator_enable(fbi->lcd_supply);
|
||||
else
|
||||
ret = regulator_disable(fbi->lcd_supply);
|
||||
|
||||
if (ret < 0)
|
||||
pr_warn("Unable to %s LCD supply regulator: %d\n",
|
||||
on ? "enable" : "disable", ret);
|
||||
else
|
||||
fbi->lcd_supply_enabled = on;
|
||||
}
|
||||
}
|
||||
|
||||
static void pxafb_enable_controller(struct pxafb_info *fbi)
|
||||
|
@ -2299,6 +2315,14 @@ static int pxafb_probe(struct platform_device *dev)
|
|||
fbi->backlight_power = inf->pxafb_backlight_power;
|
||||
fbi->lcd_power = inf->pxafb_lcd_power;
|
||||
|
||||
fbi->lcd_supply = devm_regulator_get_optional(&dev->dev, "lcd");
|
||||
if (IS_ERR(fbi->lcd_supply)) {
|
||||
if (PTR_ERR(fbi->lcd_supply) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
fbi->lcd_supply = NULL;
|
||||
}
|
||||
|
||||
r = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
||||
if (r == NULL) {
|
||||
dev_err(&dev->dev, "no I/O memory resource defined\n");
|
||||
|
|
|
@ -165,6 +165,9 @@ struct pxafb_info {
|
|||
struct notifier_block freq_policy;
|
||||
#endif
|
||||
|
||||
struct regulator *lcd_supply;
|
||||
bool lcd_supply_enabled;
|
||||
|
||||
void (*lcd_power)(int, struct fb_var_screeninfo *);
|
||||
void (*backlight_power)(int);
|
||||
|
||||
|
|
Loading…
Reference in New Issue