Index: linux/drivers/video/backlight/locomolcd.c =================================================================== --- /dev/null +++ linux/drivers/video/backlight/locomolcd.c @@ -0,0 +1,166 @@ +/* Yep, this will not be submitted upstream. Just dumping this code here for now. + * Copyright 2005 John Lenz + * GPL v2 + * + * The correct place for this is in drivers/video/backlight and using the backlight + * code + */ + +/* LCD power functions */ +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef CONFIG_SA1100_COLLIE +#include +#else +#include +#endif + +extern void (*sa1100fb_lcd_power)(int on); + +static struct locomo_dev *locomolcd_dev = NULL; + +static void locomolcd_on(int comadj) { + locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 0); + locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 1); + + udelay(2000); + + locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 0); + locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 1); + + udelay(2000); + + locomo_m62332_senddata(locomolcd_dev, comadj, 0); + + mdelay(5); + + locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 0); + locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 1); + + mdelay(10); + + /* TFTCRST | CPSOUT=0 | CPSEN */ + locomo_writel(0x01, locomolcd_dev->mapbase + LOCOMO_TC); + + /* Set CPSD */ + locomo_writel(6, locomolcd_dev->mapbase + LOCOMO_CPSD); + + /* TFTCRST | CPSOUT=0 | CPSEN */ + locomo_writel((0x04 | 0x01), locomolcd_dev->mapbase + LOCOMO_TC); + + mdelay(10); + + locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 0); + locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 1); +} + +static void locomolcd_off(int comadj) { + + /* TFTCRST=1 | CPSOUT=1 | CPSEN = 0 */ + locomo_writel(0x06, locomolcd_dev->mapbase + LOCOMO_TC); + + udelay(1000); + + locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 0); + + mdelay(110); + + locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 0); + + mdelay(700); + + /* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */ + locomo_writel(0, locomolcd_dev->mapbase + LOCOMO_TC); + + locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 0); + + locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 0); +} + +void locomolcd_power(int on) { + int comadj = 118; + unsigned long flags; + + local_irq_save(flags); + + if (!locomolcd_dev) { + local_irq_restore(flags); + return; + } + + /* read comadj */ + /*if (FLASH_DATA(FLASH_COMADJ_MAGIC_ADR) == FLASH_COMADJ_MAJIC) { + comadj = FLASH_DATA(FLASH_COMADJ_DATA_ADR); + } else {*/ +#ifdef CONFIG_MACH_POODLE + comadj = 118; +#else + comadj = 128; +#endif + /*}*/ + + if (on) + locomolcd_on(comadj); + else + locomolcd_off(comadj); + + local_irq_restore(flags); +} +EXPORT_SYMBOL(locomolcd_power); + +static int poodle_lcd_probe(struct locomo_dev *dev) { + unsigned long flags; + + local_irq_save(flags); + + locomolcd_dev = dev; + + /* the poodle_lcd_power function is called for the first time + * from fs_initcall, which is before locomo is activated. + * We need to recall poodle_lcd_power here*/ +#ifdef CONFIG_MACH_POODLE + locomolcd_power(1); +#endif + + local_irq_restore(flags); + return 0; +} +static int poodle_lcd_remove(struct locomo_dev *dev) { + unsigned long flags; + local_irq_save(flags); + locomolcd_dev = NULL; + local_irq_restore(flags); + return 0; +} + +static struct locomo_driver poodle_lcd_driver = { + .drv = { + .name = "locomo-backlight", + }, + .devid = LOCOMO_DEVID_BACKLIGHT, + .probe = poodle_lcd_probe, + .remove = poodle_lcd_remove, +}; + +static int __init poodle_lcd_init(void) { + int ret; + + ret = locomo_driver_register(&poodle_lcd_driver); + if (ret) return ret; + +#ifdef CONFIG_SA1100_COLLIE + sa1100fb_lcd_power = locomolcd_power; +#endif + + return 0; +} +device_initcall(poodle_lcd_init); +