diff options
author | Alexander Shiyan <shc_work@mail.ru> | 2012-11-17 17:57:18 +0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2012-11-21 09:57:44 -0800 |
commit | 87c37b51ade7d1296ab99ed8f237637bed7779c7 (patch) | |
tree | 615582ab943b3f0c2e587668d09e7d38d6e0289c | |
parent | 90383e0ac2ae3df283f2b56997040f71f6d1df08 (diff) |
ARM: clps711x: Moving power management of framebuffer driver to the board
This patch moves the power management for clps711x-framebuffer driver
to the board code. To control we use "platform-lcd" driver.
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Olof Johansson <olof@lixom.net>
-rw-r--r-- | arch/arm/mach-clps711x/edb7211.c | 34 | ||||
-rw-r--r-- | arch/arm/mach-clps711x/include/mach/hardware.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-clps711x/p720t.c | 20 | ||||
-rw-r--r-- | drivers/video/clps711xfb.c | 44 |
4 files changed, 60 insertions, 40 deletions
diff --git a/arch/arm/mach-clps711x/edb7211.c b/arch/arm/mach-clps711x/edb7211.c index cc32a65d6982..81cc6835d7a5 100644 --- a/arch/arm/mach-clps711x/edb7211.c +++ b/arch/arm/mach-clps711x/edb7211.c @@ -8,6 +8,8 @@ */ #include <linux/init.h> +#include <linux/gpio.h> +#include <linux/delay.h> #include <linux/memblock.h> #include <linux/types.h> #include <linux/interrupt.h> @@ -18,12 +20,17 @@ #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <video/platform_lcd.h> + #include <mach/hardware.h> #include "common.h" #define VIDEORAM_SIZE SZ_128K +#define EDB7211_LCD_DC_DC_EN CLPS711X_GPIO(3, 1) +#define EDB7211_LCDEN CLPS711X_GPIO(3, 2) + #define EDB7211_CS8900_BASE (CS2_PHYS_BASE + 0x300) #define EDB7211_CS8900_IRQ (IRQ_EINT3) @@ -32,6 +39,28 @@ static struct resource edb7211_cs8900_resource[] __initdata = { DEFINE_RES_IRQ(EDB7211_CS8900_IRQ), }; +static void edb7211_lcd_power_set(struct plat_lcd_data *pd, unsigned int power) +{ + if (power) { + gpio_set_value(EDB7211_LCDEN, 1); + udelay(100); + gpio_set_value(EDB7211_LCD_DC_DC_EN, 1); + } else { + gpio_set_value(EDB7211_LCD_DC_DC_EN, 0); + udelay(100); + gpio_set_value(EDB7211_LCDEN, 0); + } +} + +static struct plat_lcd_data edb7211_lcd_power_pdata = { + .set_power = edb7211_lcd_power_set, +}; + +static struct gpio edb7211_gpios[] __initconst = { + { EDB7211_LCD_DC_DC_EN, GPIOF_OUT_INIT_LOW, "LCD DC-DC" }, + { EDB7211_LCDEN, GPIOF_OUT_INIT_LOW, "LCD POWER" }, +}; + static struct map_desc edb7211_io_desc[] __initdata = { { /* Memory-mapped extra keyboard row */ .virtual = IO_ADDRESS(EP7211_PHYS_EXTKBD), @@ -83,6 +112,11 @@ fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi) static void __init edb7211_init(void) { + gpio_request_array(edb7211_gpios, ARRAY_SIZE(edb7211_gpios)); + + platform_device_register_data(&platform_bus, "platform-lcd", 0, + &edb7211_lcd_power_pdata, + sizeof(edb7211_lcd_power_pdata)); platform_device_register_simple("video-clps711x", 0, NULL, 0); platform_device_register_simple("cs89x0", 0, edb7211_cs8900_resource, ARRAY_SIZE(edb7211_cs8900_resource)); diff --git a/arch/arm/mach-clps711x/include/mach/hardware.h b/arch/arm/mach-clps711x/include/mach/hardware.h index 5a278cb02b03..4e273f2a5cb1 100644 --- a/arch/arm/mach-clps711x/include/mach/hardware.h +++ b/arch/arm/mach-clps711x/include/mach/hardware.h @@ -82,8 +82,6 @@ * Relevant bits in port D, which controls power to the various parts of * the LCD on the EDB7211. */ -#define EDB_PD1_LCD_DC_DC_EN (1<<1) -#define EDB_PD2_LCDEN (1<<2) #define EDB_PD3_LCDBL (1<<3) #endif diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c index a58a0585e3e7..34c8ee9ebb5e 100644 --- a/arch/arm/mach-clps711x/p720t.c +++ b/arch/arm/mach-clps711x/p720t.c @@ -37,10 +37,27 @@ #include <asm/mach/map.h> #include <mach/syspld.h> +#include <video/platform_lcd.h> + #include "common.h" #define GPIO_USERLED CLPS711X_GPIO(3, 0) +static void p720t_lcd_power_set(struct plat_lcd_data *pd, unsigned int power) +{ + if (power) { + PLD_LCDEN = PLD_LCDEN_EN; + PLD_PWR |= PLD_S4_ON | PLD_S2_ON | PLD_S1_ON; + } else { + PLD_PWR &= ~(PLD_S4_ON | PLD_S2_ON | PLD_S1_ON); + PLD_LCDEN = 0; + } +} + +static struct plat_lcd_data p720t_lcd_power_pdata = { + .set_power = p720t_lcd_power_set, +}; + /* * Map the P720T system PLD. It occupies two address spaces: * 0x10000000 and 0x10400000. We map both regions as one. @@ -121,6 +138,9 @@ static struct gpio_led_platform_data p720t_gpio_led_pdata __initdata = { static void __init p720t_init(void) { + platform_device_register_data(&platform_bus, "platform-lcd", 0, + &p720t_lcd_power_pdata, + sizeof(p720t_lcd_power_pdata)); platform_device_register_simple("video-clps711x", 0, NULL, 0); } diff --git a/drivers/video/clps711xfb.c b/drivers/video/clps711xfb.c index 2ccbb9b2a255..1902551f6e45 100644 --- a/drivers/video/clps711xfb.c +++ b/drivers/video/clps711xfb.c @@ -167,35 +167,16 @@ static int clps7111fb_blank(int blank, struct fb_info *info) /* Turn off the LCD backlight. */ clps_writeb(clps_readb(PDDR) & ~EDB_PD3_LCDBL, PDDR); - /* Power off the LCD DC-DC converter. */ - clps_writeb(clps_readb(PDDR) & ~EDB_PD1_LCD_DC_DC_EN, PDDR); - - /* Delay for a little while (half a second). */ - udelay(100); - - /* Power off the LCD panel. */ - clps_writeb(clps_readb(PDDR) & ~EDB_PD2_LCDEN, PDDR); - - /* Power off the LCD controller. */ + /* Disable LCD controller. */ clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN, SYSCON1); } } else { if (machine_is_edb7211()) { - /* Power up the LCD controller. */ + /* Enable LCD controller. */ clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN, SYSCON1); - /* Power up the LCD panel. */ - clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR); - - /* Delay for a little while. */ - udelay(100); - - /* Power up the LCD DC-DC converter. */ - clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN, - PDDR); - /* Turn on the LCD backlight. */ clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR); } @@ -386,21 +367,10 @@ static int __devinit clps711x_fb_probe(struct platform_device *pdev) /* * Power up the LCD */ - if (machine_is_p720t()) { - PLD_LCDEN = PLD_LCDEN_EN; - PLD_PWR |= (PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON); - } + if (machine_is_p720t()) + PLD_PWR |= PLD_S3_ON; if (machine_is_edb7211()) { - /* Power up the LCD panel. */ - clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR); - - /* Delay for a little while. */ - udelay(100); - - /* Power up the LCD DC-DC converter. */ - clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN, PDDR); - /* Turn on the LCD backlight. */ clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR); } @@ -418,10 +388,8 @@ static int __devexit clps711x_fb_remove(struct platform_device *pdev) /* * Power down the LCD */ - if (machine_is_p720t()) { - PLD_LCDEN = 0; - PLD_PWR &= ~(PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON); - } + if (machine_is_p720t()) + PLD_PWR &= ~PLD_S3_ON; return 0; } |