All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: platform-driver-x86@vger.kernel.org,
	Darren Hart <dvhart@infradead.org>,
	linux-kernel@vger.kernel.org
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Subject: [PATCH v1 04/10] platform/x86: intel_mid_powerbtn: Introduce driver data
Date: Thu, 19 Jan 2017 18:39:43 +0200	[thread overview]
Message-ID: <20170119163949.147183-5-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20170119163949.147183-1-andriy.shevchenko@linux.intel.com>

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

  parent reply	other threads:[~2017-01-19 16:42 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 ` Andy Shevchenko [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170119163949.147183-5-andriy.shevchenko@linux.intel.com \
    --to=andriy.shevchenko@linux.intel.com \
    --cc=dvhart@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=platform-driver-x86@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.