From 6d625fde521381b55ba9242951f53482b5afb286 Mon Sep 17 00:00:00 2001 From: jethead71 Date: Fri, 7 May 2010 10:53:19 +0000 Subject: [PATCH] i.MX31/Gigabeat S minor cleaning: Make HW access more obvious in places I forgot to do earlier. Reduce the number of structs that need to be filled-out for some drivers just to simplify a little. Change some types. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25870 a1c6a512-1295-4272-9138-f99709370657 --- .../target/arm/imx31/gigabeat-s/gpio-gigabeat-s.c | 10 +- firmware/target/arm/imx31/gigabeat-s/gpio-target.h | 3 + .../arm/imx31/gigabeat-s/mc13783-gigabeat-s.c | 8 +- .../target/arm/imx31/gigabeat-s/mc13783-target.h | 1 + firmware/target/arm/imx31/gpio-imx31.c | 125 +++++++++++---------- firmware/target/arm/imx31/gpio-imx31.h | 55 +++------ firmware/target/arm/imx31/mc13783-imx31.c | 13 +-- 7 files changed, 92 insertions(+), 123 deletions(-) diff --git a/firmware/target/arm/imx31/gigabeat-s/gpio-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/gpio-gigabeat-s.c index 3d0ff977d..f4402d561 100644 --- a/firmware/target/arm/imx31/gigabeat-s/gpio-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/gpio-gigabeat-s.c @@ -28,7 +28,7 @@ /* Gigabeat S definitions for static GPIO event registration */ /* Describes single events for each GPIO1 pin */ -static const struct gpio_event gpio1_events[] = +const struct gpio_event gpio1_events[] = { /* mc13783 keeps the PRIINT high (no low pulse) if other unmasked * interrupts become active when clearing them or if a source being @@ -41,11 +41,3 @@ static const struct gpio_event gpio1_events[] = .callback = mc13783_event, } }; - -/* Describes the events attached to GPIO1 port */ -const struct gpio_event_list gpio1_event_list = -{ - .ints_priority = INT_PRIO_DEFAULT, - .count = ARRAYLEN(gpio1_events), - .events = gpio1_events, -}; diff --git a/firmware/target/arm/imx31/gigabeat-s/gpio-target.h b/firmware/target/arm/imx31/gigabeat-s/gpio-target.h index 0c213611f..2eea27c3b 100644 --- a/firmware/target/arm/imx31/gigabeat-s/gpio-target.h +++ b/firmware/target/arm/imx31/gigabeat-s/gpio-target.h @@ -29,11 +29,14 @@ #define MC13783_GPIO_ISR GPIO1_ISR #define MC13783_GPIO_LINE 31 +#define GPIO1_INT_PRIO INT_PRIO_DEFAULT + /* Declare event indexes in priority order in a packed array */ enum gpio_event_ids { /* GPIO1 event IDs */ MC13783_EVENT_ID = GPIO1_EVENT_FIRST, + GPIO1_NUM_EVENTS = 1, /* GPIO2 event IDs */ /* none defined */ /* GPIO3 event IDs */ diff --git a/firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c index 22c9f3e1d..e0745a5b8 100644 --- a/firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c @@ -52,7 +52,7 @@ struct spi_node mc13783_spi = /* Gigabeat S definitions for static MC13783 event registration */ -static const struct mc13783_event mc13783_events[] = +const struct mc13783_event mc13783_events[MC13783_NUM_EVENTS] = { [MC13783_ADCDONE_EVENT] = /* ADC conversion complete */ { @@ -87,9 +87,3 @@ static const struct mc13783_event mc13783_events[] = }, #endif }; - -const struct mc13783_event_list mc13783_event_list = -{ - .count = ARRAYLEN(mc13783_events), - .events = mc13783_events -}; diff --git a/firmware/target/arm/imx31/gigabeat-s/mc13783-target.h b/firmware/target/arm/imx31/gigabeat-s/mc13783-target.h index 2ae3be181..48d634035 100644 --- a/firmware/target/arm/imx31/gigabeat-s/mc13783-target.h +++ b/firmware/target/arm/imx31/gigabeat-s/mc13783-target.h @@ -33,6 +33,7 @@ enum mc13783_event_ids #endif MC13783_SE1_EVENT, /* Main charger detection */ MC13783_USB_EVENT, /* USB insertion */ + MC13783_NUM_EVENTS, }; #endif /* MC13783_TARGET_H */ diff --git a/firmware/target/arm/imx31/gpio-imx31.c b/firmware/target/arm/imx31/gpio-imx31.c index 944f70eae..42d0a4218 100644 --- a/firmware/target/arm/imx31/gpio-imx31.c +++ b/firmware/target/arm/imx31/gpio-imx31.c @@ -31,67 +31,85 @@ extern void UIE_VECTOR(void); /* Event lists are allocated for the specific target */ #if (GPIO_EVENT_MASK & USE_GPIO1_EVENTS) static __attribute__((interrupt("IRQ"))) void GPIO1_HANDLER(void); -extern const struct gpio_event_list gpio1_event_list; +extern const struct gpio_event gpio1_events[GPIO1_NUM_EVENTS]; #endif #if (GPIO_EVENT_MASK & USE_GPIO2_EVENTS) static __attribute__((interrupt("IRQ"))) void GPIO2_HANDLER(void); -extern const struct gpio_event_list gpio2_event_list; +extern const struct gpio_event gpio2_events[GPIO2_NUM_EVENTS]; #endif #if (GPIO_EVENT_MASK & USE_GPIO3_EVENTS) static __attribute__((interrupt("IRQ"))) void GPIO3_HANDLER(void); -extern const struct gpio_event_list gpio3_event_list; +extern const struct gpio_event gpio3_events[GPIO3_NUM_EVENTS]; #endif -static struct gpio_module_descriptor +#define DR (0x00 / sizeof (unsigned long)) /* 00h */ +#define GDIR (0x04 / sizeof (unsigned long)) /* 04h */ +#define PSR (0x08 / sizeof (unsigned long)) /* 08h */ +#define ICR (0x0C / sizeof (unsigned long)) /* 0Ch ICR1,2 */ +#define IMR (0x14 / sizeof (unsigned long)) /* 14h */ +#define ISR (0x18 / sizeof (unsigned long)) + +static const struct gpio_module_desc { - struct gpio_map * const base; /* Module base address */ - enum IMX31_INT_LIST ints; /* AVIC int number */ - void (*handler)(void); /* Interrupt function */ - const struct gpio_event_list *list; /* Event handler list */ + volatile unsigned long * const base; /* Module base address */ + void (* const handler)(void); /* Interrupt function */ + const struct gpio_event * const events; /* Event handler list */ + const uint8_t ints; /* AVIC int number */ + const uint8_t int_priority; /* AVIC int priority */ + const uint8_t count; /* Number of events */ } gpio_descs[GPIO_NUM_GPIO] = { #if (GPIO_EVENT_MASK & USE_GPIO1_EVENTS) { - .base = (struct gpio_map *)GPIO1_BASE_ADDR, - .ints = INT_GPIO1, - .handler = GPIO1_HANDLER, + .base = (unsigned long *)GPIO1_BASE_ADDR, + .ints = INT_GPIO1, + .handler = GPIO1_HANDLER, + .events = gpio1_events, + .count = GPIO1_NUM_EVENTS, + .int_priority = GPIO1_INT_PRIO }, #endif #if (GPIO_EVENT_MASK & USE_GPIO2_EVENTS) { - .base = (struct gpio_map *)GPIO2_BASE_ADDR, - .ints = INT_GPIO2, - .handler = GPIO2_HANDLER, + .base = (unsigned long *)GPIO2_BASE_ADDR, + .ints = INT_GPIO2, + .handler = GPIO2_HANDLER, + .events = gpio2_events, + .count = GPIO2_NUM_EVENTS, + .int_priority = GPIO2_INT_PRIO }, #endif #if (GPIO_EVENT_MASK & USE_GPIO3_EVENTS) { - .base = (struct gpio_map *)GPIO3_BASE_ADDR, - .ints = INT_GPIO3, - .handler = GPIO3_HANDLER, + .base = (unsigned long *)GPIO3_BASE_ADDR, + .ints = INT_GPIO3, + .handler = GPIO3_HANDLER, + .events = gpio3_events, + .count = GPIO3_NUM_EVENTS, + .int_priority = GPIO3_INT_PRIO, }, #endif }; -static void gpio_call_events(const struct gpio_module_descriptor * const desc) +static void gpio_call_events(enum gpio_module_number gpio) { - const struct gpio_event_list * const list = desc->list; - struct gpio_map * const base = desc->base; + const struct gpio_module_desc * const desc = &gpio_descs[gpio]; + volatile unsigned long * const base = desc->base; const struct gpio_event * event, *event_last; - /* Intersect pending and unmasked bits */ - uint32_t pnd = base->isr & base->imr; + event = desc->events; + event_last = event + desc->count; - event = list->events; - event_last = event + list->count; + /* Intersect pending and unmasked bits */ + unsigned long pnd = base[ISR] & base[IMR]; /* Call each event handler in order */ /* .count is surely expected to be > 0 */ do { - uint32_t mask = event->mask; + unsigned long mask = event->mask; if (pnd & mask) { @@ -114,74 +132,63 @@ static void gpio_call_events(const struct gpio_module_descriptor * const desc) #if (GPIO_EVENT_MASK & USE_GPIO1_EVENTS) static __attribute__((interrupt("IRQ"))) void GPIO1_HANDLER(void) { - gpio_call_events(&gpio_descs[GPIO1_NUM]); + gpio_call_events(GPIO1_NUM); } #endif #if (GPIO_EVENT_MASK & USE_GPIO2_EVENTS) static __attribute__((interrupt("IRQ"))) void GPIO2_HANDLER(void) { - gpio_call_events(&gpio_descs[GPIO2_NUM]); + gpio_call_events(GPIO2_NUM); } #endif #if (GPIO_EVENT_MASK & USE_GPIO3_EVENTS) static __attribute__((interrupt("IRQ"))) void GPIO3_HANDLER(void) { - gpio_call_events(&gpio_descs[GPIO3_NUM]); + gpio_call_events(GPIO3_NUM); } #endif void gpio_init(void) { /* Mask-out GPIO interrupts - enable what's wanted later */ - GPIO1_IMR = 0; - GPIO2_IMR = 0; - GPIO3_IMR = 0; - - /* Init the externally-defined event lists for each port */ -#if (GPIO_EVENT_MASK & USE_GPIO1_EVENTS) - gpio_descs[GPIO1_NUM].list = &gpio1_event_list; -#endif -#if (GPIO_EVENT_MASK & USE_GPIO2_EVENTS) - gpio_descs[GPIO2_NUM].list = &gpio2_event_list; -#endif -#if (GPIO_EVENT_MASK & USE_GPIO3_EVENTS) - gpio_descs[GPIO3_NUM].list = &gpio3_event_list; -#endif + int i; + for (i = 0; i < GPIO_NUM_GPIO; i++) + gpio_descs[i].base[IMR] = 0; } bool gpio_enable_event(enum gpio_event_ids id) { - const struct gpio_module_descriptor * const desc = &gpio_descs[id >> 5]; - const struct gpio_event * const event = &desc->list->events[id & 31]; - struct gpio_map * const base = desc->base; - volatile uint32_t *icr; - uint32_t mask, line; - uint32_t imr; + const struct gpio_module_desc * const desc = &gpio_descs[id >> 5]; + const struct gpio_event * const event = &desc->events[id & 31]; + volatile unsigned long * const base = desc->base; + volatile unsigned long *icr; + unsigned long mask, line; + unsigned long imr; int shift; int oldlevel = disable_irq_save(); - imr = base->imr; + imr = base[IMR]; if (imr == 0) { /* First enabled interrupt for this GPIO */ - avic_enable_int(desc->ints, INT_TYPE_IRQ, desc->list->ints_priority, + avic_enable_int(desc->ints, INT_TYPE_IRQ, desc->int_priority, desc->handler); } /* Set the line sense */ line = find_first_set_bit(event->mask); - icr = &base->icr[line >> 4]; - shift = (line & 15) << 1; + icr = &base[ICR + (line >> 4)]; + shift = 2*(line & 15); mask = GPIO_SENSE_CONFIG_MASK << shift; *icr = (*icr & ~mask) | ((event->sense << shift) & mask); /* Unmask the line */ - base->imr = imr | event->mask; + base[IMR] = imr | event->mask; restore_irq(oldlevel); @@ -190,18 +197,18 @@ bool gpio_enable_event(enum gpio_event_ids id) void gpio_disable_event(enum gpio_event_ids id) { - const struct gpio_module_descriptor * const desc = &gpio_descs[id >> 5]; - const struct gpio_event * const event = &desc->list->events[id & 31]; - struct gpio_map * const base = desc->base; - uint32_t imr; + const struct gpio_module_desc * const desc = &gpio_descs[id >> 5]; + const struct gpio_event * const event = &desc->events[id & 31]; + volatile unsigned long * const base = desc->base; + unsigned long imr; int oldlevel = disable_irq_save(); /* Remove bit from mask */ - imr = base->imr & ~event->mask; + imr = base[IMR] & ~event->mask; /* Mask the line */ - base->imr = imr; + base[IMR] = imr; if (imr == 0) { diff --git a/firmware/target/arm/imx31/gpio-imx31.h b/firmware/target/arm/imx31/gpio-imx31.h index 72956d4ef..a1358672e 100644 --- a/firmware/target/arm/imx31/gpio-imx31.h +++ b/firmware/target/arm/imx31/gpio-imx31.h @@ -42,22 +42,6 @@ enum gpio_module_number GPIO_NUM_GPIO, }; -/* Module corresponding to the event ID is identified by range */ -enum gpio_event_bases -{ -#if (GPIO_EVENT_MASK & USE_GPIO1_EVENTS) - GPIO1_EVENT_FIRST = 32*GPIO1_NUM, -#endif -#if (GPIO_EVENT_MASK & USE_GPIO2_EVENTS) - GPIO2_EVENT_FIRST = 32*GPIO2_NUM, -#endif -#if (GPIO_EVENT_MASK & USE_GPIO3_EVENTS) - GPIO3_EVENT_FIRST = 32*GPIO3_NUM, -#endif -}; - -#include "gpio-target.h" - /* Possible values for gpio interrupt line config */ enum gpio_int_sense_enum { @@ -69,44 +53,33 @@ enum gpio_int_sense_enum #define GPIO_SENSE_CONFIG_MASK 0x3 -/* Register map for each module */ -struct gpio_map -{ - volatile uint32_t dr; /* 00h */ - volatile uint32_t gdir; /* 04h */ - volatile uint32_t psr; /* 08h */ - union - { - struct - { - volatile uint32_t icr1; /* 0Ch */ - volatile uint32_t icr2; /* 10h */ - }; - volatile uint32_t icr[2]; /* 0Ch */ - }; - volatile uint32_t imr; /* 14h */ - volatile uint32_t isr; /* 18h */ -}; - /* Pending events will be called in array order which allows easy * pioritization */ /* Describes a single event for a pin */ struct gpio_event { - uint32_t mask; /* mask: 1 << (0...31) */ + unsigned long mask; /* mask: 1 << (0...31) */ enum gpio_int_sense_enum sense; /* Type of sense */ void (*callback)(void); /* Callback function */ }; -/* Describes the events attached to a port */ -struct gpio_event_list +/* Module corresponding to the event ID is identified by range */ +enum gpio_event_bases { - int ints_priority; /* Interrupt priority for this GPIO */ - unsigned count; /* Count of events for the module */ - const struct gpio_event *events; /* List of events */ +#if (GPIO_EVENT_MASK & USE_GPIO1_EVENTS) + GPIO1_EVENT_FIRST = 32*GPIO1_NUM, +#endif +#if (GPIO_EVENT_MASK & USE_GPIO2_EVENTS) + GPIO2_EVENT_FIRST = 32*GPIO2_NUM, +#endif +#if (GPIO_EVENT_MASK & USE_GPIO3_EVENTS) + GPIO3_EVENT_FIRST = 32*GPIO3_NUM, +#endif }; +#include "gpio-target.h" + void gpio_init(void); bool gpio_enable_event(enum gpio_event_ids id); void gpio_disable_event(enum gpio_event_ids id); diff --git a/firmware/target/arm/imx31/mc13783-imx31.c b/firmware/target/arm/imx31/mc13783-imx31.c index 514612232..9d8f6190a 100644 --- a/firmware/target/arm/imx31/mc13783-imx31.c +++ b/firmware/target/arm/imx31/mc13783-imx31.c @@ -22,10 +22,11 @@ #include "cpu.h" #include "gpio-imx31.h" #include "mc13783.h" +#include "mc13783-target.h" #include "debug.h" #include "kernel.h" -extern const struct mc13783_event_list mc13783_event_list; +extern const struct mc13783_event mc13783_events[MC13783_NUM_EVENTS]; extern struct spi_node mc13783_spi; /* PMIC event service data */ @@ -107,8 +108,8 @@ static void mc13783_interrupt_thread(void) * generated. */ imx31_regset32(&MC13783_GPIO_IMR, 1ul << MC13783_GPIO_LINE); - event = mc13783_event_list.events; - event_last = event + mc13783_event_list.count; + event = mc13783_events; + event_last = event + MC13783_NUM_EVENTS; /* .count is surely expected to be > 0 */ do @@ -181,8 +182,7 @@ void mc13783_close(void) bool mc13783_enable_event(enum mc13783_event_ids id) { - const struct mc13783_event * const event = - &mc13783_event_list.events[id]; + const struct mc13783_event * const event = &mc13783_events[id]; int set = event->set; uint32_t mask = event->mask; @@ -198,8 +198,7 @@ bool mc13783_enable_event(enum mc13783_event_ids id) void mc13783_disable_event(enum mc13783_event_ids id) { - const struct mc13783_event * const event = - &mc13783_event_list.events[id]; + const struct mc13783_event * const event = &mc13783_events[id]; int set = event->set; uint32_t mask = event->mask; -- 2.11.4.GIT