linux-gpio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4] gpio: Add GPIO support for the ACCES 104-IDIO-16
@ 2015-10-07  2:40 ` William Breathitt Gray
  2015-10-07  3:14   ` [PATCH] gpio: fix platform_no_drv_owner.cocci warnings kbuild test robot
  0 siblings, 1 reply; 7+ messages in thread
From: William Breathitt Gray @ 2015-10-07  2:40 UTC (permalink / raw)
  To: linus.walleij, gnurou; +Cc: linux-kernel, linux-gpio

The ACCES 104-IDIO-16 family of PC/104 utility boards feature 16
optically isolated inputs and 16 optically isolated FET solid state
outputs. This driver provides GPIO support for these 32 channels of
digital I/O. Change-of-State detection interrupts are not supported.

GPIO 0-15 correspond to digital outputs 0-15, while GPIO 16-31
correspond to digital inputs 0-15. The base port address for the device
may be set via the a_104_idio_16_base module parameter.

Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com>
---
Changes in v4:
  - Replace compile-time constant CONFIG_104_IDIO_16_BASE with module
    paramater a_104_idio_16_base
  - Return -ENODEV when gpio_get is called on outputs
  - Replace global constant A_104_IDIO_16_EXTENT with struct
    a_104_idio_16_gpio member extent
  - Utilize platform API to reduce dependence on global data

 drivers/gpio/Kconfig            |  10 ++
 drivers/gpio/Makefile           |   1 +
 drivers/gpio/gpio-104-idio-16.c | 196 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 207 insertions(+)
 create mode 100644 drivers/gpio/gpio-104-idio-16.c

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 8949b3f..dc843e0 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -684,6 +684,16 @@ config GPIO_SX150X
 
 endmenu
 
+menu "ISA GPIO drivers"
+
+config GPIO_104_IDIO_16
+	tristate "ACCES 104-IDIO-16 GPIO support"
+	depends on X86
+	help
+	  Enables GPIO support for the ACCES 104-IDIO-16 family.
+
+endmenu
+
 menu "MFD GPIO expanders"
 
 config GPIO_ADP5520
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index f79a7c4..6f2fea5 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_GPIO_ACPI)		+= gpiolib-acpi.o
 # Device drivers. Generally keep list sorted alphabetically
 obj-$(CONFIG_GPIO_GENERIC)	+= gpio-generic.o
 
+obj-$(CONFIG_GPIO_104_IDIO_16)	+= gpio-104-idio-16.o
 obj-$(CONFIG_GPIO_74X164)	+= gpio-74x164.o
 obj-$(CONFIG_GPIO_74XX_MMIO)	+= gpio-74xx-mmio.o
 obj-$(CONFIG_GPIO_ADNP)		+= gpio-adnp.o
diff --git a/drivers/gpio/gpio-104-idio-16.c b/drivers/gpio/gpio-104-idio-16.c
new file mode 100644
index 0000000..45a2f1a
--- /dev/null
+++ b/drivers/gpio/gpio-104-idio-16.c
@@ -0,0 +1,196 @@
+/*
+ * GPIO driver for the ACCES 104-IDIO-16 family
+ * Copyright (C) 2015 William Breathitt Gray
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation.
+ *
+ * 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/device.h>
+#include <linux/err.h>
+#include <linux/errno.h>
+#include <linux/gpio/driver.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+
+static unsigned a_104_idio_16_base;
+module_param(a_104_idio_16_base, uint, 0);
+MODULE_PARM_DESC(a_104_idio_16_base, "ACCES 104-IDIO-16 base address");
+
+/**
+ * struct a_104_idio_16_gpio - GPIO device private data structure
+ * @chip:	instance of the gpio_chip
+ * @lock:	synchronization lock to prevent gpio_set race conditions
+ * @base:	base port address of the GPIO device
+ * @extent:	extent of port address region of the GPIO device
+ * @out_state:	output bits state
+ */
+struct a_104_idio_16_gpio {
+	struct gpio_chip chip;
+	spinlock_t lock;
+	unsigned base;
+	unsigned extent;
+	unsigned out_state;
+};
+
+static int a_104_idio_16_gpio_direction_input(struct gpio_chip *chip,
+	unsigned offset)
+{
+	return 0;
+}
+
+static int a_104_idio_16_gpio_direction_output(struct gpio_chip *chip,
+	unsigned offset, int value)
+{
+	chip->set(chip, offset, value);
+	return 0;
+}
+
+static struct a_104_idio_16_gpio *to_a104idio16gp(struct gpio_chip *gc)
+{
+	return container_of(gc, struct a_104_idio_16_gpio, chip);
+}
+
+static int a_104_idio_16_gpio_get(struct gpio_chip *chip, unsigned offset)
+{
+	struct a_104_idio_16_gpio *const a104idio16gp = to_a104idio16gp(chip);
+	const unsigned BIT_MASK = 1U << (offset-16);
+
+	if (offset < 16)
+		return -ENODEV;
+
+	if (offset < 24)
+		return !!(inb(a104idio16gp->base + 1) & BIT_MASK);
+
+	return !!(inb(a104idio16gp->base + 5) & (BIT_MASK>>8));
+}
+
+static void a_104_idio_16_gpio_set(struct gpio_chip *chip, unsigned offset,
+	int value)
+{
+	struct a_104_idio_16_gpio *const a104idio16gp = to_a104idio16gp(chip);
+	const unsigned BIT_MASK = 1U << offset;
+	unsigned long flags;
+
+	if (offset > 15)
+		return;
+
+	spin_lock_irqsave(&a104idio16gp->lock, flags);
+
+	if (value)
+		a104idio16gp->out_state |= BIT_MASK;
+	else
+		a104idio16gp->out_state &= ~BIT_MASK;
+
+	if (offset > 7)
+		outb(~a104idio16gp->out_state >> 8, a104idio16gp->base + 4);
+	else
+		outb(~a104idio16gp->out_state, a104idio16gp->base);
+
+	spin_unlock_irqrestore(&a104idio16gp->lock, flags);
+}
+
+static int a_104_idio_16_probe(struct platform_device *pdev)
+{
+	struct a_104_idio_16_gpio *const a104idio16gp = pdev->dev.platform_data;
+	struct device *dev = &pdev->dev;
+	int err;
+
+	const unsigned BASE = a104idio16gp->base;
+	const unsigned EXTENT = a104idio16gp->extent;
+
+	if (!request_region(BASE, EXTENT, "104-idio-16")) {
+		dev_err(dev, "Unable to lock 104-idio-16 port addresses (0x%X-0x%X)\n",
+			BASE, BASE + EXTENT);
+		err = -EBUSY;
+		goto out_lock_a_104_idio_16_port;
+	}
+
+	spin_lock_init(&a104idio16gp->lock);
+
+	dev_info(dev, "104-IDIO-16 GPIO detected\n");
+	err = gpiochip_add(&a104idio16gp->chip);
+	if (err) {
+		dev_err(dev, "GPIO registering failed (%d)\n", err);
+		goto out_gpio_register;
+	}
+
+	return 0;
+
+out_gpio_register:
+	release_region(BASE, EXTENT);
+out_lock_a_104_idio_16_port:
+	return err;
+}
+
+static int a_104_idio_16_remove(struct platform_device *pdev)
+{
+	struct a_104_idio_16_gpio *const a104idio16gp = pdev->dev.platform_data;
+
+	gpiochip_remove(&a104idio16gp->chip);
+	release_region(a104idio16gp->base, a104idio16gp->extent);
+
+	return 0;
+}
+
+static struct platform_device *a_104_idio_16_device;
+
+static struct platform_driver a_104_idio_16_driver = {
+	.driver = {
+		.name = "104-idio-16",
+		.owner = THIS_MODULE
+	},
+	.remove = a_104_idio_16_remove
+};
+
+static void __exit a_104_idio_16_exit(void)
+{
+	dev_info(&a_104_idio_16_device->dev, "Exiting module\n");
+
+	platform_device_unregister(a_104_idio_16_device);
+	platform_driver_unregister(&a_104_idio_16_driver);
+}
+
+static int __init a_104_idio_16_init(void)
+{
+	struct a_104_idio_16_gpio a104idio16gp = {
+		.chip = {
+			.label = "104-IDIO-16 GPIO",
+			.owner = THIS_MODULE,
+			.base = -1,
+			.ngpio = 32,
+			.direction_input = a_104_idio_16_gpio_direction_input,
+			.direction_output = a_104_idio_16_gpio_direction_output,
+			.get = a_104_idio_16_gpio_get,
+			.set = a_104_idio_16_gpio_set
+		},
+		.base = a_104_idio_16_base,
+		.extent = 8
+	};
+
+	dev_info(&a_104_idio_16_device->dev, "Initializing module\n");
+
+	a_104_idio_16_device = platform_device_register_data(NULL,
+		"104-idio-16", -1, &a104idio16gp, sizeof(a104idio16gp));
+	if (IS_ERR(a_104_idio_16_device))
+		return PTR_ERR(a_104_idio_16_device);
+
+	return platform_driver_probe(&a_104_idio_16_driver, a_104_idio_16_probe);
+}
+
+module_init(a_104_idio_16_init);
+module_exit(a_104_idio_16_exit);
+
+MODULE_AUTHOR("William Breathitt Gray <vilhelm.gray@gmail.com>");
+MODULE_DESCRIPTION("ACCES 104-IDIO-16 GPIO driver");
+MODULE_LICENSE("GPL");
-- 
2.4.9


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

* [PATCH] gpio: fix platform_no_drv_owner.cocci warnings
  2015-10-07  2:40 ` William Breathitt Gray
@ 2015-10-07  3:14   ` kbuild test robot
  2015-10-16 14:47     ` Linus Walleij
  0 siblings, 1 reply; 7+ messages in thread
From: kbuild test robot @ 2015-10-07  3:14 UTC (permalink / raw)
  To: William Breathitt Gray
  Cc: kbuild-all, linus.walleij, gnurou, linux-kernel, linux-gpio

drivers/gpio/gpio-104-idio-16.c:151:3-8: No need to set .owner here. The core will do it.

 Remove .owner field if calls are used which set it automatically

Generated by: scripts/coccinelle/api/platform_no_drv_owner.cocci

CC: William Breathitt Gray <vilhelm.gray@gmail.com>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---

 gpio-104-idio-16.c |    1 -
 1 file changed, 1 deletion(-)

--- a/drivers/gpio/gpio-104-idio-16.c
+++ b/drivers/gpio/gpio-104-idio-16.c
@@ -148,7 +148,6 @@ static struct platform_device *a_104_idi
 static struct platform_driver a_104_idio_16_driver = {
 	.driver = {
 		.name = "104-idio-16",
-		.owner = THIS_MODULE
 	},
 	.remove = a_104_idio_16_remove
 };

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

* Re: [PATCH v4] gpio: Add GPIO support for the ACCES 104-IDIO-16
  2015-10-07  2:40 ` William Breathitt Gray
@ 2015-10-07  3:14 kbuild test robot
  2015-10-07  2:40 ` William Breathitt Gray
  0 siblings, 1 reply; 7+ messages in thread
From: kbuild test robot @ 2015-10-07  3:14 UTC (permalink / raw)
  To: William Breathitt Gray
  Cc: kbuild-all, linus.walleij, gnurou, linux-kernel, linux-gpio

Hi William,

[auto build test WARNING on v4.3-rc4 -- if it's inappropriate base, please ignore]


coccinelle warnings: (new ones prefixed by >>)

>> drivers/gpio/gpio-104-idio-16.c:151:3-8: No need to set .owner here. The core will do it.

Please review and possibly fold the followup patch.

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

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

* [PATCH] gpio: fix platform_no_drv_owner.cocci warnings
  2015-10-11 16:41 ` Nicolas Saenz Julienne
@ 2015-10-11 17:12   ` kbuild test robot
  0 siblings, 0 replies; 7+ messages in thread
From: kbuild test robot @ 2015-10-11 17:12 UTC (permalink / raw)
  To: Nicolas Saenz Julienne
  Cc: kbuild-all, linus.walleij, gnurou, linux-gpio, linux-kernel

drivers/gpio/gpio-tps65218.c:153:3-8: No need to set .owner here. The core will do it.

 Remove .owner field if calls are used which set it automatically

Generated by: scripts/coccinelle/api/platform_no_drv_owner.cocci

CC: Nicolas Saenz Julienne <nicolassaenzj@gmail.com>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---

 gpio-tps65218.c |    1 -
 1 file changed, 1 deletion(-)

--- a/drivers/gpio/gpio-tps65218.c
+++ b/drivers/gpio/gpio-tps65218.c
@@ -150,7 +150,6 @@ MODULE_DEVICE_TABLE(of, tps65218_dt_matc
 static struct platform_driver tps65218_gpio_driver = {
 	.driver = {
 		.name = "tps65218-gpio",
-		.owner = THIS_MODULE,
 		.of_match_table = of_match_ptr(tps65218_dt_match)
 	},
 	.probe = tps65218_gpio_probe,

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

* Re: [PATCH] gpio: fix platform_no_drv_owner.cocci warnings
  2015-10-07  3:14   ` [PATCH] gpio: fix platform_no_drv_owner.cocci warnings kbuild test robot
@ 2015-10-16 14:47     ` Linus Walleij
  2015-10-16 15:47       ` [kbuild-all] " Fengguang Wu
  0 siblings, 1 reply; 7+ messages in thread
From: Linus Walleij @ 2015-10-16 14:47 UTC (permalink / raw)
  To: kbuild test robot
  Cc: William Breathitt Gray, kbuild-all@01.org, Alexandre Courbot,
	linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org

On Wed, Oct 7, 2015 at 5:14 AM, kbuild test robot <lkp@intel.com> wrote:

> drivers/gpio/gpio-104-idio-16.c:151:3-8: No need to set .owner here. The core will do it.
>
>  Remove .owner field if calls are used which set it automatically
>
> Generated by: scripts/coccinelle/api/platform_no_drv_owner.cocci
>
> CC: William Breathitt Gray <vilhelm.gray@gmail.com>
> Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>

This is confusing, I mix up the mails coming from my pushed git branches
with this new stuff that is obviously checking patches I haven't even applied.
It's better if these kbuild fixes are sent as Re: to the mail ID of the
patch so it appears in the same thread as the offending patch on the
mailing list.

Yours,
Linus Walleij

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

* Re: [kbuild-all] [PATCH] gpio: fix platform_no_drv_owner.cocci warnings
  2015-10-16 14:47     ` Linus Walleij
@ 2015-10-16 15:47       ` Fengguang Wu
  2015-10-16 15:53         ` Fengguang Wu
  0 siblings, 1 reply; 7+ messages in thread
From: Fengguang Wu @ 2015-10-16 15:47 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Alexandre Courbot, linux-gpio@vger.kernel.org,
	William Breathitt Gray, linux-kernel@vger.kernel.org,
	kbuild-all@01.org

On Fri, Oct 16, 2015 at 04:47:23PM +0200, Linus Walleij wrote:
> On Wed, Oct 7, 2015 at 5:14 AM, kbuild test robot <lkp@intel.com> wrote:
> 
> > drivers/gpio/gpio-104-idio-16.c:151:3-8: No need to set .owner here. The core will do it.
> >
> >  Remove .owner field if calls are used which set it automatically
> >
> > Generated by: scripts/coccinelle/api/platform_no_drv_owner.cocci
> >
> > CC: William Breathitt Gray <vilhelm.gray@gmail.com>
> > Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
> 
> This is confusing, I mix up the mails coming from my pushed git branches
> with this new stuff that is obviously checking patches I haven't even applied.
> It's better if these kbuild fixes are sent as Re: to the mail ID of the
> patch so it appears in the same thread as the offending patch on the
> mailing list.

Hi Linus, the patch email does not start with "Re:", however it does contain

        In-Reply-To: <1444997709-57293-2-git-send-email-ck.hu@mediatek.com>

So it should show up in the same thread as this email?

        [RFC 2/2] drm/bridge: Add I2C based driver for ps8640 bridge

Thanks,
Fengguang

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

* Re: [kbuild-all] [PATCH] gpio: fix platform_no_drv_owner.cocci warnings
  2015-10-16 15:47       ` [kbuild-all] " Fengguang Wu
@ 2015-10-16 15:53         ` Fengguang Wu
  0 siblings, 0 replies; 7+ messages in thread
From: Fengguang Wu @ 2015-10-16 15:53 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Alexandre Courbot, linux-gpio@vger.kernel.org,
	William Breathitt Gray, linux-kernel@vger.kernel.org,
	kbuild-all@01.org

On Fri, Oct 16, 2015 at 11:47:23PM +0800, Fengguang Wu wrote:
> On Fri, Oct 16, 2015 at 04:47:23PM +0200, Linus Walleij wrote:
> > On Wed, Oct 7, 2015 at 5:14 AM, kbuild test robot <lkp@intel.com> wrote:
> > 
> > > drivers/gpio/gpio-104-idio-16.c:151:3-8: No need to set .owner here. The core will do it.
> > >
> > >  Remove .owner field if calls are used which set it automatically
> > >
> > > Generated by: scripts/coccinelle/api/platform_no_drv_owner.cocci
> > >
> > > CC: William Breathitt Gray <vilhelm.gray@gmail.com>
> > > Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
> > 
> > This is confusing, I mix up the mails coming from my pushed git branches
> > with this new stuff that is obviously checking patches I haven't even applied.
> > It's better if these kbuild fixes are sent as Re: to the mail ID of the
> > patch so it appears in the same thread as the offending patch on the
> > mailing list.
> 
> Hi Linus, the patch email does not start with "Re:", however it does contain
> 
>         In-Reply-To: <1444997709-57293-2-git-send-email-ck.hu@mediatek.com>
> 
> So it should show up in the same thread as this email?
> 
>         [RFC 2/2] drm/bridge: Add I2C based driver for ps8640 bridge

Sorry it's not that email, but here is the mutt thread view in my mbox:

 Oct 06 William Breathi (7.8K:0) [PATCH v4] gpio: Add GPIO support for the ACCES 104-IDIO-16
 Oct 07 kbuild test rob (0.9K:0) |->[PATCH] gpio: fix platform_no_drv_owner.cocci warnings
 Oct 16 Fengguang Wu    (1.3K:0) | `->Re: [kbuild-all] [PATCH] gpio: fix platform_no_drv_owner.cocci warnings
 Oct 07 kbuild test rob (0.7K:0) `->Re: [PATCH v4] gpio: Add GPIO support for the ACCES 104-IDIO-16

Thanks,
Fengguang

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

end of thread, other threads:[~2015-10-16 15:53 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-10-07  3:14 [PATCH v4] gpio: Add GPIO support for the ACCES 104-IDIO-16 kbuild test robot
2015-10-07  2:40 ` William Breathitt Gray
2015-10-07  3:14   ` [PATCH] gpio: fix platform_no_drv_owner.cocci warnings kbuild test robot
2015-10-16 14:47     ` Linus Walleij
2015-10-16 15:47       ` [kbuild-all] " Fengguang Wu
2015-10-16 15:53         ` Fengguang Wu
  -- strict thread matches above, loose matches on Subject: below --
2015-10-11 17:12 [PATCH] gpio: add tps65218 gpio driver kbuild test robot
2015-10-11 16:41 ` Nicolas Saenz Julienne
2015-10-11 17:12   ` [PATCH] gpio: fix platform_no_drv_owner.cocci warnings kbuild test robot

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