1 /* 2 * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <key.h> 10 #include <linux/input.h> 11 #include <power/rk8xx_pmic.h> 12 #include <irq-generic.h> 13 14 static void rk8xx_pwron_rise_handler(int irq, void *data) 15 { 16 struct udevice *dev = data; 17 struct dm_key_uclass_platdata *key; 18 19 key = dev_get_uclass_platdata(dev); 20 key->rise_ms = key_timer(0); 21 22 debug("%s: %llu ms\n", __func__, key->rise_ms); 23 } 24 25 static void rk8xx_pwron_fall_handler(int irq, void *data) 26 { 27 struct udevice *dev = data; 28 struct dm_key_uclass_platdata *key; 29 30 key = dev_get_uclass_platdata(dev); 31 key->fall_ms = key_timer(0); 32 33 debug("%s: %llu ms\n", __func__, key->fall_ms); 34 } 35 36 static int rk8xx_pwrkey_probe(struct udevice *dev) 37 { 38 struct rk8xx_priv *rk8xx = dev_get_priv(dev->parent); 39 struct dm_key_uclass_platdata *key = dev_get_uclass_platdata(dev); 40 int fall_irq, rise_irq; 41 42 if (!rk8xx->irq_chip) { 43 printf("Failed to get parent irq chip\n"); 44 return -ENOENT; 45 } 46 47 fall_irq = virq_to_irq(rk8xx->irq_chip, RK8XX_IRQ_PWRON_FALL); 48 if (fall_irq < 0) { 49 printf("Failed to register pwron fall irq, ret=%d\n", fall_irq); 50 return fall_irq; 51 } 52 53 rise_irq = virq_to_irq(rk8xx->irq_chip, RK8XX_IRQ_PWRON_RISE); 54 if (rise_irq < 0) { 55 printf("Failed to register pwron rise irq, ret=%d\n", rise_irq); 56 return rise_irq; 57 } 58 59 key->name = "rk8xx_pwr"; 60 key->type = GPIO_KEY; 61 key->code = KEY_POWER; 62 key->skip_irq_init = 1; 63 64 irq_install_handler(fall_irq, rk8xx_pwron_fall_handler, dev); 65 irq_install_handler(rise_irq, rk8xx_pwron_rise_handler, dev); 66 irq_handler_enable_suspend_only(fall_irq); 67 irq_handler_enable_suspend_only(rise_irq); 68 69 return 0; 70 } 71 72 U_BOOT_DRIVER(rk8xx_pwrkey) = { 73 .name = "rk8xx_pwrkey", 74 .id = UCLASS_KEY, 75 .probe = rk8xx_pwrkey_probe, 76 }; 77