linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RESEND PATCH V4 0/3]  Add OnKey support for DA9063
@ 2015-05-19 10:32 S Twiss
  2015-05-19 10:32 ` [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver S Twiss
                   ` (2 more replies)
  0 siblings, 3 replies; 15+ messages in thread
From: S Twiss @ 2015-05-19 10:32 UTC (permalink / raw)
  To: Dmitry Torokhov, Ian Campbell, Kumar Gala, Lee Jones,
	Mark Rutland, Pawel Moll, Rob Herring, Samuel Ortiz, Steve Twiss
  Cc: DT, David Dajun Chen, INPUT, LKML, Support Opensource

From: Steve Twiss <stwiss.opensource@diasemi.com>

This patch set adds OnKey driver support for the Dialog
Semiconductor DA9063 PMIC.

[PATCH V4 1/3]: kernel driver onkey support
[PATCH V4 2/3]: device tree bindings document
[PATCH V4 3/3]: mfd core support

Thank you,
Steve Twiss, Dialog Semiconductor Ltd.

S Twiss (3):
  input: misc: da9063: OnKey driver
  devicetree: Add bindings for DA9063 OnKey
  mfd: da9063: MFD support for OnKey driver

 Documentation/devicetree/bindings/mfd/da9063.txt |  18 ++
 drivers/input/misc/Kconfig                       |  10 +
 drivers/input/misc/Makefile                      |   1 +
 drivers/input/misc/da9063_onkey.c                | 227 +++++++++++++++++++++++
 drivers/mfd/da9063-core.c                        |  54 ++++++
 include/linux/mfd/da9063/pdata.h                 |   1 +
 6 files changed, 311 insertions(+)
 create mode 100644 drivers/input/misc/da9063_onkey.c

-- 
end-of-patch for RESEND PATCH V4


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver
  2015-05-19 10:32 [RESEND PATCH V4 0/3] Add OnKey support for DA9063 S Twiss
  2015-05-19 10:32 ` [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver S Twiss
  2015-05-19 10:32 ` [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey S Twiss
@ 2015-05-19 10:32 ` S Twiss
  2015-05-27 15:37   ` Opensource [Steve Twiss]
  2015-06-01 14:01   ` Opensource [Steve Twiss]
  2 siblings, 2 replies; 15+ messages in thread
From: S Twiss @ 2015-05-19 10:32 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: DT, David Dajun Chen, INPUT, Ian Campbell, Kumar Gala, LKML,
	Lee Jones, Mark Rutland, Pawel Moll, Rob Herring, Samuel Ortiz,
	Steve Twiss, Support Opensource

From: Steve Twiss <stwiss.opensource@diasemi.com>

Add OnKey driver support for DA9063


Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>

---
The changes made here have been taken from the DA9062 OnKey review thread. 
Please see https://lkml.org/lkml/2015/4/29/406 for more information on this.

Version History

Changes in V4
 - No change

Changes in V3
 - Move the MFD code changes into a separate patch [PATCH V3 3/3]
 - Rename OnKey driver to use underscore: da9063_onkey.c
 - Header and MODULE_LICENSE macro update for GPL and filename change
 - Remove MAINTAINERS file (no longer needed due to rename of onkey driver)
 - Delete input_unregister_device call from platform driver remove function
 - Replaced dev_notice() with dev_dbg() for key press notification

Changes in V2
 - Remove the circular dependency comment in the main e-mail body
   linking PATCH V1 1/2 and 2/2
 - Alter the copyright header information to match expected GPLv2
   text from http://www.gnu.org/licenses/gpl-2.0.html

This patch applies against linux-next and v4.1-rc3 


 drivers/input/misc/Kconfig        |  10 ++
 drivers/input/misc/Makefile       |   1 +
 drivers/input/misc/da9063_onkey.c | 227 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 238 insertions(+)
 create mode 100644 drivers/input/misc/da9063_onkey.c

diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 4436ab1..d917883 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -610,6 +610,16 @@ config INPUT_DA9055_ONKEY
 	  To compile this driver as a module, choose M here: the module
 	  will be called da9055_onkey.
 
+config INPUT_DA9063_ONKEY
+	tristate "Dialog DA9063 OnKey"
+	depends on MFD_DA9063
+	help
+	  Support the ONKEY of Dialog DA9063 Power Management IC as an
+	  input device reporting power button statue.
+
+	  To compile this driver as a module, choose M here: the module
+	  will be called da9063-onkey.
+
 config INPUT_DM355EVM
 	tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
 	depends on MFD_DM355EVM_MSP
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 78ba4c1..4f95c56 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -25,6 +25,7 @@ obj-$(CONFIG_INPUT_CMA3000_I2C)		+= cma3000_d0x_i2c.o
 obj-$(CONFIG_INPUT_COBALT_BTNS)		+= cobalt_btns.o
 obj-$(CONFIG_INPUT_DA9052_ONKEY)	+= da9052_onkey.o
 obj-$(CONFIG_INPUT_DA9055_ONKEY)	+= da9055_onkey.o
+obj-$(CONFIG_INPUT_DA9063_ONKEY)	+= da9063_onkey.o
 obj-$(CONFIG_INPUT_DM355EVM)		+= dm355evm_keys.o
 obj-$(CONFIG_INPUT_E3X0_BUTTON)		+= e3x0-button.o
 obj-$(CONFIG_INPUT_DRV260X_HAPTICS)	+= drv260x.o
diff --git a/drivers/input/misc/da9063_onkey.c b/drivers/input/misc/da9063_onkey.c
new file mode 100644
index 0000000..250595c
--- /dev/null
+++ b/drivers/input/misc/da9063_onkey.c
@@ -0,0 +1,227 @@
+/*
+ * da9063_onkey.c - Onkey device driver for DA9063
+ * Copyright (C) 2015  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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/workqueue.h>
+#include <linux/regmap.h>
+#include <linux/of.h>
+#include <linux/mfd/da9063/core.h>
+#include <linux/mfd/da9063/pdata.h>
+#include <linux/mfd/da9063/registers.h>
+
+struct da9063_onkey {
+	struct	da9063 *hw;
+	struct delayed_work work;
+	struct	input_dev *input;
+	int irq;
+	bool key_power;
+};
+
+static void da9063_poll_on(struct work_struct *work)
+{
+	struct da9063_onkey *onkey = container_of(work, struct da9063_onkey,
+						  work.work);
+	unsigned int val;
+	int fault_log = 0;
+	bool poll = true;
+	int ret;
+
+	/* poll to see when the pin is released */
+	ret = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A, &val);
+	if (ret < 0) {
+		dev_err(&onkey->input->dev,
+			"Failed to read ON status: %d\n", ret);
+		goto err_poll;
+	}
+
+	if (!(val & DA9063_NONKEY)) {
+		ret = regmap_update_bits(onkey->hw->regmap,
+					 DA9063_REG_CONTROL_B,
+					 DA9063_NONKEY_LOCK, 0);
+		if (ret < 0) {
+			dev_err(&onkey->input->dev,
+				"Failed to reset the Key Delay %d\n", ret);
+			goto err_poll;
+		}
+
+		input_report_key(onkey->input, KEY_POWER, 0);
+		input_sync(onkey->input);
+
+		poll = false;
+	}
+
+	/* if the fault log KEY_RESET is detected,
+	 * then clear it and shutdown via I2C
+	 */
+	ret = regmap_read(onkey->hw->regmap, DA9063_REG_FAULT_LOG, &fault_log);
+	if (ret < 0)
+		dev_warn(&onkey->input->dev, "Cannot read FAULT_LOG\n");
+
+	if (fault_log & DA9063_KEY_RESET) {
+		ret = regmap_write(onkey->hw->regmap,
+				   DA9063_REG_FAULT_LOG,
+				   DA9063_KEY_RESET);
+		if (ret < 0)
+			dev_warn(&onkey->input->dev,
+				 "Cannot reset KEY_RESET fault log\n");
+		else {
+			/* at this point we do any S/W housekeeping
+			 * and then send shutdown command
+			 */
+			dev_dbg(&onkey->input->dev,
+				 "Sending SHUTDOWN to DA9063 ...\n");
+			ret = regmap_write(onkey->hw->regmap,
+					   DA9063_REG_CONTROL_F,
+					   DA9063_SHUTDOWN);
+			if (ret < 0)
+				dev_err(&onkey->input->dev,
+					"Cannot SHUTDOWN DA9063\n");
+		}
+	}
+
+err_poll:
+	if (poll)
+		schedule_delayed_work(&onkey->work, 50);
+}
+
+static irqreturn_t da9063_onkey_irq_handler(int irq, void *data)
+{
+	struct da9063_onkey *onkey = data;
+	unsigned int val;
+	int ret;
+
+	ret = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A, &val);
+	if (onkey->key_power && (ret >= 0) && (val & DA9063_NONKEY)) {
+		input_report_key(onkey->input, KEY_POWER, 1);
+		input_sync(onkey->input);
+		schedule_delayed_work(&onkey->work, 0);
+		dev_dbg(&onkey->input->dev, "KEY_POWER pressed.\n");
+	} else {
+		input_report_key(onkey->input, KEY_SLEEP, 1);
+		input_sync(onkey->input);
+		input_report_key(onkey->input, KEY_SLEEP, 0);
+		input_sync(onkey->input);
+		dev_dbg(&onkey->input->dev, "KEY_SLEEP pressed.\n");
+	}
+
+	return IRQ_HANDLED;
+}
+
+static int da9063_onkey_probe(struct platform_device *pdev)
+{
+	struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent);
+	struct da9063_pdata *pdata = dev_get_platdata(da9063->dev);
+	struct da9063_onkey *onkey;
+	bool kp_tmp = true;
+	int ret = 0;
+
+	if (pdata)
+		kp_tmp = pdata->key_power;
+	else {
+		kp_tmp = of_property_read_bool((&pdev->dev)->of_node,
+					       "dlg,disable-key-power");
+		kp_tmp = !kp_tmp;
+	}
+
+	onkey = devm_kzalloc(&pdev->dev, sizeof(struct da9063_onkey),
+			     GFP_KERNEL);
+	if (!onkey) {
+		dev_err(&pdev->dev, "Failed to allocate memory.\n");
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	INIT_DELAYED_WORK(&onkey->work, da9063_poll_on);
+
+	onkey->input = devm_input_allocate_device(&pdev->dev);
+	if (!onkey->input) {
+		dev_err(&pdev->dev, "Failed to allocated input device.\n");
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	ret = platform_get_irq_byname(pdev, "ONKEY");
+	if (ret < 0) {
+		dev_err(&pdev->dev, "Failed to get platform IRQ.\n");
+		goto err;
+	}
+	onkey->irq = ret;
+
+	ret = request_threaded_irq(onkey->irq, NULL,
+				   da9063_onkey_irq_handler,
+				   IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+				   "ONKEY", onkey);
+	if (ret) {
+		dev_err(&pdev->dev,
+			"Failed to request input device IRQ.\n");
+		goto err;
+	}
+
+	onkey->hw = da9063;
+	onkey->key_power = kp_tmp;
+	onkey->input->evbit[0] = BIT_MASK(EV_KEY);
+	onkey->input->name = DA9063_DRVNAME_ONKEY;
+	onkey->input->phys = DA9063_DRVNAME_ONKEY "/input0";
+	onkey->input->dev.parent = &pdev->dev;
+
+	if (onkey->key_power)
+		input_set_capability(onkey->input, EV_KEY, KEY_POWER);
+	input_set_capability(onkey->input, EV_KEY, KEY_SLEEP);
+
+	ret = input_register_device(onkey->input);
+	if (ret) {
+		dev_err(&pdev->dev,
+			"Failed to register input device.\n");
+		goto err_irq;
+	}
+
+	platform_set_drvdata(pdev, onkey);
+	return 0;
+
+err_irq:
+	free_irq(onkey->irq, onkey);
+	cancel_delayed_work_sync(&onkey->work);
+err:
+	return ret;
+}
+
+static int da9063_onkey_remove(struct platform_device *pdev)
+{
+	struct	da9063_onkey *onkey = platform_get_drvdata(pdev);
+
+	free_irq(onkey->irq, onkey);
+	cancel_delayed_work_sync(&onkey->work);
+	return 0;
+}
+
+static struct platform_driver da9063_onkey_driver = {
+	.probe	= da9063_onkey_probe,
+	.remove	= da9063_onkey_remove,
+	.driver	= {
+		.name	= DA9063_DRVNAME_ONKEY,
+		.owner	= THIS_MODULE,
+	},
+};
+
+module_platform_driver(da9063_onkey_driver);
+
+MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
+MODULE_DESCRIPTION("Onkey device driver for Dialog DA9063");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DA9063_DRVNAME_ONKEY);
-- 
end-of-patch for RESEND PATCH V4


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey
  2015-05-19 10:32 [RESEND PATCH V4 0/3] Add OnKey support for DA9063 S Twiss
  2015-05-19 10:32 ` [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver S Twiss
@ 2015-05-19 10:32 ` S Twiss
  2015-05-20 13:44   ` Rob Herring
  2015-05-26 13:58   ` Lee Jones
  2015-05-19 10:32 ` [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver S Twiss
  2 siblings, 2 replies; 15+ messages in thread
From: S Twiss @ 2015-05-19 10:32 UTC (permalink / raw)
  To: Ian Campbell, Kumar Gala, Lee Jones, Mark Rutland, Pawel Moll,
	Rob Herring, Steve Twiss
  Cc: DT, David Dajun Chen, Dmitry Torokhov, INPUT, LKML, Samuel Ortiz,
	Support Opensource

From: Steve Twiss <stwiss.opensource@diasemi.com>

Add device tree bindings for the DA9063 OnKey driver

Acked-by: Lee Jones <lee.jones@linaro.org>

Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>

---
Version History

Changes in V4
 - No change

Changes in V3
 - No change

Changes in V2
 - Remove the circular dependency comment linking patches in the main e-mail
 - Search and replace 'keyword' with 'property' in onkey sub-node description
 - Reformat onkey sub-node content to move the description for key-power into
   a new optional properties sub-section so it has a more promiment position

This patch applies against linux-next and v4.1-rc3 


 Documentation/devicetree/bindings/mfd/da9063.txt | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/Documentation/devicetree/bindings/mfd/da9063.txt b/Documentation/devicetree/bindings/mfd/da9063.txt
index 42c6fa6..05b21bc 100644
--- a/Documentation/devicetree/bindings/mfd/da9063.txt
+++ b/Documentation/devicetree/bindings/mfd/da9063.txt
@@ -5,6 +5,7 @@ DA9093 consists of a large and varied group of sub-devices (I2C Only):
 Device                   Supply Names    Description
 ------                   ------------    -----------
 da9063-regulator        :               : LDOs & BUCKs
+da9063-onkey            :               : On Key
 da9063-rtc              :               : Real-Time Clock
 da9063-watchdog         :               : Watchdog
 
@@ -51,6 +52,18 @@ Sub-nodes:
   the DA9063. There are currently no entries in this binding, however
   compatible = "dlg,da9063-rtc" should be added if a node is created.
 
+- onkey : This node defines the OnKey settings for controlling the key
+  functionality of the device. The node should contain the compatible property
+  with the value "dlg,da9063-onkey".
+
+  Optional onkey properties:
+
+  - dlg,disable-key-power : Disable power-down using a long key-press. If this
+    entry exists the OnKey driver will remove support for the KEY_POWER key
+    press. If this entry does not exist then by default the key-press
+    triggered power down is enabled and the OnKey will support both KEY_POWER
+    and KEY_SLEEP.
+
 - watchdog : This node defines settings for the Watchdog timer associated
   with the DA9063. There are currently no entries in this binding, however
   compatible = "dlg,da9063-watchdog" should be added if a node is created.
@@ -73,6 +86,11 @@ Example:
 			compatible = "dlg,da9063-watchdog";
 		};
 
+		onkey {
+			compatible = "dlg,da9063-onkey";
+			dlg,disable-key-power;
+		};
+
 		regulators {
 			DA9063_BCORE1: bcore1 {
 				regulator-name = "BCORE1";
-- 
end-of-patch for RESEND PATCH V4


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver
  2015-05-19 10:32 [RESEND PATCH V4 0/3] Add OnKey support for DA9063 S Twiss
@ 2015-05-19 10:32 ` S Twiss
  2015-05-26 13:57   ` Lee Jones
  2015-06-08 23:25   ` Dmitry Torokhov
  2015-05-19 10:32 ` [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey S Twiss
  2015-05-19 10:32 ` [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver S Twiss
  2 siblings, 2 replies; 15+ messages in thread
From: S Twiss @ 2015-05-19 10:32 UTC (permalink / raw)
  To: Lee Jones, Samuel Ortiz, Steve Twiss
  Cc: DT, David Dajun Chen, Dmitry Torokhov, INPUT, Ian Campbell,
	Kumar Gala, LKML, Mark Rutland, Pawel Moll, Rob Herring,
	Support Opensource

From: Steve Twiss <stwiss.opensource@diasemi.com>

Add MFD support for the DA9063 OnKey driver

The function da9063_clear_fault_log() is added to mitigate the case of a
hardware power-cut after a long-long OnKey press. Although there is no
software intervention in this case (by definition) such a shutdown would
cause persistent information within the DA9063 FAULT_LOG that would be
available during the next device restart.

Clearance of this persistent register must be completed after such a
hardware power-cut operation has happened so that the FAULT_LOG does not
continue with previous values. The clearance function has been added here
in the kernel driver because wiping the fault-log cannot be counted on
outside the Linux kernel.

Acked-by: Lee Jones <lee.jones@linaro.org>

Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>

---
Version History

Changes in V4
 - Additional description of MFD patch changes for FAULT_LOG in relation to
   the requirements of the OnKey driver. Please see a further explanation of
   the OnKey's operation in this thread: https://lkml.org/lkml/2015/4/29/406

Changes in V3
 - The MFD code was originally in [PATCH V2 1/2]. This is now been moved into
   this patch [PATCH V3 3/3].
 - Whitespace cleanup

This patch applies against linux-next and v4.1-rc3 


 drivers/mfd/da9063-core.c        | 54 ++++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/da9063/pdata.h |  1 +
 2 files changed, 55 insertions(+)

diff --git a/drivers/mfd/da9063-core.c b/drivers/mfd/da9063-core.c
index facd361..af841c1 100644
--- a/drivers/mfd/da9063-core.c
+++ b/drivers/mfd/da9063-core.c
@@ -60,6 +60,7 @@ static struct resource da9063_rtc_resources[] = {
 
 static struct resource da9063_onkey_resources[] = {
 	{
+		.name	= "ONKEY",
 		.start	= DA9063_IRQ_ONKEY,
 		.end	= DA9063_IRQ_ONKEY,
 		.flags	= IORESOURCE_IRQ,
@@ -97,6 +98,7 @@ static const struct mfd_cell da9063_devs[] = {
 		.name		= DA9063_DRVNAME_ONKEY,
 		.num_resources	= ARRAY_SIZE(da9063_onkey_resources),
 		.resources	= da9063_onkey_resources,
+		.of_compatible = "dlg,da9063-onkey",
 	},
 	{
 		.name		= DA9063_DRVNAME_RTC,
@@ -109,12 +111,64 @@ static const struct mfd_cell da9063_devs[] = {
 	},
 };
 
+static int da9063_clear_fault_log(struct da9063 *da9063)
+{
+	int ret = 0;
+	int fault_log = 0;
+
+	ret = regmap_read(da9063->regmap, DA9063_REG_FAULT_LOG, &fault_log);
+	if (ret < 0) {
+		dev_err(da9063->dev, "Cannot read FAULT_LOG.\n");
+		return -EIO;
+	}
+
+	if (fault_log) {
+		if (fault_log & DA9063_TWD_ERROR)
+			dev_dbg(da9063->dev,
+				"Fault log entry detected: DA9063_TWD_ERROR\n");
+		if (fault_log & DA9063_POR)
+			dev_dbg(da9063->dev,
+				"Fault log entry detected: DA9063_POR\n");
+		if (fault_log & DA9063_VDD_FAULT)
+			dev_dbg(da9063->dev,
+				"Fault log entry detected: DA9063_VDD_FAULT\n");
+		if (fault_log & DA9063_VDD_START)
+			dev_dbg(da9063->dev,
+				"Fault log entry detected: DA9063_VDD_START\n");
+		if (fault_log & DA9063_TEMP_CRIT)
+			dev_dbg(da9063->dev,
+				"Fault log entry detected: DA9063_TEMP_CRIT\n");
+		if (fault_log & DA9063_KEY_RESET)
+			dev_dbg(da9063->dev,
+				"Fault log entry detected: DA9063_KEY_RESET\n");
+		if (fault_log & DA9063_NSHUTDOWN)
+			dev_dbg(da9063->dev,
+				"Fault log entry detected: DA9063_NSHUTDOWN\n");
+		if (fault_log & DA9063_WAIT_SHUT)
+			dev_dbg(da9063->dev,
+				"Fault log entry detected: DA9063_WAIT_SHUT\n");
+	}
+
+	ret = regmap_write(da9063->regmap,
+			   DA9063_REG_FAULT_LOG,
+			   fault_log);
+	if (ret < 0)
+		dev_err(da9063->dev,
+			"Cannot reset FAULT_LOG values %d\n", ret);
+
+	return ret;
+}
+
 int da9063_device_init(struct da9063 *da9063, unsigned int irq)
 {
 	struct da9063_pdata *pdata = da9063->dev->platform_data;
 	int model, variant_id, variant_code;
 	int ret;
 
+	ret = da9063_clear_fault_log(da9063);
+	if (ret < 0)
+		dev_err(da9063->dev, "Cannot clear fault log\n");
+
 	if (pdata) {
 		da9063->flags = pdata->flags;
 		da9063->irq_base = pdata->irq_base;
diff --git a/include/linux/mfd/da9063/pdata.h b/include/linux/mfd/da9063/pdata.h
index 95c8742..612383b 100644
--- a/include/linux/mfd/da9063/pdata.h
+++ b/include/linux/mfd/da9063/pdata.h
@@ -103,6 +103,7 @@ struct da9063;
 struct da9063_pdata {
 	int				(*init)(struct da9063 *da9063);
 	int				irq_base;
+	bool				key_power;
 	unsigned			flags;
 	struct da9063_regulators_pdata	*regulators_pdata;
 	struct led_platform_data	*leds_pdata;
-- 
end-of-patch for RESEND PATCH V4


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey
  2015-05-19 10:32 ` [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey S Twiss
@ 2015-05-20 13:44   ` Rob Herring
  2015-05-20 14:27     ` Opensource [Steve Twiss]
  2015-05-26 13:58   ` Lee Jones
  1 sibling, 1 reply; 15+ messages in thread
From: Rob Herring @ 2015-05-20 13:44 UTC (permalink / raw)
  To: S Twiss
  Cc: Ian Campbell, Kumar Gala, Lee Jones, Mark Rutland, Pawel Moll,
	Rob Herring, DT, David Dajun Chen, Dmitry Torokhov, INPUT, LKML,
	Samuel Ortiz, Support Opensource

On Tue, May 19, 2015 at 5:32 AM, S Twiss <stwiss.opensource@diasemi.com> wrote:
> From: Steve Twiss <stwiss.opensource@diasemi.com>
>
> Add device tree bindings for the DA9063 OnKey driver
>
> Acked-by: Lee Jones <lee.jones@linaro.org>
>

nit: remove blank line here.

I would think a long key press would be a h/w powerdown rather than a
key event as how do you poweroff/reset a hung system? That doesn't
really affect the binding though, so:

Acked-by: Rob Herring <robh@kernel.org>

Rob

> Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
>
> ---
> Version History
>
> Changes in V4
>  - No change
>
> Changes in V3
>  - No change
>
> Changes in V2
>  - Remove the circular dependency comment linking patches in the main e-mail
>  - Search and replace 'keyword' with 'property' in onkey sub-node description
>  - Reformat onkey sub-node content to move the description for key-power into
>    a new optional properties sub-section so it has a more promiment position
>
> This patch applies against linux-next and v4.1-rc3
>
>
>  Documentation/devicetree/bindings/mfd/da9063.txt | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/mfd/da9063.txt b/Documentation/devicetree/bindings/mfd/da9063.txt
> index 42c6fa6..05b21bc 100644
> --- a/Documentation/devicetree/bindings/mfd/da9063.txt
> +++ b/Documentation/devicetree/bindings/mfd/da9063.txt
> @@ -5,6 +5,7 @@ DA9093 consists of a large and varied group of sub-devices (I2C Only):
>  Device                   Supply Names    Description
>  ------                   ------------    -----------
>  da9063-regulator        :               : LDOs & BUCKs
> +da9063-onkey            :               : On Key
>  da9063-rtc              :               : Real-Time Clock
>  da9063-watchdog         :               : Watchdog
>
> @@ -51,6 +52,18 @@ Sub-nodes:
>    the DA9063. There are currently no entries in this binding, however
>    compatible = "dlg,da9063-rtc" should be added if a node is created.
>
> +- onkey : This node defines the OnKey settings for controlling the key
> +  functionality of the device. The node should contain the compatible property
> +  with the value "dlg,da9063-onkey".
> +
> +  Optional onkey properties:
> +
> +  - dlg,disable-key-power : Disable power-down using a long key-press. If this
> +    entry exists the OnKey driver will remove support for the KEY_POWER key
> +    press. If this entry does not exist then by default the key-press
> +    triggered power down is enabled and the OnKey will support both KEY_POWER
> +    and KEY_SLEEP.
> +
>  - watchdog : This node defines settings for the Watchdog timer associated
>    with the DA9063. There are currently no entries in this binding, however
>    compatible = "dlg,da9063-watchdog" should be added if a node is created.
> @@ -73,6 +86,11 @@ Example:
>                         compatible = "dlg,da9063-watchdog";
>                 };
>
> +               onkey {
> +                       compatible = "dlg,da9063-onkey";
> +                       dlg,disable-key-power;
> +               };
> +
>                 regulators {
>                         DA9063_BCORE1: bcore1 {
>                                 regulator-name = "BCORE1";
> --
> end-of-patch for RESEND PATCH V4
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey
  2015-05-20 13:44   ` Rob Herring
@ 2015-05-20 14:27     ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 15+ messages in thread
From: Opensource [Steve Twiss] @ 2015-05-20 14:27 UTC (permalink / raw)
  To: Rob Herring
  Cc: Ian Campbell, Kumar Gala, Lee Jones, Mark Rutland, Pawel Moll,
	Rob Herring, DT, David Dajun Chen, Dmitry Torokhov, INPUT, LKML,
	Samuel Ortiz, Support Opensource

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 2556 bytes --]

On 20 May 2015 14:44 Rob Herring wrote:

> To: Opensource [Steve Twiss]
> Cc: Ian Campbell; Kumar Gala; Lee Jones; Mark Rutland; Pawel Moll; Rob
> Herring; DT; David Dajun Chen; Dmitry Torokhov; INPUT; LKML; Samuel Ortiz;
> Support Opensource
> Subject: Re: [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063
> OnKey
> 
> On Tue, May 19, 2015 at 5:32 AM, S Twiss
> <stwiss.opensource@diasemi.com> wrote:
> > From: Steve Twiss <stwiss.opensource@diasemi.com>
> >
> > Add device tree bindings for the DA9063 OnKey driver
> >
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> >

Hi Rob,

Thanks for the Ack.

> I would think a long key press would be a h/w powerdown rather than a
> key event as how do you poweroff/reset a hung system? That doesn't
> really affect the binding though, so:

yep.. 

That H/W controlled shutdown is not covered in the device driver because
it is defaulted by the hardware PMIC.

The  DA9063 OnKey has are four modes of operation -- and one of them is
a H/W controlled shutdown (to reset a hung system).  Holding down the
OnKey for a "long-long" key-press, if there is no software intervention,
then the PMIC will chop the power.

The other three modes are ...
(a) Short key press
(b) Long-key press
(c) Long-long key press

These modes *are* handled by the S/W driver.
(a) The short key-press being the usual sleep/suspend.
(b) Long key press is the KEY_POWER (bringing up a dialog on Android to ask if
the user wants to shutdown the device) -- this is the one that can be disabled
by the device tree binding.
(c) Long-long key press -- this is the software equivalent to the H/W shutdown
for a hung system. Instead of the hardware pulling the plug, the software sends
a command to tell the PMIC to pull the plug.

If that last one sounds like a repeat of the H/W shutdown, then that is because
it almost is.

It covers the use case when the user decides to shutdown their device by doing
a long-long key press. The difference here is that the software is still able to
respond, and so there is space for any important house-keeping (say to save
important data) before the software sends a command to tell the PMIC to pull
the plug.

The fail-safe at this point is: if the S/W really isn't responding, then the hardware
monitors the long-long key-press and if there is no intervention by software, the 
PMIC pulls the power plug 1 second later.

Regards,
Steve
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver
  2015-05-19 10:32 ` [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver S Twiss
@ 2015-05-26 13:57   ` Lee Jones
  2015-05-26 14:06     ` Opensource [Steve Twiss]
  2015-06-08 23:25   ` Dmitry Torokhov
  1 sibling, 1 reply; 15+ messages in thread
From: Lee Jones @ 2015-05-26 13:57 UTC (permalink / raw)
  To: S Twiss
  Cc: Samuel Ortiz, DT, David Dajun Chen, Dmitry Torokhov, INPUT,
	Ian Campbell, Kumar Gala, LKML, Mark Rutland, Pawel Moll,
	Rob Herring, Support Opensource

On Tue, 19 May 2015, S Twiss wrote:

> From: Steve Twiss <stwiss.opensource@diasemi.com>
> 
> Add MFD support for the DA9063 OnKey driver
> 
> The function da9063_clear_fault_log() is added to mitigate the case of a
> hardware power-cut after a long-long OnKey press. Although there is no
> software intervention in this case (by definition) such a shutdown would
> cause persistent information within the DA9063 FAULT_LOG that would be
> available during the next device restart.
> 
> Clearance of this persistent register must be completed after such a
> hardware power-cut operation has happened so that the FAULT_LOG does not
> continue with previous values. The clearance function has been added here
> in the kernel driver because wiping the fault-log cannot be counted on
> outside the Linux kernel.
> 
> Acked-by: Lee Jones <lee.jones@linaro.org>
> 
> Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
> 
> ---
> Version History
> 
> Changes in V4
>  - Additional description of MFD patch changes for FAULT_LOG in relation to
>    the requirements of the OnKey driver. Please see a further explanation of
>    the OnKey's operation in this thread: https://lkml.org/lkml/2015/4/29/406
> 
> Changes in V3
>  - The MFD code was originally in [PATCH V2 1/2]. This is now been moved into
>    this patch [PATCH V3 3/3].
>  - Whitespace cleanup
> 
> This patch applies against linux-next and v4.1-rc3 
> 
> 
>  drivers/mfd/da9063-core.c        | 54 ++++++++++++++++++++++++++++++++++++++++
>  include/linux/mfd/da9063/pdata.h |  1 +
>  2 files changed, 55 insertions(+)

Applied, thanks.

> diff --git a/drivers/mfd/da9063-core.c b/drivers/mfd/da9063-core.c
> index facd361..af841c1 100644
> --- a/drivers/mfd/da9063-core.c
> +++ b/drivers/mfd/da9063-core.c
> @@ -60,6 +60,7 @@ static struct resource da9063_rtc_resources[] = {
>  
>  static struct resource da9063_onkey_resources[] = {
>  	{
> +		.name	= "ONKEY",
>  		.start	= DA9063_IRQ_ONKEY,
>  		.end	= DA9063_IRQ_ONKEY,
>  		.flags	= IORESOURCE_IRQ,
> @@ -97,6 +98,7 @@ static const struct mfd_cell da9063_devs[] = {
>  		.name		= DA9063_DRVNAME_ONKEY,
>  		.num_resources	= ARRAY_SIZE(da9063_onkey_resources),
>  		.resources	= da9063_onkey_resources,
> +		.of_compatible = "dlg,da9063-onkey",
>  	},
>  	{
>  		.name		= DA9063_DRVNAME_RTC,
> @@ -109,12 +111,64 @@ static const struct mfd_cell da9063_devs[] = {
>  	},
>  };
>  
> +static int da9063_clear_fault_log(struct da9063 *da9063)
> +{
> +	int ret = 0;
> +	int fault_log = 0;
> +
> +	ret = regmap_read(da9063->regmap, DA9063_REG_FAULT_LOG, &fault_log);
> +	if (ret < 0) {
> +		dev_err(da9063->dev, "Cannot read FAULT_LOG.\n");
> +		return -EIO;
> +	}
> +
> +	if (fault_log) {
> +		if (fault_log & DA9063_TWD_ERROR)
> +			dev_dbg(da9063->dev,
> +				"Fault log entry detected: DA9063_TWD_ERROR\n");
> +		if (fault_log & DA9063_POR)
> +			dev_dbg(da9063->dev,
> +				"Fault log entry detected: DA9063_POR\n");
> +		if (fault_log & DA9063_VDD_FAULT)
> +			dev_dbg(da9063->dev,
> +				"Fault log entry detected: DA9063_VDD_FAULT\n");
> +		if (fault_log & DA9063_VDD_START)
> +			dev_dbg(da9063->dev,
> +				"Fault log entry detected: DA9063_VDD_START\n");
> +		if (fault_log & DA9063_TEMP_CRIT)
> +			dev_dbg(da9063->dev,
> +				"Fault log entry detected: DA9063_TEMP_CRIT\n");
> +		if (fault_log & DA9063_KEY_RESET)
> +			dev_dbg(da9063->dev,
> +				"Fault log entry detected: DA9063_KEY_RESET\n");
> +		if (fault_log & DA9063_NSHUTDOWN)
> +			dev_dbg(da9063->dev,
> +				"Fault log entry detected: DA9063_NSHUTDOWN\n");
> +		if (fault_log & DA9063_WAIT_SHUT)
> +			dev_dbg(da9063->dev,
> +				"Fault log entry detected: DA9063_WAIT_SHUT\n");
> +	}
> +
> +	ret = regmap_write(da9063->regmap,
> +			   DA9063_REG_FAULT_LOG,
> +			   fault_log);
> +	if (ret < 0)
> +		dev_err(da9063->dev,
> +			"Cannot reset FAULT_LOG values %d\n", ret);
> +
> +	return ret;
> +}
> +
>  int da9063_device_init(struct da9063 *da9063, unsigned int irq)
>  {
>  	struct da9063_pdata *pdata = da9063->dev->platform_data;
>  	int model, variant_id, variant_code;
>  	int ret;
>  
> +	ret = da9063_clear_fault_log(da9063);
> +	if (ret < 0)
> +		dev_err(da9063->dev, "Cannot clear fault log\n");
> +
>  	if (pdata) {
>  		da9063->flags = pdata->flags;
>  		da9063->irq_base = pdata->irq_base;
> diff --git a/include/linux/mfd/da9063/pdata.h b/include/linux/mfd/da9063/pdata.h
> index 95c8742..612383b 100644
> --- a/include/linux/mfd/da9063/pdata.h
> +++ b/include/linux/mfd/da9063/pdata.h
> @@ -103,6 +103,7 @@ struct da9063;
>  struct da9063_pdata {
>  	int				(*init)(struct da9063 *da9063);
>  	int				irq_base;
> +	bool				key_power;
>  	unsigned			flags;
>  	struct da9063_regulators_pdata	*regulators_pdata;
>  	struct led_platform_data	*leds_pdata;

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey
  2015-05-19 10:32 ` [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey S Twiss
  2015-05-20 13:44   ` Rob Herring
@ 2015-05-26 13:58   ` Lee Jones
  1 sibling, 0 replies; 15+ messages in thread
From: Lee Jones @ 2015-05-26 13:58 UTC (permalink / raw)
  To: S Twiss
  Cc: Ian Campbell, Kumar Gala, Mark Rutland, Pawel Moll, Rob Herring,
	DT, David Dajun Chen, Dmitry Torokhov, INPUT, LKML, Samuel Ortiz,
	Support Opensource

On Tue, 19 May 2015, S Twiss wrote:

> From: Steve Twiss <stwiss.opensource@diasemi.com>
> 
> Add device tree bindings for the DA9063 OnKey driver
> 
> Acked-by: Lee Jones <lee.jones@linaro.org>
> 
> Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
> 
> ---
> Version History
> 
> Changes in V4
>  - No change
> 
> Changes in V3
>  - No change
> 
> Changes in V2
>  - Remove the circular dependency comment linking patches in the main e-mail
>  - Search and replace 'keyword' with 'property' in onkey sub-node description
>  - Reformat onkey sub-node content to move the description for key-power into
>    a new optional properties sub-section so it has a more promiment position
> 
> This patch applies against linux-next and v4.1-rc3 
> 
> 
>  Documentation/devicetree/bindings/mfd/da9063.txt | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)

Applied with Rob's Ack.

> diff --git a/Documentation/devicetree/bindings/mfd/da9063.txt b/Documentation/devicetree/bindings/mfd/da9063.txt
> index 42c6fa6..05b21bc 100644
> --- a/Documentation/devicetree/bindings/mfd/da9063.txt
> +++ b/Documentation/devicetree/bindings/mfd/da9063.txt
> @@ -5,6 +5,7 @@ DA9093 consists of a large and varied group of sub-devices (I2C Only):
>  Device                   Supply Names    Description
>  ------                   ------------    -----------
>  da9063-regulator        :               : LDOs & BUCKs
> +da9063-onkey            :               : On Key
>  da9063-rtc              :               : Real-Time Clock
>  da9063-watchdog         :               : Watchdog
>  
> @@ -51,6 +52,18 @@ Sub-nodes:
>    the DA9063. There are currently no entries in this binding, however
>    compatible = "dlg,da9063-rtc" should be added if a node is created.
>  
> +- onkey : This node defines the OnKey settings for controlling the key
> +  functionality of the device. The node should contain the compatible property
> +  with the value "dlg,da9063-onkey".
> +
> +  Optional onkey properties:
> +
> +  - dlg,disable-key-power : Disable power-down using a long key-press. If this
> +    entry exists the OnKey driver will remove support for the KEY_POWER key
> +    press. If this entry does not exist then by default the key-press
> +    triggered power down is enabled and the OnKey will support both KEY_POWER
> +    and KEY_SLEEP.
> +
>  - watchdog : This node defines settings for the Watchdog timer associated
>    with the DA9063. There are currently no entries in this binding, however
>    compatible = "dlg,da9063-watchdog" should be added if a node is created.
> @@ -73,6 +86,11 @@ Example:
>  			compatible = "dlg,da9063-watchdog";
>  		};
>  
> +		onkey {
> +			compatible = "dlg,da9063-onkey";
> +			dlg,disable-key-power;
> +		};
> +
>  		regulators {
>  			DA9063_BCORE1: bcore1 {
>  				regulator-name = "BCORE1";

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver
  2015-05-26 13:57   ` Lee Jones
@ 2015-05-26 14:06     ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 15+ messages in thread
From: Opensource [Steve Twiss] @ 2015-05-26 14:06 UTC (permalink / raw)
  To: Lee Jones, Opensource [Steve Twiss]
  Cc: Samuel Ortiz, DT, David Dajun Chen, Dmitry Torokhov, INPUT,
	Ian Campbell, Kumar Gala, LKML, Mark Rutland, Pawel Moll,
	Rob Herring, Support Opensource

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 2213 bytes --]


On 26 May 2015 14:58 Lee Jones wrote:

> To: Opensource [Steve Twiss]
> Cc: Samuel Ortiz; DT; David Dajun Chen; Dmitry Torokhov; INPUT; Ian
> Campbell; Kumar Gala; LKML; Mark Rutland; Pawel Moll; Rob Herring;
> Support Opensource
> Subject: Re: [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey
> driver
> 
> On Tue, 19 May 2015, S Twiss wrote:
> 
> > From: Steve Twiss <stwiss.opensource@diasemi.com>
> >
> > Add MFD support for the DA9063 OnKey driver
> >
> > The function da9063_clear_fault_log() is added to mitigate the case of a
> > hardware power-cut after a long-long OnKey press. Although there is no
> > software intervention in this case (by definition) such a shutdown would
> > cause persistent information within the DA9063 FAULT_LOG that would be
> > available during the next device restart.
> >
> > Clearance of this persistent register must be completed after such a
> > hardware power-cut operation has happened so that the FAULT_LOG does not
> > continue with previous values. The clearance function has been added here
> > in the kernel driver because wiping the fault-log cannot be counted on
> > outside the Linux kernel.
> >
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> >
> > Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
> >
> > ---
> > Version History
> >
> > Changes in V4
> >  - Additional description of MFD patch changes for FAULT_LOG in relation to
> >    the requirements of the OnKey driver. Please see a further explanation of
> >    the OnKey's operation in this thread: https://lkml.org/lkml/2015/4/29/406
> >
> > Changes in V3
> >  - The MFD code was originally in [PATCH V2 1/2]. This is now been moved into
> >    this patch [PATCH V3 3/3].
> >  - Whitespace cleanup
> >
> > This patch applies against linux-next and v4.1-rc3
> >
> >
> >  drivers/mfd/da9063-core.c        | 54
> ++++++++++++++++++++++++++++++++++++++++
> >  include/linux/mfd/da9063/pdata.h |  1 +
> >  2 files changed, 55 insertions(+)
> 
> Applied, thanks.
> 

Thank you
Regards,
Steve

ps.
and also for DT patch

[...]
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver
  2015-05-19 10:32 ` [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver S Twiss
@ 2015-05-27 15:37   ` Opensource [Steve Twiss]
  2015-06-01 14:01   ` Opensource [Steve Twiss]
  1 sibling, 0 replies; 15+ messages in thread
From: Opensource [Steve Twiss] @ 2015-05-27 15:37 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: DT, David Dajun Chen, INPUT, Ian Campbell, Kumar Gala, LKML,
	Lee Jones, Mark Rutland, Pawel Moll, Rob Herring, Samuel Ortiz,
	Opensource [Steve Twiss],
	Support Opensource

On 19 May 2015 11:33, S Twiss wrote:

> To: Dmitry Torokhov
> Cc: DT; David Dajun Chen; INPUT; Ian Campbell; Kumar Gala; LKML; Lee
> Jones; Mark Rutland; Pawel Moll; Rob Herring; Samuel Ortiz; Opensource
> [Steve Twiss]; Support Opensource
> Subject: [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver
> 
> From: Steve Twiss <stwiss.opensource@diasemi.com>
> 
> Add OnKey driver support for DA9063
> 
> Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
> 
> ---
> The changes made here have been taken from the DA9062 OnKey review
> thread.
> Please see https://lkml.org/lkml/2015/4/29/406 for more information on this.
> 
> Version History
> 
> Changes in V4
>  - No change

Hi Dmitry,

Could I please ask: is this OnKey driver suitable? Or are there still comments
pending for it? If there are any outstanding issues with this OnKey driver then
could you please let me know so I can resolve them?

Thanks,
Regards,
Steve

> 
> Changes in V3
>  - Move the MFD code changes into a separate patch [PATCH V3 3/3]
>  - Rename OnKey driver to use underscore: da9063_onkey.c
>  - Header and MODULE_LICENSE macro update for GPL and filename change
>  - Remove MAINTAINERS file (no longer needed due to rename of onkey
> driver)
>  - Delete input_unregister_device call from platform driver remove function
>  - Replaced dev_notice() with dev_dbg() for key press notification
> 
> Changes in V2
>  - Remove the circular dependency comment in the main e-mail body
>    linking PATCH V1 1/2 and 2/2
>  - Alter the copyright header information to match expected GPLv2
>    text from http://www.gnu.org/licenses/gpl-2.0.html
> 
> This patch applies against linux-next and v4.1-rc3
> 
> 
>  drivers/input/misc/Kconfig        |  10 ++
>  drivers/input/misc/Makefile       |   1 +
>  drivers/input/misc/da9063_onkey.c | 227
> ++++++++++++++++++++++++++++++++++++++
>  3 files changed, 238 insertions(+)
>  create mode 100644 drivers/input/misc/da9063_onkey.c
> 
> diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
> index 4436ab1..d917883 100644
> --- a/drivers/input/misc/Kconfig
> +++ b/drivers/input/misc/Kconfig
> @@ -610,6 +610,16 @@ config INPUT_DA9055_ONKEY
>  	  To compile this driver as a module, choose M here: the module
>  	  will be called da9055_onkey.
> 
> +config INPUT_DA9063_ONKEY
> +	tristate "Dialog DA9063 OnKey"
> +	depends on MFD_DA9063
> +	help
> +	  Support the ONKEY of Dialog DA9063 Power Management IC as an
> +	  input device reporting power button statue.
> +
> +	  To compile this driver as a module, choose M here: the module
> +	  will be called da9063-onkey.
> +
>  config INPUT_DM355EVM
>  	tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
>  	depends on MFD_DM355EVM_MSP
> diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
> index 78ba4c1..4f95c56 100644
> --- a/drivers/input/misc/Makefile
> +++ b/drivers/input/misc/Makefile
> @@ -25,6 +25,7 @@ obj-$(CONFIG_INPUT_CMA3000_I2C)		+=
> cma3000_d0x_i2c.o
>  obj-$(CONFIG_INPUT_COBALT_BTNS)		+= cobalt_btns.o
>  obj-$(CONFIG_INPUT_DA9052_ONKEY)	+= da9052_onkey.o
>  obj-$(CONFIG_INPUT_DA9055_ONKEY)	+= da9055_onkey.o
> +obj-$(CONFIG_INPUT_DA9063_ONKEY)	+= da9063_onkey.o
>  obj-$(CONFIG_INPUT_DM355EVM)		+= dm355evm_keys.o
>  obj-$(CONFIG_INPUT_E3X0_BUTTON)		+= e3x0-button.o
>  obj-$(CONFIG_INPUT_DRV260X_HAPTICS)	+= drv260x.o
> diff --git a/drivers/input/misc/da9063_onkey.c
> b/drivers/input/misc/da9063_onkey.c
> new file mode 100644
> index 0000000..250595c
> --- /dev/null
> +++ b/drivers/input/misc/da9063_onkey.c
> @@ -0,0 +1,227 @@
> +/*
> + * da9063_onkey.c - Onkey device driver for DA9063
> + * Copyright (C) 2015  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.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/errno.h>
> +#include <linux/input.h>
> +#include <linux/interrupt.h>
> +#include <linux/platform_device.h>
> +#include <linux/workqueue.h>
> +#include <linux/regmap.h>
> +#include <linux/of.h>
> +#include <linux/mfd/da9063/core.h>
> +#include <linux/mfd/da9063/pdata.h>
> +#include <linux/mfd/da9063/registers.h>
> +
> +struct da9063_onkey {
> +	struct	da9063 *hw;
> +	struct delayed_work work;
> +	struct	input_dev *input;
> +	int irq;
> +	bool key_power;
> +};
> +
> +static void da9063_poll_on(struct work_struct *work)
> +{
> +	struct da9063_onkey *onkey = container_of(work, struct
> da9063_onkey,
> +						  work.work);
> +	unsigned int val;
> +	int fault_log = 0;
> +	bool poll = true;
> +	int ret;
> +
> +	/* poll to see when the pin is released */
> +	ret = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A,
> &val);
> +	if (ret < 0) {
> +		dev_err(&onkey->input->dev,
> +			"Failed to read ON status: %d\n", ret);
> +		goto err_poll;
> +	}
> +
> +	if (!(val & DA9063_NONKEY)) {
> +		ret = regmap_update_bits(onkey->hw->regmap,
> +					 DA9063_REG_CONTROL_B,
> +					 DA9063_NONKEY_LOCK, 0);
> +		if (ret < 0) {
> +			dev_err(&onkey->input->dev,
> +				"Failed to reset the Key Delay %d\n", ret);
> +			goto err_poll;
> +		}
> +
> +		input_report_key(onkey->input, KEY_POWER, 0);
> +		input_sync(onkey->input);
> +
> +		poll = false;
> +	}
> +
> +	/* if the fault log KEY_RESET is detected,
> +	 * then clear it and shutdown via I2C
> +	 */
> +	ret = regmap_read(onkey->hw->regmap, DA9063_REG_FAULT_LOG,
> &fault_log);
> +	if (ret < 0)
> +		dev_warn(&onkey->input->dev, "Cannot read
> FAULT_LOG\n");
> +
> +	if (fault_log & DA9063_KEY_RESET) {
> +		ret = regmap_write(onkey->hw->regmap,
> +				   DA9063_REG_FAULT_LOG,
> +				   DA9063_KEY_RESET);
> +		if (ret < 0)
> +			dev_warn(&onkey->input->dev,
> +				 "Cannot reset KEY_RESET fault log\n");
> +		else {
> +			/* at this point we do any S/W housekeeping
> +			 * and then send shutdown command
> +			 */
> +			dev_dbg(&onkey->input->dev,
> +				 "Sending SHUTDOWN to DA9063 ...\n");
> +			ret = regmap_write(onkey->hw->regmap,
> +					   DA9063_REG_CONTROL_F,
> +					   DA9063_SHUTDOWN);
> +			if (ret < 0)
> +				dev_err(&onkey->input->dev,
> +					"Cannot SHUTDOWN DA9063\n");
> +		}
> +	}
> +
> +err_poll:
> +	if (poll)
> +		schedule_delayed_work(&onkey->work, 50);
> +}
> +
> +static irqreturn_t da9063_onkey_irq_handler(int irq, void *data)
> +{
> +	struct da9063_onkey *onkey = data;
> +	unsigned int val;
> +	int ret;
> +
> +	ret = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A,
> &val);
> +	if (onkey->key_power && (ret >= 0) && (val & DA9063_NONKEY)) {
> +		input_report_key(onkey->input, KEY_POWER, 1);
> +		input_sync(onkey->input);
> +		schedule_delayed_work(&onkey->work, 0);
> +		dev_dbg(&onkey->input->dev, "KEY_POWER pressed.\n");
> +	} else {
> +		input_report_key(onkey->input, KEY_SLEEP, 1);
> +		input_sync(onkey->input);
> +		input_report_key(onkey->input, KEY_SLEEP, 0);
> +		input_sync(onkey->input);
> +		dev_dbg(&onkey->input->dev, "KEY_SLEEP pressed.\n");
> +	}
> +
> +	return IRQ_HANDLED;
> +}
> +
> +static int da9063_onkey_probe(struct platform_device *pdev)
> +{
> +	struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent);
> +	struct da9063_pdata *pdata = dev_get_platdata(da9063->dev);
> +	struct da9063_onkey *onkey;
> +	bool kp_tmp = true;
> +	int ret = 0;
> +
> +	if (pdata)
> +		kp_tmp = pdata->key_power;
> +	else {
> +		kp_tmp = of_property_read_bool((&pdev->dev)->of_node,
> +					       "dlg,disable-key-power");
> +		kp_tmp = !kp_tmp;
> +	}
> +
> +	onkey = devm_kzalloc(&pdev->dev, sizeof(struct da9063_onkey),
> +			     GFP_KERNEL);
> +	if (!onkey) {
> +		dev_err(&pdev->dev, "Failed to allocate memory.\n");
> +		ret = -ENOMEM;
> +		goto err;
> +	}
> +
> +	INIT_DELAYED_WORK(&onkey->work, da9063_poll_on);
> +
> +	onkey->input = devm_input_allocate_device(&pdev->dev);
> +	if (!onkey->input) {
> +		dev_err(&pdev->dev, "Failed to allocated input device.\n");
> +		ret = -ENOMEM;
> +		goto err;
> +	}
> +
> +	ret = platform_get_irq_byname(pdev, "ONKEY");
> +	if (ret < 0) {
> +		dev_err(&pdev->dev, "Failed to get platform IRQ.\n");
> +		goto err;
> +	}
> +	onkey->irq = ret;
> +
> +	ret = request_threaded_irq(onkey->irq, NULL,
> +				   da9063_onkey_irq_handler,
> +				   IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> +				   "ONKEY", onkey);
> +	if (ret) {
> +		dev_err(&pdev->dev,
> +			"Failed to request input device IRQ.\n");
> +		goto err;
> +	}
> +
> +	onkey->hw = da9063;
> +	onkey->key_power = kp_tmp;
> +	onkey->input->evbit[0] = BIT_MASK(EV_KEY);
> +	onkey->input->name = DA9063_DRVNAME_ONKEY;
> +	onkey->input->phys = DA9063_DRVNAME_ONKEY "/input0";
> +	onkey->input->dev.parent = &pdev->dev;
> +
> +	if (onkey->key_power)
> +		input_set_capability(onkey->input, EV_KEY, KEY_POWER);
> +	input_set_capability(onkey->input, EV_KEY, KEY_SLEEP);
> +
> +	ret = input_register_device(onkey->input);
> +	if (ret) {
> +		dev_err(&pdev->dev,
> +			"Failed to register input device.\n");
> +		goto err_irq;
> +	}
> +
> +	platform_set_drvdata(pdev, onkey);
> +	return 0;
> +
> +err_irq:
> +	free_irq(onkey->irq, onkey);
> +	cancel_delayed_work_sync(&onkey->work);
> +err:
> +	return ret;
> +}
> +
> +static int da9063_onkey_remove(struct platform_device *pdev)
> +{
> +	struct	da9063_onkey *onkey = platform_get_drvdata(pdev);
> +
> +	free_irq(onkey->irq, onkey);
> +	cancel_delayed_work_sync(&onkey->work);
> +	return 0;
> +}
> +
> +static struct platform_driver da9063_onkey_driver = {
> +	.probe	= da9063_onkey_probe,
> +	.remove	= da9063_onkey_remove,
> +	.driver	= {
> +		.name	= DA9063_DRVNAME_ONKEY,
> +		.owner	= THIS_MODULE,
> +	},
> +};
> +
> +module_platform_driver(da9063_onkey_driver);
> +
> +MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
> +MODULE_DESCRIPTION("Onkey device driver for Dialog DA9063");
> +MODULE_LICENSE("GPL");
> +MODULE_ALIAS("platform:" DA9063_DRVNAME_ONKEY);
> --
> end-of-patch for RESEND PATCH V4


^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver
  2015-05-19 10:32 ` [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver S Twiss
  2015-05-27 15:37   ` Opensource [Steve Twiss]
@ 2015-06-01 14:01   ` Opensource [Steve Twiss]
  1 sibling, 0 replies; 15+ messages in thread
From: Opensource [Steve Twiss] @ 2015-06-01 14:01 UTC (permalink / raw)
  To: Dmitry Torokhov, Jiri Kosina
  Cc: DT, David Dajun Chen, INPUT, Ian Campbell, Kumar Gala, LKML,
	Lee Jones, Mark Rutland, Pawel Moll, Rob Herring, Samuel Ortiz,
	Support Opensource

On 27 May 2015 16:38, Steve Twiss wrote: 

> On 19 May 2015 11:33, S Twiss wrote:
> 
> > To: Dmitry Torokhov
> > Subject: [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver
> >
> > From: Steve Twiss <stwiss.opensource@diasemi.com>
> > Add OnKey driver support for DA9063
> > Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
> >
> > ---
> > The changes made here have been taken from the DA9062 OnKey review
> > thread.
> > 
> > Please see https://lkml.org/lkml/2015/4/29/406 for more information on this.
> >
> > Version History
> >
> > Changes in V4
> >  - No change
> 
> Hi Dmitry,
> 
> Could I please ask: is this OnKey driver suitable? Or are there still comments
> pending for it? If there are any outstanding issues with this OnKey driver
> then could you please let me know so I can resolve them?

Hi again Dmitry,

The date of your original review was 17th April and it is now been 6 weeks since
I sent my replies. If there is a problem with the DA9063 onkey driver as it stands,
please can you let me know quickly?

The core and device tree parts of this driver patch have already been applied.
LKML: https://lkml.org/lkml/2015/5/26/350 
LKML: https://lkml.org/lkml/2015/5/26/352

Regards,
Steve

CC: Jiri Kosina <jkosina@suse.cz>

> 
> Thanks,
> Regards,
> Steve
> 
> >
> > Changes in V3
> >  - Move the MFD code changes into a separate patch [PATCH V3 3/3]
> >  - Rename OnKey driver to use underscore: da9063_onkey.c
> >  - Header and MODULE_LICENSE macro update for GPL and filename
> change
> >  - Remove MAINTAINERS file (no longer needed due to rename of onkey
> > driver)
> >  - Delete input_unregister_device call from platform driver remove
> function
> >  - Replaced dev_notice() with dev_dbg() for key press notification
> >
> > Changes in V2
> >  - Remove the circular dependency comment in the main e-mail body
> >    linking PATCH V1 1/2 and 2/2
> >  - Alter the copyright header information to match expected GPLv2
> >    text from http://www.gnu.org/licenses/gpl-2.0.html
> >
> > This patch applies against linux-next and v4.1-rc3
> >
> >
> >  drivers/input/misc/Kconfig        |  10 ++
> >  drivers/input/misc/Makefile       |   1 +
> >  drivers/input/misc/da9063_onkey.c | 227
> > ++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 238 insertions(+)
> >  create mode 100644 drivers/input/misc/da9063_onkey.c
> >
> > diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
> > index 4436ab1..d917883 100644
> > --- a/drivers/input/misc/Kconfig
> > +++ b/drivers/input/misc/Kconfig
> > @@ -610,6 +610,16 @@ config INPUT_DA9055_ONKEY
> >  	  To compile this driver as a module, choose M here: the module
> >  	  will be called da9055_onkey.
> >
> > +config INPUT_DA9063_ONKEY
> > +	tristate "Dialog DA9063 OnKey"
> > +	depends on MFD_DA9063
> > +	help
> > +	  Support the ONKEY of Dialog DA9063 Power Management IC as an
> > +	  input device reporting power button statue.
> > +
> > +	  To compile this driver as a module, choose M here: the module
> > +	  will be called da9063-onkey.
> > +
> >  config INPUT_DM355EVM
> >  	tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
> >  	depends on MFD_DM355EVM_MSP
> > diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
> > index 78ba4c1..4f95c56 100644
> > --- a/drivers/input/misc/Makefile
> > +++ b/drivers/input/misc/Makefile
> > @@ -25,6 +25,7 @@ obj-$(CONFIG_INPUT_CMA3000_I2C)		+=
> > cma3000_d0x_i2c.o
> >  obj-$(CONFIG_INPUT_COBALT_BTNS)		+= cobalt_btns.o
> >  obj-$(CONFIG_INPUT_DA9052_ONKEY)	+= da9052_onkey.o
> >  obj-$(CONFIG_INPUT_DA9055_ONKEY)	+= da9055_onkey.o
> > +obj-$(CONFIG_INPUT_DA9063_ONKEY)	+= da9063_onkey.o
> >  obj-$(CONFIG_INPUT_DM355EVM)		+= dm355evm_keys.o
> >  obj-$(CONFIG_INPUT_E3X0_BUTTON)		+= e3x0-button.o
> >  obj-$(CONFIG_INPUT_DRV260X_HAPTICS)	+= drv260x.o
> > diff --git a/drivers/input/misc/da9063_onkey.c
> > b/drivers/input/misc/da9063_onkey.c
> > new file mode 100644
> > index 0000000..250595c
> > --- /dev/null
> > +++ b/drivers/input/misc/da9063_onkey.c
> > @@ -0,0 +1,227 @@
> > +/*
> > + * da9063_onkey.c - Onkey device driver for DA9063
> > + * Copyright (C) 2015  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.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/errno.h>
> > +#include <linux/input.h>
> > +#include <linux/interrupt.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/workqueue.h>
> > +#include <linux/regmap.h>
> > +#include <linux/of.h>
> > +#include <linux/mfd/da9063/core.h>
> > +#include <linux/mfd/da9063/pdata.h>
> > +#include <linux/mfd/da9063/registers.h>
> > +
> > +struct da9063_onkey {
> > +	struct	da9063 *hw;
> > +	struct delayed_work work;
> > +	struct	input_dev *input;
> > +	int irq;
> > +	bool key_power;
> > +};
> > +
> > +static void da9063_poll_on(struct work_struct *work)
> > +{
> > +	struct da9063_onkey *onkey = container_of(work, struct
> > da9063_onkey,
> > +						  work.work);
> > +	unsigned int val;
> > +	int fault_log = 0;
> > +	bool poll = true;
> > +	int ret;
> > +
> > +	/* poll to see when the pin is released */
> > +	ret = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A,
> > &val);
> > +	if (ret < 0) {
> > +		dev_err(&onkey->input->dev,
> > +			"Failed to read ON status: %d\n", ret);
> > +		goto err_poll;
> > +	}
> > +
> > +	if (!(val & DA9063_NONKEY)) {
> > +		ret = regmap_update_bits(onkey->hw->regmap,
> > +					 DA9063_REG_CONTROL_B,
> > +					 DA9063_NONKEY_LOCK, 0);
> > +		if (ret < 0) {
> > +			dev_err(&onkey->input->dev,
> > +				"Failed to reset the Key Delay %d\n", ret);
> > +			goto err_poll;
> > +		}
> > +
> > +		input_report_key(onkey->input, KEY_POWER, 0);
> > +		input_sync(onkey->input);
> > +
> > +		poll = false;
> > +	}
> > +
> > +	/* if the fault log KEY_RESET is detected,
> > +	 * then clear it and shutdown via I2C
> > +	 */
> > +	ret = regmap_read(onkey->hw->regmap, DA9063_REG_FAULT_LOG,
> > &fault_log);
> > +	if (ret < 0)
> > +		dev_warn(&onkey->input->dev, "Cannot read
> > FAULT_LOG\n");
> > +
> > +	if (fault_log & DA9063_KEY_RESET) {
> > +		ret = regmap_write(onkey->hw->regmap,
> > +				   DA9063_REG_FAULT_LOG,
> > +				   DA9063_KEY_RESET);
> > +		if (ret < 0)
> > +			dev_warn(&onkey->input->dev,
> > +				 "Cannot reset KEY_RESET fault log\n");
> > +		else {
> > +			/* at this point we do any S/W housekeeping
> > +			 * and then send shutdown command
> > +			 */
> > +			dev_dbg(&onkey->input->dev,
> > +				 "Sending SHUTDOWN to DA9063 ...\n");
> > +			ret = regmap_write(onkey->hw->regmap,
> > +					   DA9063_REG_CONTROL_F,
> > +					   DA9063_SHUTDOWN);
> > +			if (ret < 0)
> > +				dev_err(&onkey->input->dev,
> > +					"Cannot SHUTDOWN DA9063\n");
> > +		}
> > +	}
> > +
> > +err_poll:
> > +	if (poll)
> > +		schedule_delayed_work(&onkey->work, 50);
> > +}
> > +
> > +static irqreturn_t da9063_onkey_irq_handler(int irq, void *data)
> > +{
> > +	struct da9063_onkey *onkey = data;
> > +	unsigned int val;
> > +	int ret;
> > +
> > +	ret = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A,
> > &val);
> > +	if (onkey->key_power && (ret >= 0) && (val & DA9063_NONKEY)) {
> > +		input_report_key(onkey->input, KEY_POWER, 1);
> > +		input_sync(onkey->input);
> > +		schedule_delayed_work(&onkey->work, 0);
> > +		dev_dbg(&onkey->input->dev, "KEY_POWER pressed.\n");
> > +	} else {
> > +		input_report_key(onkey->input, KEY_SLEEP, 1);
> > +		input_sync(onkey->input);
> > +		input_report_key(onkey->input, KEY_SLEEP, 0);
> > +		input_sync(onkey->input);
> > +		dev_dbg(&onkey->input->dev, "KEY_SLEEP pressed.\n");
> > +	}
> > +
> > +	return IRQ_HANDLED;
> > +}
> > +
> > +static int da9063_onkey_probe(struct platform_device *pdev)
> > +{
> > +	struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent);
> > +	struct da9063_pdata *pdata = dev_get_platdata(da9063->dev);
> > +	struct da9063_onkey *onkey;
> > +	bool kp_tmp = true;
> > +	int ret = 0;
> > +
> > +	if (pdata)
> > +		kp_tmp = pdata->key_power;
> > +	else {
> > +		kp_tmp = of_property_read_bool((&pdev->dev)->of_node,
> > +					       "dlg,disable-key-power");
> > +		kp_tmp = !kp_tmp;
> > +	}
> > +
> > +	onkey = devm_kzalloc(&pdev->dev, sizeof(struct da9063_onkey),
> > +			     GFP_KERNEL);
> > +	if (!onkey) {
> > +		dev_err(&pdev->dev, "Failed to allocate memory.\n");
> > +		ret = -ENOMEM;
> > +		goto err;
> > +	}
> > +
> > +	INIT_DELAYED_WORK(&onkey->work, da9063_poll_on);
> > +
> > +	onkey->input = devm_input_allocate_device(&pdev->dev);
> > +	if (!onkey->input) {
> > +		dev_err(&pdev->dev, "Failed to allocated input device.\n");
> > +		ret = -ENOMEM;
> > +		goto err;
> > +	}
> > +
> > +	ret = platform_get_irq_byname(pdev, "ONKEY");
> > +	if (ret < 0) {
> > +		dev_err(&pdev->dev, "Failed to get platform IRQ.\n");
> > +		goto err;
> > +	}
> > +	onkey->irq = ret;
> > +
> > +	ret = request_threaded_irq(onkey->irq, NULL,
> > +				   da9063_onkey_irq_handler,
> > +				   IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> > +				   "ONKEY", onkey);
> > +	if (ret) {
> > +		dev_err(&pdev->dev,
> > +			"Failed to request input device IRQ.\n");
> > +		goto err;
> > +	}
> > +
> > +	onkey->hw = da9063;
> > +	onkey->key_power = kp_tmp;
> > +	onkey->input->evbit[0] = BIT_MASK(EV_KEY);
> > +	onkey->input->name = DA9063_DRVNAME_ONKEY;
> > +	onkey->input->phys = DA9063_DRVNAME_ONKEY "/input0";
> > +	onkey->input->dev.parent = &pdev->dev;
> > +
> > +	if (onkey->key_power)
> > +		input_set_capability(onkey->input, EV_KEY, KEY_POWER);
> > +	input_set_capability(onkey->input, EV_KEY, KEY_SLEEP);
> > +
> > +	ret = input_register_device(onkey->input);
> > +	if (ret) {
> > +		dev_err(&pdev->dev,
> > +			"Failed to register input device.\n");
> > +		goto err_irq;
> > +	}
> > +
> > +	platform_set_drvdata(pdev, onkey);
> > +	return 0;
> > +
> > +err_irq:
> > +	free_irq(onkey->irq, onkey);
> > +	cancel_delayed_work_sync(&onkey->work);
> > +err:
> > +	return ret;
> > +}
> > +
> > +static int da9063_onkey_remove(struct platform_device *pdev)
> > +{
> > +	struct	da9063_onkey *onkey = platform_get_drvdata(pdev);
> > +
> > +	free_irq(onkey->irq, onkey);
> > +	cancel_delayed_work_sync(&onkey->work);
> > +	return 0;
> > +}
> > +
> > +static struct platform_driver da9063_onkey_driver = {
> > +	.probe	= da9063_onkey_probe,
> > +	.remove	= da9063_onkey_remove,
> > +	.driver	= {
> > +		.name	= DA9063_DRVNAME_ONKEY,
> > +		.owner	= THIS_MODULE,
> > +	},
> > +};
> > +
> > +module_platform_driver(da9063_onkey_driver);
> > +
> > +MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
> > +MODULE_DESCRIPTION("Onkey device driver for Dialog DA9063");
> > +MODULE_LICENSE("GPL");
> > +MODULE_ALIAS("platform:" DA9063_DRVNAME_ONKEY);
> > --
> > end-of-patch for RESEND PATCH V4


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver
  2015-05-19 10:32 ` [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver S Twiss
  2015-05-26 13:57   ` Lee Jones
@ 2015-06-08 23:25   ` Dmitry Torokhov
  2015-06-09  6:51     ` Lee Jones
  1 sibling, 1 reply; 15+ messages in thread
From: Dmitry Torokhov @ 2015-06-08 23:25 UTC (permalink / raw)
  To: S Twiss
  Cc: Lee Jones, Samuel Ortiz, DT, David Dajun Chen, INPUT,
	Ian Campbell, Kumar Gala, LKML, Mark Rutland, Pawel Moll,
	Rob Herring, Support Opensource

On Tue, May 19, 2015 at 11:32:45AM +0100, S Twiss wrote:
> From: Steve Twiss <stwiss.opensource@diasemi.com>
> 
> Add MFD support for the DA9063 OnKey driver
> 
> The function da9063_clear_fault_log() is added to mitigate the case of a
> hardware power-cut after a long-long OnKey press. Although there is no
> software intervention in this case (by definition) such a shutdown would
> cause persistent information within the DA9063 FAULT_LOG that would be
> available during the next device restart.
> 
> Clearance of this persistent register must be completed after such a
> hardware power-cut operation has happened so that the FAULT_LOG does not
> continue with previous values. The clearance function has been added here
> in the kernel driver because wiping the fault-log cannot be counted on
> outside the Linux kernel.
> 
> Acked-by: Lee Jones <lee.jones@linaro.org>
> 
> Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>

...

> diff --git a/include/linux/mfd/da9063/pdata.h b/include/linux/mfd/da9063/pdata.h
> index 95c8742..612383b 100644
> --- a/include/linux/mfd/da9063/pdata.h
> +++ b/include/linux/mfd/da9063/pdata.h
> @@ -103,6 +103,7 @@ struct da9063;
>  struct da9063_pdata {
>  	int				(*init)(struct da9063 *da9063);
>  	int				irq_base;
> +	bool				key_power;
>  	unsigned			flags;
>  	struct da9063_regulators_pdata	*regulators_pdata;
>  	struct led_platform_data	*leds_pdata;

I need this bit of pdata to merge the OnKey driver... Lee, any chance
you could drop it from the patch in your tree?

Alternatively, can you pick the OnKey driver (the latest version is
below)?

Thanks.

-- 
Dmitry

Input: add OnKey driver for DA9063 MFD part

From: Steve Twiss <stwiss.opensource@diasemi.com>

Add OnKey driver support for DA9063

Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/misc/Kconfig        |   10 ++
 drivers/input/misc/Makefile       |    1 
 drivers/input/misc/da9063_onkey.c |  226 +++++++++++++++++++++++++++++++++++++
 3 files changed, 237 insertions(+)
 create mode 100644 drivers/input/misc/da9063_onkey.c

diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index e5c4de2..d4f0a81 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -610,6 +610,16 @@ config INPUT_DA9055_ONKEY
 	  To compile this driver as a module, choose M here: the module
 	  will be called da9055_onkey.
 
+config INPUT_DA9063_ONKEY
+	tristate "Dialog DA9063 OnKey"
+	depends on MFD_DA9063
+	help
+	  Support the ONKEY of Dialog DA9063 Power Management IC as an
+	  input device reporting power button statue.
+
+	  To compile this driver as a module, choose M here: the module
+	  will be called da9063_onkey.
+
 config INPUT_DM355EVM
 	tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
 	depends on MFD_DM355EVM_MSP
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index d317947..53df07d 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -25,6 +25,7 @@ obj-$(CONFIG_INPUT_CMA3000_I2C)		+= cma3000_d0x_i2c.o
 obj-$(CONFIG_INPUT_COBALT_BTNS)		+= cobalt_btns.o
 obj-$(CONFIG_INPUT_DA9052_ONKEY)	+= da9052_onkey.o
 obj-$(CONFIG_INPUT_DA9055_ONKEY)	+= da9055_onkey.o
+obj-$(CONFIG_INPUT_DA9063_ONKEY)	+= da9063_onkey.o
 obj-$(CONFIG_INPUT_DM355EVM)		+= dm355evm_keys.o
 obj-$(CONFIG_INPUT_E3X0_BUTTON)		+= e3x0-button.o
 obj-$(CONFIG_INPUT_DRV260X_HAPTICS)	+= drv260x.o
diff --git a/drivers/input/misc/da9063_onkey.c b/drivers/input/misc/da9063_onkey.c
new file mode 100644
index 0000000..f577585
--- /dev/null
+++ b/drivers/input/misc/da9063_onkey.c
@@ -0,0 +1,226 @@
+/*
+ * OnKey device driver for DA9063
+ * Copyright (C) 2015  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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/workqueue.h>
+#include <linux/regmap.h>
+#include <linux/of.h>
+#include <linux/mfd/da9063/core.h>
+#include <linux/mfd/da9063/pdata.h>
+#include <linux/mfd/da9063/registers.h>
+
+struct da9063_onkey {
+	struct da9063 *hw;
+	struct delayed_work work;
+	struct input_dev *input;
+	struct device *dev;
+	bool key_power;
+};
+
+static void da9063_poll_on(struct work_struct *work)
+{
+	struct da9063_onkey *onkey = container_of(work, struct da9063_onkey,
+						  work.work);
+	unsigned int val;
+	int fault_log = 0;
+	bool poll = true;
+	int error;
+
+	/* Poll to see when the pin is released */
+	error = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A, &val);
+	if (error) {
+		dev_err(onkey->dev,
+			"Failed to read ON status: %d\n", error);
+		goto err_poll;
+	}
+
+	if (!(val & DA9063_NONKEY)) {
+		error = regmap_update_bits(onkey->hw->regmap,
+					   DA9063_REG_CONTROL_B,
+					   DA9063_NONKEY_LOCK, 0);
+		if (error) {
+			dev_err(onkey->dev,
+				"Failed to reset the Key Delay %d\n", error);
+			goto err_poll;
+		}
+
+		input_report_key(onkey->input, KEY_POWER, 0);
+		input_sync(onkey->input);
+
+		poll = false;
+	}
+
+	/*
+	 * If the fault log KEY_RESET is detected, then clear it
+	 * and shut down the system.
+	 */
+	error = regmap_read(onkey->hw->regmap,
+			    DA9063_REG_FAULT_LOG, &fault_log);
+	if (error) {
+		dev_warn(&onkey->input->dev,
+			 "Cannot read FAULT_LOG: %d\n", error);
+	} else if (fault_log & DA9063_KEY_RESET) {
+		error = regmap_write(onkey->hw->regmap,
+				     DA9063_REG_FAULT_LOG,
+				     DA9063_KEY_RESET);
+		if (error) {
+			dev_warn(&onkey->input->dev,
+				 "Cannot reset KEY_RESET fault log: %d\n",
+				 error);
+		} else {
+			/* at this point we do any S/W housekeeping
+			 * and then send shutdown command
+			 */
+			dev_dbg(&onkey->input->dev,
+				 "Sending SHUTDOWN to DA9063 ...\n");
+			error = regmap_write(onkey->hw->regmap,
+					     DA9063_REG_CONTROL_F,
+					     DA9063_SHUTDOWN);
+			if (error)
+				dev_err(&onkey->input->dev,
+					"Cannot SHUTDOWN DA9063: %d\n",
+					error);
+		}
+	}
+
+err_poll:
+	if (poll)
+		schedule_delayed_work(&onkey->work, msecs_to_jiffies(50));
+}
+
+static irqreturn_t da9063_onkey_irq_handler(int irq, void *data)
+{
+	struct da9063_onkey *onkey = data;
+	unsigned int val;
+	int error;
+
+	error = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A, &val);
+	if (onkey->key_power && !error && (val & DA9063_NONKEY)) {
+		input_report_key(onkey->input, KEY_POWER, 1);
+		input_sync(onkey->input);
+		schedule_delayed_work(&onkey->work, 0);
+		dev_dbg(onkey->dev, "KEY_POWER pressed.\n");
+	} else {
+		input_report_key(onkey->input, KEY_SLEEP, 1);
+		input_sync(onkey->input);
+		input_report_key(onkey->input, KEY_SLEEP, 0);
+		input_sync(onkey->input);
+		dev_dbg(onkey->dev, "KEY_SLEEP pressed.\n");
+	}
+
+	return IRQ_HANDLED;
+}
+
+static void da9063_cancel_poll(void *data)
+{
+	struct da9063_onkey *onkey = data;
+
+	cancel_delayed_work_sync(&onkey->work);
+}
+
+static int da9063_onkey_probe(struct platform_device *pdev)
+{
+	struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent);
+	struct da9063_pdata *pdata = dev_get_platdata(da9063->dev);
+	struct da9063_onkey *onkey;
+	int irq;
+	int error;
+
+	onkey = devm_kzalloc(&pdev->dev, sizeof(struct da9063_onkey),
+			     GFP_KERNEL);
+	if (!onkey) {
+		dev_err(&pdev->dev, "Failed to allocate memory.\n");
+		return -ENOMEM;
+	}
+
+	onkey->dev = &pdev->dev;
+	onkey->hw = da9063;
+
+	if (pdata)
+		onkey->key_power = pdata->key_power;
+	else
+		onkey->key_power =
+			!of_property_read_bool(pdev->dev.of_node,
+					       "dlg,disable-key-power");
+
+	onkey->input = devm_input_allocate_device(&pdev->dev);
+	if (!onkey->input) {
+		dev_err(&pdev->dev, "Failed to allocated input device.\n");
+		return -ENOMEM;
+	}
+
+	onkey->input->name = DA9063_DRVNAME_ONKEY;
+	onkey->input->phys = DA9063_DRVNAME_ONKEY "/input0";
+	onkey->input->dev.parent = &pdev->dev;
+
+	if (onkey->key_power)
+		input_set_capability(onkey->input, EV_KEY, KEY_POWER);
+
+	input_set_capability(onkey->input, EV_KEY, KEY_SLEEP);
+
+	INIT_DELAYED_WORK(&onkey->work, da9063_poll_on);
+
+	error = devm_add_action(&pdev->dev, da9063_cancel_poll, onkey);
+	if (error) {
+		dev_err(&pdev->dev,
+			"Failed to add cancel poll action: %d\n",
+			error);
+		return error;
+	}
+
+	irq = platform_get_irq_byname(pdev, "ONKEY");
+	if (irq < 0) {
+		error = irq;
+		dev_err(&pdev->dev, "Failed to get platform IRQ: %d\n", error);
+		return error;
+	}
+
+	error = devm_request_threaded_irq(&pdev->dev, irq,
+					  NULL, da9063_onkey_irq_handler,
+					  IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+					  "ONKEY", onkey);
+	if (error) {
+		dev_err(&pdev->dev,
+			"Failed to request IRQ %d: %d\n", irq, error);
+		return error;
+	}
+
+	error = input_register_device(onkey->input);
+	if (error) {
+		dev_err(&pdev->dev,
+			"Failed to register input device: %d\n", error);
+		return error;
+	}
+
+	platform_set_drvdata(pdev, onkey);
+	return 0;
+}
+
+static struct platform_driver da9063_onkey_driver = {
+	.probe	= da9063_onkey_probe,
+	.driver	= {
+		.name	= DA9063_DRVNAME_ONKEY,
+	},
+};
+module_platform_driver(da9063_onkey_driver);
+
+MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
+MODULE_DESCRIPTION("Onkey device driver for Dialog DA9063");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DA9063_DRVNAME_ONKEY);

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver
  2015-06-08 23:25   ` Dmitry Torokhov
@ 2015-06-09  6:51     ` Lee Jones
  2015-06-09  7:21       ` Opensource [Steve Twiss]
  0 siblings, 1 reply; 15+ messages in thread
From: Lee Jones @ 2015-06-09  6:51 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: S Twiss, Samuel Ortiz, DT, David Dajun Chen, INPUT, Ian Campbell,
	Kumar Gala, LKML, Mark Rutland, Pawel Moll, Rob Herring,
	Support Opensource

On Mon, 08 Jun 2015, Dmitry Torokhov wrote:

> On Tue, May 19, 2015 at 11:32:45AM +0100, S Twiss wrote:
> > From: Steve Twiss <stwiss.opensource@diasemi.com>
> > 
> > Add MFD support for the DA9063 OnKey driver
> > 
> > The function da9063_clear_fault_log() is added to mitigate the case of a
> > hardware power-cut after a long-long OnKey press. Although there is no
> > software intervention in this case (by definition) such a shutdown would
> > cause persistent information within the DA9063 FAULT_LOG that would be
> > available during the next device restart.
> > 
> > Clearance of this persistent register must be completed after such a
> > hardware power-cut operation has happened so that the FAULT_LOG does not
> > continue with previous values. The clearance function has been added here
> > in the kernel driver because wiping the fault-log cannot be counted on
> > outside the Linux kernel.
> > 
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > 
> > Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
> 
> ...
> 
> > diff --git a/include/linux/mfd/da9063/pdata.h b/include/linux/mfd/da9063/pdata.h
> > index 95c8742..612383b 100644
> > --- a/include/linux/mfd/da9063/pdata.h
> > +++ b/include/linux/mfd/da9063/pdata.h
> > @@ -103,6 +103,7 @@ struct da9063;
> >  struct da9063_pdata {
> >  	int				(*init)(struct da9063 *da9063);
> >  	int				irq_base;
> > +	bool				key_power;
> >  	unsigned			flags;
> >  	struct da9063_regulators_pdata	*regulators_pdata;
> >  	struct led_platform_data	*leds_pdata;
> 
> I need this bit of pdata to merge the OnKey driver... Lee, any chance
> you could drop it from the patch in your tree?

Consider it done.

> Alternatively, can you pick the OnKey driver (the latest version is
> below)?
> 
> Thanks.
> 

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver
  2015-06-09  6:51     ` Lee Jones
@ 2015-06-09  7:21       ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 15+ messages in thread
From: Opensource [Steve Twiss] @ 2015-06-09  7:21 UTC (permalink / raw)
  To: Lee Jones, Dmitry Torokhov
  Cc: Samuel Ortiz, DT, David Dajun Chen, INPUT, Ian Campbell,
	Kumar Gala, LKML, Mark Rutland, Pawel Moll, Rob Herring,
	Support Opensource

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 2095 bytes --]

On 09 June 2015 07:51 Lee Jones wrote:

> On Mon, 08 Jun 2015, Dmitry Torokhov wrote:
> > On Tue, May 19, 2015 at 11:32:45AM +0100, S Twiss wrote:
> > > From: Steve Twiss <stwiss.opensource@diasemi.com>
> > >
> > > Add MFD support for the DA9063 OnKey driver
> > >
> > > The function da9063_clear_fault_log() is added to mitigate the case of a
> > > hardware power-cut after a long-long OnKey press. Although there is no
> > > software intervention in this case (by definition) such a shutdown would
> > > cause persistent information within the DA9063 FAULT_LOG that would be
> > > available during the next device restart.
> > >
> > > Clearance of this persistent register must be completed after such a
> > > hardware power-cut operation has happened so that the FAULT_LOG does not
> > > continue with previous values. The clearance function has been added here
> > > in the kernel driver because wiping the fault-log cannot be counted on
> > > outside the Linux kernel.
> > >
> > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > >
> > > Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>
> >
> > ...
> >
> > > diff --git a/include/linux/mfd/da9063/pdata.h
> b/include/linux/mfd/da9063/pdata.h
> > > index 95c8742..612383b 100644
> > > --- a/include/linux/mfd/da9063/pdata.h
> > > +++ b/include/linux/mfd/da9063/pdata.h
> > > @@ -103,6 +103,7 @@ struct da9063;
> > >  struct da9063_pdata {
> > >  	int				(*init)(struct da9063 *da9063);
> > >  	int				irq_base;
> > > +	bool				key_power;
> > >  	unsigned			flags;
> > >  	struct da9063_regulators_pdata	*regulators_pdata;
> > >  	struct led_platform_data	*leds_pdata;
> >
> > I need this bit of pdata to merge the OnKey driver... Lee, any chance
> > you could drop it from the patch in your tree?
> 
> Consider it done.
> 
> > Alternatively, can you pick the OnKey driver (the latest version is
> > below)?
> >
> > Thanks.
> >

Thank you both for your help.
Regards,
Steve
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver
       [not found] <cover.1433317427.git.stwiss.opensource@diasemi.com>
@ 2015-06-03  7:43 ` S Twiss
  0 siblings, 0 replies; 15+ messages in thread
From: S Twiss @ 2015-06-03  7:43 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: DT, David Dajun Chen, INPUT, Ian Campbell, Kumar Gala, LKML,
	Lee Jones, Mark Rutland, Pawel Moll, Rob Herring, Samuel Ortiz,
	Steve Twiss, Support Opensource

From: Steve Twiss <stwiss.opensource@diasemi.com>

Add OnKey driver support for DA9063

Signed-off-by: Steve Twiss <stwiss.opensource@diasemi.com>

---
Hi Dmitry,

If there are comments pending for this patch or if there are any outstanding
issues with this OnKey driver then could you please let me know so I can
resolve them?

Or, if you are busy or there is a problem taking the patch, please can you
let me know and I will promote it further up the maintainer hierarchy.

Regards,
Steve

The changes made here have been taken from the DA9062 OnKey review thread. 
Please see https://lkml.org/lkml/2015/4/29/406 for more information on this.

Version History

Changes in V4
 - No change

Changes in V3
 - Move the MFD code changes into a separate patch [PATCH V3 3/3]
 - Rename OnKey driver to use underscore: da9063_onkey.c
 - Header and MODULE_LICENSE macro update for GPL and filename change
 - Remove MAINTAINERS file (no longer needed due to rename of onkey driver)
 - Delete input_unregister_device call from platform driver remove function
 - Replaced dev_notice() with dev_dbg() for key press notification

Changes in V2
 - Remove the circular dependency comment in the main e-mail body
   linking PATCH V1 1/2 and 2/2
 - Alter the copyright header information to match expected GPLv2
   text from http://www.gnu.org/licenses/gpl-2.0.html

This patch applies against linux-next and v4.1-rc3 


 drivers/input/misc/Kconfig        |  10 ++
 drivers/input/misc/Makefile       |   1 +
 drivers/input/misc/da9063_onkey.c | 227 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 238 insertions(+)
 create mode 100644 drivers/input/misc/da9063_onkey.c

diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 4436ab1..d917883 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -610,6 +610,16 @@ config INPUT_DA9055_ONKEY
 	  To compile this driver as a module, choose M here: the module
 	  will be called da9055_onkey.
 
+config INPUT_DA9063_ONKEY
+	tristate "Dialog DA9063 OnKey"
+	depends on MFD_DA9063
+	help
+	  Support the ONKEY of Dialog DA9063 Power Management IC as an
+	  input device reporting power button statue.
+
+	  To compile this driver as a module, choose M here: the module
+	  will be called da9063-onkey.
+
 config INPUT_DM355EVM
 	tristate "TI DaVinci DM355 EVM Keypad and IR Remote"
 	depends on MFD_DM355EVM_MSP
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 78ba4c1..4f95c56 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -25,6 +25,7 @@ obj-$(CONFIG_INPUT_CMA3000_I2C)		+= cma3000_d0x_i2c.o
 obj-$(CONFIG_INPUT_COBALT_BTNS)		+= cobalt_btns.o
 obj-$(CONFIG_INPUT_DA9052_ONKEY)	+= da9052_onkey.o
 obj-$(CONFIG_INPUT_DA9055_ONKEY)	+= da9055_onkey.o
+obj-$(CONFIG_INPUT_DA9063_ONKEY)	+= da9063_onkey.o
 obj-$(CONFIG_INPUT_DM355EVM)		+= dm355evm_keys.o
 obj-$(CONFIG_INPUT_E3X0_BUTTON)		+= e3x0-button.o
 obj-$(CONFIG_INPUT_DRV260X_HAPTICS)	+= drv260x.o
diff --git a/drivers/input/misc/da9063_onkey.c b/drivers/input/misc/da9063_onkey.c
new file mode 100644
index 0000000..250595c
--- /dev/null
+++ b/drivers/input/misc/da9063_onkey.c
@@ -0,0 +1,227 @@
+/*
+ * da9063_onkey.c - Onkey device driver for DA9063
+ * Copyright (C) 2015  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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/workqueue.h>
+#include <linux/regmap.h>
+#include <linux/of.h>
+#include <linux/mfd/da9063/core.h>
+#include <linux/mfd/da9063/pdata.h>
+#include <linux/mfd/da9063/registers.h>
+
+struct da9063_onkey {
+	struct	da9063 *hw;
+	struct delayed_work work;
+	struct	input_dev *input;
+	int irq;
+	bool key_power;
+};
+
+static void da9063_poll_on(struct work_struct *work)
+{
+	struct da9063_onkey *onkey = container_of(work, struct da9063_onkey,
+						  work.work);
+	unsigned int val;
+	int fault_log = 0;
+	bool poll = true;
+	int ret;
+
+	/* poll to see when the pin is released */
+	ret = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A, &val);
+	if (ret < 0) {
+		dev_err(&onkey->input->dev,
+			"Failed to read ON status: %d\n", ret);
+		goto err_poll;
+	}
+
+	if (!(val & DA9063_NONKEY)) {
+		ret = regmap_update_bits(onkey->hw->regmap,
+					 DA9063_REG_CONTROL_B,
+					 DA9063_NONKEY_LOCK, 0);
+		if (ret < 0) {
+			dev_err(&onkey->input->dev,
+				"Failed to reset the Key Delay %d\n", ret);
+			goto err_poll;
+		}
+
+		input_report_key(onkey->input, KEY_POWER, 0);
+		input_sync(onkey->input);
+
+		poll = false;
+	}
+
+	/* if the fault log KEY_RESET is detected,
+	 * then clear it and shutdown via I2C
+	 */
+	ret = regmap_read(onkey->hw->regmap, DA9063_REG_FAULT_LOG, &fault_log);
+	if (ret < 0)
+		dev_warn(&onkey->input->dev, "Cannot read FAULT_LOG\n");
+
+	if (fault_log & DA9063_KEY_RESET) {
+		ret = regmap_write(onkey->hw->regmap,
+				   DA9063_REG_FAULT_LOG,
+				   DA9063_KEY_RESET);
+		if (ret < 0)
+			dev_warn(&onkey->input->dev,
+				 "Cannot reset KEY_RESET fault log\n");
+		else {
+			/* at this point we do any S/W housekeeping
+			 * and then send shutdown command
+			 */
+			dev_dbg(&onkey->input->dev,
+				 "Sending SHUTDOWN to DA9063 ...\n");
+			ret = regmap_write(onkey->hw->regmap,
+					   DA9063_REG_CONTROL_F,
+					   DA9063_SHUTDOWN);
+			if (ret < 0)
+				dev_err(&onkey->input->dev,
+					"Cannot SHUTDOWN DA9063\n");
+		}
+	}
+
+err_poll:
+	if (poll)
+		schedule_delayed_work(&onkey->work, 50);
+}
+
+static irqreturn_t da9063_onkey_irq_handler(int irq, void *data)
+{
+	struct da9063_onkey *onkey = data;
+	unsigned int val;
+	int ret;
+
+	ret = regmap_read(onkey->hw->regmap, DA9063_REG_STATUS_A, &val);
+	if (onkey->key_power && (ret >= 0) && (val & DA9063_NONKEY)) {
+		input_report_key(onkey->input, KEY_POWER, 1);
+		input_sync(onkey->input);
+		schedule_delayed_work(&onkey->work, 0);
+		dev_dbg(&onkey->input->dev, "KEY_POWER pressed.\n");
+	} else {
+		input_report_key(onkey->input, KEY_SLEEP, 1);
+		input_sync(onkey->input);
+		input_report_key(onkey->input, KEY_SLEEP, 0);
+		input_sync(onkey->input);
+		dev_dbg(&onkey->input->dev, "KEY_SLEEP pressed.\n");
+	}
+
+	return IRQ_HANDLED;
+}
+
+static int da9063_onkey_probe(struct platform_device *pdev)
+{
+	struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent);
+	struct da9063_pdata *pdata = dev_get_platdata(da9063->dev);
+	struct da9063_onkey *onkey;
+	bool kp_tmp = true;
+	int ret = 0;
+
+	if (pdata)
+		kp_tmp = pdata->key_power;
+	else {
+		kp_tmp = of_property_read_bool((&pdev->dev)->of_node,
+					       "dlg,disable-key-power");
+		kp_tmp = !kp_tmp;
+	}
+
+	onkey = devm_kzalloc(&pdev->dev, sizeof(struct da9063_onkey),
+			     GFP_KERNEL);
+	if (!onkey) {
+		dev_err(&pdev->dev, "Failed to allocate memory.\n");
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	INIT_DELAYED_WORK(&onkey->work, da9063_poll_on);
+
+	onkey->input = devm_input_allocate_device(&pdev->dev);
+	if (!onkey->input) {
+		dev_err(&pdev->dev, "Failed to allocated input device.\n");
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	ret = platform_get_irq_byname(pdev, "ONKEY");
+	if (ret < 0) {
+		dev_err(&pdev->dev, "Failed to get platform IRQ.\n");
+		goto err;
+	}
+	onkey->irq = ret;
+
+	ret = request_threaded_irq(onkey->irq, NULL,
+				   da9063_onkey_irq_handler,
+				   IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+				   "ONKEY", onkey);
+	if (ret) {
+		dev_err(&pdev->dev,
+			"Failed to request input device IRQ.\n");
+		goto err;
+	}
+
+	onkey->hw = da9063;
+	onkey->key_power = kp_tmp;
+	onkey->input->evbit[0] = BIT_MASK(EV_KEY);
+	onkey->input->name = DA9063_DRVNAME_ONKEY;
+	onkey->input->phys = DA9063_DRVNAME_ONKEY "/input0";
+	onkey->input->dev.parent = &pdev->dev;
+
+	if (onkey->key_power)
+		input_set_capability(onkey->input, EV_KEY, KEY_POWER);
+	input_set_capability(onkey->input, EV_KEY, KEY_SLEEP);
+
+	ret = input_register_device(onkey->input);
+	if (ret) {
+		dev_err(&pdev->dev,
+			"Failed to register input device.\n");
+		goto err_irq;
+	}
+
+	platform_set_drvdata(pdev, onkey);
+	return 0;
+
+err_irq:
+	free_irq(onkey->irq, onkey);
+	cancel_delayed_work_sync(&onkey->work);
+err:
+	return ret;
+}
+
+static int da9063_onkey_remove(struct platform_device *pdev)
+{
+	struct	da9063_onkey *onkey = platform_get_drvdata(pdev);
+
+	free_irq(onkey->irq, onkey);
+	cancel_delayed_work_sync(&onkey->work);
+	return 0;
+}
+
+static struct platform_driver da9063_onkey_driver = {
+	.probe	= da9063_onkey_probe,
+	.remove	= da9063_onkey_remove,
+	.driver	= {
+		.name	= DA9063_DRVNAME_ONKEY,
+		.owner	= THIS_MODULE,
+	},
+};
+
+module_platform_driver(da9063_onkey_driver);
+
+MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
+MODULE_DESCRIPTION("Onkey device driver for Dialog DA9063");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DA9063_DRVNAME_ONKEY);
-- 
end-of-patch for RESEND PATCH V4


^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2015-06-09  7:22 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-19 10:32 [RESEND PATCH V4 0/3] Add OnKey support for DA9063 S Twiss
2015-05-19 10:32 ` [RESEND PATCH V4 3/3] mfd: da9063: MFD support for OnKey driver S Twiss
2015-05-26 13:57   ` Lee Jones
2015-05-26 14:06     ` Opensource [Steve Twiss]
2015-06-08 23:25   ` Dmitry Torokhov
2015-06-09  6:51     ` Lee Jones
2015-06-09  7:21       ` Opensource [Steve Twiss]
2015-05-19 10:32 ` [RESEND PATCH V4 2/3] devicetree: Add bindings for DA9063 OnKey S Twiss
2015-05-20 13:44   ` Rob Herring
2015-05-20 14:27     ` Opensource [Steve Twiss]
2015-05-26 13:58   ` Lee Jones
2015-05-19 10:32 ` [RESEND PATCH V4 1/3] input: misc: da9063: OnKey driver S Twiss
2015-05-27 15:37   ` Opensource [Steve Twiss]
2015-06-01 14:01   ` Opensource [Steve Twiss]
     [not found] <cover.1433317427.git.stwiss.opensource@diasemi.com>
2015-06-03  7:43 ` S Twiss

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).