Blackfin arch: fix bug - gpio_bank() macros messed up bank number caculating with positioning a gpio

The whole story:

Before BF51x merged, all the MAX_BLACKFIN_GPIOS are integral multiple of GPIO_BANKSIZE (= 16).
But BF51x provides MAX_BLACKFIN_GPIOS = 40 which includes 3 banks and the 3rd bank has only 8
GPIO pins.

Therefore, gpio_bank() macros is correct when you try to find a GPIO in which bank (GPIO_35 is
in bank 2). But on BF51x gpio_bank(MAX_BLACKFIN_GPIOS) only gives out 2 banks instead of 3
banks for some static array initialization.

This patch add a new macros gpio_bank_n() and GPIO_BANK_NUM to do bank number caculating and
remain the gpio_bank() macros for positioning a gpio in which bank.

Signed-off-by: Bryan Wu <cooloney@kernel.org>
This commit is contained in:
Bryan Wu 2008-11-18 17:48:22 +08:00
Родитель 10a88a2be5
Коммит 397861cd80
3 изменённых файлов: 20 добавлений и 18 удалений

Просмотреть файл

@ -85,10 +85,12 @@
#define __ARCH_BLACKFIN_GPIO_H__ #define __ARCH_BLACKFIN_GPIO_H__
#define gpio_bank(x) ((x) >> 4) #define gpio_bank(x) ((x) >> 4)
#define gpio_bank_n(x) ((x) & 0xF ? ((x) >> 4) + 1 : (x) >> 4)
#define gpio_bit(x) (1<<((x) & 0xF)) #define gpio_bit(x) (1<<((x) & 0xF))
#define gpio_sub_n(x) ((x) & 0xF) #define gpio_sub_n(x) ((x) & 0xF)
#define GPIO_BANKSIZE 16 #define GPIO_BANKSIZE 16
#define GPIO_BANK_NUM gpio_bank_n(MAX_BLACKFIN_GPIOS)
#define GPIO_0 0 #define GPIO_0 0
#define GPIO_1 1 #define GPIO_1 1

Просмотреть файл

@ -120,19 +120,19 @@ enum {
#endif #endif
#if defined(BF533_FAMILY) || defined(BF538_FAMILY) #if defined(BF533_FAMILY) || defined(BF538_FAMILY)
static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = { static struct gpio_port_t *gpio_bankb[] = {
(struct gpio_port_t *) FIO_FLAG_D, (struct gpio_port_t *) FIO_FLAG_D,
}; };
#endif #endif
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY) #if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = { static struct gpio_port_t *gpio_bankb[] = {
(struct gpio_port_t *) PORTFIO, (struct gpio_port_t *) PORTFIO,
(struct gpio_port_t *) PORTGIO, (struct gpio_port_t *) PORTGIO,
(struct gpio_port_t *) PORTHIO, (struct gpio_port_t *) PORTHIO,
}; };
static unsigned short *port_fer[gpio_bank(MAX_BLACKFIN_GPIOS)] = { static unsigned short *port_fer[] = {
(unsigned short *) PORTF_FER, (unsigned short *) PORTF_FER,
(unsigned short *) PORTG_FER, (unsigned short *) PORTG_FER,
(unsigned short *) PORTH_FER, (unsigned short *) PORTH_FER,
@ -140,7 +140,7 @@ static unsigned short *port_fer[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
#endif #endif
#if defined(BF527_FAMILY) || defined(BF518_FAMILY) #if defined(BF527_FAMILY) || defined(BF518_FAMILY)
static unsigned short *port_mux[gpio_bank(MAX_BLACKFIN_GPIOS)] = { static unsigned short *port_mux[] = {
(unsigned short *) PORTF_MUX, (unsigned short *) PORTF_MUX,
(unsigned short *) PORTG_MUX, (unsigned short *) PORTG_MUX,
(unsigned short *) PORTH_MUX, (unsigned short *) PORTH_MUX,
@ -155,7 +155,7 @@ u8 pmux_offset[][16] =
#endif #endif
#ifdef BF561_FAMILY #ifdef BF561_FAMILY
static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = { static struct gpio_port_t *gpio_bankb[] = {
(struct gpio_port_t *) FIO0_FLAG_D, (struct gpio_port_t *) FIO0_FLAG_D,
(struct gpio_port_t *) FIO1_FLAG_D, (struct gpio_port_t *) FIO1_FLAG_D,
(struct gpio_port_t *) FIO2_FLAG_D, (struct gpio_port_t *) FIO2_FLAG_D,
@ -163,7 +163,7 @@ static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
#endif #endif
#ifdef BF548_FAMILY #ifdef BF548_FAMILY
static struct gpio_port_t *gpio_array[gpio_bank(MAX_BLACKFIN_GPIOS)] = { static struct gpio_port_t *gpio_array[] = {
(struct gpio_port_t *)PORTA_FER, (struct gpio_port_t *)PORTA_FER,
(struct gpio_port_t *)PORTB_FER, (struct gpio_port_t *)PORTB_FER,
(struct gpio_port_t *)PORTC_FER, (struct gpio_port_t *)PORTC_FER,
@ -177,7 +177,7 @@ static struct gpio_port_t *gpio_array[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
}; };
#endif #endif
static unsigned short reserved_gpio_map[gpio_bank(MAX_BLACKFIN_GPIOS)]; static unsigned short reserved_gpio_map[GPIO_BANK_NUM];
static unsigned short reserved_peri_map[gpio_bank(MAX_RESOURCES)]; static unsigned short reserved_peri_map[gpio_bank(MAX_RESOURCES)];
#define RESOURCE_LABEL_SIZE 16 #define RESOURCE_LABEL_SIZE 16
@ -188,30 +188,30 @@ static struct str_ident {
#if defined(CONFIG_PM) #if defined(CONFIG_PM)
#if defined(CONFIG_BF54x) #if defined(CONFIG_BF54x)
static struct gpio_port_s gpio_bank_saved[gpio_bank(MAX_BLACKFIN_GPIOS)]; static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
#else #else
static unsigned short wakeup_map[gpio_bank(MAX_BLACKFIN_GPIOS)]; static unsigned short wakeup_map[GPIO_BANK_NUM];
static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS]; static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
static struct gpio_port_s gpio_bank_saved[gpio_bank(MAX_BLACKFIN_GPIOS)]; static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
#ifdef BF533_FAMILY #ifdef BF533_FAMILY
static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG_INTB}; static unsigned int sic_iwr_irqs[] = {IRQ_PROG_INTB};
#endif #endif
#ifdef BF537_FAMILY #ifdef BF537_FAMILY
static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX}; static unsigned int sic_iwr_irqs[] = {IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX};
#endif #endif
#ifdef BF538_FAMILY #ifdef BF538_FAMILY
static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PORTF_INTB}; static unsigned int sic_iwr_irqs[] = {IRQ_PORTF_INTB};
#endif #endif
#if defined(BF527_FAMILY) || defined(BF518_FAMILY) #if defined(BF527_FAMILY) || defined(BF518_FAMILY)
static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB}; static unsigned int sic_iwr_irqs[] = {IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB};
#endif #endif
#ifdef BF561_FAMILY #ifdef BF561_FAMILY
static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB}; static unsigned int sic_iwr_irqs[] = {IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB};
#endif #endif
#endif #endif
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */

Просмотреть файл

@ -377,8 +377,8 @@ static inline void bfin_set_irq_handler(unsigned irq, irq_flow_handler_t handle)
#if !defined(CONFIG_BF54x) #if !defined(CONFIG_BF54x)
static unsigned short gpio_enabled[gpio_bank(MAX_BLACKFIN_GPIOS)]; static unsigned short gpio_enabled[GPIO_BANK_NUM];
static unsigned short gpio_edge_triggered[gpio_bank(MAX_BLACKFIN_GPIOS)]; static unsigned short gpio_edge_triggered[GPIO_BANK_NUM];
extern void bfin_gpio_irq_prepare(unsigned gpio); extern void bfin_gpio_irq_prepare(unsigned gpio);
@ -620,7 +620,7 @@ static unsigned char irq2pint_lut[NR_PINTS];
static unsigned char pint2irq_lut[NR_PINT_SYS_IRQS * NR_PINT_BITS]; static unsigned char pint2irq_lut[NR_PINT_SYS_IRQS * NR_PINT_BITS];
static unsigned int gpio_both_edge_triggered[NR_PINT_SYS_IRQS]; static unsigned int gpio_both_edge_triggered[NR_PINT_SYS_IRQS];
static unsigned short gpio_enabled[gpio_bank(MAX_BLACKFIN_GPIOS)]; static unsigned short gpio_enabled[GPIO_BANK_NUM];
struct pin_int_t { struct pin_int_t {