Linux Audio

Check our new training course

Loading...
v3.15
 
  1/*
  2 * arch/arm/plat-iop/gpio.c
  3 * GPIO handling for Intel IOP3xx processors.
  4 *
  5 * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
  6 *
  7 * This program is free software; you can redistribute it and/or modify
  8 * it under the terms of the GNU General Public License as published by
  9 * the Free Software Foundation; either version 2 of the License, or (at
 10 * your option) any later version.
 11 */
 12
 13#include <linux/device.h>
 14#include <linux/init.h>
 15#include <linux/types.h>
 16#include <linux/errno.h>
 17#include <linux/gpio.h>
 18#include <linux/export.h>
 19#include <linux/platform_device.h>
 20#include <linux/bitops.h>
 21#include <linux/io.h>
 22
 23#define IOP3XX_N_GPIOS	8
 24
 25#define GPIO_IN			0
 26#define GPIO_OUT		1
 27#define GPIO_LOW		0
 28#define GPIO_HIGH		1
 29
 30/* Memory base offset */
 31static void __iomem *base;
 32
 33#define IOP3XX_GPIO_REG(reg)	(base + (reg))
 34#define IOP3XX_GPOE		IOP3XX_GPIO_REG(0x0000)
 35#define IOP3XX_GPID		IOP3XX_GPIO_REG(0x0004)
 36#define IOP3XX_GPOD		IOP3XX_GPIO_REG(0x0008)
 37
 38static void gpio_line_config(int line, int direction)
 39{
 40	unsigned long flags;
 41	u32 val;
 42
 43	local_irq_save(flags);
 44	val = readl(IOP3XX_GPOE);
 45	if (direction == GPIO_IN) {
 46		val |= BIT(line);
 47	} else if (direction == GPIO_OUT) {
 48		val &= ~BIT(line);
 49	}
 50	writel(val, IOP3XX_GPOE);
 51	local_irq_restore(flags);
 52}
 53
 54static int gpio_line_get(int line)
 55{
 56	return !!(readl(IOP3XX_GPID) & BIT(line));
 57}
 58
 59static void gpio_line_set(int line, int value)
 60{
 61	unsigned long flags;
 62	u32 val;
 63
 64	local_irq_save(flags);
 65	val = readl(IOP3XX_GPOD);
 66	if (value == GPIO_LOW) {
 67		val &= ~BIT(line);
 68	} else if (value == GPIO_HIGH) {
 69		val |= BIT(line);
 70	}
 71	writel(val, IOP3XX_GPOD);
 72	local_irq_restore(flags);
 73}
 74
 75static int iop3xx_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
 76{
 77	gpio_line_config(gpio, GPIO_IN);
 78	return 0;
 79}
 80
 81static int iop3xx_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int level)
 82{
 83	gpio_line_set(gpio, level);
 84	gpio_line_config(gpio, GPIO_OUT);
 85	return 0;
 86}
 87
 88static int iop3xx_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
 89{
 90	return gpio_line_get(gpio);
 91}
 92
 93static void iop3xx_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value)
 94{
 95	gpio_line_set(gpio, value);
 96}
 97
 98static struct gpio_chip iop3xx_chip = {
 99	.label			= "iop3xx",
100	.direction_input	= iop3xx_gpio_direction_input,
101	.get			= iop3xx_gpio_get_value,
102	.direction_output	= iop3xx_gpio_direction_output,
103	.set			= iop3xx_gpio_set_value,
104	.base			= 0,
105	.ngpio			= IOP3XX_N_GPIOS,
106};
107
108static int iop3xx_gpio_probe(struct platform_device *pdev)
109{
110	struct resource *res;
 
 
 
 
 
 
111
112	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
113	base = devm_ioremap_resource(&pdev->dev, res);
114	if (IS_ERR(base))
115		return PTR_ERR(base);
116
117	return gpiochip_add(&iop3xx_chip);
 
 
 
 
 
 
 
 
 
118}
119
120static struct platform_driver iop3xx_gpio_driver = {
121	.driver = {
122		.name = "gpio-iop",
123		.owner = THIS_MODULE,
124	},
125	.probe = iop3xx_gpio_probe,
126};
127
128static int __init iop3xx_gpio_init(void)
129{
130	return platform_driver_register(&iop3xx_gpio_driver);
131}
132arch_initcall(iop3xx_gpio_init);
v5.9
 1// SPDX-License-Identifier: GPL-2.0-or-later
 2/*
 3 * arch/arm/plat-iop/gpio.c
 4 * GPIO handling for Intel IOP3xx processors.
 5 *
 6 * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
 
 
 
 
 
 7 */
 8
 9#include <linux/err.h>
10#include <linux/module.h>
11#include <linux/gpio/driver.h>
 
 
 
12#include <linux/platform_device.h>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
14#define IOP3XX_GPOE	0x0000
15#define IOP3XX_GPID	0x0004
16#define IOP3XX_GPOD	0x0008
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
18static int iop3xx_gpio_probe(struct platform_device *pdev)
19{
20	struct gpio_chip *gc;
21	void __iomem *base;
22	int err;
23
24	gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL);
25	if (!gc)
26		return -ENOMEM;
27
28	base = devm_platform_ioremap_resource(pdev, 0);
 
29	if (IS_ERR(base))
30		return PTR_ERR(base);
31
32	err = bgpio_init(gc, &pdev->dev, 1, base + IOP3XX_GPID,
33			 base + IOP3XX_GPOD, NULL, NULL, base + IOP3XX_GPOE, 0);
34	if (err)
35		return err;
36
37	gc->base = 0;
38	gc->owner = THIS_MODULE;
39	gc->label = "gpio-iop";
40
41	return devm_gpiochip_add_data(&pdev->dev, gc, NULL);
42}
43
44static struct platform_driver iop3xx_gpio_driver = {
45	.driver = {
46		.name = "gpio-iop",
 
47	},
48	.probe = iop3xx_gpio_probe,
49};
50
51static int __init iop3xx_gpio_init(void)
52{
53	return platform_driver_register(&iop3xx_gpio_driver);
54}
55arch_initcall(iop3xx_gpio_init);
56
57MODULE_DESCRIPTION("GPIO handling for Intel IOP3xx processors");
58MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>");
59MODULE_LICENSE("GPL");