1436d684cSJoseph Chen /*
2436d684cSJoseph Chen * (C) Copyright 2017 Rockchip Electronics Co., Ltd
3436d684cSJoseph Chen *
4436d684cSJoseph Chen * SPDX-License-Identifier: GPL-2.0+
5436d684cSJoseph Chen */
6436d684cSJoseph Chen
7436d684cSJoseph Chen #include <common.h>
8436d684cSJoseph Chen #include <dm.h>
9436d684cSJoseph Chen #include <key.h>
109745ade2SJoseph Chen #include <linux/input.h>
11436d684cSJoseph Chen #include <power/rk8xx_pmic.h>
123ccaecfaSJoseph Chen #include <irq-generic.h>
13436d684cSJoseph Chen
rk8xx_pwron_rise_handler(int irq,void * data)1401c5bab1SJoseph Chen static void rk8xx_pwron_rise_handler(int irq, void *data)
153ccaecfaSJoseph Chen {
1601c5bab1SJoseph Chen struct udevice *dev = data;
1701c5bab1SJoseph Chen struct dm_key_uclass_platdata *key;
183ccaecfaSJoseph Chen
1901c5bab1SJoseph Chen key = dev_get_uclass_platdata(dev);
2001c5bab1SJoseph Chen key->rise_ms = key_timer(0);
217f18d96cSJoseph Chen
2201c5bab1SJoseph Chen debug("%s: %llu ms\n", __func__, key->rise_ms);
2335d17bf7SJoseph Chen }
2435d17bf7SJoseph Chen
rk8xx_pwron_fall_handler(int irq,void * data)2501c5bab1SJoseph Chen static void rk8xx_pwron_fall_handler(int irq, void *data)
263ccaecfaSJoseph Chen {
2701c5bab1SJoseph Chen struct udevice *dev = data;
2801c5bab1SJoseph Chen struct dm_key_uclass_platdata *key;
293ccaecfaSJoseph Chen
3001c5bab1SJoseph Chen key = dev_get_uclass_platdata(dev);
3101c5bab1SJoseph Chen key->fall_ms = key_timer(0);
323ccaecfaSJoseph Chen
3301c5bab1SJoseph Chen debug("%s: %llu ms\n", __func__, key->fall_ms);
34436d684cSJoseph Chen }
35436d684cSJoseph Chen
rk8xx_pwrkey_probe(struct udevice * dev)36436d684cSJoseph Chen static int rk8xx_pwrkey_probe(struct udevice *dev)
37436d684cSJoseph Chen {
38436d684cSJoseph Chen struct rk8xx_priv *rk8xx = dev_get_priv(dev->parent);
3901c5bab1SJoseph Chen struct dm_key_uclass_platdata *key = dev_get_uclass_platdata(dev);
4001c5bab1SJoseph Chen int fall_irq, rise_irq;
41436d684cSJoseph Chen
4201c5bab1SJoseph Chen if (!rk8xx->irq_chip) {
4301c5bab1SJoseph Chen printf("Failed to get parent irq chip\n");
4401c5bab1SJoseph Chen return -ENOENT;
45436d684cSJoseph Chen }
46436d684cSJoseph Chen
4701c5bab1SJoseph Chen fall_irq = virq_to_irq(rk8xx->irq_chip, RK8XX_IRQ_PWRON_FALL);
4801c5bab1SJoseph Chen if (fall_irq < 0) {
4901c5bab1SJoseph Chen printf("Failed to register pwron fall irq, ret=%d\n", fall_irq);
5001c5bab1SJoseph Chen return fall_irq;
51436d684cSJoseph Chen }
527f18d96cSJoseph Chen
5301c5bab1SJoseph Chen rise_irq = virq_to_irq(rk8xx->irq_chip, RK8XX_IRQ_PWRON_RISE);
5401c5bab1SJoseph Chen if (rise_irq < 0) {
5501c5bab1SJoseph Chen printf("Failed to register pwron rise irq, ret=%d\n", rise_irq);
5601c5bab1SJoseph Chen return rise_irq;
57436d684cSJoseph Chen }
58436d684cSJoseph Chen
5901c5bab1SJoseph Chen key->name = "rk8xx_pwr";
6001c5bab1SJoseph Chen key->type = GPIO_KEY;
6101c5bab1SJoseph Chen key->code = KEY_POWER;
6201c5bab1SJoseph Chen key->skip_irq_init = 1;
6301c5bab1SJoseph Chen
6401c5bab1SJoseph Chen irq_install_handler(fall_irq, rk8xx_pwron_fall_handler, dev);
6501c5bab1SJoseph Chen irq_install_handler(rise_irq, rk8xx_pwron_rise_handler, dev);
66*a91da598SJoseph Chen irq_handler_enable(fall_irq);
67*a91da598SJoseph Chen irq_handler_enable(rise_irq);
6801c5bab1SJoseph Chen
6901c5bab1SJoseph Chen return 0;
70436d684cSJoseph Chen }
71436d684cSJoseph Chen
72436d684cSJoseph Chen U_BOOT_DRIVER(rk8xx_pwrkey) = {
73436d684cSJoseph Chen .name = "rk8xx_pwrkey",
74436d684cSJoseph Chen .id = UCLASS_KEY,
75a7b534a0SJoseph Chen .probe = rk8xx_pwrkey_probe,
76436d684cSJoseph Chen };
77