1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2010
5 * Author: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
7 * AB8500 Power-On Key handler
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>
18 #include <linux/slab.h>
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
27 struct ab8500_ponkey
{
28 struct input_dev
*idev
;
29 struct ab8500
*ab8500
;
34 /* AB8500 gives us an interrupt when ONKEY is held */
35 static irqreturn_t
ab8500_ponkey_handler(int irq
, void *data
)
37 struct ab8500_ponkey
*ponkey
= data
;
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);
44 input_sync(ponkey
->idev
);
49 static int ab8500_ponkey_probe(struct platform_device
*pdev
)
51 struct ab8500
*ab8500
= dev_get_drvdata(pdev
->dev
.parent
);
52 struct ab8500_ponkey
*ponkey
;
53 struct input_dev
*input
;
57 irq_dbf
= platform_get_irq_byname(pdev
, "ONKEY_DBF");
61 irq_dbr
= platform_get_irq_byname(pdev
, "ONKEY_DBR");
65 ponkey
= devm_kzalloc(&pdev
->dev
, sizeof(struct ab8500_ponkey
),
70 input
= devm_input_allocate_device(&pdev
->dev
);
75 ponkey
->ab8500
= ab8500
;
76 ponkey
->irq_dbf
= irq_dbf
;
77 ponkey
->irq_dbr
= irq_dbr
;
79 input
->name
= "AB8500 POn(PowerOn) Key";
80 input
->dev
.parent
= &pdev
->dev
;
82 input_set_capability(input
, EV_KEY
, KEY_POWER
);
84 error
= devm_request_any_context_irq(&pdev
->dev
, ponkey
->irq_dbf
,
85 ab8500_ponkey_handler
, 0,
86 "ab8500-ponkey-dbf", ponkey
);
88 dev_err(ab8500
->dev
, "Failed to request dbf IRQ#%d: %d\n",
89 ponkey
->irq_dbf
, error
);
93 error
= devm_request_any_context_irq(&pdev
->dev
, ponkey
->irq_dbr
,
94 ab8500_ponkey_handler
, 0,
95 "ab8500-ponkey-dbr", ponkey
);
97 dev_err(ab8500
->dev
, "Failed to request dbr IRQ#%d: %d\n",
98 ponkey
->irq_dbr
, error
);
102 error
= input_register_device(ponkey
->idev
);
104 dev_err(ab8500
->dev
, "Can't register input device: %d\n", error
);
112 static const struct of_device_id ab8500_ponkey_match
[] = {
113 { .compatible
= "stericsson,ab8500-ponkey", },
116 MODULE_DEVICE_TABLE(of
, ab8500_ponkey_match
);
119 static struct platform_driver ab8500_ponkey_driver
= {
121 .name
= "ab8500-poweron-key",
122 .of_match_table
= of_match_ptr(ab8500_ponkey_match
),
124 .probe
= ab8500_ponkey_probe
,
126 module_platform_driver(ab8500_ponkey_driver
);
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");