Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31e1391a authored by Daniel Mack's avatar Daniel Mack Committed by Bartlomiej Zolnierkiewicz
Browse files

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: default avatarDaniel Mack <daniel@zonque.org>
Reviewed-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
parent a2f2058e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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.
+24 −0
Original line number Diff line number Diff line
@@ -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");
+3 −0
Original line number Diff line number Diff line
@@ -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);