summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2010-05-07 10:53:19 +0000
committerMichael Sevakis <jethead71@rockbox.org>2010-05-07 10:53:19 +0000
commitd7ef2474120f2a009af139754f6d387c8e83c949 (patch)
tree7b63172498900d1c63c238fd256e532b23dd411e
parent235fc05e3be7508c310cfd2ff5151d30b78be971 (diff)
downloadrockbox-d7ef2474120f2a009af139754f6d387c8e83c949.zip
rockbox-d7ef2474120f2a009af139754f6d387c8e83c949.tar.gz
rockbox-d7ef2474120f2a009af139754f6d387c8e83c949.tar.bz2
rockbox-d7ef2474120f2a009af139754f6d387c8e83c949.tar.xz
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
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/gpio-gigabeat-s.c10
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/gpio-target.h3
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c8
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/mc13783-target.h1
-rw-r--r--firmware/target/arm/imx31/gpio-imx31.c125
-rw-r--r--firmware/target/arm/imx31/gpio-imx31.h55
-rw-r--r--firmware/target/arm/imx31/mc13783-imx31.c13
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 3d0ff97..f4402d5 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 0c21361..2eea27c 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 22c9f3e..e0745a5 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 2ae3be1..48d6340 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 944f70e..42d0a42 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 72956d4..a135867 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 5146122..9d8f619 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;