This is the ONKEY component driver of the Dialog DA9058 PMIC.
This driver is just one component of the whole DA9058 PMIC driver.
It depends on the CORE component driver of the DA9058 MFD.
Signed-off-by: Anthony Olech <[email protected]>
Signed-off-by: David Dajun Chen <[email protected]>
---
drivers/input/misc/Kconfig | 10 +++
drivers/input/misc/Makefile | 1 +
drivers/input/misc/da9058_onkey.c | 177 +++++++++++++++++++++++++++++++++++++
3 files changed, 188 insertions(+)
create mode 100644 drivers/input/misc/da9058_onkey.c
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 259ef31..bd07b38 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -93,6 +93,16 @@ config INPUT_BMA150
To compile this driver as a module, choose M here: the
module will be called bma150.
+config INPUT_DA9058_ONKEY
+ tristate "DA9058 ONKEY support"
+ depends on MFD_DA9058
+ help
+ Support the ONKEY of DA9058 PMICs as an input device
+ reporting power button status.
+
+ To compile this driver as a module, choose M here: the module
+ will be called da9058_onkey.
+
config INPUT_PCSPKR
tristate "PC Speaker support"
depends on PCSPKR_PLATFORM
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 1f1e1b1..f36bf33 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -44,6 +44,7 @@ obj-$(CONFIG_INPUT_PCF8574) += pcf8574_keypad.o
obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
obj-$(CONFIG_INPUT_PM8XXX_VIBRATOR) += pm8xxx-vibrator.o
obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) += pmic8xxx-pwrkey.o
+obj-$(CONFIG_INPUT_DA9058_ONKEY) += da9058_onkey.o
obj-$(CONFIG_INPUT_POWERMATE) += powermate.o
obj-$(CONFIG_INPUT_PWM_BEEPER) += pwm-beeper.o
obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o
diff --git a/drivers/input/misc/da9058_onkey.c b/drivers/input/misc/da9058_onkey.c
new file mode 100644
index 0000000..969ad70
--- /dev/null
+++ b/drivers/input/misc/da9058_onkey.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/mfd/core.h>
+#include <linux/regmap.h>
+
+#include <linux/mfd/da9058/version.h>
+#include <linux/mfd/da9058/registers.h>
+#include <linux/mfd/da9058/core.h>
+#include <linux/mfd/da9058/irq.h>
+#include <linux/mfd/da9058/onkey.h>
+
+struct da9058_onkey {
+ struct da9058 *da9058;
+ struct platform_device *pdev;
+ struct input_dev *input;
+ struct delayed_work work;
+ int irq;
+};
+
+static void da9058_onkey_poll(struct work_struct *work)
+{
+ struct da9058_onkey *onkey = container_of(work, struct da9058_onkey,
+ work.work);
+ struct da9058 *da9058 = onkey->da9058;
+ int poll, ret;
+ unsigned int sa;
+
+ ret = da9058_reg_read(da9058, DA9058_STATUSA_REG, &sa);
+ if (ret) {
+ dev_dbg(&onkey->pdev->dev, "Failed to read ONKEY: %d\n", ret);
+ poll = 1;
+ } else if (sa & DA9058_STATUSA_NONKEY) {
+ poll = 0;
+ } else {
+ poll = 1;
+ }
+
+ input_report_key(onkey->input, KEY_POWER, poll);
+ input_sync(onkey->input);
+
+ if (poll)
+ schedule_delayed_work(&onkey->work, msecs_to_jiffies(50));
+}
+
+static irqreturn_t da9058_onkey_event_handler(int irq, void *data)
+{
+ struct da9058_onkey *onkey = data;
+
+ schedule_delayed_work(&onkey->work, 0);
+
+ return IRQ_HANDLED;
+}
+
+static int da9058_onkey_probe(struct platform_device *pdev)
+{
+ struct da9058 *da9058 = dev_get_drvdata(pdev->dev.parent);
+ const struct mfd_cell *cell = mfd_get_cell(pdev);
+ struct da9058_onkey_pdata *onkey_pdata;
+ struct da9058_onkey *onkey;
+ int ret;
+
+ if (cell == NULL) {
+ ret = -ENODEV;
+ goto exit;
+ }
+
+ onkey_pdata = cell->platform_data;
+
+ if (onkey_pdata == NULL) {
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ dev_info(&pdev->dev, "Starting ONKEY\n");
+
+ onkey = devm_kzalloc(&pdev->dev, sizeof(struct da9058_onkey),
+ GFP_KERNEL);
+ if (!onkey) {
+ ret = -ENOMEM;
+ goto exit;
+ }
+
+ platform_set_drvdata(pdev, onkey);
+
+ onkey->da9058 = da9058;
+ onkey->pdev = pdev;
+
+ onkey->irq = platform_get_irq(pdev, 0);
+ if (onkey->irq < 0) {
+ dev_err(&pdev->dev, "can not get ONKEY IRQ error=%d\n",
+ onkey->irq);
+ ret = -ENODEV;
+ goto failed_to_get_irq;
+ }
+
+ INIT_DELAYED_WORK(&onkey->work, da9058_onkey_poll);
+
+ onkey->input = input_allocate_device();
+ if (!onkey->input) {
+ dev_err(&pdev->dev, "failed to allocate data device\n");
+ ret = -ENOMEM;
+ goto failed_to_allocate_device;
+ }
+
+ onkey->input->evbit[0] = BIT_MASK(EV_KEY);
+ onkey->input->keybit[BIT_WORD(KEY_POWER)] = BIT_MASK(KEY_POWER);
+ onkey->input->name = "da9058-onkey";
+ onkey->input->phys = "da9058-onkey/input0";
+ onkey->input->dev.parent = &pdev->dev;
+
+ ret = input_register_device(onkey->input);
+ if (ret) {
+ dev_err(&pdev->dev,
+ "Unable to register input ONKEY device: %d\n", ret);
+ goto failed_to_register_device;
+ }
+
+ ret = request_threaded_irq(da9058_to_virt_irq_num(da9058, onkey->irq),
+ NULL, da9058_onkey_event_handler,
+ IRQF_TRIGGER_RISING | IRQF_ONESHOT,
+ "DA9058 keydown", onkey);
+
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to get ONKEY keydown IRQ %d: %d\n",
+ onkey->irq, ret);
+ goto failed_to_get_onkey_irq;
+ }
+ goto exit;
+
+failed_to_get_onkey_irq:
+failed_to_register_device:
+ input_free_device(onkey->input);
+failed_to_get_irq:
+failed_to_allocate_device:
+ platform_set_drvdata(pdev, NULL);
+exit:
+ return ret;
+}
+
+static int da9058_onkey_remove(struct platform_device *pdev)
+{
+ struct da9058_onkey *onkey = platform_get_drvdata(pdev);
+ struct da9058 *da9058 = onkey->da9058;
+
+ free_irq(da9058_to_virt_irq_num(da9058, onkey->irq), onkey);
+ cancel_delayed_work_sync(&onkey->work);
+ input_unregister_device(onkey->input);
+
+ return 0;
+}
+
+static struct platform_driver da9058_onkey_driver = {
+ .probe = da9058_onkey_probe,
+ .remove = da9058_onkey_remove,
+ .driver = {
+ .name = "da9058-onkey",
+ .owner = THIS_MODULE,
+ }
+};
+
+module_platform_driver(da9058_onkey_driver);
+
+MODULE_AUTHOR("Anthony Olech <[email protected]>");
+MODULE_DESCRIPTION("Dialog DA9058 PMIC Onkey Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:da9058-onkey");
--
end-of-patch for NEW DRIVER V4
On 04/12/13 06:05, Anthony Olech wrote:
> This is the ONKEY component driver of the Dialog DA9058 PMIC.
> This driver is just one component of the whole DA9058 PMIC driver.
> It depends on the CORE component driver of the DA9058 MFD.
>
> Signed-off-by: Anthony Olech <[email protected]>
> Signed-off-by: David Dajun Chen <[email protected]>
> ---
> drivers/input/misc/Kconfig | 10 +++
> drivers/input/misc/Makefile | 1 +
> drivers/input/misc/da9058_onkey.c | 177 +++++++++++++++++++++++++++++++++++++
> 3 files changed, 188 insertions(+)
> create mode 100644 drivers/input/misc/da9058_onkey.c
>
> diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
> index 259ef31..bd07b38 100644
> --- a/drivers/input/misc/Kconfig
> +++ b/drivers/input/misc/Kconfig
> @@ -93,6 +93,16 @@ config INPUT_BMA150
> To compile this driver as a module, choose M here: the
> module will be called bma150.
>
> +config INPUT_DA9058_ONKEY
> + tristate "DA9058 ONKEY support"
> + depends on MFD_DA9058
> + help
> + Support the ONKEY of DA9058 PMICs as an input device
> + reporting power button status.
What possible values can a power button status have?
Must be more than my KISS guess:
this software is running => ON
software not running => OFF
eh?
> +
> + To compile this driver as a module, choose M here: the module
> + will be called da9058_onkey.
> +
> config INPUT_PCSPKR
> tristate "PC Speaker support"
> depends on PCSPKR_PLATFORM
> diff --git a/drivers/input/misc/da9058_onkey.c b/drivers/input/misc/da9058_onkey.c
> new file mode 100644
> index 0000000..969ad70
> --- /dev/null
> +++ b/drivers/input/misc/da9058_onkey.c
> @@ -0,0 +1,177 @@
> +/*
> + * Copyright (C) 2012 Dialog Semiconductor Ltd.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + */
> +
> +
> +static int da9058_onkey_probe(struct platform_device *pdev)
> +{
> + struct da9058 *da9058 = dev_get_drvdata(pdev->dev.parent);
> + const struct mfd_cell *cell = mfd_get_cell(pdev);
> + struct da9058_onkey_pdata *onkey_pdata;
> + struct da9058_onkey *onkey;
> + int ret;
> +
> + if (cell == NULL) {
> + ret = -ENODEV;
> + goto exit;
> + }
> +
> + onkey_pdata = cell->platform_data;
> +
> + if (onkey_pdata == NULL) {
> + ret = -EINVAL;
> + goto exit;
> + }
> +
> + dev_info(&pdev->dev, "Starting ONKEY\n");
> +
> + onkey = devm_kzalloc(&pdev->dev, sizeof(struct da9058_onkey),
> + GFP_KERNEL);
> + if (!onkey) {
> + ret = -ENOMEM;
> + goto exit;
> + }
> +
> + platform_set_drvdata(pdev, onkey);
> +
> + onkey->da9058 = da9058;
> + onkey->pdev = pdev;
> +
> + onkey->irq = platform_get_irq(pdev, 0);
> + if (onkey->irq < 0) {
> + dev_err(&pdev->dev, "can not get ONKEY IRQ error=%d\n",
cannot
> + onkey->irq);
--
~Randy
> -----Original Message-----
> From: Randy Dunlap [mailto:[email protected]]
> Sent: 12 April 2013 21:02
> To: Opensource [Anthony Olech]
> Cc: Dmitry Torokhov; Mark Brown; Samuel Ortiz; Ashish Jangam; Eric
> Andersson; Andrew Jones; [email protected]; LKML; David Dajun Chen
> Subject: Re: [NEW DRIVER V4 3/7] DA9058 ONKEY driver
>
> On 04/12/13 06:05, Anthony Olech wrote:
> > This is the ONKEY component driver of the Dialog DA9058 PMIC.
> > This driver is just one component of the whole DA9058 PMIC driver.
> > It depends on the CORE component driver of the DA9058 MFD.
> >
> > Signed-off-by: Anthony Olech <[email protected]>
> > Signed-off-by: David Dajun Chen <[email protected]>
> > ---
> > drivers/input/misc/Kconfig | 10 +++
> > drivers/input/misc/Makefile | 1 +
> > drivers/input/misc/da9058_onkey.c | 177
> > +++++++++++++++++++++++++++++++++++++
> > 3 files changed, 188 insertions(+)
> > create mode 100644 drivers/input/misc/da9058_onkey.c
> >
> > diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
> > index 259ef31..bd07b38 100644
> > --- a/drivers/input/misc/Kconfig
> > +++ b/drivers/input/misc/Kconfig
> > @@ -93,6 +93,16 @@ config INPUT_BMA150
> > To compile this driver as a module, choose M here: the
> > module will be called bma150.
> >
> > +config INPUT_DA9058_ONKEY
> > + tristate "DA9058 ONKEY support"
> > + depends on MFD_DA9058
> > + help
> > + Support the ONKEY of DA9058 PMICs as an input device
> > + reporting power button status.
>
> What possible values can a power button status have?
> Must be more than my KISS guess:
> this software is running => ON
> software not running => OFF
> eh?
Pressing the button briefly and pressing and holding the button will have
different effects in a mobile device. The press and hold on phones normally
switches them into a sleep state. So the "power button status" is the fact
that the ONKEY is still being held down.
Does that answer your question? or have I missed your point??
[...]
> > + onkey->irq = platform_get_irq(pdev, 0);
> > + if (onkey->irq < 0) {
> > + dev_err(&pdev->dev, "can not get ONKEY IRQ error=%d\n",
>
> cannot
The Washington State University language site says:
"These two spellings [cannot/can not] are largely interchangeable, but by far
the most common is 'cannot' and you should probably use it except when you
want to be emphatic: 'No, you can not wash the dog in the Maytag.'"
Since I was not trying to be particularly emphatic, I will change to using 'cannot'
as per your suggestion.
Tony Olech
On 04/16/13 03:33, Opensource [Anthony Olech] wrote:
>> -----Original Message-----
>> From: Randy Dunlap [mailto:[email protected]]
>> Sent: 12 April 2013 21:02
>> To: Opensource [Anthony Olech]
>> Cc: Dmitry Torokhov; Mark Brown; Samuel Ortiz; Ashish Jangam; Eric
>> Andersson; Andrew Jones; [email protected]; LKML; David Dajun Chen
>> Subject: Re: [NEW DRIVER V4 3/7] DA9058 ONKEY driver
>>
>> On 04/12/13 06:05, Anthony Olech wrote:
>>> This is the ONKEY component driver of the Dialog DA9058 PMIC.
>>> This driver is just one component of the whole DA9058 PMIC driver.
>>> It depends on the CORE component driver of the DA9058 MFD.
>>>
>>> Signed-off-by: Anthony Olech <[email protected]>
>>> Signed-off-by: David Dajun Chen <[email protected]>
>>> ---
>>> drivers/input/misc/Kconfig | 10 +++
>>> drivers/input/misc/Makefile | 1 +
>>> drivers/input/misc/da9058_onkey.c | 177
>>> +++++++++++++++++++++++++++++++++++++
>>> 3 files changed, 188 insertions(+)
>>> create mode 100644 drivers/input/misc/da9058_onkey.c
>>>
>>> diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
>>> index 259ef31..bd07b38 100644
>>> --- a/drivers/input/misc/Kconfig
>>> +++ b/drivers/input/misc/Kconfig
>>> @@ -93,6 +93,16 @@ config INPUT_BMA150
>>> To compile this driver as a module, choose M here: the
>>> module will be called bma150.
>>>
>>> +config INPUT_DA9058_ONKEY
>>> + tristate "DA9058 ONKEY support"
>>> + depends on MFD_DA9058
>>> + help
>>> + Support the ONKEY of DA9058 PMICs as an input device
>>> + reporting power button status.
>>
>> What possible values can a power button status have?
>> Must be more than my KISS guess:
>> this software is running => ON
>> software not running => OFF
>> eh?
>
> Pressing the button briefly and pressing and holding the button will have
> different effects in a mobile device. The press and hold on phones normally
> switches them into a sleep state. So the "power button status" is the fact
> that the ONKEY is still being held down.
>
> Does that answer your question? or have I missed your point??
Yes, that answers my question. I get it.
>
> [...]
>>> + onkey->irq = platform_get_irq(pdev, 0);
>>> + if (onkey->irq < 0) {
>>> + dev_err(&pdev->dev, "can not get ONKEY IRQ error=%d\n",
>>
>> cannot
>
> The Washington State University language site says:
>
> "These two spellings [cannot/can not] are largely interchangeable, but by far
> the most common is 'cannot' and you should probably use it except when you
> want to be emphatic: 'No, you can not wash the dog in the Maytag.'"
>
> Since I was not trying to be particularly emphatic, I will change to using 'cannot'
> as per your suggestion.
thanks.
--
~Randy