All of lore.kernel.org
 help / color / mirror / Atom feed
From: MyungJoo Ham <myungjoo.ham@samsung.com>
To: Greg KH <gregkh@linuxfoundation.org>
Cc: "Arnd Bergmann" <arnd@arndb.de>,
	LKML <linux-kernel@vger.kernel.org>,
	"Arve Hjønnevag" <arve@android.com>,
	"Kyungmin Park" <kyungmin.park@samsung.com>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
	"Morten CHRISTIANSEN" <morten.christiansen@stericsson.com>,
	"Mark Brown" <broonie@opensource.wolfsonmicro.com>,
	"John Stultz" <john.stultz@linaro.org>,
	myungjoo.ham@gmail.com, cw00.choi@samsung.com
Subject: [PATCH v8 resend 2/6] Extcon: support generic GPIO extcon driver
Date: Fri, 20 Apr 2012 14:16:23 +0900	[thread overview]
Message-ID: <1334898987-7800-3-git-send-email-myungjoo.ham@samsung.com> (raw)
In-Reply-To: <1334898987-7800-1-git-send-email-myungjoo.ham@samsung.com>

The generic GPIO extcon driver (an external connector device based on
GPIO control) and imported from Android kernel.

switch: switch class and GPIO drivers. (splitted)
Author: Mike Lockwood <lockwood@android.com>

switch: gpio: Don't call request_irq with interrupts disabled
Author: Arve Hjønnevåg <arve@android.com>

switch_gpio: Add missing #include <linux/interrupt.h>
Author: Mike Lockwood <lockwood@android.com>

Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

--
Changed from v7:
- Style updates mentioned by Stephen Boyd and Mark Brown
Changed from v5:
- Splitted at v5 from the main extcon patch.
- Added debounce time for irq handlers.
- Use request_any_context_irq instead of request_irq
- User needs to specify irq flags for GPIO interrupts (was fixed to
IRQF_TRIGGER_LOW before)
- Use module_platform_driver().
---
 drivers/extcon/Kconfig             |    7 ++
 drivers/extcon/Makefile            |    1 +
 drivers/extcon/extcon_gpio.c       |  169 ++++++++++++++++++++++++++++++++++++
 include/linux/extcon/extcon_gpio.h |   52 +++++++++++
 4 files changed, 229 insertions(+), 0 deletions(-)
 create mode 100644 drivers/extcon/extcon_gpio.c
 create mode 100644 include/linux/extcon/extcon_gpio.h

diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig
index 7932e1b..85cecff 100644
--- a/drivers/extcon/Kconfig
+++ b/drivers/extcon/Kconfig
@@ -14,4 +14,11 @@ if EXTCON
 
 comment "Extcon Device Drivers"
 
+config EXTCON_GPIO
+	tristate "GPIO extcon support"
+	depends on GENERIC_GPIO
+	help
+	  Say Y here to enable GPIO based extcon support. Note that GPIO
+	  extcon supports single state per extcon instance.
+
 endif # MULTISTATE_SWITCH
diff --git a/drivers/extcon/Makefile b/drivers/extcon/Makefile
index 6bc6921..2c46d41 100644
--- a/drivers/extcon/Makefile
+++ b/drivers/extcon/Makefile
@@ -3,3 +3,4 @@
 #
 
 obj-$(CONFIG_EXTCON)		+= extcon_class.o
+obj-$(CONFIG_EXTCON_GPIO)	+= extcon_gpio.o
diff --git a/drivers/extcon/extcon_gpio.c b/drivers/extcon/extcon_gpio.c
new file mode 100644
index 0000000..5c0f085
--- /dev/null
+++ b/drivers/extcon/extcon_gpio.c
@@ -0,0 +1,169 @@
+/*
+ *  drivers/extcon/extcon_gpio.c
+ *
+ *  Single-state GPIO extcon driver based on extcon class
+ *
+ * Copyright (C) 2008 Google, Inc.
+ * Author: Mike Lockwood <lockwood@android.com>
+ *
+ * Modified by MyungJoo Ham <myungjoo.ham@samsung.com> to support extcon
+ * (originally switch class is supported)
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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/kernel.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/extcon.h>
+#include <linux/workqueue.h>
+#include <linux/gpio.h>
+#include <linux/extcon.h>
+#include <linux/extcon/extcon_gpio.h>
+
+struct gpio_extcon_data {
+	struct extcon_dev edev;
+	unsigned gpio;
+	const char *state_on;
+	const char *state_off;
+	int irq;
+	struct delayed_work work;
+	unsigned long debounce_jiffies;
+};
+
+static void gpio_extcon_work(struct work_struct *work)
+{
+	int state;
+	struct gpio_extcon_data	*data =
+		container_of(to_delayed_work(work), struct gpio_extcon_data,
+			     work);
+
+	state = gpio_get_value(data->gpio);
+	extcon_set_state(&data->edev, state);
+}
+
+static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
+{
+	struct gpio_extcon_data *extcon_data = dev_id;
+
+	schedule_delayed_work(&extcon_data->work,
+			      extcon_data->debounce_jiffies);
+	return IRQ_HANDLED;
+}
+
+static ssize_t extcon_gpio_print_state(struct extcon_dev *edev, char *buf)
+{
+	struct gpio_extcon_data	*extcon_data =
+		container_of(edev, struct gpio_extcon_data, edev);
+	const char *state;
+	if (extcon_get_state(edev))
+		state = extcon_data->state_on;
+	else
+		state = extcon_data->state_off;
+
+	if (state)
+		return sprintf(buf, "%s\n", state);
+	return -EINVAL;
+}
+
+static int __devinit gpio_extcon_probe(struct platform_device *pdev)
+{
+	struct gpio_extcon_platform_data *pdata = pdev->dev.platform_data;
+	struct gpio_extcon_data *extcon_data;
+	int ret = 0;
+
+	if (!pdata)
+		return -EBUSY;
+	if (!pdata->irq_flags) {
+		dev_err(&pdev->dev, "IRQ flag is not specified.\n");
+		return -EINVAL;
+	}
+
+	extcon_data = devm_kzalloc(&pdev->dev, sizeof(struct gpio_extcon_data),
+				   GFP_KERNEL);
+	if (!extcon_data)
+		return -ENOMEM;
+
+	extcon_data->edev.name = pdata->name;
+	extcon_data->gpio = pdata->gpio;
+	extcon_data->state_on = pdata->state_on;
+	extcon_data->state_off = pdata->state_off;
+	if (pdata->state_on && pdata->state_off)
+		extcon_data->edev.print_state = extcon_gpio_print_state;
+	extcon_data->debounce_jiffies = msecs_to_jiffies(pdata->debounce);
+
+	ret = extcon_dev_register(&extcon_data->edev, &pdev->dev);
+	if (ret < 0)
+		goto err_extcon_dev_register;
+
+	ret = gpio_request_one(extcon_data->gpio, GPIOF_DIR_IN, pdev->name);
+	if (ret < 0)
+		goto err_request_gpio;
+
+	INIT_DELAYED_WORK(&extcon_data->work, gpio_extcon_work);
+
+	extcon_data->irq = gpio_to_irq(extcon_data->gpio);
+	if (extcon_data->irq < 0) {
+		ret = extcon_data->irq;
+		goto err_detect_irq_num_failed;
+	}
+
+	ret = request_any_context_irq(extcon_data->irq, gpio_irq_handler,
+				      pdata->irq_flags, pdev->name,
+				      extcon_data);
+	if (ret < 0)
+		goto err_request_irq;
+
+	/* Perform initial detection */
+	gpio_extcon_work(&extcon_data->work.work);
+
+	return 0;
+
+err_request_irq:
+err_detect_irq_num_failed:
+	gpio_free(extcon_data->gpio);
+err_request_gpio:
+	extcon_dev_unregister(&extcon_data->edev);
+err_extcon_dev_register:
+	devm_kfree(&pdev->dev, extcon_data);
+
+	return ret;
+}
+
+static int __devexit gpio_extcon_remove(struct platform_device *pdev)
+{
+	struct gpio_extcon_data *extcon_data = platform_get_drvdata(pdev);
+
+	cancel_delayed_work_sync(&extcon_data->work);
+	gpio_free(extcon_data->gpio);
+	extcon_dev_unregister(&extcon_data->edev);
+	devm_kfree(&pdev->dev, extcon_data);
+
+	return 0;
+}
+
+static struct platform_driver gpio_extcon = {
+	.probe		= gpio_extcon_probe,
+	.remove		= __devexit_p(gpio_extcon_remove),
+	.driver		= {
+		.name	= "extcon-gpio",
+		.owner	= THIS_MODULE,
+	},
+};
+
+module_platform_driver(gpio_extcon);
+
+MODULE_AUTHOR("Mike Lockwood <lockwood@android.com>");
+MODULE_DESCRIPTION("GPIO extcon driver");
+MODULE_LICENSE("GPL");
diff --git a/include/linux/extcon/extcon_gpio.h b/include/linux/extcon/extcon_gpio.h
new file mode 100644
index 0000000..a2129b7
--- /dev/null
+++ b/include/linux/extcon/extcon_gpio.h
@@ -0,0 +1,52 @@
+/*
+ *  External connector (extcon) class generic GPIO driver
+ *
+ * Copyright (C) 2012 Samsung Electronics
+ * Author: MyungJoo Ham <myungjoo.ham@samsung.com>
+ *
+ * based on switch class driver
+ * Copyright (C) 2008 Google, Inc.
+ * Author: Mike Lockwood <lockwood@android.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+*/
+#ifndef __EXTCON_GPIO_H__
+#define __EXTCON_GPIO_H__ __FILE__
+
+#include <linux/extcon.h>
+
+/**
+ * struct gpio_extcon_platform_data - A simple GPIO-controlled extcon device.
+ * @name	The name of this GPIO extcon device.
+ * @gpio	Corresponding GPIO.
+ * @debounce	Debounce time for GPIO IRQ in ms.
+ * @irq_flags	IRQ Flags (e.g., IRQF_TRIGGER_LOW).
+ * @state_on	print_state is overriden with state_on if attached. If Null,
+ *		default method of extcon class is used.
+ * @state_off	print_state is overriden with state_on if dettached. If Null,
+ *		default method of extcon class is used.
+ *
+ * Note that in order for state_on or state_off to be valid, both state_on
+ * and state_off should be not NULL. If at least one of them is NULL,
+ * the print_state is not overriden.
+ */
+struct gpio_extcon_platform_data {
+	const char *name;
+	unsigned gpio;
+	unsigned long debounce;
+	unsigned long irq_flags;
+
+	/* if NULL, "0" or "1" will be printed */
+	const char *state_on;
+	const char *state_off;
+};
+
+#endif /* __EXTCON_GPIO_H__ */
-- 
1.7.4.1


  parent reply	other threads:[~2012-04-20  5:17 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-23  8:52 [PATCH v7 0/6] Introduce External Connector Class (extcon) MyungJoo Ham
2012-03-23  8:52 ` [PATCH v7 1/6] Extcon (external connector): import Android's switch class and modify MyungJoo Ham
2012-04-18 21:47   ` Greg KH
2012-04-18 23:38     ` Kyungmin Park
2012-04-18 23:40       ` Greg KH
2012-04-18 23:48         ` Kyungmin Park
2012-04-19  0:01           ` Greg KH
2012-04-19  2:36     ` MyungJoo Ham
2012-04-19  2:41     ` [PATCH v8 0/6] Introduce External Connector Class (extcon) MyungJoo Ham
2012-04-19  2:41       ` [PATCH v8 1/6] Extcon (external connector): import Android's switch class and modify MyungJoo Ham
2012-04-19 11:38         ` Mark Brown
2012-04-20  2:37         ` Greg KH
2012-04-20  2:46           ` Kyungmin Park
2012-04-20  2:49             ` Greg KH
2012-04-20  2:57               ` Kyungmin Park
2012-04-20  3:00                 ` Greg KH
2012-04-20  3:08                   ` Kyungmin Park
2012-04-20  3:32                     ` Greg KH
2012-04-20  5:16                       ` [PATCH v8 resend 0/6] Introduce External Connector Class (extcon) MyungJoo Ham
2012-04-20  5:16                         ` [PATCH v8 resend 1/6] Extcon (external connector): import Android's switch class and modify MyungJoo Ham
2012-04-20  7:00                           ` Ryan Mallon
2012-04-20  5:16                         ` MyungJoo Ham [this message]
2012-04-20  5:16                         ` [PATCH v8 resend 3/6] Extcon: support notification based on the state changes MyungJoo Ham
2012-04-20  5:16                         ` [PATCH v8 resend 4/6] Extcon: support multiple states at a device MyungJoo Ham
2012-04-20  5:16                         ` [PATCH v8 resend 5/6] Extcon: support mutually exclusive relation between cables MyungJoo Ham
2012-04-20  5:16                         ` [PATCH v8 resend 6/6] Documentation/extcon: porting guide for Android kernel switch driver MyungJoo Ham
2012-04-20 16:25                           ` Greg KH
2012-04-20 17:05                             ` Mark Brown
2012-04-20 17:15                               ` Greg KH
2012-04-20 21:59                                 ` Mark Brown
2012-04-20 16:27                         ` [PATCH v8 resend 0/6] Introduce External Connector Class (extcon) Greg KH
2012-04-23 11:18                           ` MyungJoo Ham
2012-04-23 11:19                             ` [PATCH] Remove "switch" class in drivers/staging/android/switch MyungJoo Ham
2012-04-23 20:25                               ` Greg KH
2012-04-19  2:41       ` [PATCH v8 2/6] Extcon: support generic GPIO extcon driver MyungJoo Ham
2012-04-19 11:40         ` Mark Brown
2012-04-19  2:41       ` [PATCH v8 3/6] Extcon: support notification based on the state changes MyungJoo Ham
2012-04-19  2:41       ` [PATCH v8 4/6] Extcon: support multiple states at a device MyungJoo Ham
2012-04-19  2:41       ` [PATCH v8 5/6] Extcon: support mutually exclusive relation between cables MyungJoo Ham
2012-04-19  2:41       ` [PATCH v8 6/6] Documentation/extcon: porting guide for Android kernel switch driver MyungJoo Ham
2012-03-23  8:52 ` [PATCH v7 2/6] Extcon: support generic GPIO extcon driver MyungJoo Ham
2012-03-23  8:53 ` [PATCH v7 3/6] Extcon: support notification based on the state changes MyungJoo Ham
2012-03-23  8:53 ` [PATCH v7 4/6] Extcon: support multiple states at a device MyungJoo Ham
2012-03-23  8:53 ` [PATCH v7 5/6] Extcon: support mutually exclusive relation between cables MyungJoo Ham
2012-03-23  8:53 ` [PATCH v7 6/6] Documentation/extcon: porting guide for Android kernel switch driver MyungJoo Ham
2012-03-23  8:53 ` [RFC PATCH] Remove "switch" class in drivers/staging/android/switch MyungJoo Ham
2012-03-28  9:39 ` [PATCH v7 0/6] Introduce External Connector Class (extcon) MyungJoo Ham
2012-03-28 14:44   ` Greg KH
2012-03-28 15:24     ` Arnd Bergmann
2012-03-28 15:28       ` Greg KH
2012-03-29  4:20         ` Kyungmin Park

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=1334898987-7800-3-git-send-email-myungjoo.ham@samsung.com \
    --to=myungjoo.ham@samsung.com \
    --cc=arnd@arndb.de \
    --cc=arve@android.com \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=cw00.choi@samsung.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=john.stultz@linaro.org \
    --cc=kyungmin.park@samsung.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=morten.christiansen@stericsson.com \
    --cc=myungjoo.ham@gmail.com \
    /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.