diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2013-04-07 15:44:59 -0300 |
---|---|---|
committer | Shawn Guo <shawn.guo@linaro.org> | 2013-04-08 15:44:55 +0800 |
commit | 4344429d3d926d219671f607125cff51223a140a (patch) | |
tree | 38d3c3c93f5af889d98f8866962f142ff99f90d8 /drivers/video | |
parent | ac77bc227e96bb6d42b86ee5e20e4fa6a743d632 (diff) | |
download | blackbird-op-linux-4344429d3d926d219671f607125cff51223a140a.tar.gz blackbird-op-linux-4344429d3d926d219671f607125cff51223a140a.zip |
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: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/mxsfb.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c index eac7c1ace7a5..1b2c26d1658c 100644 --- a/drivers/video/mxsfb.c +++ b/drivers/video/mxsfb.c @@ -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); |