[U-Boot] [PATCH] M28: Added guarding for reserved bits in GPIO driver
Robert Deliën
Robert at delien.nl
Tue Nov 22 15:41:48 CET 2011
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;
}
More information about the U-Boot
mailing list