aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-10-10 14:34:28 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-10 14:34:28 -0400
commit911f9dab301e8583143c7e75b552eadd434ea0a8 (patch)
tree5ae66958da8ad33ac556d2cf59ce915edddec5ad
parentae50a840e779d48aa4dea2aaec1778f6b3f1d67f (diff)
parent4a5d67d7346619f4a45b5d6f7a496db2e0e8545d (diff)
Merge branch 'pcmcia' of git://git.armlinux.org.uk/~rmk/linux-arm
Pull ARM pcmcia updates from Russell King: "These updates lay the foundations for more generic soc_common PCMCIA support, which will result in several of the board specific drivers being elimated. As the dependencies for this are complex, the preliminary work is being submitted now, with the remainder scheduled for the next merge window" * 'pcmcia' of git://git.armlinux.org.uk/~rmk/linux-arm: pcmcia: soc_common: add driver-data pointer pcmcia: soc_common: add support for voltage sense GPIOs pcmcia: soc_common: constify pcmcia_low_level ops pointer pcmcia: soc_common: switch to a per-socket cpufreq notifier pcmcia: soc_common: add support for Vcc and Vpp regulators pcmcia: soc_common: add CF socket state helper pcmcia: soc_common: restore previous socket state on error pcmcia: soc_common: add support for reset and bus enable GPIOs pcmcia: soc_common: request legacy detect GPIO with active low pcmcia: soc_common: ignore invalid interrupts pcmcia: soc_common: switch to using gpio_descs pcmcia: soc_common: use devm_gpio_request_one()
-rw-r--r--drivers/pcmcia/sa1100_assabet.c9
-rw-r--r--drivers/pcmcia/sa1100_cerf.c9
-rw-r--r--drivers/pcmcia/soc_common.c238
-rw-r--r--drivers/pcmcia/soc_common.h29
4 files changed, 183 insertions, 102 deletions
diff --git a/drivers/pcmcia/sa1100_assabet.c b/drivers/pcmcia/sa1100_assabet.c
index 44cfc4416e54..71ace6910d7e 100644
--- a/drivers/pcmcia/sa1100_assabet.c
+++ b/drivers/pcmcia/sa1100_assabet.c
@@ -31,13 +31,6 @@ static int assabet_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
31 return 0; 31 return 0;
32} 32}
33 33
34static void
35assabet_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
36{
37 state->vs_3v = 1; /* Can only apply 3.3V on Assabet. */
38 state->vs_Xv = 0;
39}
40
41static int 34static int
42assabet_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) 35assabet_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
43{ 36{
@@ -90,7 +83,7 @@ static void assabet_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
90static struct pcmcia_low_level assabet_pcmcia_ops = { 83static struct pcmcia_low_level assabet_pcmcia_ops = {
91 .owner = THIS_MODULE, 84 .owner = THIS_MODULE,
92 .hw_init = assabet_pcmcia_hw_init, 85 .hw_init = assabet_pcmcia_hw_init,
93 .socket_state = assabet_pcmcia_socket_state, 86 .socket_state = soc_common_cf_socket_state,
94 .configure_socket = assabet_pcmcia_configure_socket, 87 .configure_socket = assabet_pcmcia_configure_socket,
95 .socket_suspend = assabet_pcmcia_socket_suspend, 88 .socket_suspend = assabet_pcmcia_socket_suspend,
96}; 89};
diff --git a/drivers/pcmcia/sa1100_cerf.c b/drivers/pcmcia/sa1100_cerf.c
index b3774e5d0396..c3f67363f6a1 100644
--- a/drivers/pcmcia/sa1100_cerf.c
+++ b/drivers/pcmcia/sa1100_cerf.c
@@ -45,13 +45,6 @@ static void cerf_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
45 gpio_free(CERF_GPIO_CF_RESET); 45 gpio_free(CERF_GPIO_CF_RESET);
46} 46}
47 47
48static void
49cerf_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
50{
51 state->vs_3v = 1;
52 state->vs_Xv = 0;
53}
54
55static int 48static int
56cerf_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, 49cerf_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
57 const socket_state_t *state) 50 const socket_state_t *state)
@@ -77,7 +70,7 @@ static struct pcmcia_low_level cerf_pcmcia_ops = {
77 .owner = THIS_MODULE, 70 .owner = THIS_MODULE,
78 .hw_init = cerf_pcmcia_hw_init, 71 .hw_init = cerf_pcmcia_hw_init,
79 .hw_shutdown = cerf_pcmcia_hw_shutdown, 72 .hw_shutdown = cerf_pcmcia_hw_shutdown,
80 .socket_state = cerf_pcmcia_socket_state, 73 .socket_state = soc_common_cf_socket_state,
81 .configure_socket = cerf_pcmcia_configure_socket, 74 .configure_socket = cerf_pcmcia_configure_socket,
82}; 75};
83 76
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index d5ca760c4eb2..153f3122283d 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -33,6 +33,7 @@
33 33
34#include <linux/cpufreq.h> 34#include <linux/cpufreq.h>
35#include <linux/gpio.h> 35#include <linux/gpio.h>
36#include <linux/gpio/consumer.h>
36#include <linux/init.h> 37#include <linux/init.h>
37#include <linux/interrupt.h> 38#include <linux/interrupt.h>
38#include <linux/io.h> 39#include <linux/io.h>
@@ -42,6 +43,7 @@
42#include <linux/module.h> 43#include <linux/module.h>
43#include <linux/moduleparam.h> 44#include <linux/moduleparam.h>
44#include <linux/mutex.h> 45#include <linux/mutex.h>
46#include <linux/regulator/consumer.h>
45#include <linux/spinlock.h> 47#include <linux/spinlock.h>
46#include <linux/timer.h> 48#include <linux/timer.h>
47 49
@@ -79,6 +81,41 @@ EXPORT_SYMBOL(soc_pcmcia_debug);
79#define to_soc_pcmcia_socket(x) \ 81#define to_soc_pcmcia_socket(x) \
80 container_of(x, struct soc_pcmcia_socket, socket) 82 container_of(x, struct soc_pcmcia_socket, socket)
81 83
84int soc_pcmcia_regulator_set(struct soc_pcmcia_socket *skt,
85 struct soc_pcmcia_regulator *r, int v)
86{
87 bool on;
88 int ret;
89
90 if (!r->reg)
91 return 0;
92
93 on = v != 0;
94 if (r->on == on)
95 return 0;
96
97 if (on) {
98 ret = regulator_set_voltage(r->reg, v * 100000, v * 100000);
99 if (ret) {
100 int vout = regulator_get_voltage(r->reg) / 100000;
101
102 dev_warn(&skt->socket.dev,
103 "CS requested %s=%u.%uV, applying %u.%uV\n",
104 r == &skt->vcc ? "Vcc" : "Vpp",
105 v / 10, v % 10, vout / 10, vout % 10);
106 }
107
108 ret = regulator_enable(r->reg);
109 } else {
110 regulator_disable(r->reg);
111 }
112 if (ret == 0)
113 r->on = on;
114
115 return ret;
116}
117EXPORT_SYMBOL_GPL(soc_pcmcia_regulator_set);
118
82static unsigned short 119static unsigned short
83calc_speed(unsigned short *spds, int num, unsigned short dflt) 120calc_speed(unsigned short *spds, int num, unsigned short dflt)
84{ 121{
@@ -111,12 +148,9 @@ static void __soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt,
111{ 148{
112 unsigned int i; 149 unsigned int i;
113 150
114 for (i = 0; i < nr; i++) { 151 for (i = 0; i < nr; i++)
115 if (skt->stat[i].irq) 152 if (skt->stat[i].irq)
116 free_irq(skt->stat[i].irq, skt); 153 free_irq(skt->stat[i].irq, skt);
117 if (gpio_is_valid(skt->stat[i].gpio))
118 gpio_free(skt->stat[i].gpio);
119 }
120 154
121 if (skt->ops->hw_shutdown) 155 if (skt->ops->hw_shutdown)
122 skt->ops->hw_shutdown(skt); 156 skt->ops->hw_shutdown(skt);
@@ -129,6 +163,30 @@ static void soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
129 __soc_pcmcia_hw_shutdown(skt, ARRAY_SIZE(skt->stat)); 163 __soc_pcmcia_hw_shutdown(skt, ARRAY_SIZE(skt->stat));
130} 164}
131 165
166int soc_pcmcia_request_gpiods(struct soc_pcmcia_socket *skt)
167{
168 struct device *dev = skt->socket.dev.parent;
169 struct gpio_desc *desc;
170 int i;
171
172 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) {
173 if (!skt->stat[i].name)
174 continue;
175
176 desc = devm_gpiod_get(dev, skt->stat[i].name, GPIOD_IN);
177 if (IS_ERR(desc)) {
178 dev_err(dev, "Failed to get GPIO for %s: %ld\n",
179 skt->stat[i].name, PTR_ERR(desc));
180 return PTR_ERR(desc);
181 }
182
183 skt->stat[i].desc = desc;
184 }
185
186 return 0;
187}
188EXPORT_SYMBOL_GPL(soc_pcmcia_request_gpiods);
189
132static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt) 190static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
133{ 191{
134 int ret = 0, i; 192 int ret = 0, i;
@@ -143,21 +201,32 @@ static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
143 201
144 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) { 202 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) {
145 if (gpio_is_valid(skt->stat[i].gpio)) { 203 if (gpio_is_valid(skt->stat[i].gpio)) {
146 int irq; 204 unsigned long flags = GPIOF_IN;
147 205
148 ret = gpio_request_one(skt->stat[i].gpio, GPIOF_IN, 206 /* CD is active low by default */
149 skt->stat[i].name); 207 if (i == SOC_STAT_CD)
208 flags |= GPIOF_ACTIVE_LOW;
209
210 ret = devm_gpio_request_one(skt->socket.dev.parent,
211 skt->stat[i].gpio, flags,
212 skt->stat[i].name);
150 if (ret) { 213 if (ret) {
151 __soc_pcmcia_hw_shutdown(skt, i); 214 __soc_pcmcia_hw_shutdown(skt, i);
152 return ret; 215 return ret;
153 } 216 }
154 217
155 irq = gpio_to_irq(skt->stat[i].gpio); 218 skt->stat[i].desc = gpio_to_desc(skt->stat[i].gpio);
219 }
220
221 if (i < SOC_STAT_VS1 && skt->stat[i].desc) {
222 int irq = gpiod_to_irq(skt->stat[i].desc);
156 223
157 if (i == SOC_STAT_RDY) 224 if (irq > 0) {
158 skt->socket.pci_irq = irq; 225 if (i == SOC_STAT_RDY)
159 else 226 skt->socket.pci_irq = irq;
160 skt->stat[i].irq = irq; 227 else
228 skt->stat[i].irq = irq;
229 }
161 } 230 }
162 231
163 if (skt->stat[i].irq) { 232 if (skt->stat[i].irq) {
@@ -166,8 +235,6 @@ static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
166 IRQF_TRIGGER_NONE, 235 IRQF_TRIGGER_NONE,
167 skt->stat[i].name, skt); 236 skt->stat[i].name, skt);
168 if (ret) { 237 if (ret) {
169 if (gpio_is_valid(skt->stat[i].gpio))
170 gpio_free(skt->stat[i].gpio);
171 __soc_pcmcia_hw_shutdown(skt, i); 238 __soc_pcmcia_hw_shutdown(skt, i);
172 return ret; 239 return ret;
173 } 240 }
@@ -197,6 +264,18 @@ static void soc_pcmcia_hw_disable(struct soc_pcmcia_socket *skt)
197 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_NONE); 264 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_NONE);
198} 265}
199 266
267/*
268 * The CF 3.0 specification says that cards tie VS1 to ground and leave
269 * VS2 open. Many implementations do not wire up the VS signals, so we
270 * provide hard-coded values as per the CF 3.0 spec.
271 */
272void soc_common_cf_socket_state(struct soc_pcmcia_socket *skt,
273 struct pcmcia_state *state)
274{
275 state->vs_3v = 1;
276}
277EXPORT_SYMBOL_GPL(soc_common_cf_socket_state);
278
200static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt) 279static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt)
201{ 280{
202 struct pcmcia_state state; 281 struct pcmcia_state state;
@@ -208,17 +287,18 @@ static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt)
208 state.bvd1 = 1; 287 state.bvd1 = 1;
209 state.bvd2 = 1; 288 state.bvd2 = 1;
210 289
211 /* CD is active low by default */ 290 if (skt->stat[SOC_STAT_CD].desc)
212 if (gpio_is_valid(skt->stat[SOC_STAT_CD].gpio)) 291 state.detect = !!gpiod_get_value(skt->stat[SOC_STAT_CD].desc);
213 state.detect = !gpio_get_value(skt->stat[SOC_STAT_CD].gpio); 292 if (skt->stat[SOC_STAT_RDY].desc)
214 293 state.ready = !!gpiod_get_value(skt->stat[SOC_STAT_RDY].desc);
215 /* RDY and BVD are active high by default */ 294 if (skt->stat[SOC_STAT_BVD1].desc)
216 if (gpio_is_valid(skt->stat[SOC_STAT_RDY].gpio)) 295 state.bvd1 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD1].desc);
217 state.ready = !!gpio_get_value(skt->stat[SOC_STAT_RDY].gpio); 296 if (skt->stat[SOC_STAT_BVD2].desc)
218 if (gpio_is_valid(skt->stat[SOC_STAT_BVD1].gpio)) 297 state.bvd2 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD2].desc);
219 state.bvd1 = !!gpio_get_value(skt->stat[SOC_STAT_BVD1].gpio); 298 if (skt->stat[SOC_STAT_VS1].desc)
220 if (gpio_is_valid(skt->stat[SOC_STAT_BVD2].gpio)) 299 state.vs_3v = !!gpiod_get_value(skt->stat[SOC_STAT_VS1].desc);
221 state.bvd2 = !!gpio_get_value(skt->stat[SOC_STAT_BVD2].gpio); 300 if (skt->stat[SOC_STAT_VS2].desc)
301 state.vs_Xv = !!gpiod_get_value(skt->stat[SOC_STAT_VS2].desc);
222 302
223 skt->ops->socket_state(skt, &state); 303 skt->ops->socket_state(skt, &state);
224 304
@@ -257,7 +337,30 @@ static int soc_common_pcmcia_config_skt(
257 int ret; 337 int ret;
258 338
259 ret = skt->ops->configure_socket(skt, state); 339 ret = skt->ops->configure_socket(skt, state);
340 if (ret < 0) {
341 pr_err("soc_common_pcmcia: unable to configure socket %d\n",
342 skt->nr);
343 /* restore the previous state */
344 WARN_ON(skt->ops->configure_socket(skt, &skt->cs_state));
345 return ret;
346 }
347
260 if (ret == 0) { 348 if (ret == 0) {
349 struct gpio_desc *descs[2];
350 int values[2], n = 0;
351
352 if (skt->gpio_reset) {
353 descs[n] = skt->gpio_reset;
354 values[n++] = !!(state->flags & SS_RESET);
355 }
356 if (skt->gpio_bus_enable) {
357 descs[n] = skt->gpio_bus_enable;
358 values[n++] = !!(state->flags & SS_OUTPUT_ENA);
359 }
360
361 if (n)
362 gpiod_set_array_value_cansleep(n, descs, values);
363
261 /* 364 /*
262 * This really needs a better solution. The IRQ 365 * This really needs a better solution. The IRQ
263 * may or may not be claimed by the driver. 366 * may or may not be claimed by the driver.
@@ -274,10 +377,6 @@ static int soc_common_pcmcia_config_skt(
274 skt->cs_state = *state; 377 skt->cs_state = *state;
275 } 378 }
276 379
277 if (ret < 0)
278 printk(KERN_ERR "soc_common_pcmcia: unable to configure "
279 "socket %d\n", skt->nr);
280
281 return ret; 380 return ret;
282} 381}
283 382
@@ -637,54 +736,19 @@ static struct pccard_operations soc_common_pcmcia_operations = {
637}; 736};
638 737
639 738
640static LIST_HEAD(soc_pcmcia_sockets);
641static DEFINE_MUTEX(soc_pcmcia_sockets_lock);
642
643#ifdef CONFIG_CPU_FREQ 739#ifdef CONFIG_CPU_FREQ
644static int 740static int soc_common_pcmcia_cpufreq_nb(struct notifier_block *nb,
645soc_pcmcia_notifier(struct notifier_block *nb, unsigned long val, void *data) 741 unsigned long val, void *data)
646{ 742{
647 struct soc_pcmcia_socket *skt; 743 struct soc_pcmcia_socket *skt = container_of(nb, struct soc_pcmcia_socket, cpufreq_nb);
648 struct cpufreq_freqs *freqs = data; 744 struct cpufreq_freqs *freqs = data;
649 int ret = 0;
650
651 mutex_lock(&soc_pcmcia_sockets_lock);
652 list_for_each_entry(skt, &soc_pcmcia_sockets, node)
653 if (skt->ops->frequency_change)
654 ret += skt->ops->frequency_change(skt, val, freqs);
655 mutex_unlock(&soc_pcmcia_sockets_lock);
656
657 return ret;
658}
659
660static struct notifier_block soc_pcmcia_notifier_block = {
661 .notifier_call = soc_pcmcia_notifier
662};
663
664static int soc_pcmcia_cpufreq_register(void)
665{
666 int ret;
667 745
668 ret = cpufreq_register_notifier(&soc_pcmcia_notifier_block, 746 return skt->ops->frequency_change(skt, val, freqs);
669 CPUFREQ_TRANSITION_NOTIFIER);
670 if (ret < 0)
671 printk(KERN_ERR "Unable to register CPU frequency change "
672 "notifier for PCMCIA (%d)\n", ret);
673 return ret;
674} 747}
675fs_initcall(soc_pcmcia_cpufreq_register);
676
677static void soc_pcmcia_cpufreq_unregister(void)
678{
679 cpufreq_unregister_notifier(&soc_pcmcia_notifier_block,
680 CPUFREQ_TRANSITION_NOTIFIER);
681}
682module_exit(soc_pcmcia_cpufreq_unregister);
683
684#endif 748#endif
685 749
686void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt, 750void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt,
687 struct pcmcia_low_level *ops, struct device *dev) 751 const struct pcmcia_low_level *ops, struct device *dev)
688{ 752{
689 int i; 753 int i;
690 754
@@ -700,19 +764,21 @@ EXPORT_SYMBOL(soc_pcmcia_init_one);
700 764
701void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt) 765void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt)
702{ 766{
703 mutex_lock(&soc_pcmcia_sockets_lock);
704 del_timer_sync(&skt->poll_timer); 767 del_timer_sync(&skt->poll_timer);
705 768
706 pcmcia_unregister_socket(&skt->socket); 769 pcmcia_unregister_socket(&skt->socket);
707 770
771#ifdef CONFIG_CPU_FREQ
772 if (skt->ops->frequency_change)
773 cpufreq_unregister_notifier(&skt->cpufreq_nb,
774 CPUFREQ_TRANSITION_NOTIFIER);
775#endif
776
708 soc_pcmcia_hw_shutdown(skt); 777 soc_pcmcia_hw_shutdown(skt);
709 778
710 /* should not be required; violates some lowlevel drivers */ 779 /* should not be required; violates some lowlevel drivers */
711 soc_common_pcmcia_config_skt(skt, &dead_socket); 780 soc_common_pcmcia_config_skt(skt, &dead_socket);
712 781
713 list_del(&skt->node);
714 mutex_unlock(&soc_pcmcia_sockets_lock);
715
716 iounmap(skt->virt_io); 782 iounmap(skt->virt_io);
717 skt->virt_io = NULL; 783 skt->virt_io = NULL;
718 release_resource(&skt->res_attr); 784 release_resource(&skt->res_attr);
@@ -726,6 +792,8 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
726{ 792{
727 int ret; 793 int ret;
728 794
795 skt->cs_state = dead_socket;
796
729 setup_timer(&skt->poll_timer, soc_common_pcmcia_poll_event, 797 setup_timer(&skt->poll_timer, soc_common_pcmcia_poll_event,
730 (unsigned long)skt); 798 (unsigned long)skt);
731 skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD; 799 skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
@@ -752,10 +820,6 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
752 goto out_err_5; 820 goto out_err_5;
753 } 821 }
754 822
755 mutex_lock(&soc_pcmcia_sockets_lock);
756
757 list_add(&skt->node, &soc_pcmcia_sockets);
758
759 /* 823 /*
760 * We initialize default socket timing here, because 824 * We initialize default socket timing here, because
761 * we are not guaranteed to see a SetIOMap operation at 825 * we are not guaranteed to see a SetIOMap operation at
@@ -776,14 +840,23 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
776 840
777 skt->status = soc_common_pcmcia_skt_state(skt); 841 skt->status = soc_common_pcmcia_skt_state(skt);
778 842
843#ifdef CONFIG_CPU_FREQ
844 if (skt->ops->frequency_change) {
845 skt->cpufreq_nb.notifier_call = soc_common_pcmcia_cpufreq_nb;
846
847 ret = cpufreq_register_notifier(&skt->cpufreq_nb,
848 CPUFREQ_TRANSITION_NOTIFIER);
849 if (ret < 0)
850 dev_err(skt->socket.dev.parent,
851 "unable to register CPU frequency change notifier for PCMCIA (%d)\n",
852 ret);
853 }
854#endif
855
779 ret = pcmcia_register_socket(&skt->socket); 856 ret = pcmcia_register_socket(&skt->socket);
780 if (ret) 857 if (ret)
781 goto out_err_7; 858 goto out_err_7;
782 859
783 add_timer(&skt->poll_timer);
784
785 mutex_unlock(&soc_pcmcia_sockets_lock);
786
787 ret = device_create_file(&skt->socket.dev, &dev_attr_status); 860 ret = device_create_file(&skt->socket.dev, &dev_attr_status);
788 if (ret) 861 if (ret)
789 goto out_err_8; 862 goto out_err_8;
@@ -791,15 +864,12 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
791 return ret; 864 return ret;
792 865
793 out_err_8: 866 out_err_8:
794 mutex_lock(&soc_pcmcia_sockets_lock);
795 del_timer_sync(&skt->poll_timer); 867 del_timer_sync(&skt->poll_timer);
796 pcmcia_unregister_socket(&skt->socket); 868 pcmcia_unregister_socket(&skt->socket);
797 869
798 out_err_7: 870 out_err_7:
799 soc_pcmcia_hw_shutdown(skt); 871 soc_pcmcia_hw_shutdown(skt);
800 out_err_6: 872 out_err_6:
801 list_del(&skt->node);
802 mutex_unlock(&soc_pcmcia_sockets_lock);
803 iounmap(skt->virt_io); 873 iounmap(skt->virt_io);
804 out_err_5: 874 out_err_5:
805 release_resource(&skt->res_attr); 875 release_resource(&skt->res_attr);
diff --git a/drivers/pcmcia/soc_common.h b/drivers/pcmcia/soc_common.h
index 94762a54d731..3f3625805353 100644
--- a/drivers/pcmcia/soc_common.h
+++ b/drivers/pcmcia/soc_common.h
@@ -17,7 +17,14 @@
17 17
18 18
19struct device; 19struct device;
20struct gpio_desc;
20struct pcmcia_low_level; 21struct pcmcia_low_level;
22struct regulator;
23
24struct soc_pcmcia_regulator {
25 struct regulator *reg;
26 bool on;
27};
21 28
22/* 29/*
23 * This structure encapsulates per-socket state which we might need to 30 * This structure encapsulates per-socket state which we might need to
@@ -52,18 +59,30 @@ struct soc_pcmcia_socket {
52 59
53 struct { 60 struct {
54 int gpio; 61 int gpio;
62 struct gpio_desc *desc;
55 unsigned int irq; 63 unsigned int irq;
56 const char *name; 64 const char *name;
57 } stat[4]; 65 } stat[6];
58#define SOC_STAT_CD 0 /* Card detect */ 66#define SOC_STAT_CD 0 /* Card detect */
59#define SOC_STAT_BVD1 1 /* BATDEAD / IOSTSCHG */ 67#define SOC_STAT_BVD1 1 /* BATDEAD / IOSTSCHG */
60#define SOC_STAT_BVD2 2 /* BATWARN / IOSPKR */ 68#define SOC_STAT_BVD2 2 /* BATWARN / IOSPKR */
61#define SOC_STAT_RDY 3 /* Ready / Interrupt */ 69#define SOC_STAT_RDY 3 /* Ready / Interrupt */
70#define SOC_STAT_VS1 4 /* Voltage sense 1 */
71#define SOC_STAT_VS2 5 /* Voltage sense 2 */
72
73 struct gpio_desc *gpio_reset;
74 struct gpio_desc *gpio_bus_enable;
75 struct soc_pcmcia_regulator vcc;
76 struct soc_pcmcia_regulator vpp;
62 77
63 unsigned int irq_state; 78 unsigned int irq_state;
64 79
80#ifdef CONFIG_CPU_FREQ
81 struct notifier_block cpufreq_nb;
82#endif
65 struct timer_list poll_timer; 83 struct timer_list poll_timer;
66 struct list_head node; 84 struct list_head node;
85 void *driver_data;
67}; 86};
68 87
69struct skt_dev_info { 88struct skt_dev_info {
@@ -133,10 +152,16 @@ struct soc_pcmcia_timing {
133extern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_pcmcia_timing *); 152extern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_pcmcia_timing *);
134 153
135void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt, 154void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt,
136 struct pcmcia_low_level *ops, struct device *dev); 155 const struct pcmcia_low_level *ops, struct device *dev);
137void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt); 156void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt);
138int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt); 157int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt);
158int soc_pcmcia_request_gpiods(struct soc_pcmcia_socket *skt);
159
160void soc_common_cf_socket_state(struct soc_pcmcia_socket *skt,
161 struct pcmcia_state *state);
139 162
163int soc_pcmcia_regulator_set(struct soc_pcmcia_socket *skt,
164 struct soc_pcmcia_regulator *r, int v);
140 165
141#ifdef CONFIG_PCMCIA_DEBUG 166#ifdef CONFIG_PCMCIA_DEBUG
142 167