Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | // SPDX-License-Identifier: GPL-2.0-or-later /* * Rockchip RK805 PMIC Power Key driver * * Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd * * Author: Joseph Chen <chenjh@rock-chips.com> */ #include <linux/errno.h> #include <linux/init.h> #include <linux/input.h> #include <linux/interrupt.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/platform_device.h> static irqreturn_t pwrkey_fall_irq(int irq, void *_pwr) { struct input_dev *pwr = _pwr; input_report_key(pwr, KEY_POWER, 1); input_sync(pwr); return IRQ_HANDLED; } static irqreturn_t pwrkey_rise_irq(int irq, void *_pwr) { struct input_dev *pwr = _pwr; input_report_key(pwr, KEY_POWER, 0); input_sync(pwr); return IRQ_HANDLED; } static int rk805_pwrkey_probe(struct platform_device *pdev) { struct input_dev *pwr; int fall_irq, rise_irq; int err; pwr = devm_input_allocate_device(&pdev->dev); if (!pwr) { dev_err(&pdev->dev, "Can't allocate power button\n"); return -ENOMEM; } pwr->name = "rk805 pwrkey"; pwr->phys = "rk805_pwrkey/input0"; pwr->id.bustype = BUS_HOST; input_set_capability(pwr, EV_KEY, KEY_POWER); fall_irq = platform_get_irq(pdev, 0); if (fall_irq < 0) return fall_irq; rise_irq = platform_get_irq(pdev, 1); if (rise_irq < 0) return rise_irq; err = devm_request_any_context_irq(&pwr->dev, fall_irq, pwrkey_fall_irq, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "rk805_pwrkey_fall", pwr); if (err < 0) { dev_err(&pdev->dev, "Can't register fall irq: %d\n", err); return err; } err = devm_request_any_context_irq(&pwr->dev, rise_irq, pwrkey_rise_irq, IRQF_TRIGGER_RISING | IRQF_ONESHOT, "rk805_pwrkey_rise", pwr); if (err < 0) { dev_err(&pdev->dev, "Can't register rise irq: %d\n", err); return err; } err = input_register_device(pwr); if (err) { dev_err(&pdev->dev, "Can't register power button: %d\n", err); return err; } platform_set_drvdata(pdev, pwr); device_init_wakeup(&pdev->dev, true); return 0; } static struct platform_driver rk805_pwrkey_driver = { .probe = rk805_pwrkey_probe, .driver = { .name = "rk805-pwrkey", }, }; module_platform_driver(rk805_pwrkey_driver); MODULE_ALIAS("platform:rk805-pwrkey"); MODULE_AUTHOR("Joseph Chen <chenjh@rock-chips.com>"); MODULE_DESCRIPTION("RK805 PMIC Power Key driver"); MODULE_LICENSE("GPL"); |