All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically
@ 2017-04-04 15:41 Damien Riegel
  2017-04-04 15:41 ` [PATCH v2 2/5] Input: pm8xxx-vib: parametrize the driver Damien Riegel
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Damien Riegel @ 2017-04-04 15:41 UTC (permalink / raw)
  To: linux-input
  Cc: Dmitry Torokhov, Rob Herring, Mark Rutland, kernel, Damien Riegel

Signed-off-by: Damien Riegel <damien.riegel@savoirfairelinux.com>
---
 drivers/input/misc/pm8xxx-vibrator.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c
index 5113877153d7..580448170342 100644
--- a/drivers/input/misc/pm8xxx-vibrator.c
+++ b/drivers/input/misc/pm8xxx-vibrator.c
@@ -10,13 +10,13 @@
  * GNU General Public License for more details.
  */
 
-#include <linux/module.h>
-#include <linux/kernel.h>
 #include <linux/errno.h>
-#include <linux/platform_device.h>
 #include <linux/input.h>
-#include <linux/slab.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
+#include <linux/slab.h>
 
 #define VIB_DRV			0x4A
 
-- 
2.12.1


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

* [PATCH v2 2/5] Input: pm8xxx-vib: parametrize the driver
  2017-04-04 15:41 [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Damien Riegel
@ 2017-04-04 15:41 ` Damien Riegel
  2017-04-04 15:41 ` [PATCH v2 3/5] Input: pm8xxx-vib: handle separate enable register Damien Riegel
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Damien Riegel @ 2017-04-04 15:41 UTC (permalink / raw)
  To: linux-input
  Cc: Dmitry Torokhov, Rob Herring, Mark Rutland, kernel, Damien Riegel

In order to prepare this driver to support other vibrators of the same
kind, move some hardcoded values to a structure holding register
parameters (address, mask, shit of the control register).

Signed-off-by: Damien Riegel <damien.riegel@savoirfairelinux.com>
---
Changes in v2:
 - Constified struct pm8xxx_regs
 - Dropped useless parenthesis in case like ~(reg->mask)

 drivers/input/misc/pm8xxx-vibrator.c | 49 ++++++++++++++++++++++++------------
 1 file changed, 33 insertions(+), 16 deletions(-)

diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c
index 580448170342..b9b73957a48f 100644
--- a/drivers/input/misc/pm8xxx-vibrator.c
+++ b/drivers/input/misc/pm8xxx-vibrator.c
@@ -14,36 +14,47 @@
 #include <linux/input.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
 
-#define VIB_DRV			0x4A
-
-#define VIB_DRV_SEL_MASK	0xf8
-#define VIB_DRV_SEL_SHIFT	0x03
-#define VIB_DRV_EN_MANUAL_MASK	0xfc
-
 #define VIB_MAX_LEVEL_mV	(3100)
 #define VIB_MIN_LEVEL_mV	(1200)
 #define VIB_MAX_LEVELS		(VIB_MAX_LEVEL_mV - VIB_MIN_LEVEL_mV)
 
 #define MAX_FF_SPEED		0xff
 
+struct pm8xxx_regs {
+	unsigned int drv_addr;
+	unsigned int drv_mask;
+	unsigned int drv_shift;
+	unsigned int drv_en_manual_mask;
+};
+
+static struct pm8xxx_regs pm8058_regs = {
+	.drv_addr = 0x4A,
+	.drv_mask = 0xf8,
+	.drv_shift = 3,
+	.drv_en_manual_mask = 0xfc,
+};
+
 /**
  * struct pm8xxx_vib - structure to hold vibrator data
  * @vib_input_dev: input device supporting force feedback
  * @work: work structure to set the vibration parameters
  * @regmap: regmap for register read/write
+ * @regs: registers' info
  * @speed: speed of vibration set from userland
  * @active: state of vibrator
  * @level: level of vibration to set in the chip
- * @reg_vib_drv: VIB_DRV register value
+ * @reg_vib_drv: regs->drv_addr register value
  */
 struct pm8xxx_vib {
 	struct input_dev *vib_input_dev;
 	struct work_struct work;
 	struct regmap *regmap;
+	const struct pm8xxx_regs *regs;
 	int speed;
 	int level;
 	bool active;
@@ -59,13 +70,14 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
 {
 	int rc;
 	unsigned int val = vib->reg_vib_drv;
+	const struct pm8xxx_regs *regs = vib->regs;
 
 	if (on)
-		val |= ((vib->level << VIB_DRV_SEL_SHIFT) & VIB_DRV_SEL_MASK);
+		val |= ((vib->level << regs->drv_shift) & regs->drv_mask);
 	else
-		val &= ~VIB_DRV_SEL_MASK;
+		val &= ~regs->drv_mask;
 
-	rc = regmap_write(vib->regmap, VIB_DRV, val);
+	rc = regmap_write(vib->regmap, regs->drv_addr, val);
 	if (rc < 0)
 		return rc;
 
@@ -80,10 +92,11 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
 static void pm8xxx_work_handler(struct work_struct *work)
 {
 	struct pm8xxx_vib *vib = container_of(work, struct pm8xxx_vib, work);
+	const struct pm8xxx_regs *regs = vib->regs;
 	int rc;
 	unsigned int val;
 
-	rc = regmap_read(vib->regmap, VIB_DRV, &val);
+	rc = regmap_read(vib->regmap, regs->drv_addr, &val);
 	if (rc < 0)
 		return;
 
@@ -147,6 +160,7 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)
 	struct input_dev *input_dev;
 	int error;
 	unsigned int val;
+	const struct pm8xxx_regs *regs;
 
 	vib = devm_kzalloc(&pdev->dev, sizeof(*vib), GFP_KERNEL);
 	if (!vib)
@@ -163,16 +177,19 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)
 	INIT_WORK(&vib->work, pm8xxx_work_handler);
 	vib->vib_input_dev = input_dev;
 
+	regs = of_device_get_match_data(&pdev->dev);
+
 	/* operate in manual mode */
-	error = regmap_read(vib->regmap, VIB_DRV, &val);
+	error = regmap_read(vib->regmap, regs->drv_addr, &val);
 	if (error < 0)
 		return error;
 
-	val &= ~VIB_DRV_EN_MANUAL_MASK;
-	error = regmap_write(vib->regmap, VIB_DRV, val);
+	val &= regs->drv_en_manual_mask;
+	error = regmap_write(vib->regmap, regs->drv_addr, val);
 	if (error < 0)
 		return error;
 
+	vib->regs = regs;
 	vib->reg_vib_drv = val;
 
 	input_dev->name = "pm8xxx_vib_ffmemless";
@@ -212,8 +229,8 @@ static int __maybe_unused pm8xxx_vib_suspend(struct device *dev)
 static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL);
 
 static const struct of_device_id pm8xxx_vib_id_table[] = {
-	{ .compatible = "qcom,pm8058-vib" },
-	{ .compatible = "qcom,pm8921-vib" },
+	{ .compatible = "qcom,pm8058-vib", .data = &pm8058_regs },
+	{ .compatible = "qcom,pm8921-vib", .data = &pm8058_regs },
 	{ }
 };
 MODULE_DEVICE_TABLE(of, pm8xxx_vib_id_table);
-- 
2.12.1


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

* [PATCH v2 3/5] Input: pm8xxx-vib: handle separate enable register
  2017-04-04 15:41 [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Damien Riegel
  2017-04-04 15:41 ` [PATCH v2 2/5] Input: pm8xxx-vib: parametrize the driver Damien Riegel
@ 2017-04-04 15:41 ` Damien Riegel
  2017-04-04 15:41 ` [PATCH v2 4/5] dt-bindings: input: add pm8916-vib bindings Damien Riegel
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Damien Riegel @ 2017-04-04 15:41 UTC (permalink / raw)
  To: linux-input
  Cc: Dmitry Torokhov, Rob Herring, Mark Rutland, kernel, Damien Riegel

Some PMIC vibrator IPs use a separate enable register to turn the
vibrator on and off. To detect if a vibrator uses this feature, rely on
the enable_mask being non-zero.

Signed-off-by: Damien Riegel <damien.riegel@savoirfairelinux.com>
---
Changes in v2:
 - Removed reading register base address from device tree as it can
   already be infered from the compatible string.

 drivers/input/misc/pm8xxx-vibrator.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c
index b9b73957a48f..50b874e6f678 100644
--- a/drivers/input/misc/pm8xxx-vibrator.c
+++ b/drivers/input/misc/pm8xxx-vibrator.c
@@ -14,6 +14,7 @@
 #include <linux/input.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
@@ -26,6 +27,9 @@
 #define MAX_FF_SPEED		0xff
 
 struct pm8xxx_regs {
+	unsigned int enable_addr;
+	unsigned int enable_mask;
+
 	unsigned int drv_addr;
 	unsigned int drv_mask;
 	unsigned int drv_shift;
@@ -82,7 +86,14 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
 		return rc;
 
 	vib->reg_vib_drv = val;
-	return 0;
+
+	if (regs->enable_mask) {
+		unsigned int val = on ? regs->enable_mask : 0;
+		rc = regmap_update_bits(vib->regmap, regs->enable_addr,
+					regs->enable_mask, val);
+	}
+
+	return rc;
 }
 
 /**
-- 
2.12.1


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

* [PATCH v2 4/5] dt-bindings: input: add pm8916-vib bindings
  2017-04-04 15:41 [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Damien Riegel
  2017-04-04 15:41 ` [PATCH v2 2/5] Input: pm8xxx-vib: parametrize the driver Damien Riegel
  2017-04-04 15:41 ` [PATCH v2 3/5] Input: pm8xxx-vib: handle separate enable register Damien Riegel
@ 2017-04-04 15:41 ` Damien Riegel
  2017-04-04 15:41 ` [PATCH v2 5/5] Input: pm8xxx-vib: add support for pm8916's vibrator Damien Riegel
  2017-04-04 23:31 ` [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Dmitry Torokhov
  4 siblings, 0 replies; 6+ messages in thread
From: Damien Riegel @ 2017-04-04 15:41 UTC (permalink / raw)
  To: linux-input
  Cc: Dmitry Torokhov, Rob Herring, Mark Rutland, kernel, Damien Riegel

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Damien Riegel <damien.riegel@savoirfairelinux.com>
---
Changes in v2:
 - removed documentation tweaking, let's keep it generic
 - changed commit title to start with "dt-bindings: input:"

 Documentation/devicetree/bindings/input/qcom,pm8xxx-vib.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/input/qcom,pm8xxx-vib.txt b/Documentation/devicetree/bindings/input/qcom,pm8xxx-vib.txt
index 4ed467b1e402..64bb990075c3 100644
--- a/Documentation/devicetree/bindings/input/qcom,pm8xxx-vib.txt
+++ b/Documentation/devicetree/bindings/input/qcom,pm8xxx-vib.txt
@@ -7,6 +7,7 @@ PROPERTIES
 	Value type: <string>
 	Definition: must be one of:
 		    "qcom,pm8058-vib"
+		    "qcom,pm8916-vib"
 		    "qcom,pm8921-vib"
 
 - reg:
-- 
2.12.1


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

* [PATCH v2 5/5] Input: pm8xxx-vib: add support for pm8916's vibrator
  2017-04-04 15:41 [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Damien Riegel
                   ` (2 preceding siblings ...)
  2017-04-04 15:41 ` [PATCH v2 4/5] dt-bindings: input: add pm8916-vib bindings Damien Riegel
@ 2017-04-04 15:41 ` Damien Riegel
  2017-04-04 23:31 ` [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Dmitry Torokhov
  4 siblings, 0 replies; 6+ messages in thread
From: Damien Riegel @ 2017-04-04 15:41 UTC (permalink / raw)
  To: linux-input
  Cc: Dmitry Torokhov, Rob Herring, Mark Rutland, kernel, Damien Riegel

Add pm8xxx_regs for this PMIC and the device tree match table entry.

Signed-off-by: Damien Riegel <damien.riegel@savoirfairelinux.com>
---
Changes in v2:
 - Added 0xc000 offset to enable_addr and drv_addr

 drivers/input/misc/Kconfig           |  2 +-
 drivers/input/misc/pm8xxx-vibrator.c | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 5b6c52210d20..79d0be9885c5 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -143,7 +143,7 @@ config INPUT_PM8941_PWRKEY
 
 config INPUT_PM8XXX_VIBRATOR
 	tristate "Qualcomm PM8XXX vibrator support"
-	depends on MFD_PM8XXX
+	depends on MFD_PM8XXX || MFD_SPMI_PMIC
 	select INPUT_FF_MEMLESS
 	help
 	  This option enables device driver support for the vibrator
diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c
index 50b874e6f678..33b1fe9154b0 100644
--- a/drivers/input/misc/pm8xxx-vibrator.c
+++ b/drivers/input/misc/pm8xxx-vibrator.c
@@ -43,6 +43,15 @@ static struct pm8xxx_regs pm8058_regs = {
 	.drv_en_manual_mask = 0xfc,
 };
 
+static struct pm8xxx_regs pm8916_regs = {
+	.enable_addr = 0xc046,
+	.enable_mask = BIT(7),
+	.drv_addr = 0xc041,
+	.drv_mask = 0x1F,
+	.drv_shift = 0,
+	.drv_en_manual_mask = 0,
+};
+
 /**
  * struct pm8xxx_vib - structure to hold vibrator data
  * @vib_input_dev: input device supporting force feedback
@@ -242,6 +251,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL);
 static const struct of_device_id pm8xxx_vib_id_table[] = {
 	{ .compatible = "qcom,pm8058-vib", .data = &pm8058_regs },
 	{ .compatible = "qcom,pm8921-vib", .data = &pm8058_regs },
+	{ .compatible = "qcom,pm8916-vib", .data = &pm8916_regs },
 	{ }
 };
 MODULE_DEVICE_TABLE(of, pm8xxx_vib_id_table);
-- 
2.12.1


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

* Re: [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically
  2017-04-04 15:41 [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Damien Riegel
                   ` (3 preceding siblings ...)
  2017-04-04 15:41 ` [PATCH v2 5/5] Input: pm8xxx-vib: add support for pm8916's vibrator Damien Riegel
@ 2017-04-04 23:31 ` Dmitry Torokhov
  4 siblings, 0 replies; 6+ messages in thread
From: Dmitry Torokhov @ 2017-04-04 23:31 UTC (permalink / raw)
  To: Damien Riegel; +Cc: linux-input, Rob Herring, Mark Rutland, kernel

On Tue, Apr 04, 2017 at 11:41:49AM -0400, Damien Riegel wrote:
> Signed-off-by: Damien Riegel <damien.riegel@savoirfairelinux.com>

Applied the lot, thank you.

> ---
>  drivers/input/misc/pm8xxx-vibrator.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c
> index 5113877153d7..580448170342 100644
> --- a/drivers/input/misc/pm8xxx-vibrator.c
> +++ b/drivers/input/misc/pm8xxx-vibrator.c
> @@ -10,13 +10,13 @@
>   * GNU General Public License for more details.
>   */
>  
> -#include <linux/module.h>
> -#include <linux/kernel.h>
>  #include <linux/errno.h>
> -#include <linux/platform_device.h>
>  #include <linux/input.h>
> -#include <linux/slab.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
>  #include <linux/regmap.h>
> +#include <linux/slab.h>
>  
>  #define VIB_DRV			0x4A
>  
> -- 
> 2.12.1
> 

-- 
Dmitry

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

end of thread, other threads:[~2017-04-04 23:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-04 15:41 [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Damien Riegel
2017-04-04 15:41 ` [PATCH v2 2/5] Input: pm8xxx-vib: parametrize the driver Damien Riegel
2017-04-04 15:41 ` [PATCH v2 3/5] Input: pm8xxx-vib: handle separate enable register Damien Riegel
2017-04-04 15:41 ` [PATCH v2 4/5] dt-bindings: input: add pm8916-vib bindings Damien Riegel
2017-04-04 15:41 ` [PATCH v2 5/5] Input: pm8xxx-vib: add support for pm8916's vibrator Damien Riegel
2017-04-04 23:31 ` [PATCH v2 1/5] Input: pm8xxx-vib: reorder header alphabetically Dmitry Torokhov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.