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 /arch | |
parent | 90383e0ac2ae3df283f2b56997040f71f6d1df08 (diff) | |
download | lwn-87c37b51ade7d1296ab99ed8f237637bed7779c7.tar.gz lwn-87c37b51ade7d1296ab99ed8f237637bed7779c7.zip |
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>
Diffstat (limited to 'arch')
-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 |
3 files changed, 54 insertions, 2 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); } |