| /* | 
 |  * Backlight control code for Sharp Zaurus SL-5500 | 
 |  * | 
 |  * Copyright 2005 John Lenz <lenz@cs.wisc.edu> | 
 |  * Maintainer: Pavel Machek <pavel@suse.cz> (unless John wants to :-) | 
 |  * GPL v2 | 
 |  * | 
 |  * This driver assumes single CPU. That's okay, because collie is | 
 |  * slightly old hardware, and noone is going to retrofit second CPU to | 
 |  * old PDA. | 
 |  */ | 
 |  | 
 | /* LCD power functions */ | 
 | #include <linux/config.h> | 
 | #include <linux/module.h> | 
 | #include <linux/init.h> | 
 | #include <linux/delay.h> | 
 | #include <linux/device.h> | 
 | #include <linux/interrupt.h> | 
 |  | 
 | #include <asm/hardware/locomo.h> | 
 | #include <asm/irq.h> | 
 |  | 
 | #ifdef CONFIG_SA1100_COLLIE | 
 | #include <asm/arch/collie.h> | 
 | #else | 
 | #include <asm/arch/poodle.h> | 
 | #endif | 
 |  | 
 | extern void (*sa1100fb_lcd_power)(int on); | 
 |  | 
 | static struct locomo_dev *locomolcd_dev; | 
 |  | 
 | 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); | 
 | 	mdelay(2); | 
 |  | 
 | 	locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 0); | 
 | 	locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 1); | 
 | 	mdelay(2); | 
 |  | 
 | 	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); | 
 | 	mdelay(1); | 
 |  | 
 | 	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 */ | 
 | #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 = 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); | 
 |  |