2 * Copyright (C) ST-Ericsson SA 2010
4 * License Terms: GNU General Public License v2
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");
59 dev_err(&pdev
->dev
, "No IRQ for ONKEY_DBF, error=%d\n", irq_dbf
);
63 irq_dbr
= platform_get_irq_byname(pdev
, "ONKEY_DBR");
65 dev_err(&pdev
->dev
, "No IRQ for ONKEY_DBR, error=%d\n", irq_dbr
);
69 ponkey
= devm_kzalloc(&pdev
->dev
, sizeof(struct ab8500_ponkey
),
74 input
= devm_input_allocate_device(&pdev
->dev
);
79 ponkey
->ab8500
= ab8500
;
80 ponkey
->irq_dbf
= irq_dbf
;
81 ponkey
->irq_dbr
= irq_dbr
;
83 input
->name
= "AB8500 POn(PowerOn) Key";
84 input
->dev
.parent
= &pdev
->dev
;
86 input_set_capability(input
, EV_KEY
, KEY_POWER
);
88 error
= devm_request_any_context_irq(&pdev
->dev
, ponkey
->irq_dbf
,
89 ab8500_ponkey_handler
, 0,
90 "ab8500-ponkey-dbf", ponkey
);
92 dev_err(ab8500
->dev
, "Failed to request dbf IRQ#%d: %d\n",
93 ponkey
->irq_dbf
, error
);
97 error
= devm_request_any_context_irq(&pdev
->dev
, ponkey
->irq_dbr
,
98 ab8500_ponkey_handler
, 0,
99 "ab8500-ponkey-dbr", ponkey
);
101 dev_err(ab8500
->dev
, "Failed to request dbr IRQ#%d: %d\n",
102 ponkey
->irq_dbr
, error
);
106 error
= input_register_device(ponkey
->idev
);
108 dev_err(ab8500
->dev
, "Can't register input device: %d\n", error
);
112 platform_set_drvdata(pdev
, ponkey
);
117 static const struct of_device_id ab8500_ponkey_match
[] = {
118 { .compatible
= "stericsson,ab8500-ponkey", },
121 MODULE_DEVICE_TABLE(of
, ab8500_ponkey_match
);
124 static struct platform_driver ab8500_ponkey_driver
= {
126 .name
= "ab8500-poweron-key",
127 .of_match_table
= of_match_ptr(ab8500_ponkey_match
),
129 .probe
= ab8500_ponkey_probe
,
131 module_platform_driver(ab8500_ponkey_driver
);
133 MODULE_LICENSE("GPL v2");
134 MODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
135 MODULE_DESCRIPTION("ST-Ericsson AB8500 Power-ON(Pon) Key driver");