diff options
Diffstat (limited to 'drivers/gpio/max730x.c')
-rw-r--r-- | drivers/gpio/max730x.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/gpio/max730x.c b/drivers/gpio/max730x.c index 7696a5625d58..94ce773f95f8 100644 --- a/drivers/gpio/max730x.c +++ b/drivers/gpio/max730x.c | |||
@@ -54,7 +54,7 @@ static int max7301_direction_input(struct gpio_chip *chip, unsigned offset) | |||
54 | { | 54 | { |
55 | struct max7301 *ts = container_of(chip, struct max7301, chip); | 55 | struct max7301 *ts = container_of(chip, struct max7301, chip); |
56 | u8 *config; | 56 | u8 *config; |
57 | u8 offset_bits; | 57 | u8 offset_bits, pin_config; |
58 | int ret; | 58 | int ret; |
59 | 59 | ||
60 | /* First 4 pins are unused in the controller */ | 60 | /* First 4 pins are unused in the controller */ |
@@ -63,12 +63,15 @@ static int max7301_direction_input(struct gpio_chip *chip, unsigned offset) | |||
63 | 63 | ||
64 | config = &ts->port_config[offset >> 2]; | 64 | config = &ts->port_config[offset >> 2]; |
65 | 65 | ||
66 | if (ts->input_pullup_active & BIT(offset)) | ||
67 | pin_config = PIN_CONFIG_IN_PULLUP; | ||
68 | else | ||
69 | pin_config = PIN_CONFIG_IN_WO_PULLUP; | ||
70 | |||
66 | mutex_lock(&ts->lock); | 71 | mutex_lock(&ts->lock); |
67 | 72 | ||
68 | /* Standard GPIO API doesn't support pull-ups, has to be extended. | ||
69 | * Hard-coding no pollup for now. */ | ||
70 | *config = (*config & ~(PIN_CONFIG_MASK << offset_bits)) | 73 | *config = (*config & ~(PIN_CONFIG_MASK << offset_bits)) |
71 | | (PIN_CONFIG_IN_WO_PULLUP << offset_bits); | 74 | | (pin_config << offset_bits); |
72 | 75 | ||
73 | ret = ts->write(ts->dev, 0x08 + (offset >> 2), *config); | 76 | ret = ts->write(ts->dev, 0x08 + (offset >> 2), *config); |
74 | 77 | ||
@@ -177,6 +180,7 @@ int __devinit __max730x_probe(struct max7301 *ts) | |||
177 | /* Power up the chip and disable IRQ output */ | 180 | /* Power up the chip and disable IRQ output */ |
178 | ts->write(dev, 0x04, 0x01); | 181 | ts->write(dev, 0x04, 0x01); |
179 | 182 | ||
183 | ts->input_pullup_active = pdata->input_pullup_active; | ||
180 | ts->chip.label = dev->driver->name; | 184 | ts->chip.label = dev->driver->name; |
181 | 185 | ||
182 | ts->chip.direction_input = max7301_direction_input; | 186 | ts->chip.direction_input = max7301_direction_input; |
@@ -191,13 +195,17 @@ int __devinit __max730x_probe(struct max7301 *ts) | |||
191 | ts->chip.owner = THIS_MODULE; | 195 | ts->chip.owner = THIS_MODULE; |
192 | 196 | ||
193 | /* | 197 | /* |
194 | * tristate all pins in hardware and cache the | 198 | * initialize pullups according to platform data and cache the |
195 | * register values for later use. | 199 | * register values for later use. |
196 | */ | 200 | */ |
197 | for (i = 1; i < 8; i++) { | 201 | for (i = 1; i < 8; i++) { |
198 | int j; | 202 | int j; |
199 | /* 0xAA means input with internal pullup disabled */ | 203 | /* |
200 | ts->write(dev, 0x08 + i, 0xAA); | 204 | * initialize port_config with "0xAA", which means |
205 | * input with internal pullup disabled. This is needed | ||
206 | * to avoid writing zeros (in the inner for loop), | ||
207 | * which is not allowed according to the datasheet. | ||
208 | */ | ||
201 | ts->port_config[i] = 0xAA; | 209 | ts->port_config[i] = 0xAA; |
202 | for (j = 0; j < 4; j++) { | 210 | for (j = 0; j < 4; j++) { |
203 | int offset = (i - 1) * 4 + j; | 211 | int offset = (i - 1) * 4 + j; |