static void locomolcd_on(int comadj) { locomo_gpio_set_dir(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHA_ON, 0); locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHA_ON, 1); mdelay(2); locomo_gpio_set_dir(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHD_ON, 0); locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHD_ON, 1); mdelay(2); locomo_m62332_senddata(locomolcd_dev, comadj, 0); mdelay(5); locomo_gpio_set_dir(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VEE_ON, 0); locomo_gpio_write(locomolcd_dev->dev.parent, 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->dev.parent, LOCOMO_GPIO_LCD_MOD, 0); locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_MOD, 1); }
static inline void locomokbd_activate_all(unsigned long membase) { unsigned long r; locomo_writel(0, membase + LOCOMO_KSC); r = locomo_readl(membase + LOCOMO_KIC); r &= 0xFEFF; locomo_writel(r, membase + LOCOMO_KIC); }
static void locomoled_brightness_set(struct led_classdev *led_cdev, enum led_brightness value, int offset) { struct locomo_dev *locomo_dev = LOCOMO_DEV(led_cdev->dev->parent); unsigned long flags; local_irq_save(flags); if (value) locomo_writel(LOCOMO_LPT_TOFH, locomo_dev->mapbase + offset); else locomo_writel(LOCOMO_LPT_TOFL, locomo_dev->mapbase + offset); local_irq_restore(flags); }
static inline void locomokbd_reset_col(unsigned long membase, int col) { unsigned short nbset; nbset = ((0xFF & ~(1 << col)) << 8) + 0xFF; locomo_writel(nbset, membase + LOCOMO_KSC); }
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->dev.parent, LOCOMO_GPIO_LCD_VSHA_ON, 0); mdelay(110); locomo_gpio_write(locomolcd_dev->dev.parent, 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->dev.parent, LOCOMO_GPIO_LCD_MOD, 0); locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHD_ON, 0); }
static void locomokbd_close(struct input_dev *dev) { struct locomokbd *locomokbd = input_get_drvdata(dev); u16 r; r = locomo_readl(locomokbd->base + LOCOMO_KIC) & ~0x0010; locomo_writel(r, locomokbd->base + LOCOMO_KIC); }
static int locomokbd_open(struct input_dev *dev) { struct locomokbd *locomokbd = input_get_drvdata(dev); u16 r; r = locomo_readl(locomokbd->base + LOCOMO_KIC) | 0x0010; locomo_writel(r, locomokbd->base + LOCOMO_KIC); return 0; }
static inline void locomokbd_activate_col(unsigned long membase, int col) { unsigned short nset; unsigned short nbset; nset = 0xFF & ~(1 << col); nbset = (nset << 8) + nset; locomo_writel(nbset, membase + LOCOMO_KSC); }
/* * LoCoMo keyboard interrupt handler. */ static irqreturn_t locomokbd_interrupt(int irq, void *dev_id) { struct locomokbd *locomokbd = dev_id; u16 r; r = locomo_readl(locomokbd->base + LOCOMO_KIC); if ((r & 0x0001) == 0) return IRQ_HANDLED; locomo_writel(r & ~0x0100, locomokbd->base + LOCOMO_KIC); /* Ack */ /** wait chattering delay **/ udelay(100); locomokbd_scankeyboard(locomokbd); return IRQ_HANDLED; }
/* helper functions for reading the keyboard matrix */ static inline void locomokbd_charge_all(unsigned long membase) { locomo_writel(0x00FF, membase + LOCOMO_KSC); }