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

Commit 4344429d authored by Fabio Estevam's avatar Fabio Estevam Committed by Shawn Guo
Browse files

video: mxsfb: Introduce regulator support



Instead of using a custom binding for retrieving the GPIO that activates the
LCD from devicetree, use a standard regulator.

This approach has the advantage to be more generic.

For example: in the case of a board that has a PMIC supplying the LCD voltage,
the current approach would not work, as it only searches for a GPIO pin.

Signed-off-by: default avatarFabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
parent ac77bc22
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -7,9 +7,6 @@ Required properties:
- interrupts: Should contain lcdif interrupts
- display : phandle to display node (see below for details)

Optional properties:
- panel-enable-gpios : Should specify the gpio for panel enable

* display node

Required properties:
@@ -25,7 +22,6 @@ lcdif@80030000 {
	compatible = "fsl,imx28-lcdif";
	reg = <0x80030000 2000>;
	interrupts = <38 86>;
	panel-enable-gpios = <&gpio3 30 0>;

	display: display {
		bits-per-pixel = <32>;
+10 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@
			lcdif@80030000 {
				pinctrl-names = "default";
				pinctrl-0 = <&lcdif_24bit_pins_a>;
				panel-enable-gpios = <&gpio1 18 0>;
				lcd-supply = <&reg_lcd_3v3>;
				display = <&display>;
				status = "okay";

@@ -120,6 +120,15 @@
			regulator-max-microvolt = <3300000>;
			gpio = <&gpio1 29 0>;
		};

		reg_lcd_3v3: lcd-3v3 {
			compatible = "regulator-fixed";
			regulator-name = "lcd-3v3";
			regulator-min-microvolt = <3300000>;
			regulator-max-microvolt = <3300000>;
			gpio = <&gpio1 18 0>;
			enable-active-high;
		};
	};

	backlight {
+10 −1
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@
				pinctrl-names = "default";
				pinctrl-0 = <&lcdif_24bit_pins_a
					     &lcdif_pins_evk>;
				panel-enable-gpios = <&gpio3 30 0>;
				lcd-supply = <&reg_lcd_3v3>;
				display = <&display>;
				status = "okay";

@@ -310,6 +310,15 @@
			gpio = <&gpio3 8 0>;
			enable-active-high;
		};

		reg_lcd_3v3: lcd-3v3 {
			compatible = "regulator-fixed";
			regulator-name = "lcd-3v3";
			regulator-min-microvolt = <3300000>;
			regulator-max-microvolt = <3300000>;
			gpio = <&gpio3 30 0>;
			enable-active-high;
		};
	};

	sound {
+23 −18
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <video/of_display_timing.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
@@ -50,6 +49,7 @@
#include <linux/io.h>
#include <linux/pinctrl/consumer.h>
#include <linux/fb.h>
#include <linux/regulator/consumer.h>
#include <video/videomode.h>

#define REG_SET	4
@@ -179,6 +179,7 @@ struct mxsfb_info {
	unsigned dotclk_delay;
	const struct mxsfb_devdata *devdata;
	u32 sync;
	struct regulator *reg_lcd;
};

#define mxsfb_is_v3(host) (host->devdata->ipversion == 3)
@@ -338,9 +339,19 @@ static void mxsfb_enable_controller(struct fb_info *fb_info)
{
	struct mxsfb_info *host = to_imxfb_host(fb_info);
	u32 reg;
	int ret;

	dev_dbg(&host->pdev->dev, "%s\n", __func__);

	if (host->reg_lcd) {
		ret = regulator_enable(host->reg_lcd);
		if (ret) {
			dev_err(&host->pdev->dev,
				"lcd regulator enable failed:	%d\n", ret);
			return;
		}
	}

	clk_prepare_enable(host->clk);
	clk_set_rate(host->clk, PICOS2KHZ(fb_info->var.pixclock) * 1000U);

@@ -362,6 +373,7 @@ static void mxsfb_disable_controller(struct fb_info *fb_info)
	struct mxsfb_info *host = to_imxfb_host(fb_info);
	unsigned loop;
	u32 reg;
	int ret;

	dev_dbg(&host->pdev->dev, "%s\n", __func__);

@@ -385,6 +397,13 @@ static void mxsfb_disable_controller(struct fb_info *fb_info)
	clk_disable_unprepare(host->clk);

	host->enabled = 0;

	if (host->reg_lcd) {
		ret = regulator_disable(host->reg_lcd);
		if (ret)
			dev_err(&host->pdev->dev,
				"lcd regulator disable failed: %d\n", ret);
	}
}

static int mxsfb_set_par(struct fb_info *fb_info)
@@ -859,8 +878,6 @@ static int mxsfb_probe(struct platform_device *pdev)
	struct fb_info *fb_info;
	struct fb_modelist *modelist;
	struct pinctrl *pinctrl;
	int panel_enable;
	enum of_gpio_flags flags;
	int ret;

	if (of_id)
@@ -904,21 +921,9 @@ static int mxsfb_probe(struct platform_device *pdev)
		goto fb_release;
	}

	panel_enable = of_get_named_gpio_flags(pdev->dev.of_node,
					       "panel-enable-gpios", 0, &flags);
	if (gpio_is_valid(panel_enable)) {
		unsigned long f = GPIOF_OUT_INIT_HIGH;
		if (flags == OF_GPIO_ACTIVE_LOW)
			f = GPIOF_OUT_INIT_LOW;
		ret = devm_gpio_request_one(&pdev->dev, panel_enable,
					    f, "panel-enable");
		if (ret) {
			dev_err(&pdev->dev,
				"failed to request gpio %d: %d\n",
				panel_enable, ret);
			goto fb_release;
		}
	}
	host->reg_lcd = devm_regulator_get(&pdev->dev, "lcd");
	if (IS_ERR(host->reg_lcd))
		host->reg_lcd = NULL;

	fb_info->pseudo_palette = devm_kzalloc(&pdev->dev, sizeof(u32) * 16,
					       GFP_KERNEL);