diff options
Diffstat (limited to 'include/linux/basic_mmio_gpio.h')
| -rw-r--r-- | include/linux/basic_mmio_gpio.h | 56 | 
1 files changed, 56 insertions, 0 deletions
diff --git a/include/linux/basic_mmio_gpio.h b/include/linux/basic_mmio_gpio.h index 198087a16fc..1ae12710d73 100644 --- a/include/linux/basic_mmio_gpio.h +++ b/include/linux/basic_mmio_gpio.h @@ -13,8 +13,64 @@  #ifndef __BASIC_MMIO_GPIO_H  #define __BASIC_MMIO_GPIO_H +#include <linux/gpio.h> +#include <linux/types.h> +#include <linux/compiler.h> +  struct bgpio_pdata {  	int base; +	int ngpio;  }; +struct device; + +struct bgpio_chip { +	struct gpio_chip gc; + +	unsigned long (*read_reg)(void __iomem *reg); +	void (*write_reg)(void __iomem *reg, unsigned long data); + +	void __iomem *reg_dat; +	void __iomem *reg_set; +	void __iomem *reg_clr; +	void __iomem *reg_dir; + +	/* Number of bits (GPIOs): <register width> * 8. */ +	int bits; + +	/* +	 * Some GPIO controllers work with the big-endian bits notation, +	 * e.g. in a 8-bits register, GPIO7 is the least significant bit. +	 */ +	unsigned long (*pin2mask)(struct bgpio_chip *bgc, unsigned int pin); + +	/* +	 * Used to lock bgpio_chip->data. Also, this is needed to keep +	 * shadowed and real data registers writes together. +	 */ +	spinlock_t lock; + +	/* Shadowed data register to clear/set bits safely. */ +	unsigned long data; + +	/* Shadowed direction registers to clear/set direction safely. */ +	unsigned long dir; +}; + +static inline struct bgpio_chip *to_bgpio_chip(struct gpio_chip *gc) +{ +	return container_of(gc, struct bgpio_chip, gc); +} + +int __devexit bgpio_remove(struct bgpio_chip *bgc); +int __devinit bgpio_init(struct bgpio_chip *bgc, +			 struct device *dev, +			 unsigned long sz, +			 void __iomem *dat, +			 void __iomem *set, +			 void __iomem *clr, +			 void __iomem *dirout, +			 void __iomem *dirin, +			 bool big_endian); +  #endif /* __BASIC_MMIO_GPIO_H */  |