#include <adm5120_defs.h>
#include <adm5120_info.h>
#include <adm5120_switch.h>
-
+#include <adm5120_irq.h>
#define GPIO_READ(r) readl((r))
#define GPIO_WRITE(v, r) writel((v), (r))
struct adm5120_gpio_line {
u32 flags;
const char *label;
+ int irq;
};
#define GPIO_FLAG_VALID 0x01
LED_DESC(4, 0), LED_DESC(4, 1), LED_DESC(4, 2)
};
-static struct adm5120_gpio_line adm5120_gpio_map[ADM5120_GPIO_COUNT] = {
- [ADM5120_GPIO_PIN0] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_PIN1] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_PIN2] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_PIN3] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_PIN4] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_PIN5] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_PIN6] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_PIN7] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P0L0] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P0L1] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P0L2] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P1L0] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P1L1] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P1L2] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P2L0] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P2L1] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P2L2] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P3L0] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P3L1] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P3L2] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P4L0] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P4L1] = {.flags = GPIO_FLAG_VALID},
- [ADM5120_GPIO_P4L2] = {.flags = GPIO_FLAG_VALID}
-};
+static struct adm5120_gpio_line adm5120_gpio_map[ADM5120_GPIO_COUNT];
+
+/*-------------------------------------------------------------------------*/
+
+static inline int gpio_is_invalid(unsigned gpio)
+{
+ if ((gpio > ADM5120_GPIO_MAX) ||
+ (adm5120_gpio_map[gpio].flags & GPIO_FLAG_VALID) == 0);
+ return 0;
-#define gpio_is_invalid(g) ((g) > ADM5120_GPIO_MAX || \
- ((adm5120_gpio_map[(g)].flags & GPIO_FLAG_VALID) == 0))
+ return 1;
+}
+
+static inline int gpio_is_used(unsigned gpio)
+{
+ return ((adm5120_gpio_map[gpio].flags & GPIO_FLAG_USED) != 0);
+}
-#define gpio_is_used(g) ((adm5120_gpio_map[(g)].flags & GPIO_FLAG_USED) != 0)
+/*-------------------------------------------------------------------------*/
/*
* Helpers for GPIO lines in GPIO_CONF0 register
return 1;
}
+/*-------------------------------------------------------------------------*/
+
/*
* Main GPIO support routines
*/
int adm5120_gpio_to_irq(unsigned gpio)
{
- /* FIXME: not yet implemented */
- return -EINVAL;
+ if (gpio > ADM5120_GPIO_MAX)
+ return -EINVAL;
+
+ return adm5120_gpio_map[gpio].irq;
}
EXPORT_SYMBOL(adm5120_gpio_to_irq);
int adm5120_irq_to_gpio(unsigned irq)
{
- /* FIXME: not yet implemented */
+ int i;
+
+ for (i = 0; i < ADM5120_GPIO_COUNT; i++)
+ if (adm5120_gpio_map[i].irq == irq)
+ return i;
+
return -EINVAL;
}
EXPORT_SYMBOL(adm5120_irq_to_gpio);
-static int __init adm5120_gpio_init(void)
+/*-------------------------------------------------------------------------*/
+
+void __init adm5120_gpio_csx0_enable(void)
+{
+ u32 t;
+
+ t = SW_READ_REG(GPIO_CONF2);
+ t |= GPIO_CONF2_CSX0;
+ SW_WRITE_REG(GPIO_CONF2, t);
+
+ adm5120_gpio_map[ADM5120_GPIO_PIN1].flags &= ~GPIO_FLAG_VALID;
+ adm5120_gpio_map[ADM5120_GPIO_PIN2].irq = ADM5120_IRQ_GPIO2;
+}
+
+void __init adm5120_gpio_csx1_enable(void)
+{
+ u32 t;
+
+ t = SW_READ_REG(GPIO_CONF2);
+ t |= GPIO_CONF2_CSX1;
+ SW_WRITE_REG(GPIO_CONF2, t);
+
+ adm5120_gpio_map[ADM5120_GPIO_PIN3].flags &= ~GPIO_FLAG_VALID;
+ if (adm5120_package_bga())
+ adm5120_gpio_map[ADM5120_GPIO_PIN4].irq = ADM5120_IRQ_GPIO4;
+}
+
+void __init adm5120_gpio_ew_enable(void)
+{
+ u32 t;
+
+ t = SW_READ_REG(GPIO_CONF2);
+ t |= GPIO_CONF2_EW;
+ SW_WRITE_REG(GPIO_CONF2, t);
+}
+
+void __init adm5120_gpio_init(void)
{
int i;
+ SW_WRITE_REG(GPIO_CONF2, 0);
+
+ for (i = 0; i < ADM5120_GPIO_COUNT; i++)
+ adm5120_gpio_map[i].flags = GPIO_FLAG_VALID;
+
if (adm5120_package_pqfp()) {
- /* GPIO pins 4-7 are unavailable in ADM5120P */
- for (i = ADM5120_GPIO_PIN4; i <= ADM5120_GPIO_PIN7; i++)
- adm5120_gpio_map[i].flags &= ~GPIO_FLAG_VALID;
+ adm5120_gpio_map[ADM5120_GPIO_PIN4].flags &= ~GPIO_FLAG_VALID;
+ adm5120_gpio_map[ADM5120_GPIO_PIN5].flags &= ~GPIO_FLAG_VALID;
+ adm5120_gpio_map[ADM5120_GPIO_PIN6].flags &= ~GPIO_FLAG_VALID;
+ adm5120_gpio_map[ADM5120_GPIO_PIN7].flags &= ~GPIO_FLAG_VALID;
}
-
- return 0;
}
-
-pure_initcall(adm5120_gpio_init);