linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance
@ 2017-01-19 16:39 Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 01/10] platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT Andy Shevchenko
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

The series contains 3 groups of patches
- fix of the driver regarding interrupt flags
- several clean ups
- enhancement to enable on Intel Merrifield (Intel Edison board)

The driver has been tested on Intel Medfield tablet and Intel Edison board.

Andy Shevchenko (10):
  platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT
  platform/x86: intel_mid_powerbtn: Convert to use devm_*()
  platform/x86: intel_mid_powerbtn: Substitute mfld by mid
  platform/x86: intel_mid_powerbtn: Introduce driver data
  platform/x86: intel_mid_powerbtn: Factor out mfld_ack()
  platform/x86: intel_mid_powerbtn: Acknowledge interrupts
  platform/x86: intel_mid_powerbtn: Enable driver for Merrifield
  platform/x86: intel_mid_powerbtn: Join string literals
  platform/x86: intel_mid_powerbtn: Sort headers alphabetically
  platform/x86: intel_mid_powerbtn: Remove snail address

 drivers/platform/x86/intel_mid_powerbtn.c | 225 ++++++++++++++++++++++--------
 1 file changed, 164 insertions(+), 61 deletions(-)

-- 
2.11.0

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

* [PATCH v1 01/10] platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 02/10] platform/x86: intel_mid_powerbtn: Convert to use devm_*() Andy Shevchenko
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

The commit 1c6c69525b40 ("genirq: Reject bogus threaded irq requests")
starts refusing misconfigured interrupt handlers. This makes
intel_mid_powerbtn not working anymore.

Add a mandatory flag to a threaded IRQ request in the driver.

Fixes: 1c6c69525b40 ("genirq: Reject bogus threaded irq requests")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index 1fc0de870ff8..361770568ad0 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -77,7 +77,7 @@ static int mfld_pb_probe(struct platform_device *pdev)
 
 	input_set_capability(input, EV_KEY, KEY_POWER);
 
-	error = request_threaded_irq(irq, NULL, mfld_pb_isr, 0,
+	error = request_threaded_irq(irq, NULL, mfld_pb_isr, IRQF_ONESHOT,
 				     DRIVER_NAME, input);
 	if (error) {
 		dev_err(&pdev->dev, "Unable to request irq %d for mfld power"
-- 
2.11.0

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

* [PATCH v1 02/10] platform/x86: intel_mid_powerbtn: Convert to use devm_*()
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 01/10] platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 03/10] platform/x86: intel_mid_powerbtn: Substitute mfld by mid Andy Shevchenko
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

Convert driver to use managed resources.
This eliminates error path boilerplate and makes code neat.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 29 +++++++++--------------------
 1 file changed, 9 insertions(+), 20 deletions(-)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index 361770568ad0..05c52cc87852 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -66,7 +66,7 @@ static int mfld_pb_probe(struct platform_device *pdev)
 	if (irq < 0)
 		return -EINVAL;
 
-	input = input_allocate_device();
+	input = devm_input_allocate_device(&pdev->dev);
 	if (!input)
 		return -ENOMEM;
 
@@ -77,22 +77,19 @@ static int mfld_pb_probe(struct platform_device *pdev)
 
 	input_set_capability(input, EV_KEY, KEY_POWER);
 
-	error = request_threaded_irq(irq, NULL, mfld_pb_isr, IRQF_ONESHOT,
-				     DRIVER_NAME, input);
+	error = devm_request_threaded_irq(&pdev->dev, irq, NULL, mfld_pb_isr,
+					  IRQF_ONESHOT, DRIVER_NAME, input);
 	if (error) {
 		dev_err(&pdev->dev, "Unable to request irq %d for mfld power"
 				"button\n", irq);
-		goto err_free_input;
+		return error;
 	}
 
-	device_init_wakeup(&pdev->dev, true);
-	dev_pm_set_wake_irq(&pdev->dev, irq);
-
 	error = input_register_device(input);
 	if (error) {
 		dev_err(&pdev->dev, "Unable to register input dev, error "
 				"%d\n", error);
-		goto err_free_irq;
+		return error;
 	}
 
 	platform_set_drvdata(pdev, input);
@@ -111,27 +108,19 @@ static int mfld_pb_probe(struct platform_device *pdev)
 	if (error) {
 		dev_err(&pdev->dev, "Unable to clear power button interrupt, "
 				"error: %d\n", error);
-		goto err_free_irq;
+		return error;
 	}
 
-	return 0;
+	device_init_wakeup(&pdev->dev, true);
+	dev_pm_set_wake_irq(&pdev->dev, irq);
 
-err_free_irq:
-	free_irq(irq, input);
-err_free_input:
-	input_free_device(input);
-	return error;
+	return 0;
 }
 
 static int mfld_pb_remove(struct platform_device *pdev)
 {
-	struct input_dev *input = platform_get_drvdata(pdev);
-	int irq = platform_get_irq(pdev, 0);
-
 	dev_pm_clear_wake_irq(&pdev->dev);
 	device_init_wakeup(&pdev->dev, false);
-	free_irq(irq, input);
-	input_unregister_device(input);
 
 	return 0;
 }
-- 
2.11.0

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

* [PATCH v1 03/10] platform/x86: intel_mid_powerbtn: Substitute mfld by mid
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 01/10] platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 02/10] platform/x86: intel_mid_powerbtn: Convert to use devm_*() Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 04/10] platform/x86: intel_mid_powerbtn: Introduce driver data Andy Shevchenko
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

Replace all occurrences of mfld by mid to emphasize that driver is used
for Intel MID platforms.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index 05c52cc87852..3ab134ba832e 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -1,5 +1,5 @@
 /*
- * Power button driver for Medfield.
+ * Power button driver for Intel MID platforms.
  *
  * Copyright (C) 2010 Intel Corp
  *
@@ -36,7 +36,7 @@
  */
 #define MSIC_PWRBTNM    (1 << 0)
 
-static irqreturn_t mfld_pb_isr(int irq, void *dev_id)
+static irqreturn_t mid_pb_isr(int irq, void *dev_id)
 {
 	struct input_dev *input = dev_id;
 	int ret;
@@ -57,7 +57,7 @@ static irqreturn_t mfld_pb_isr(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static int mfld_pb_probe(struct platform_device *pdev)
+static int mid_pb_probe(struct platform_device *pdev)
 {
 	struct input_dev *input;
 	int irq = platform_get_irq(pdev, 0);
@@ -77,10 +77,10 @@ static int mfld_pb_probe(struct platform_device *pdev)
 
 	input_set_capability(input, EV_KEY, KEY_POWER);
 
-	error = devm_request_threaded_irq(&pdev->dev, irq, NULL, mfld_pb_isr,
+	error = devm_request_threaded_irq(&pdev->dev, irq, NULL, mid_pb_isr,
 					  IRQF_ONESHOT, DRIVER_NAME, input);
 	if (error) {
-		dev_err(&pdev->dev, "Unable to request irq %d for mfld power"
+		dev_err(&pdev->dev, "Unable to request irq %d for MID power"
 				"button\n", irq);
 		return error;
 	}
@@ -117,7 +117,7 @@ static int mfld_pb_probe(struct platform_device *pdev)
 	return 0;
 }
 
-static int mfld_pb_remove(struct platform_device *pdev)
+static int mid_pb_remove(struct platform_device *pdev)
 {
 	dev_pm_clear_wake_irq(&pdev->dev);
 	device_init_wakeup(&pdev->dev, false);
@@ -125,17 +125,17 @@ static int mfld_pb_remove(struct platform_device *pdev)
 	return 0;
 }
 
-static struct platform_driver mfld_pb_driver = {
+static struct platform_driver mid_pb_driver = {
 	.driver = {
 		.name = DRIVER_NAME,
 	},
-	.probe	= mfld_pb_probe,
-	.remove	= mfld_pb_remove,
+	.probe	= mid_pb_probe,
+	.remove	= mid_pb_remove,
 };
 
-module_platform_driver(mfld_pb_driver);
+module_platform_driver(mid_pb_driver);
 
 MODULE_AUTHOR("Hong Liu <hong.liu@intel.com>");
-MODULE_DESCRIPTION("Intel Medfield Power Button Driver");
+MODULE_DESCRIPTION("Intel MID Power Button Driver");
 MODULE_LICENSE("GPL v2");
 MODULE_ALIAS("platform:" DRIVER_NAME);
-- 
2.11.0

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

* [PATCH v1 04/10] platform/x86: intel_mid_powerbtn: Introduce driver data
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
                   ` (2 preceding siblings ...)
  2017-01-19 16:39 ` [PATCH v1 03/10] platform/x86: intel_mid_powerbtn: Substitute mfld by mid Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 05/10] platform/x86: intel_mid_powerbtn: Factor out mfld_ack() Andy Shevchenko
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

This is preparatory patch to extend the driver in order to support other
Intel MID platform.

Here the new driver data structure is introduced with split of
->pbstat() callback.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 62 ++++++++++++++++++++++++++++---
 1 file changed, 56 insertions(+), 6 deletions(-)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index 3ab134ba832e..bce8653cc345 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -26,6 +26,9 @@
 #include <linux/mfd/intel_msic.h>
 #include <linux/pm_wakeirq.h>
 
+#include <asm/cpu_device_id.h>
+#include <asm/intel-family.h>
+
 #define DRIVER_NAME "msic_power_btn"
 
 #define MSIC_PB_LEVEL	(1 << 3) /* 1 - release, 0 - press */
@@ -36,33 +39,72 @@
  */
 #define MSIC_PWRBTNM    (1 << 0)
 
-static irqreturn_t mid_pb_isr(int irq, void *dev_id)
+struct mid_pb_ddata {
+	struct device *dev;
+	int irq;
+	struct input_dev *input;
+	int (*pbstat)(struct mid_pb_ddata *ddata, int *value);
+};
+
+static int mfld_pbstat(struct mid_pb_ddata *ddata, int *value)
 {
-	struct input_dev *input = dev_id;
+	struct input_dev *input = ddata->input;
 	int ret;
 	u8 pbstat;
 
 	ret = intel_msic_reg_read(INTEL_MSIC_PBSTATUS, &pbstat);
+	if (ret)
+		return ret;
+
 	dev_dbg(input->dev.parent, "PB_INT status= %d\n", pbstat);
 
+	*value = !(pbstat & MSIC_PB_LEVEL);
+	return 0;
+}
+
+static irqreturn_t mid_pb_isr(int irq, void *dev_id)
+{
+	struct mid_pb_ddata *ddata = dev_id;
+	struct input_dev *input = ddata->input;
+	int value;
+	int ret;
+
+	ret = ddata->pbstat(ddata, &value);
 	if (ret < 0) {
 		dev_err(input->dev.parent, "Read error %d while reading"
 			       " MSIC_PB_STATUS\n", ret);
 	} else {
-		input_event(input, EV_KEY, KEY_POWER,
-			       !(pbstat & MSIC_PB_LEVEL));
+		input_event(input, EV_KEY, KEY_POWER, value);
 		input_sync(input);
 	}
 
 	return IRQ_HANDLED;
 }
 
+static struct mid_pb_ddata mfld_ddata = {
+	.pbstat	= mfld_pbstat,
+};
+
+#define ICPU(model, ddata)	\
+	{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (kernel_ulong_t)&ddata }
+
+static const struct x86_cpu_id mid_pb_cpu_ids[] = {
+	ICPU(INTEL_FAM6_ATOM_PENWELL,		mfld_ddata),
+	{}
+};
+
 static int mid_pb_probe(struct platform_device *pdev)
 {
+	const struct x86_cpu_id *id;
+	struct mid_pb_ddata *ddata;
 	struct input_dev *input;
 	int irq = platform_get_irq(pdev, 0);
 	int error;
 
+	id = x86_match_cpu(mid_pb_cpu_ids);
+	if (!id)
+		return -ENODEV;
+
 	if (irq < 0)
 		return -EINVAL;
 
@@ -77,8 +119,16 @@ static int mid_pb_probe(struct platform_device *pdev)
 
 	input_set_capability(input, EV_KEY, KEY_POWER);
 
+	ddata = (struct mid_pb_ddata *)id->driver_data;
+	if (!ddata)
+		return -ENODATA;
+
+	ddata->dev = &pdev->dev;
+	ddata->irq = irq;
+	ddata->input = input;
+
 	error = devm_request_threaded_irq(&pdev->dev, irq, NULL, mid_pb_isr,
-					  IRQF_ONESHOT, DRIVER_NAME, input);
+					  IRQF_ONESHOT, DRIVER_NAME, ddata);
 	if (error) {
 		dev_err(&pdev->dev, "Unable to request irq %d for MID power"
 				"button\n", irq);
@@ -92,7 +142,7 @@ static int mid_pb_probe(struct platform_device *pdev)
 		return error;
 	}
 
-	platform_set_drvdata(pdev, input);
+	platform_set_drvdata(pdev, ddata);
 
 	/*
 	 * SCU firmware might send power button interrupts to IA core before
-- 
2.11.0

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

* [PATCH v1 05/10] platform/x86: intel_mid_powerbtn: Factor out mfld_ack()
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
                   ` (3 preceding siblings ...)
  2017-01-19 16:39 ` [PATCH v1 04/10] platform/x86: intel_mid_powerbtn: Introduce driver data Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 06/10] platform/x86: intel_mid_powerbtn: Acknowledge interrupts Andy Shevchenko
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

Move Intel Medfield specific code to another callback, which will be
used later.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index bce8653cc345..596ac9f3e89d 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -44,6 +44,7 @@ struct mid_pb_ddata {
 	int irq;
 	struct input_dev *input;
 	int (*pbstat)(struct mid_pb_ddata *ddata, int *value);
+	int (*ack)(struct mid_pb_ddata *ddata);
 };
 
 static int mfld_pbstat(struct mid_pb_ddata *ddata, int *value)
@@ -62,6 +63,21 @@ static int mfld_pbstat(struct mid_pb_ddata *ddata, int *value)
 	return 0;
 }
 
+static int mfld_ack(struct mid_pb_ddata *ddata)
+{
+	/*
+	 * SCU firmware might send power button interrupts to IA core before
+	 * kernel boots and doesn't get EOI from IA core. The first bit of
+	 * MSIC reg 0x21 is kept masked, and SCU firmware doesn't send new
+	 * power interrupt to Android kernel. Unmask the bit when probing
+	 * power button in kernel.
+	 * There is a very narrow race between irq handler and power button
+	 * initialization. The race happens rarely. So we needn't worry
+	 * about it.
+	 */
+	return intel_msic_reg_update(INTEL_MSIC_IRQLVL1MSK, 0, MSIC_PWRBTNM);
+}
+
 static irqreturn_t mid_pb_isr(int irq, void *dev_id)
 {
 	struct mid_pb_ddata *ddata = dev_id;
@@ -83,6 +99,7 @@ static irqreturn_t mid_pb_isr(int irq, void *dev_id)
 
 static struct mid_pb_ddata mfld_ddata = {
 	.pbstat	= mfld_pbstat,
+	.ack	= mfld_ack,
 };
 
 #define ICPU(model, ddata)	\
@@ -144,17 +161,7 @@ static int mid_pb_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, ddata);
 
-	/*
-	 * SCU firmware might send power button interrupts to IA core before
-	 * kernel boots and doesn't get EOI from IA core. The first bit of
-	 * MSIC reg 0x21 is kept masked, and SCU firmware doesn't send new
-	 * power interrupt to Android kernel. Unmask the bit when probing
-	 * power button in kernel.
-	 * There is a very narrow race between irq handler and power button
-	 * initialization. The race happens rarely. So we needn't worry
-	 * about it.
-	 */
-	error = intel_msic_reg_update(INTEL_MSIC_IRQLVL1MSK, 0, MSIC_PWRBTNM);
+	error = ddata->ack(ddata);
 	if (error) {
 		dev_err(&pdev->dev, "Unable to clear power button interrupt, "
 				"error: %d\n", error);
-- 
2.11.0

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

* [PATCH v1 06/10] platform/x86: intel_mid_powerbtn: Acknowledge interrupts
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
                   ` (4 preceding siblings ...)
  2017-01-19 16:39 ` [PATCH v1 05/10] platform/x86: intel_mid_powerbtn: Factor out mfld_ack() Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 07/10] platform/x86: intel_mid_powerbtn: Enable driver for Merrifield Andy Shevchenko
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

Some platforms require interrupt to be acknowledged by clearing
MSIC_PWRBTNM bit in interrupt level 1 mask register.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index 596ac9f3e89d..ac02a0b8bef3 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -94,6 +94,7 @@ static irqreturn_t mid_pb_isr(int irq, void *dev_id)
 		input_sync(input);
 	}
 
+	ddata->ack(ddata);
 	return IRQ_HANDLED;
 }
 
-- 
2.11.0

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

* [PATCH v1 07/10] platform/x86: intel_mid_powerbtn: Enable driver for Merrifield
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
                   ` (5 preceding siblings ...)
  2017-01-19 16:39 ` [PATCH v1 06/10] platform/x86: intel_mid_powerbtn: Acknowledge interrupts Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 08/10] platform/x86: intel_mid_powerbtn: Join string literals Andy Shevchenko
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

Enable this driver to handle events from Basin Cove PMIC, which is
installed on Intel Merrifield platform.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 56 +++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index ac02a0b8bef3..12fbf400f228 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -28,6 +28,7 @@
 
 #include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
+#include <asm/intel_scu_ipc.h>
 
 #define DRIVER_NAME "msic_power_btn"
 
@@ -39,12 +40,23 @@
  */
 #define MSIC_PWRBTNM    (1 << 0)
 
+/* Intel Tangier */
+#define MRFLD_PBSTAT_ADDR	0xfffff61a
+#define MRFLD_PB_LEVEL		(1 << 4)	/* 1 - release, 0 - press */
+
+/* Basin Cove PMIC */
+#define BCOVE_PBIRQ		0x02
+#define BCOVE_IRQLVL1MSK	0x0c
+#define BCOVE_PBIRQMASK		0x0d
+
 struct mid_pb_ddata {
 	struct device *dev;
+	void __iomem *reg;
 	int irq;
 	struct input_dev *input;
 	int (*pbstat)(struct mid_pb_ddata *ddata, int *value);
 	int (*ack)(struct mid_pb_ddata *ddata);
+	int (*setup)(struct mid_pb_ddata *ddata);
 };
 
 static int mfld_pbstat(struct mid_pb_ddata *ddata, int *value)
@@ -78,6 +90,37 @@ static int mfld_ack(struct mid_pb_ddata *ddata)
 	return intel_msic_reg_update(INTEL_MSIC_IRQLVL1MSK, 0, MSIC_PWRBTNM);
 }
 
+static int mrfld_pbstat(struct mid_pb_ddata *ddata, int *value)
+{
+	struct input_dev *input = ddata->input;
+	u8 pbstat;
+
+	pbstat = readb(ddata->reg);
+
+	dev_dbg(input->dev.parent, "PB_INT status= %d\n", pbstat);
+
+	*value = !(pbstat & MRFLD_PB_LEVEL);
+	return 0;
+}
+
+static int mrfld_ack(struct mid_pb_ddata *ddata)
+{
+	return intel_scu_ipc_update_register(BCOVE_IRQLVL1MSK, 0, MSIC_PWRBTNM);
+}
+
+static int mrfld_setup(struct mid_pb_ddata *ddata)
+{
+	ddata->reg = devm_ioremap_nocache(ddata->dev, MRFLD_PBSTAT_ADDR, 1);
+	if (!ddata->reg)
+		return -ENOMEM;
+
+	/* Unmask the PBIRQ and MPBIRQ on Tangier */
+	intel_scu_ipc_update_register(BCOVE_PBIRQ, 0, MSIC_PWRBTNM);
+	intel_scu_ipc_update_register(BCOVE_PBIRQMASK, 0, MSIC_PWRBTNM);
+
+	return 0;
+}
+
 static irqreturn_t mid_pb_isr(int irq, void *dev_id)
 {
 	struct mid_pb_ddata *ddata = dev_id;
@@ -103,11 +146,18 @@ static struct mid_pb_ddata mfld_ddata = {
 	.ack	= mfld_ack,
 };
 
+static struct mid_pb_ddata mrfld_ddata = {
+	.pbstat	= mrfld_pbstat,
+	.ack	= mrfld_ack,
+	.setup	= mrfld_setup,
+};
+
 #define ICPU(model, ddata)	\
 	{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (kernel_ulong_t)&ddata }
 
 static const struct x86_cpu_id mid_pb_cpu_ids[] = {
 	ICPU(INTEL_FAM6_ATOM_PENWELL,		mfld_ddata),
+	ICPU(INTEL_FAM6_ATOM_MERRIFIELD,	mrfld_ddata),
 	{}
 };
 
@@ -145,6 +195,12 @@ static int mid_pb_probe(struct platform_device *pdev)
 	ddata->irq = irq;
 	ddata->input = input;
 
+	if (ddata->setup) {
+		error = ddata->setup(ddata);
+		if (error)
+			return error;
+	}
+
 	error = devm_request_threaded_irq(&pdev->dev, irq, NULL, mid_pb_isr,
 					  IRQF_ONESHOT, DRIVER_NAME, ddata);
 	if (error) {
-- 
2.11.0

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

* [PATCH v1 08/10] platform/x86: intel_mid_powerbtn: Join string literals
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
                   ` (6 preceding siblings ...)
  2017-01-19 16:39 ` [PATCH v1 07/10] platform/x86: intel_mid_powerbtn: Enable driver for Merrifield Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 09/10] platform/x86: intel_mid_powerbtn: Sort headers alphabetically Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 10/10] platform/x86: intel_mid_powerbtn: Remove snail address Andy Shevchenko
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

There is no need and bad practice for debugging to split string
literals. Join them back.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index 12fbf400f228..9b718cf237ee 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -130,8 +130,8 @@ static irqreturn_t mid_pb_isr(int irq, void *dev_id)
 
 	ret = ddata->pbstat(ddata, &value);
 	if (ret < 0) {
-		dev_err(input->dev.parent, "Read error %d while reading"
-			       " MSIC_PB_STATUS\n", ret);
+		dev_err(input->dev.parent,
+			"Read error %d while reading MSIC_PB_STATUS\n", ret);
 	} else {
 		input_event(input, EV_KEY, KEY_POWER, value);
 		input_sync(input);
@@ -204,15 +204,15 @@ static int mid_pb_probe(struct platform_device *pdev)
 	error = devm_request_threaded_irq(&pdev->dev, irq, NULL, mid_pb_isr,
 					  IRQF_ONESHOT, DRIVER_NAME, ddata);
 	if (error) {
-		dev_err(&pdev->dev, "Unable to request irq %d for MID power"
-				"button\n", irq);
+		dev_err(&pdev->dev,
+			"Unable to request irq %d for MID power button\n", irq);
 		return error;
 	}
 
 	error = input_register_device(input);
 	if (error) {
-		dev_err(&pdev->dev, "Unable to register input dev, error "
-				"%d\n", error);
+		dev_err(&pdev->dev,
+			"Unable to register input dev, error %d\n", error);
 		return error;
 	}
 
@@ -220,8 +220,9 @@ static int mid_pb_probe(struct platform_device *pdev)
 
 	error = ddata->ack(ddata);
 	if (error) {
-		dev_err(&pdev->dev, "Unable to clear power button interrupt, "
-				"error: %d\n", error);
+		dev_err(&pdev->dev,
+			"Unable to clear power button interrupt, error: %d\n",
+			error);
 		return error;
 	}
 
-- 
2.11.0

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

* [PATCH v1 09/10] platform/x86: intel_mid_powerbtn: Sort headers alphabetically
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
                   ` (7 preceding siblings ...)
  2017-01-19 16:39 ` [PATCH v1 08/10] platform/x86: intel_mid_powerbtn: Join string literals Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  2017-01-19 16:39 ` [PATCH v1 10/10] platform/x86: intel_mid_powerbtn: Remove snail address Andy Shevchenko
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

Sort header inclusion block in alphabetical order.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index 9b718cf237ee..63ffd1ce3d1c 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -17,14 +17,14 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-#include <linux/module.h>
 #include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/platform_device.h>
 #include <linux/input.h>
+#include <linux/interrupt.h>
 #include <linux/mfd/intel_msic.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
 #include <linux/pm_wakeirq.h>
+#include <linux/slab.h>
 
 #include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
-- 
2.11.0

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

* [PATCH v1 10/10] platform/x86: intel_mid_powerbtn: Remove snail address
  2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
                   ` (8 preceding siblings ...)
  2017-01-19 16:39 ` [PATCH v1 09/10] platform/x86: intel_mid_powerbtn: Sort headers alphabetically Andy Shevchenko
@ 2017-01-19 16:39 ` Andy Shevchenko
  9 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2017-01-19 16:39 UTC (permalink / raw)
  To: platform-driver-x86, Darren Hart, linux-kernel; +Cc: Andy Shevchenko

The snail address is subject to change. This already happened once.
Remove the address completely from the file to avoid potential noise
when update.

While here, adjust copyright years and list authors.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/platform/x86/intel_mid_powerbtn.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c
index 63ffd1ce3d1c..1d30b3549748 100644
--- a/drivers/platform/x86/intel_mid_powerbtn.c
+++ b/drivers/platform/x86/intel_mid_powerbtn.c
@@ -1,7 +1,10 @@
 /*
  * Power button driver for Intel MID platforms.
  *
- * Copyright (C) 2010 Intel Corp
+ * Copyright (C) 2010,2017 Intel Corp
+ *
+ * Author: Hong Liu <hong.liu@intel.com>
+ * Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  *
  * 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
@@ -11,10 +14,6 @@
  * 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
 #include <linux/init.h>
-- 
2.11.0

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

end of thread, other threads:[~2017-01-19 19:24 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-19 16:39 [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 01/10] platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 02/10] platform/x86: intel_mid_powerbtn: Convert to use devm_*() Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 03/10] platform/x86: intel_mid_powerbtn: Substitute mfld by mid Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 04/10] platform/x86: intel_mid_powerbtn: Introduce driver data Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 05/10] platform/x86: intel_mid_powerbtn: Factor out mfld_ack() Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 06/10] platform/x86: intel_mid_powerbtn: Acknowledge interrupts Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 07/10] platform/x86: intel_mid_powerbtn: Enable driver for Merrifield Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 08/10] platform/x86: intel_mid_powerbtn: Join string literals Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 09/10] platform/x86: intel_mid_powerbtn: Sort headers alphabetically Andy Shevchenko
2017-01-19 16:39 ` [PATCH v1 10/10] platform/x86: intel_mid_powerbtn: Remove snail address Andy Shevchenko

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).