This patch fixes a small bug that allowed unintended manipulation of non-existing GPIO pins within a pin bank, clobbering reserved bits.
Signed-off-by: Robert Deliën <robert at delien.nl> diff --git a/arch/arm/include/asm/arch-mx28/iomux.h b/arch/arm/include/asm/arch-mx28/iomux.h index 7abdf58..829d9a8 100644 --- a/arch/arm/include/asm/arch-mx28/iomux.h +++ b/arch/arm/include/asm/arch-mx28/iomux.h @@ -56,6 +56,12 @@ typedef u32 iomux_cfg_t; #define MXS_PAD_PULL_VALID_SHIFT 16 #define MXS_PAD_PULL_VALID_MASK ((iomux_cfg_t)0x1 << MXS_PAD_PULL_VALID_SHIFT) +#define MXS_BANK0_PINS 29 +#define MXS_BANK1_PINS 32 +#define MXS_BANK2_PINS 28 +#define MXS_BANK3_PINS 31 +#define MXS_BANK4_PINS 21 + #define PAD_MUXSEL_0 0 #define PAD_MUXSEL_1 1 #define PAD_MUXSEL_2 2 diff --git a/drivers/gpio/mxs_gpio.c b/drivers/gpio/mxs_gpio.c index 539738b..fbc6da3 100644 --- a/drivers/gpio/mxs_gpio.c +++ b/drivers/gpio/mxs_gpio.c @@ -120,9 +120,34 @@ int gpio_direction_output(int gp, int value) int gpio_request(int gp, const char *label) { + int bank_pins; + if (PAD_BANK(gp) >= PINCTRL_BANKS) return -EINVAL; + switch(PAD_BANK(gp)) { + case 0: + bank_pins = MXS_BANK0_PINS; + break; + case 1: + bank_pins = MXS_BANK1_PINS; + break; + case 2: + bank_pins = MXS_BANK2_PINS; + break; + case 3: + bank_pins = MXS_BANK3_PINS; + break; + case 4: + bank_pins = MXS_BANK4_PINS; + break; + default: + bank_pins = 0; + } + + if (PAD_PIN(gp) >= bank_pins) + return -EINVAL; + return 0; } _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot