diff options
Diffstat (limited to 'arch/arm/mach-mx3/iomux.c')
| -rw-r--r-- | arch/arm/mach-mx3/iomux.c | 25 |
1 files changed, 6 insertions, 19 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 | ||
