|
@@ -0,0 +1,122 @@
|
|
|
+/*
|
|
|
+ * GPIO Abstraction Layer
|
|
|
+ *
|
|
|
+ * Copyright 2006-2010 Analog Devices Inc.
|
|
|
+ *
|
|
|
+ * Licensed under the GPL-2 or later
|
|
|
+ */
|
|
|
+
|
|
|
+#include <linux/delay.h>
|
|
|
+#include <linux/module.h>
|
|
|
+#include <linux/err.h>
|
|
|
+#include <linux/proc_fs.h>
|
|
|
+#include <linux/seq_file.h>
|
|
|
+#include <asm/blackfin.h>
|
|
|
+#include <asm/gpio.h>
|
|
|
+#include <asm/portmux.h>
|
|
|
+#include <linux/irq.h>
|
|
|
+#include <asm/irq_handler.h>
|
|
|
+
|
|
|
+#if ANOMALY_05000311 || ANOMALY_05000323
|
|
|
+enum {
|
|
|
+ AWA_data = SYSCR,
|
|
|
+ AWA_data_clear = SYSCR,
|
|
|
+ AWA_data_set = SYSCR,
|
|
|
+ AWA_toggle = SYSCR,
|
|
|
+ AWA_maska = BFIN_UART_SCR,
|
|
|
+ AWA_maska_clear = BFIN_UART_SCR,
|
|
|
+ AWA_maska_set = BFIN_UART_SCR,
|
|
|
+ AWA_maska_toggle = BFIN_UART_SCR,
|
|
|
+ AWA_maskb = BFIN_UART_GCTL,
|
|
|
+ AWA_maskb_clear = BFIN_UART_GCTL,
|
|
|
+ AWA_maskb_set = BFIN_UART_GCTL,
|
|
|
+ AWA_maskb_toggle = BFIN_UART_GCTL,
|
|
|
+ AWA_dir = SPORT1_STAT,
|
|
|
+ AWA_polar = SPORT1_STAT,
|
|
|
+ AWA_edge = SPORT1_STAT,
|
|
|
+ AWA_both = SPORT1_STAT,
|
|
|
+#if ANOMALY_05000311
|
|
|
+ AWA_inen = TIMER_ENABLE,
|
|
|
+#elif ANOMALY_05000323
|
|
|
+ AWA_inen = DMA1_1_CONFIG,
|
|
|
+#endif
|
|
|
+};
|
|
|
+ /* Anomaly Workaround */
|
|
|
+#define AWA_DUMMY_READ(name) bfin_read16(AWA_ ## name)
|
|
|
+#else
|
|
|
+#define AWA_DUMMY_READ(...) do { } while (0)
|
|
|
+#endif
|
|
|
+
|
|
|
+static struct gpio_port_t * const gpio_array[] = {
|
|
|
+#if defined(BF533_FAMILY) || defined(BF538_FAMILY)
|
|
|
+ (struct gpio_port_t *) FIO_FLAG_D,
|
|
|
+#elif defined(CONFIG_BF52x) || defined(BF537_FAMILY) || defined(CONFIG_BF51x)
|
|
|
+ (struct gpio_port_t *) PORTFIO,
|
|
|
+ (struct gpio_port_t *) PORTGIO,
|
|
|
+ (struct gpio_port_t *) PORTHIO,
|
|
|
+#elif defined(BF561_FAMILY)
|
|
|
+ (struct gpio_port_t *) FIO0_FLAG_D,
|
|
|
+ (struct gpio_port_t *) FIO1_FLAG_D,
|
|
|
+ (struct gpio_port_t *) FIO2_FLAG_D,
|
|
|
+#elif defined(CONFIG_BF54x) || defined(CONFIG_BF60x)
|
|
|
+ (struct gpio_port_t *)PORTA_FER,
|
|
|
+ (struct gpio_port_t *)PORTB_FER,
|
|
|
+ (struct gpio_port_t *)PORTC_FER,
|
|
|
+ (struct gpio_port_t *)PORTD_FER,
|
|
|
+ (struct gpio_port_t *)PORTE_FER,
|
|
|
+ (struct gpio_port_t *)PORTF_FER,
|
|
|
+ (struct gpio_port_t *)PORTG_FER,
|
|
|
+# if defined(CONFIG_BF54x)
|
|
|
+ (struct gpio_port_t *)PORTH_FER,
|
|
|
+ (struct gpio_port_t *)PORTI_FER,
|
|
|
+ (struct gpio_port_t *)PORTJ_FER,
|
|
|
+# endif
|
|
|
+#else
|
|
|
+# error no gpio arrays defined
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|
|
|
+#if defined(CONFIG_BF52x) || defined(BF537_FAMILY) || defined(CONFIG_BF51x)
|
|
|
+static unsigned short * const port_fer[] = {
|
|
|
+ (unsigned short *) PORTF_FER,
|
|
|
+ (unsigned short *) PORTG_FER,
|
|
|
+ (unsigned short *) PORTH_FER,
|
|
|
+};
|
|
|
+
|
|
|
+# if !defined(BF537_FAMILY)
|
|
|
+static unsigned short * const port_mux[] = {
|
|
|
+ (unsigned short *) PORTF_MUX,
|
|
|
+ (unsigned short *) PORTG_MUX,
|
|
|
+ (unsigned short *) PORTH_MUX,
|
|
|
+};
|
|
|
+
|
|
|
+static const
|
|
|
+u8 pmux_offset[][16] = {
|
|
|
+# if defined(CONFIG_BF52x)
|
|
|
+ { 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 4, 6, 8, 8, 10, 10 }, /* PORTF */
|
|
|
+ { 0, 0, 0, 0, 0, 2, 2, 4, 4, 6, 8, 10, 10, 10, 12, 12 }, /* PORTG */
|
|
|
+ { 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 4, 4 }, /* PORTH */
|
|
|
+# elif defined(CONFIG_BF51x)
|
|
|
+ { 0, 2, 2, 2, 2, 2, 2, 4, 6, 6, 6, 8, 8, 8, 8, 10 }, /* PORTF */
|
|
|
+ { 0, 0, 0, 2, 4, 6, 6, 6, 8, 10, 10, 12, 14, 14, 14, 14 }, /* PORTG */
|
|
|
+ { 0, 0, 0, 0, 2, 2, 4, 6, 10, 10, 10, 10, 10, 10, 10, 10 }, /* PORTH */
|
|
|
+# endif
|
|
|
+};
|
|
|
+# endif
|
|
|
+
|
|
|
+#elif defined(BF538_FAMILY)
|
|
|
+static unsigned short * const port_fer[] = {
|
|
|
+ (unsigned short *) PORTCIO_FER,
|
|
|
+ (unsigned short *) PORTDIO_FER,
|
|
|
+ (unsigned short *) PORTEIO_FER,
|
|
|
+};
|
|
|
+#endif
|
|
|
+
|
|
|
+#define RESOURCE_LABEL_SIZE 16
|
|
|
+
|
|
|
+static struct str_ident {
|
|
|
+ char name[RESOURCE_LABEL_SIZE];
|
|
|
+} str_ident[MAX_RESOURCES];
|
|
|
+
|
|
|
+#if defined(CONFIG_PM)
|
|
|
+static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
|