xref: /OK3568_Linux_fs/u-boot/drivers/input/rk8xx_pwrkey.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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