diff options
-rw-r--r-- | arch/arm/mach-mx3/iomux.c | 25 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/iomux-mx3.h | 2 |
2 files changed, 7 insertions, 20 deletions
diff --git a/arch/arm/mach-mx3/iomux.c b/arch/arm/mach-mx3/iomux.c index 40ffc5a664d9..c66ccbcdc11b 100644 --- a/arch/arm/mach-mx3/iomux.c +++ b/arch/arm/mach-mx3/iomux.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/spinlock.h> | 22 | #include <linux/spinlock.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/gpio.h> | ||
25 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
26 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
27 | #include <mach/gpio.h> | 26 | #include <mach/gpio.h> |
@@ -94,15 +93,13 @@ void mxc_iomux_set_pad(enum iomux_pins pin, u32 config) | |||
94 | EXPORT_SYMBOL(mxc_iomux_set_pad); | 93 | EXPORT_SYMBOL(mxc_iomux_set_pad); |
95 | 94 | ||
96 | /* | 95 | /* |
97 | * setups a single pin: | 96 | * allocs a single pin: |
98 | * - reserves the pin so that it is not claimed by another driver | 97 | * - reserves the pin so that it is not claimed by another driver |
99 | * - setups the iomux according to the configuration | 98 | * - setups the iomux according to the configuration |
100 | * - if the pin is configured as a GPIO, we claim it through kernel gpiolib | ||
101 | */ | 99 | */ |
102 | int mxc_iomux_setup_pin(const unsigned int pin, const char *label) | 100 | int mxc_iomux_alloc_pin(const unsigned int pin, const char *label) |
103 | { | 101 | { |
104 | unsigned pad = pin & IOMUX_PADNUM_MASK; | 102 | unsigned pad = pin & IOMUX_PADNUM_MASK; |
105 | unsigned gpio; | ||
106 | 103 | ||
107 | if (pad >= (PIN_MAX + 1)) { | 104 | if (pad >= (PIN_MAX + 1)) { |
108 | printk(KERN_ERR "mxc_iomux: Attempt to request nonexistant pin %u for \"%s\"\n", | 105 | printk(KERN_ERR "mxc_iomux: Attempt to request nonexistant pin %u for \"%s\"\n", |
@@ -113,19 +110,13 @@ int mxc_iomux_setup_pin(const unsigned int pin, const char *label) | |||
113 | if (test_and_set_bit(pad, mxc_pin_alloc_map)) { | 110 | if (test_and_set_bit(pad, mxc_pin_alloc_map)) { |
114 | printk(KERN_ERR "mxc_iomux: pin %u already used. Allocation for \"%s\" failed\n", | 111 | printk(KERN_ERR "mxc_iomux: pin %u already used. Allocation for \"%s\" failed\n", |
115 | pad, label ? label : "?"); | 112 | pad, label ? label : "?"); |
116 | return -EINVAL; | 113 | return -EBUSY; |
117 | } | 114 | } |
118 | mxc_iomux_mode(pin); | 115 | mxc_iomux_mode(pin); |
119 | 116 | ||
120 | /* if we have a gpio, we can allocate it */ | ||
121 | gpio = (pin & IOMUX_GPIONUM_MASK) >> IOMUX_GPIONUM_SHIFT; | ||
122 | if (gpio < (GPIO_PORT_MAX + 1) * 32) | ||
123 | if (gpio_request(gpio, label)) | ||
124 | return -EINVAL; | ||
125 | |||
126 | return 0; | 117 | return 0; |
127 | } | 118 | } |
128 | EXPORT_SYMBOL(mxc_iomux_setup_pin); | 119 | EXPORT_SYMBOL(mxc_iomux_alloc_pin); |
129 | 120 | ||
130 | int mxc_iomux_setup_multiple_pins(unsigned int *pin_list, unsigned count, | 121 | int mxc_iomux_setup_multiple_pins(unsigned int *pin_list, unsigned count, |
131 | const char *label) | 122 | const char *label) |
@@ -135,7 +126,8 @@ int mxc_iomux_setup_multiple_pins(unsigned int *pin_list, unsigned count, | |||
135 | int ret = -EINVAL; | 126 | int ret = -EINVAL; |
136 | 127 | ||
137 | for (i = 0; i < count; i++) { | 128 | for (i = 0; i < count; i++) { |
138 | if (mxc_iomux_setup_pin(*p, label)) | 129 | ret = mxc_iomux_alloc_pin(*p, label); |
130 | if (ret) | ||
139 | goto setup_error; | 131 | goto setup_error; |
140 | p++; | 132 | p++; |
141 | } | 133 | } |
@@ -150,14 +142,9 @@ EXPORT_SYMBOL(mxc_iomux_setup_multiple_pins); | |||
150 | void mxc_iomux_release_pin(const unsigned int pin) | 142 | void mxc_iomux_release_pin(const unsigned int pin) |
151 | { | 143 | { |
152 | unsigned pad = pin & IOMUX_PADNUM_MASK; | 144 | unsigned pad = pin & IOMUX_PADNUM_MASK; |
153 | unsigned gpio; | ||
154 | 145 | ||
155 | if (pad < (PIN_MAX + 1)) | 146 | if (pad < (PIN_MAX + 1)) |
156 | clear_bit(pad, mxc_pin_alloc_map); | 147 | clear_bit(pad, mxc_pin_alloc_map); |
157 | |||
158 | gpio = (pin & IOMUX_GPIONUM_MASK) >> IOMUX_GPIONUM_SHIFT; | ||
159 | if (gpio < (GPIO_PORT_MAX + 1) * 32) | ||
160 | gpio_free(gpio); | ||
161 | } | 148 | } |
162 | EXPORT_SYMBOL(mxc_iomux_release_pin); | 149 | EXPORT_SYMBOL(mxc_iomux_release_pin); |
163 | 150 | ||
diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx3.h b/arch/arm/plat-mxc/include/mach/iomux-mx3.h index be43f7684244..27f8d1b2bc6b 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-mx3.h +++ b/arch/arm/plat-mxc/include/mach/iomux-mx3.h | |||
@@ -114,7 +114,7 @@ enum iomux_gp_func { | |||
114 | * - setups the iomux according to the configuration | 114 | * - setups the iomux according to the configuration |
115 | * - if the pin is configured as a GPIO, we claim it throug kernel gpiolib | 115 | * - if the pin is configured as a GPIO, we claim it throug kernel gpiolib |
116 | */ | 116 | */ |
117 | int mxc_iomux_setup_pin(const unsigned int pin, const char *label); | 117 | int mxc_iomux_alloc_pin(const unsigned int pin, const char *label); |
118 | /* | 118 | /* |
119 | * setups mutliple pins | 119 | * setups mutliple pins |
120 | * convenient way to call the above function with tables | 120 | * convenient way to call the above function with tables |