diff options
Diffstat (limited to 'drivers/input/touchscreen/ads7846.c')
-rw-r--r-- | drivers/input/touchscreen/ads7846.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 52d2ca147d8f..8b05d8e97543 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
28 | #include <linux/spi/spi.h> | 28 | #include <linux/spi/spi.h> |
29 | #include <linux/spi/ads7846.h> | 29 | #include <linux/spi/ads7846.h> |
30 | #include <linux/regulator/consumer.h> | ||
30 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
31 | 32 | ||
32 | /* | 33 | /* |
@@ -85,6 +86,7 @@ struct ads7846 { | |||
85 | char name[32]; | 86 | char name[32]; |
86 | 87 | ||
87 | struct spi_device *spi; | 88 | struct spi_device *spi; |
89 | struct regulator *reg; | ||
88 | 90 | ||
89 | #if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) | 91 | #if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) |
90 | struct attribute_group *attr_group; | 92 | struct attribute_group *attr_group; |
@@ -788,6 +790,8 @@ static void ads7846_disable(struct ads7846 *ts) | |||
788 | } | 790 | } |
789 | } | 791 | } |
790 | 792 | ||
793 | regulator_disable(ts->reg); | ||
794 | |||
791 | /* we know the chip's in lowpower mode since we always | 795 | /* we know the chip's in lowpower mode since we always |
792 | * leave it that way after every request | 796 | * leave it that way after every request |
793 | */ | 797 | */ |
@@ -799,6 +803,8 @@ static void ads7846_enable(struct ads7846 *ts) | |||
799 | if (!ts->disabled) | 803 | if (!ts->disabled) |
800 | return; | 804 | return; |
801 | 805 | ||
806 | regulator_enable(ts->reg); | ||
807 | |||
802 | ts->disabled = 0; | 808 | ts->disabled = 0; |
803 | ts->irq_disabled = 0; | 809 | ts->irq_disabled = 0; |
804 | enable_irq(ts->spi->irq); | 810 | enable_irq(ts->spi->irq); |
@@ -1139,6 +1145,19 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1139 | 1145 | ||
1140 | ts->last_msg = m; | 1146 | ts->last_msg = m; |
1141 | 1147 | ||
1148 | ts->reg = regulator_get(&spi->dev, "vcc"); | ||
1149 | if (IS_ERR(ts->reg)) { | ||
1150 | dev_err(&spi->dev, "unable to get regulator: %ld\n", | ||
1151 | PTR_ERR(ts->reg)); | ||
1152 | goto err_free_gpio; | ||
1153 | } | ||
1154 | |||
1155 | err = regulator_enable(ts->reg); | ||
1156 | if (err) { | ||
1157 | dev_err(&spi->dev, "unable to enable regulator: %d\n", err); | ||
1158 | goto err_put_regulator; | ||
1159 | } | ||
1160 | |||
1142 | if (request_irq(spi->irq, ads7846_irq, IRQF_TRIGGER_FALLING, | 1161 | if (request_irq(spi->irq, ads7846_irq, IRQF_TRIGGER_FALLING, |
1143 | spi->dev.driver->name, ts)) { | 1162 | spi->dev.driver->name, ts)) { |
1144 | dev_info(&spi->dev, | 1163 | dev_info(&spi->dev, |
@@ -1148,7 +1167,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1148 | spi->dev.driver->name, ts); | 1167 | spi->dev.driver->name, ts); |
1149 | if (err) { | 1168 | if (err) { |
1150 | dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); | 1169 | dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); |
1151 | goto err_free_gpio; | 1170 | goto err_disable_regulator; |
1152 | } | 1171 | } |
1153 | } | 1172 | } |
1154 | 1173 | ||
@@ -1180,6 +1199,10 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1180 | ads784x_hwmon_unregister(spi, ts); | 1199 | ads784x_hwmon_unregister(spi, ts); |
1181 | err_free_irq: | 1200 | err_free_irq: |
1182 | free_irq(spi->irq, ts); | 1201 | free_irq(spi->irq, ts); |
1202 | err_disable_regulator: | ||
1203 | regulator_disable(ts->reg); | ||
1204 | err_put_regulator: | ||
1205 | regulator_put(ts->reg); | ||
1183 | err_free_gpio: | 1206 | err_free_gpio: |
1184 | if (ts->gpio_pendown != -1) | 1207 | if (ts->gpio_pendown != -1) |
1185 | gpio_free(ts->gpio_pendown); | 1208 | gpio_free(ts->gpio_pendown); |
@@ -1208,6 +1231,9 @@ static int __devexit ads7846_remove(struct spi_device *spi) | |||
1208 | /* suspend left the IRQ disabled */ | 1231 | /* suspend left the IRQ disabled */ |
1209 | enable_irq(ts->spi->irq); | 1232 | enable_irq(ts->spi->irq); |
1210 | 1233 | ||
1234 | regulator_disable(ts->reg); | ||
1235 | regulator_put(ts->reg); | ||
1236 | |||
1211 | if (ts->gpio_pendown != -1) | 1237 | if (ts->gpio_pendown != -1) |
1212 | gpio_free(ts->gpio_pendown); | 1238 | gpio_free(ts->gpio_pendown); |
1213 | 1239 | ||