Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.17 154 lines 3.8 kB view raw
1/* 2 * MOXA ART SoCs GPIO driver. 3 * 4 * Copyright (C) 2013 Jonas Jensen 5 * 6 * Jonas Jensen <jonas.jensen@gmail.com> 7 * 8 * This file is licensed under the terms of the GNU General Public 9 * License version 2. This program is licensed "as is" without any 10 * warranty of any kind, whether express or implied. 11 */ 12 13#include <linux/err.h> 14#include <linux/init.h> 15#include <linux/irq.h> 16#include <linux/io.h> 17#include <linux/gpio.h> 18#include <linux/platform_device.h> 19#include <linux/module.h> 20#include <linux/of_address.h> 21#include <linux/of_gpio.h> 22#include <linux/pinctrl/consumer.h> 23#include <linux/delay.h> 24#include <linux/timer.h> 25#include <linux/bitops.h> 26 27#define GPIO_DATA_OUT 0x00 28#define GPIO_DATA_IN 0x04 29#define GPIO_PIN_DIRECTION 0x08 30 31struct moxart_gpio_chip { 32 struct gpio_chip gpio; 33 void __iomem *base; 34}; 35 36static inline struct moxart_gpio_chip *to_moxart_gpio(struct gpio_chip *chip) 37{ 38 return container_of(chip, struct moxart_gpio_chip, gpio); 39} 40 41static int moxart_gpio_request(struct gpio_chip *chip, unsigned offset) 42{ 43 return pinctrl_request_gpio(offset); 44} 45 46static void moxart_gpio_free(struct gpio_chip *chip, unsigned offset) 47{ 48 pinctrl_free_gpio(offset); 49} 50 51static void moxart_gpio_set(struct gpio_chip *chip, unsigned offset, int value) 52{ 53 struct moxart_gpio_chip *gc = to_moxart_gpio(chip); 54 void __iomem *ioaddr = gc->base + GPIO_DATA_OUT; 55 u32 reg = readl(ioaddr); 56 57 if (value) 58 reg = reg | BIT(offset); 59 else 60 reg = reg & ~BIT(offset); 61 62 writel(reg, ioaddr); 63} 64 65static int moxart_gpio_get(struct gpio_chip *chip, unsigned offset) 66{ 67 struct moxart_gpio_chip *gc = to_moxart_gpio(chip); 68 u32 ret = readl(gc->base + GPIO_PIN_DIRECTION); 69 70 if (ret & BIT(offset)) 71 return !!(readl(gc->base + GPIO_DATA_OUT) & BIT(offset)); 72 else 73 return !!(readl(gc->base + GPIO_DATA_IN) & BIT(offset)); 74} 75 76static int moxart_gpio_direction_input(struct gpio_chip *chip, unsigned offset) 77{ 78 struct moxart_gpio_chip *gc = to_moxart_gpio(chip); 79 void __iomem *ioaddr = gc->base + GPIO_PIN_DIRECTION; 80 81 writel(readl(ioaddr) & ~BIT(offset), ioaddr); 82 return 0; 83} 84 85static int moxart_gpio_direction_output(struct gpio_chip *chip, 86 unsigned offset, int value) 87{ 88 struct moxart_gpio_chip *gc = to_moxart_gpio(chip); 89 void __iomem *ioaddr = gc->base + GPIO_PIN_DIRECTION; 90 91 moxart_gpio_set(chip, offset, value); 92 writel(readl(ioaddr) | BIT(offset), ioaddr); 93 return 0; 94} 95 96static struct gpio_chip moxart_template_chip = { 97 .label = "moxart-gpio", 98 .request = moxart_gpio_request, 99 .free = moxart_gpio_free, 100 .direction_input = moxart_gpio_direction_input, 101 .direction_output = moxart_gpio_direction_output, 102 .set = moxart_gpio_set, 103 .get = moxart_gpio_get, 104 .ngpio = 32, 105 .owner = THIS_MODULE, 106}; 107 108static int moxart_gpio_probe(struct platform_device *pdev) 109{ 110 struct device *dev = &pdev->dev; 111 struct resource *res; 112 struct moxart_gpio_chip *mgc; 113 int ret; 114 115 mgc = devm_kzalloc(dev, sizeof(*mgc), GFP_KERNEL); 116 if (!mgc) 117 return -ENOMEM; 118 mgc->gpio = moxart_template_chip; 119 120 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 121 mgc->base = devm_ioremap_resource(dev, res); 122 if (IS_ERR(mgc->base)) 123 return PTR_ERR(mgc->base); 124 125 mgc->gpio.dev = dev; 126 127 ret = gpiochip_add(&mgc->gpio); 128 if (ret) { 129 dev_err(dev, "%s: gpiochip_add failed\n", 130 dev->of_node->full_name); 131 return ret; 132 } 133 134 return 0; 135} 136 137static const struct of_device_id moxart_gpio_match[] = { 138 { .compatible = "moxa,moxart-gpio" }, 139 { } 140}; 141 142static struct platform_driver moxart_gpio_driver = { 143 .driver = { 144 .name = "moxart-gpio", 145 .owner = THIS_MODULE, 146 .of_match_table = moxart_gpio_match, 147 }, 148 .probe = moxart_gpio_probe, 149}; 150module_platform_driver(moxart_gpio_driver); 151 152MODULE_DESCRIPTION("MOXART GPIO chip driver"); 153MODULE_LICENSE("GPL"); 154MODULE_AUTHOR("Jonas Jensen <jonas.jensen@gmail.com>");