Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Rockchip RK805 PMIC Power Key driver
0004  *
0005  * Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd
0006  *
0007  * Author: Joseph Chen <chenjh@rock-chips.com>
0008  */
0009 
0010 #include <linux/errno.h>
0011 #include <linux/init.h>
0012 #include <linux/input.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/kernel.h>
0015 #include <linux/module.h>
0016 #include <linux/platform_device.h>
0017 
0018 static irqreturn_t pwrkey_fall_irq(int irq, void *_pwr)
0019 {
0020     struct input_dev *pwr = _pwr;
0021 
0022     input_report_key(pwr, KEY_POWER, 1);
0023     input_sync(pwr);
0024 
0025     return IRQ_HANDLED;
0026 }
0027 
0028 static irqreturn_t pwrkey_rise_irq(int irq, void *_pwr)
0029 {
0030     struct input_dev *pwr = _pwr;
0031 
0032     input_report_key(pwr, KEY_POWER, 0);
0033     input_sync(pwr);
0034 
0035     return IRQ_HANDLED;
0036 }
0037 
0038 static int rk805_pwrkey_probe(struct platform_device *pdev)
0039 {
0040     struct input_dev *pwr;
0041     int fall_irq, rise_irq;
0042     int err;
0043 
0044     pwr = devm_input_allocate_device(&pdev->dev);
0045     if (!pwr) {
0046         dev_err(&pdev->dev, "Can't allocate power button\n");
0047         return -ENOMEM;
0048     }
0049 
0050     pwr->name = "rk805 pwrkey";
0051     pwr->phys = "rk805_pwrkey/input0";
0052     pwr->id.bustype = BUS_HOST;
0053     input_set_capability(pwr, EV_KEY, KEY_POWER);
0054 
0055     fall_irq = platform_get_irq(pdev, 0);
0056     if (fall_irq < 0)
0057         return fall_irq;
0058 
0059     rise_irq = platform_get_irq(pdev, 1);
0060     if (rise_irq < 0)
0061         return rise_irq;
0062 
0063     err = devm_request_any_context_irq(&pwr->dev, fall_irq,
0064                        pwrkey_fall_irq,
0065                        IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
0066                        "rk805_pwrkey_fall", pwr);
0067     if (err < 0) {
0068         dev_err(&pdev->dev, "Can't register fall irq: %d\n", err);
0069         return err;
0070     }
0071 
0072     err = devm_request_any_context_irq(&pwr->dev, rise_irq,
0073                        pwrkey_rise_irq,
0074                        IRQF_TRIGGER_RISING | IRQF_ONESHOT,
0075                        "rk805_pwrkey_rise", pwr);
0076     if (err < 0) {
0077         dev_err(&pdev->dev, "Can't register rise irq: %d\n", err);
0078         return err;
0079     }
0080 
0081     err = input_register_device(pwr);
0082     if (err) {
0083         dev_err(&pdev->dev, "Can't register power button: %d\n", err);
0084         return err;
0085     }
0086 
0087     platform_set_drvdata(pdev, pwr);
0088     device_init_wakeup(&pdev->dev, true);
0089 
0090     return 0;
0091 }
0092 
0093 static struct platform_driver rk805_pwrkey_driver = {
0094     .probe  = rk805_pwrkey_probe,
0095     .driver = {
0096         .name = "rk805-pwrkey",
0097     },
0098 };
0099 module_platform_driver(rk805_pwrkey_driver);
0100 
0101 MODULE_ALIAS("platform:rk805-pwrkey");
0102 MODULE_AUTHOR("Joseph Chen <chenjh@rock-chips.com>");
0103 MODULE_DESCRIPTION("RK805 PMIC Power Key driver");
0104 MODULE_LICENSE("GPL");