root/drivers/input/misc/ab8500-ponkey.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ab8500_ponkey_handler
  2. ab8500_ponkey_probe

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (C) ST-Ericsson SA 2010
   4  *
   5  * Author: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
   6  *
   7  * AB8500 Power-On Key handler
   8  */
   9 
  10 #include <linux/device.h>
  11 #include <linux/kernel.h>
  12 #include <linux/module.h>
  13 #include <linux/platform_device.h>
  14 #include <linux/input.h>
  15 #include <linux/interrupt.h>
  16 #include <linux/mfd/abx500/ab8500.h>
  17 #include <linux/of.h>
  18 #include <linux/slab.h>
  19 
  20 /**
  21  * struct ab8500_ponkey - ab8500 ponkey information
  22  * @input_dev: pointer to input device
  23  * @ab8500: ab8500 parent
  24  * @irq_dbf: irq number for falling transition
  25  * @irq_dbr: irq number for rising transition
  26  */
  27 struct ab8500_ponkey {
  28         struct input_dev        *idev;
  29         struct ab8500           *ab8500;
  30         int                     irq_dbf;
  31         int                     irq_dbr;
  32 };
  33 
  34 /* AB8500 gives us an interrupt when ONKEY is held */
  35 static irqreturn_t ab8500_ponkey_handler(int irq, void *data)
  36 {
  37         struct ab8500_ponkey *ponkey = data;
  38 
  39         if (irq == ponkey->irq_dbf)
  40                 input_report_key(ponkey->idev, KEY_POWER, true);
  41         else if (irq == ponkey->irq_dbr)
  42                 input_report_key(ponkey->idev, KEY_POWER, false);
  43 
  44         input_sync(ponkey->idev);
  45 
  46         return IRQ_HANDLED;
  47 }
  48 
  49 static int ab8500_ponkey_probe(struct platform_device *pdev)
  50 {
  51         struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
  52         struct ab8500_ponkey *ponkey;
  53         struct input_dev *input;
  54         int irq_dbf, irq_dbr;
  55         int error;
  56 
  57         irq_dbf = platform_get_irq_byname(pdev, "ONKEY_DBF");
  58         if (irq_dbf < 0)
  59                 return irq_dbf;
  60 
  61         irq_dbr = platform_get_irq_byname(pdev, "ONKEY_DBR");
  62         if (irq_dbr < 0)
  63                 return irq_dbr;
  64 
  65         ponkey = devm_kzalloc(&pdev->dev, sizeof(struct ab8500_ponkey),
  66                               GFP_KERNEL);
  67         if (!ponkey)
  68                 return -ENOMEM;
  69 
  70         input = devm_input_allocate_device(&pdev->dev);
  71         if (!input)
  72                 return -ENOMEM;
  73 
  74         ponkey->idev = input;
  75         ponkey->ab8500 = ab8500;
  76         ponkey->irq_dbf = irq_dbf;
  77         ponkey->irq_dbr = irq_dbr;
  78 
  79         input->name = "AB8500 POn(PowerOn) Key";
  80         input->dev.parent = &pdev->dev;
  81 
  82         input_set_capability(input, EV_KEY, KEY_POWER);
  83 
  84         error = devm_request_any_context_irq(&pdev->dev, ponkey->irq_dbf,
  85                                              ab8500_ponkey_handler, 0,
  86                                              "ab8500-ponkey-dbf", ponkey);
  87         if (error < 0) {
  88                 dev_err(ab8500->dev, "Failed to request dbf IRQ#%d: %d\n",
  89                         ponkey->irq_dbf, error);
  90                 return error;
  91         }
  92 
  93         error = devm_request_any_context_irq(&pdev->dev, ponkey->irq_dbr,
  94                                              ab8500_ponkey_handler, 0,
  95                                              "ab8500-ponkey-dbr", ponkey);
  96         if (error < 0) {
  97                 dev_err(ab8500->dev, "Failed to request dbr IRQ#%d: %d\n",
  98                         ponkey->irq_dbr, error);
  99                 return error;
 100         }
 101 
 102         error = input_register_device(ponkey->idev);
 103         if (error) {
 104                 dev_err(ab8500->dev, "Can't register input device: %d\n", error);
 105                 return error;
 106         }
 107 
 108         return 0;
 109 }
 110 
 111 #ifdef CONFIG_OF
 112 static const struct of_device_id ab8500_ponkey_match[] = {
 113         { .compatible = "stericsson,ab8500-ponkey", },
 114         {}
 115 };
 116 MODULE_DEVICE_TABLE(of, ab8500_ponkey_match);
 117 #endif
 118 
 119 static struct platform_driver ab8500_ponkey_driver = {
 120         .driver         = {
 121                 .name   = "ab8500-poweron-key",
 122                 .of_match_table = of_match_ptr(ab8500_ponkey_match),
 123         },
 124         .probe          = ab8500_ponkey_probe,
 125 };
 126 module_platform_driver(ab8500_ponkey_driver);
 127 
 128 MODULE_LICENSE("GPL v2");
 129 MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
 130 MODULE_DESCRIPTION("ST-Ericsson AB8500 Power-ON(Pon) Key driver");

/* [<][>][^][v][top][bottom][index][help] */