|
@@ -45,23 +45,13 @@
|
|
|
/* Convert GPIO signal to GPIO pin number */
|
|
|
#define GPIO_TO_PIN(bank, gpio) (16 * (bank) + (gpio))
|
|
|
|
|
|
-struct davinci_gpio_regs {
|
|
|
- u32 dir;
|
|
|
- u32 out_data;
|
|
|
- u32 set_data;
|
|
|
- u32 clr_data;
|
|
|
- u32 in_data;
|
|
|
- u32 set_rising;
|
|
|
- u32 clr_rising;
|
|
|
- u32 set_falling;
|
|
|
- u32 clr_falling;
|
|
|
- u32 intstat;
|
|
|
-};
|
|
|
-
|
|
|
struct davinci_gpio_controller {
|
|
|
- struct davinci_gpio_regs __iomem *regs;
|
|
|
struct gpio_chip chip;
|
|
|
int irq_base;
|
|
|
+ void __iomem *regs;
|
|
|
+ void __iomem *set_data;
|
|
|
+ void __iomem *clr_data;
|
|
|
+ void __iomem *in_data;
|
|
|
};
|
|
|
|
|
|
/* The __gpio_to_controller() and __gpio_mask() functions inline to constants
|
|
@@ -73,25 +63,16 @@ struct davinci_gpio_controller {
|
|
|
*
|
|
|
* These are NOT part of the cross-platform GPIO interface
|
|
|
*/
|
|
|
-static inline struct davinci_gpio_regs __iomem *
|
|
|
+static inline struct davinci_gpio_controller *
|
|
|
__gpio_to_controller(unsigned gpio)
|
|
|
{
|
|
|
- void __iomem *ptr;
|
|
|
- void __iomem *base = davinci_soc_info.gpio_base;
|
|
|
-
|
|
|
- if (gpio < 32 * 1)
|
|
|
- ptr = base + 0x10;
|
|
|
- else if (gpio < 32 * 2)
|
|
|
- ptr = base + 0x38;
|
|
|
- else if (gpio < 32 * 3)
|
|
|
- ptr = base + 0x60;
|
|
|
- else if (gpio < 32 * 4)
|
|
|
- ptr = base + 0x88;
|
|
|
- else if (gpio < 32 * 5)
|
|
|
- ptr = base + 0xb0;
|
|
|
- else
|
|
|
- ptr = NULL;
|
|
|
- return ptr;
|
|
|
+ struct davinci_gpio_controller *ctlrs = davinci_soc_info.gpio_ctlrs;
|
|
|
+ int index = gpio / 32;
|
|
|
+
|
|
|
+ if (!ctlrs || index >= davinci_soc_info.gpio_ctlrs_num)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return ctlrs + index;
|
|
|
}
|
|
|
|
|
|
static inline u32 __gpio_mask(unsigned gpio)
|
|
@@ -107,16 +88,16 @@ static inline u32 __gpio_mask(unsigned gpio)
|
|
|
*/
|
|
|
static inline void gpio_set_value(unsigned gpio, int value)
|
|
|
{
|
|
|
- if (__builtin_constant_p(value) && gpio < DAVINCI_N_GPIO) {
|
|
|
- struct davinci_gpio_regs __iomem *g;
|
|
|
- u32 mask;
|
|
|
+ if (__builtin_constant_p(value) && gpio < davinci_soc_info.gpio_num) {
|
|
|
+ struct davinci_gpio_controller *ctlr;
|
|
|
+ u32 mask;
|
|
|
|
|
|
- g = __gpio_to_controller(gpio);
|
|
|
+ ctlr = __gpio_to_controller(gpio);
|
|
|
mask = __gpio_mask(gpio);
|
|
|
if (value)
|
|
|
- __raw_writel(mask, &g->set_data);
|
|
|
+ __raw_writel(mask, ctlr->set_data);
|
|
|
else
|
|
|
- __raw_writel(mask, &g->clr_data);
|
|
|
+ __raw_writel(mask, ctlr->clr_data);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -134,18 +115,18 @@ static inline void gpio_set_value(unsigned gpio, int value)
|
|
|
*/
|
|
|
static inline int gpio_get_value(unsigned gpio)
|
|
|
{
|
|
|
- struct davinci_gpio_regs __iomem *g;
|
|
|
+ struct davinci_gpio_controller *ctlr;
|
|
|
|
|
|
- if (!__builtin_constant_p(gpio) || gpio >= DAVINCI_N_GPIO)
|
|
|
+ if (!__builtin_constant_p(gpio) || gpio >= davinci_soc_info.gpio_num)
|
|
|
return __gpio_get_value(gpio);
|
|
|
|
|
|
- g = __gpio_to_controller(gpio);
|
|
|
- return __gpio_mask(gpio) & __raw_readl(&g->in_data);
|
|
|
+ ctlr = __gpio_to_controller(gpio);
|
|
|
+ return __gpio_mask(gpio) & __raw_readl(ctlr->in_data);
|
|
|
}
|
|
|
|
|
|
static inline int gpio_cansleep(unsigned gpio)
|
|
|
{
|
|
|
- if (__builtin_constant_p(gpio) && gpio < DAVINCI_N_GPIO)
|
|
|
+ if (__builtin_constant_p(gpio) && gpio < davinci_soc_info.gpio_num)
|
|
|
return 0;
|
|
|
else
|
|
|
return __gpio_cansleep(gpio);
|