12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 25a35b85cSJoseph Chen /* 35a35b85cSJoseph Chen * Rockchip RK805 PMIC Power Key driver 45a35b85cSJoseph Chen * 55a35b85cSJoseph Chen * Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd 65a35b85cSJoseph Chen * 75a35b85cSJoseph Chen * Author: Joseph Chen <chenjh@rock-chips.com> 85a35b85cSJoseph Chen */ 95a35b85cSJoseph Chen 105a35b85cSJoseph Chen #include <linux/errno.h> 115a35b85cSJoseph Chen #include <linux/init.h> 125a35b85cSJoseph Chen #include <linux/input.h> 135a35b85cSJoseph Chen #include <linux/interrupt.h> 145a35b85cSJoseph Chen #include <linux/kernel.h> 155a35b85cSJoseph Chen #include <linux/module.h> 165a35b85cSJoseph Chen #include <linux/platform_device.h> 175a35b85cSJoseph Chen 185a35b85cSJoseph Chen static irqreturn_t pwrkey_fall_irq(int irq, void *_pwr) 195a35b85cSJoseph Chen { 205a35b85cSJoseph Chen struct input_dev *pwr = _pwr; 215a35b85cSJoseph Chen 225a35b85cSJoseph Chen input_report_key(pwr, KEY_POWER, 1); 235a35b85cSJoseph Chen input_sync(pwr); 245a35b85cSJoseph Chen 255a35b85cSJoseph Chen return IRQ_HANDLED; 265a35b85cSJoseph Chen } 275a35b85cSJoseph Chen 285a35b85cSJoseph Chen static irqreturn_t pwrkey_rise_irq(int irq, void *_pwr) 295a35b85cSJoseph Chen { 305a35b85cSJoseph Chen struct input_dev *pwr = _pwr; 315a35b85cSJoseph Chen 325a35b85cSJoseph Chen input_report_key(pwr, KEY_POWER, 0); 335a35b85cSJoseph Chen input_sync(pwr); 345a35b85cSJoseph Chen 355a35b85cSJoseph Chen return IRQ_HANDLED; 365a35b85cSJoseph Chen } 375a35b85cSJoseph Chen 385a35b85cSJoseph Chen static int rk805_pwrkey_probe(struct platform_device *pdev) 395a35b85cSJoseph Chen { 405a35b85cSJoseph Chen struct input_dev *pwr; 415a35b85cSJoseph Chen int fall_irq, rise_irq; 425a35b85cSJoseph Chen int err; 435a35b85cSJoseph Chen 445a35b85cSJoseph Chen pwr = devm_input_allocate_device(&pdev->dev); 455a35b85cSJoseph Chen if (!pwr) { 465a35b85cSJoseph Chen dev_err(&pdev->dev, "Can't allocate power button\n"); 475a35b85cSJoseph Chen return -ENOMEM; 485a35b85cSJoseph Chen } 495a35b85cSJoseph Chen 505a35b85cSJoseph Chen pwr->name = "rk805 pwrkey"; 515a35b85cSJoseph Chen pwr->phys = "rk805_pwrkey/input0"; 525a35b85cSJoseph Chen pwr->id.bustype = BUS_HOST; 535a35b85cSJoseph Chen input_set_capability(pwr, EV_KEY, KEY_POWER); 545a35b85cSJoseph Chen 555a35b85cSJoseph Chen fall_irq = platform_get_irq(pdev, 0); 560bec8b7eSStephen Boyd if (fall_irq < 0) 575a35b85cSJoseph Chen return fall_irq; 585a35b85cSJoseph Chen 595a35b85cSJoseph Chen rise_irq = platform_get_irq(pdev, 1); 600bec8b7eSStephen Boyd if (rise_irq < 0) 615a35b85cSJoseph Chen return rise_irq; 625a35b85cSJoseph Chen 635a35b85cSJoseph Chen err = devm_request_any_context_irq(&pwr->dev, fall_irq, 645a35b85cSJoseph Chen pwrkey_fall_irq, 655a35b85cSJoseph Chen IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 665a35b85cSJoseph Chen "rk805_pwrkey_fall", pwr); 675a35b85cSJoseph Chen if (err < 0) { 685a35b85cSJoseph Chen dev_err(&pdev->dev, "Can't register fall irq: %d\n", err); 695a35b85cSJoseph Chen return err; 705a35b85cSJoseph Chen } 715a35b85cSJoseph Chen 725a35b85cSJoseph Chen err = devm_request_any_context_irq(&pwr->dev, rise_irq, 735a35b85cSJoseph Chen pwrkey_rise_irq, 745a35b85cSJoseph Chen IRQF_TRIGGER_RISING | IRQF_ONESHOT, 755a35b85cSJoseph Chen "rk805_pwrkey_rise", pwr); 765a35b85cSJoseph Chen if (err < 0) { 775a35b85cSJoseph Chen dev_err(&pdev->dev, "Can't register rise irq: %d\n", err); 785a35b85cSJoseph Chen return err; 795a35b85cSJoseph Chen } 805a35b85cSJoseph Chen 815a35b85cSJoseph Chen err = input_register_device(pwr); 825a35b85cSJoseph Chen if (err) { 835a35b85cSJoseph Chen dev_err(&pdev->dev, "Can't register power button: %d\n", err); 845a35b85cSJoseph Chen return err; 855a35b85cSJoseph Chen } 865a35b85cSJoseph Chen 875a35b85cSJoseph Chen platform_set_drvdata(pdev, pwr); 885a35b85cSJoseph Chen device_init_wakeup(&pdev->dev, true); 895a35b85cSJoseph Chen 905a35b85cSJoseph Chen return 0; 915a35b85cSJoseph Chen } 925a35b85cSJoseph Chen 935a35b85cSJoseph Chen static struct platform_driver rk805_pwrkey_driver = { 945a35b85cSJoseph Chen .probe = rk805_pwrkey_probe, 955a35b85cSJoseph Chen .driver = { 965a35b85cSJoseph Chen .name = "rk805-pwrkey", 975a35b85cSJoseph Chen }, 985a35b85cSJoseph Chen }; 995a35b85cSJoseph Chen module_platform_driver(rk805_pwrkey_driver); 1005a35b85cSJoseph Chen 1015a35b85cSJoseph Chen MODULE_AUTHOR("Joseph Chen <chenjh@rock-chips.com>"); 1025a35b85cSJoseph Chen MODULE_DESCRIPTION("RK805 PMIC Power Key driver"); 1035a35b85cSJoseph Chen MODULE_LICENSE("GPL"); 104