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
rk8xx_pwron_rise_handler(int irq,void * data)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
rk8xx_pwron_fall_handler(int irq,void * data)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
rk8xx_pwrkey_probe(struct udevice * dev)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(fall_irq);
67 irq_handler_enable(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