diff options
Diffstat (limited to 'target/linux/ar71xx/files/drivers/gpio')
-rw-r--r-- | target/linux/ar71xx/files/drivers/gpio/gpio-latch.c | 219 | ||||
-rw-r--r-- | target/linux/ar71xx/files/drivers/gpio/gpio-nxp-74hc153.c | 247 |
2 files changed, 0 insertions, 466 deletions
diff --git a/target/linux/ar71xx/files/drivers/gpio/gpio-latch.c b/target/linux/ar71xx/files/drivers/gpio/gpio-latch.c deleted file mode 100644 index 1efa1a1..0000000 --- a/target/linux/ar71xx/files/drivers/gpio/gpio-latch.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * GPIO latch driver - * - * Copyright (C) 2014 Gabor Juhos <juhosg@openwrt.org> - * - * 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. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/types.h> -#include <linux/gpio.h> -#include <linux/slab.h> -#include <linux/platform_device.h> - -#include <linux/platform_data/gpio-latch.h> - -struct gpio_latch_chip { - struct gpio_chip gc; - - struct mutex mutex; - struct mutex latch_mutex; - bool latch_enabled; - int le_gpio; - bool le_active_low; - int *gpios; -}; - -static inline struct gpio_latch_chip *to_gpio_latch_chip(struct gpio_chip *gc) -{ - return container_of(gc, struct gpio_latch_chip, gc); -} - -static void gpio_latch_lock(struct gpio_latch_chip *glc, bool enable) -{ - mutex_lock(&glc->mutex); - - if (enable) - glc->latch_enabled = true; - - if (glc->latch_enabled) - mutex_lock(&glc->latch_mutex); -} - -static void gpio_latch_unlock(struct gpio_latch_chip *glc, bool disable) -{ - if (glc->latch_enabled) - mutex_unlock(&glc->latch_mutex); - - if (disable) - glc->latch_enabled = true; - - mutex_unlock(&glc->mutex); -} - -static int -gpio_latch_get(struct gpio_chip *gc, unsigned offset) -{ - struct gpio_latch_chip *glc = to_gpio_latch_chip(gc); - int ret; - - gpio_latch_lock(glc, false); - ret = gpio_get_value(glc->gpios[offset]); - gpio_latch_unlock(glc, false); - - return ret; -} - -static void -gpio_latch_set(struct gpio_chip *gc, unsigned offset, int value) -{ - struct gpio_latch_chip *glc = to_gpio_latch_chip(gc); - bool enable_latch = false; - bool disable_latch = false; - int gpio; - - gpio = glc->gpios[offset]; - - if (gpio == glc->le_gpio) { - enable_latch = value ^ glc->le_active_low; - disable_latch = !enable_latch; - } - - gpio_latch_lock(glc, enable_latch); - gpio_set_value(gpio, value); - gpio_latch_unlock(glc, disable_latch); -} - -static int -gpio_latch_direction_input(struct gpio_chip *gc, unsigned offset) -{ - struct gpio_latch_chip *glc = to_gpio_latch_chip(gc); - int ret; - - gpio_latch_lock(glc, false); - ret = gpio_direction_input(glc->gpios[offset]); - gpio_latch_unlock(glc, false); - - return ret; -} - -static int -gpio_latch_direction_output(struct gpio_chip *gc, unsigned offset, int value) -{ - struct gpio_latch_chip *glc = to_gpio_latch_chip(gc); - bool enable_latch = false; - bool disable_latch = false; - int gpio; - int ret; - - gpio = glc->gpios[offset]; - - if (gpio == glc->le_gpio) { - enable_latch = value ^ glc->le_active_low; - disable_latch = !enable_latch; - } - - gpio_latch_lock(glc, enable_latch); - ret = gpio_direction_output(gpio, value); - gpio_latch_unlock(glc, disable_latch); - - return ret; -} - -static int gpio_latch_probe(struct platform_device *pdev) -{ - struct gpio_latch_chip *glc; - struct gpio_latch_platform_data *pdata; - struct gpio_chip *gc; - int size; - int ret; - int i; - - pdata = dev_get_platdata(&pdev->dev); - if (!pdata) - return -EINVAL; - - if (pdata->le_gpio_index >= pdata->num_gpios || - !pdata->num_gpios || - !pdata->gpios) - return -EINVAL; - - for (i = 0; i < pdata->num_gpios; i++) { - int gpio = pdata->gpios[i]; - - ret = devm_gpio_request(&pdev->dev, gpio, - GPIO_LATCH_DRIVER_NAME); - if (ret) - return ret; - } - - glc = devm_kzalloc(&pdev->dev, sizeof(*glc), GFP_KERNEL); - if (!glc) - return -ENOMEM; - - mutex_init(&glc->mutex); - mutex_init(&glc->latch_mutex); - - size = pdata->num_gpios * sizeof(glc->gpios[0]); - glc->gpios = devm_kzalloc(&pdev->dev, size , GFP_KERNEL); - if (!glc->gpios) - return -ENOMEM; - - memcpy(glc->gpios, pdata->gpios, size); - - glc->le_gpio = glc->gpios[pdata->le_gpio_index]; - glc->le_active_low = pdata->le_active_low; - - gc = &glc->gc; - - gc->label = GPIO_LATCH_DRIVER_NAME; - gc->base = pdata->base; - gc->can_sleep = true; - gc->ngpio = pdata->num_gpios; - gc->get = gpio_latch_get; - gc->set = gpio_latch_set; - gc->direction_input = gpio_latch_direction_input, - gc->direction_output = gpio_latch_direction_output; - - platform_set_drvdata(pdev, glc); - - ret = gpiochip_add(&glc->gc); - if (ret) - return ret; - - return 0; -} - -static int gpio_latch_remove(struct platform_device *pdev) -{ - struct gpio_latch_chip *glc = platform_get_drvdata(pdev); - - return gpiochip_remove(&glc->gc);; -} - - -static struct platform_driver gpio_latch_driver = { - .probe = gpio_latch_probe, - .remove = gpio_latch_remove, - .driver = { - .name = GPIO_LATCH_DRIVER_NAME, - .owner = THIS_MODULE, - }, -}; - -static int __init gpio_latch_init(void) -{ - return platform_driver_register(&gpio_latch_driver); -} - -postcore_initcall(gpio_latch_init); - -MODULE_DESCRIPTION("GPIO latch driver"); -MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" GPIO_LATCH_DRIVER_NAME); diff --git a/target/linux/ar71xx/files/drivers/gpio/gpio-nxp-74hc153.c b/target/linux/ar71xx/files/drivers/gpio/gpio-nxp-74hc153.c deleted file mode 100644 index 5bdeb3d..0000000 --- a/target/linux/ar71xx/files/drivers/gpio/gpio-nxp-74hc153.c +++ /dev/null @@ -1,247 +0,0 @@ -/* - * NXP 74HC153 - Dual 4-input multiplexer GPIO driver - * - * Copyright (C) 2010 Gabor Juhos <juhosg@openwrt.org> - * - * 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. - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/gpio.h> -#include <linux/slab.h> -#include <linux/platform_device.h> -#include <linux/nxp_74hc153.h> - -#define NXP_74HC153_NUM_GPIOS 8 -#define NXP_74HC153_S0_MASK 0x1 -#define NXP_74HC153_S1_MASK 0x2 -#define NXP_74HC153_BANK_MASK 0x4 - -struct nxp_74hc153_chip { - struct device *parent; - struct gpio_chip gpio_chip; - struct mutex lock; -}; - -static struct nxp_74hc153_chip *gpio_to_nxp(struct gpio_chip *gc) -{ - return container_of(gc, struct nxp_74hc153_chip, gpio_chip); -} - -static int nxp_74hc153_direction_input(struct gpio_chip *gc, unsigned offset) -{ - return 0; -} - -static int nxp_74hc153_direction_output(struct gpio_chip *gc, - unsigned offset, int val) -{ - return -EINVAL; -} - -static int nxp_74hc153_get_value(struct gpio_chip *gc, unsigned offset) -{ - struct nxp_74hc153_chip *nxp; - struct nxp_74hc153_platform_data *pdata; - unsigned s0; - unsigned s1; - unsigned pin; - int ret; - - nxp = gpio_to_nxp(gc); - pdata = nxp->parent->platform_data; - - s0 = !!(offset & NXP_74HC153_S0_MASK); - s1 = !!(offset & NXP_74HC153_S1_MASK); - pin = (offset & NXP_74HC153_BANK_MASK) ? pdata->gpio_pin_2y - : pdata->gpio_pin_1y; - - mutex_lock(&nxp->lock); - gpio_set_value(pdata->gpio_pin_s0, s0); - gpio_set_value(pdata->gpio_pin_s1, s1); - ret = gpio_get_value(pin); - mutex_unlock(&nxp->lock); - - return ret; -} - -static void nxp_74hc153_set_value(struct gpio_chip *gc, - unsigned offset, int val) -{ - /* not supported */ -} - -static int nxp_74hc153_probe(struct platform_device *pdev) -{ - struct nxp_74hc153_platform_data *pdata; - struct nxp_74hc153_chip *nxp; - struct gpio_chip *gc; - int err; - - pdata = pdev->dev.platform_data; - if (pdata == NULL) { - dev_dbg(&pdev->dev, "no platform data specified\n"); - return -EINVAL; - } - - nxp = kzalloc(sizeof(struct nxp_74hc153_chip), GFP_KERNEL); - if (nxp == NULL) { - dev_err(&pdev->dev, "no memory for private data\n"); - return -ENOMEM; - } - - err = gpio_request(pdata->gpio_pin_s0, dev_name(&pdev->dev)); - if (err) { - dev_err(&pdev->dev, "unable to claim gpio %u, err=%d\n", - pdata->gpio_pin_s0, err); - goto err_free_nxp; - } - - err = gpio_request(pdata->gpio_pin_s1, dev_name(&pdev->dev)); - if (err) { - dev_err(&pdev->dev, "unable to claim gpio %u, err=%d\n", - pdata->gpio_pin_s1, err); - goto err_free_s0; - } - - err = gpio_request(pdata->gpio_pin_1y, dev_name(&pdev->dev)); - if (err) { - dev_err(&pdev->dev, "unable to claim gpio %u, err=%d\n", - pdata->gpio_pin_1y, err); - goto err_free_s1; - } - - err = gpio_request(pdata->gpio_pin_2y, dev_name(&pdev->dev)); - if (err) { - dev_err(&pdev->dev, "unable to claim gpio %u, err=%d\n", - pdata->gpio_pin_2y, err); - goto err_free_1y; - } - - err = gpio_direction_output(pdata->gpio_pin_s0, 0); - if (err) { - dev_err(&pdev->dev, - "unable to set direction of gpio %u, err=%d\n", - pdata->gpio_pin_s0, err); - goto err_free_2y; - } - - err = gpio_direction_output(pdata->gpio_pin_s1, 0); - if (err) { - dev_err(&pdev->dev, - "unable to set direction of gpio %u, err=%d\n", - pdata->gpio_pin_s1, err); - goto err_free_2y; - } - - err = gpio_direction_input(pdata->gpio_pin_1y); - if (err) { - dev_err(&pdev->dev, - "unable to set direction of gpio %u, err=%d\n", - pdata->gpio_pin_1y, err); - goto err_free_2y; - } - - err = gpio_direction_input(pdata->gpio_pin_2y); - if (err) { - dev_err(&pdev->dev, - "unable to set direction of gpio %u, err=%d\n", - pdata->gpio_pin_2y, err); - goto err_free_2y; - } - - nxp->parent = &pdev->dev; - mutex_init(&nxp->lock); - - gc = &nxp->gpio_chip; - - gc->direction_input = nxp_74hc153_direction_input; - gc->direction_output = nxp_74hc153_direction_output; - gc->get = nxp_74hc153_get_value; - gc->set = nxp_74hc153_set_value; - gc->can_sleep = 1; - - gc->base = pdata->gpio_base; - gc->ngpio = NXP_74HC153_NUM_GPIOS; - gc->label = dev_name(nxp->parent); - gc->dev = nxp->parent; - gc->owner = THIS_MODULE; - - err = gpiochip_add(&nxp->gpio_chip); - if (err) { - dev_err(&pdev->dev, "unable to add gpio chip, err=%d\n", err); - goto err_free_2y; - } - - platform_set_drvdata(pdev, nxp); - return 0; - -err_free_2y: - gpio_free(pdata->gpio_pin_2y); -err_free_1y: - gpio_free(pdata->gpio_pin_1y); -err_free_s1: - gpio_free(pdata->gpio_pin_s1); -err_free_s0: - gpio_free(pdata->gpio_pin_s0); -err_free_nxp: - kfree(nxp); - return err; -} - -static int nxp_74hc153_remove(struct platform_device *pdev) -{ - struct nxp_74hc153_chip *nxp = platform_get_drvdata(pdev); - struct nxp_74hc153_platform_data *pdata = pdev->dev.platform_data; - - if (nxp) { - int err; - - err = gpiochip_remove(&nxp->gpio_chip); - if (err) { - dev_err(&pdev->dev, - "unable to remove gpio chip, err=%d\n", - err); - return err; - } - - gpio_free(pdata->gpio_pin_2y); - gpio_free(pdata->gpio_pin_1y); - gpio_free(pdata->gpio_pin_s1); - gpio_free(pdata->gpio_pin_s0); - - kfree(nxp); - platform_set_drvdata(pdev, NULL); - } - - return 0; -} - -static struct platform_driver nxp_74hc153_driver = { - .probe = nxp_74hc153_probe, - .remove = nxp_74hc153_remove, - .driver = { - .name = NXP_74HC153_DRIVER_NAME, - .owner = THIS_MODULE, - }, -}; - -static int __init nxp_74hc153_init(void) -{ - return platform_driver_register(&nxp_74hc153_driver); -} -subsys_initcall(nxp_74hc153_init); - -static void __exit nxp_74hc153_exit(void) -{ - platform_driver_unregister(&nxp_74hc153_driver); -} -module_exit(nxp_74hc153_exit); - -MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); -MODULE_DESCRIPTION("GPIO expander driver for NXP 74HC153"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" NXP_74HC153_DRIVER_NAME); |