static int corgikbd_suspend(struct platform_device *dev, pm_message_t state) { int i; struct corgikbd *corgikbd = platform_get_drvdata(dev); corgikbd->suspended = 1; for (i = 1; i < CORGI_KEY_STROBE_NUM; i++) pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_IN); return 0; }
static int corgikbd_suspend(struct platform_device *dev, pm_message_t state) { int i; struct corgikbd *corgikbd = platform_get_drvdata(dev); corgikbd->suspended = 1; /* strobe 0 is the power key so this can't be made an input for powersaving therefore i = 1 */ for (i = 1; i < CORGI_KEY_STROBE_NUM; i++) pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_IN); return 0; }
static int corgikbd_resume(struct platform_device *dev) { int i; struct corgikbd *corgikbd = platform_get_drvdata(dev); for (i = 1; i < CORGI_KEY_STROBE_NUM; i++) pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_OUT | GPIO_DFLT_HIGH); corgikbd->suspend_jiffies=jiffies; corgikbd->suspended = 0; return 0; }
static int __devinit corgikbd_probe(struct platform_device *pdev) { struct corgikbd *corgikbd; struct input_dev *input_dev; int i, err = -ENOMEM; corgikbd = kzalloc(sizeof(struct corgikbd), GFP_KERNEL); input_dev = input_allocate_device(); if (!corgikbd || !input_dev) goto fail; platform_set_drvdata(pdev, corgikbd); corgikbd->input = input_dev; spin_lock_init(&corgikbd->lock); init_timer(&corgikbd->timer); corgikbd->timer.function = corgikbd_timer_callback; corgikbd->timer.data = (unsigned long) corgikbd; init_timer(&corgikbd->htimer); corgikbd->htimer.function = corgikbd_hinge_timer; corgikbd->htimer.data = (unsigned long) corgikbd; corgikbd->suspend_jiffies=jiffies; memcpy(corgikbd->keycode, corgikbd_keycode, sizeof(corgikbd->keycode)); input_dev->name = "Corgi Keyboard"; input_dev->phys = "corgikbd/input0"; input_dev->id.bustype = BUS_HOST; input_dev->id.vendor = 0x0001; input_dev->id.product = 0x0001; input_dev->id.version = 0x0100; input_dev->dev.parent = &pdev->dev; input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | BIT_MASK(EV_PWR) | BIT_MASK(EV_SW); input_dev->keycode = corgikbd->keycode; input_dev->keycodesize = sizeof(unsigned char); input_dev->keycodemax = ARRAY_SIZE(corgikbd_keycode); for (i = 0; i < ARRAY_SIZE(corgikbd_keycode); i++) set_bit(corgikbd->keycode[i], input_dev->keybit); clear_bit(0, input_dev->keybit); set_bit(SW_LID, input_dev->swbit); set_bit(SW_TABLET_MODE, input_dev->swbit); set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); err = input_register_device(corgikbd->input); if (err) goto fail; mod_timer(&corgikbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL)); for (i = 0; i < CORGI_KEY_SENSE_NUM; i++) { pxa_gpio_mode(CORGI_GPIO_KEY_SENSE(i) | GPIO_IN); if (request_irq(CORGI_IRQ_GPIO_KEY_SENSE(i), corgikbd_interrupt, IRQF_DISABLED | IRQF_TRIGGER_RISING, "corgikbd", corgikbd)) printk(KERN_WARNING "corgikbd: Can't get IRQ: %d!\n", i); } for (i = 0; i < CORGI_KEY_STROBE_NUM; i++) pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_OUT | GPIO_DFLT_HIGH); pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN); return 0; fail: input_free_device(input_dev); kfree(corgikbd); return err; }