Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1562910 > unrolled thread

[PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance

Started byAndy Shevchenko <andriy.shevchenko@linux.intel.com>
First post2017-01-19 17:50 +0100
Last post2017-01-19 20:30 +0100
Articles 6 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance Andy Shevchenko <andriy.shevchenko@linux.intel.com> - 2017-01-19 17:50 +0100
    [PATCH v1 02/10] platform/x86: intel_mid_powerbtn: Convert to use devm_*() Andy Shevchenko <andriy.shevchenko@linux.intel.com> - 2017-01-19 17:50 +0100
    [PATCH v1 05/10] platform/x86: intel_mid_powerbtn: Factor out mfld_ack() Andy Shevchenko <andriy.shevchenko@linux.intel.com> - 2017-01-19 18:00 +0100
    [PATCH v1 01/10] platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT Andy Shevchenko <andriy.shevchenko@linux.intel.com> - 2017-01-19 18:30 +0100
    [PATCH v1 08/10] platform/x86: intel_mid_powerbtn: Join string literals Andy Shevchenko <andriy.shevchenko@linux.intel.com> - 2017-01-19 20:30 +0100
    [PATCH v1 06/10] platform/x86: intel_mid_powerbtn: Acknowledge interrupts Andy Shevchenko <andriy.shevchenko@linux.intel.com> - 2017-01-19 20:30 +0100

#1562910 — [PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance

FromAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Date2017-01-19 17:50 +0100
Subject[PATCH v1 00/10] platform/x86: intel_mid_powerbtn: Fix, clean up, enhance
Message-ID<t1o4p-3Xc-11@gated-at.bofh.it>
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

[toc] | [next] | [standalone]


#1562915 — [PATCH v1 02/10] platform/x86: intel_mid_powerbtn: Convert to use devm_*()

FromAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Date2017-01-19 17:50 +0100
Subject[PATCH v1 02/10] platform/x86: intel_mid_powerbtn: Convert to use devm_*()
Message-ID<t1o4r-3Xc-63@gated-at.bofh.it>
In reply to#1562910
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

[toc] | [prev] | [next] | [standalone]


#1562923 — [PATCH v1 05/10] platform/x86: intel_mid_powerbtn: Factor out mfld_ack()

FromAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Date2017-01-19 18:00 +0100
Subject[PATCH v1 05/10] platform/x86: intel_mid_powerbtn: Factor out mfld_ack()
Message-ID<t1oe6-40V-25@gated-at.bofh.it>
In reply to#1562910
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

[toc] | [prev] | [next] | [standalone]


#1562963 — [PATCH v1 01/10] platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT

FromAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Date2017-01-19 18:30 +0100
Subject[PATCH v1 01/10] platform/x86: intel_mid_powerbtn: Set IRQ_ONESHOT
Message-ID<t1oH8-4qY-33@gated-at.bofh.it>
In reply to#1562910
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

[toc] | [prev] | [next] | [standalone]


#1563026 — [PATCH v1 08/10] platform/x86: intel_mid_powerbtn: Join string literals

FromAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Date2017-01-19 20:30 +0100
Subject[PATCH v1 08/10] platform/x86: intel_mid_powerbtn: Join string literals
Message-ID<t1qzg-5Bs-13@gated-at.bofh.it>
In reply to#1562910
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

[toc] | [prev] | [next] | [standalone]


#1563028 — [PATCH v1 06/10] platform/x86: intel_mid_powerbtn: Acknowledge interrupts

FromAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Date2017-01-19 20:30 +0100
Subject[PATCH v1 06/10] platform/x86: intel_mid_powerbtn: Acknowledge interrupts
Message-ID<t1qzg-5Bs-29@gated-at.bofh.it>
In reply to#1562910
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

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web