1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <linux/cpufreq.h>
35#include <linux/gpio.h>
36#include <linux/gpio/consumer.h>
37#include <linux/init.h>
38#include <linux/interrupt.h>
39#include <linux/io.h>
40#include <linux/irq.h>
41#include <linux/kernel.h>
42#include <linux/mm.h>
43#include <linux/module.h>
44#include <linux/moduleparam.h>
45#include <linux/mutex.h>
46#include <linux/regulator/consumer.h>
47#include <linux/spinlock.h>
48#include <linux/timer.h>
49
50#include <mach/hardware.h>
51
52#include "soc_common.h"
53
54static irqreturn_t soc_common_pcmcia_interrupt(int irq, void *dev);
55
56#ifdef CONFIG_PCMCIA_DEBUG
57
58static int pc_debug;
59module_param(pc_debug, int, 0644);
60
61void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func,
62 int lvl, const char *fmt, ...)
63{
64 struct va_format vaf;
65 va_list args;
66 if (pc_debug > lvl) {
67 va_start(args, fmt);
68
69 vaf.fmt = fmt;
70 vaf.va = &args;
71
72 printk(KERN_DEBUG "skt%u: %s: %pV", skt->nr, func, &vaf);
73
74 va_end(args);
75 }
76}
77EXPORT_SYMBOL(soc_pcmcia_debug);
78
79#endif
80
81#define to_soc_pcmcia_socket(x) \
82 container_of(x, struct soc_pcmcia_socket, socket)
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 ret = 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
119static unsigned short
120calc_speed(unsigned short *spds, int num, unsigned short dflt)
121{
122 unsigned short speed = 0;
123 int i;
124
125 for (i = 0; i < num; i++)
126 if (speed < spds[i])
127 speed = spds[i];
128 if (speed == 0)
129 speed = dflt;
130
131 return speed;
132}
133
134void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *skt,
135 struct soc_pcmcia_timing *timing)
136{
137 timing->io =
138 calc_speed(skt->spd_io, MAX_IO_WIN, SOC_PCMCIA_IO_ACCESS);
139 timing->mem =
140 calc_speed(skt->spd_mem, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS);
141 timing->attr =
142 calc_speed(skt->spd_attr, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS);
143}
144EXPORT_SYMBOL(soc_common_pcmcia_get_timing);
145
146static void __soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt,
147 unsigned int nr)
148{
149 unsigned int i;
150
151 for (i = 0; i < nr; i++)
152 if (skt->stat[i].irq)
153 free_irq(skt->stat[i].irq, skt);
154
155 if (skt->ops->hw_shutdown)
156 skt->ops->hw_shutdown(skt);
157
158 clk_disable_unprepare(skt->clk);
159}
160
161static void soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
162{
163 __soc_pcmcia_hw_shutdown(skt, ARRAY_SIZE(skt->stat));
164}
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
190static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
191{
192 int ret = 0, i;
193
194 ret = clk_prepare_enable(skt->clk);
195 if (ret)
196 return ret;
197
198 if (skt->ops->hw_init) {
199 ret = skt->ops->hw_init(skt);
200 if (ret) {
201 clk_disable_unprepare(skt->clk);
202 return ret;
203 }
204 }
205
206 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) {
207 if (gpio_is_valid(skt->stat[i].gpio)) {
208 unsigned long flags = GPIOF_IN;
209
210
211 if (i == SOC_STAT_CD)
212 flags |= GPIOF_ACTIVE_LOW;
213
214 ret = devm_gpio_request_one(skt->socket.dev.parent,
215 skt->stat[i].gpio, flags,
216 skt->stat[i].name);
217 if (ret) {
218 __soc_pcmcia_hw_shutdown(skt, i);
219 return ret;
220 }
221
222 skt->stat[i].desc = gpio_to_desc(skt->stat[i].gpio);
223 }
224
225 if (i < SOC_STAT_VS1 && skt->stat[i].desc) {
226 int irq = gpiod_to_irq(skt->stat[i].desc);
227
228 if (irq > 0) {
229 if (i == SOC_STAT_RDY)
230 skt->socket.pci_irq = irq;
231 else
232 skt->stat[i].irq = irq;
233 }
234 }
235
236 if (skt->stat[i].irq) {
237 ret = request_irq(skt->stat[i].irq,
238 soc_common_pcmcia_interrupt,
239 IRQF_TRIGGER_NONE,
240 skt->stat[i].name, skt);
241 if (ret) {
242 __soc_pcmcia_hw_shutdown(skt, i);
243 return ret;
244 }
245 }
246 }
247
248 return ret;
249}
250
251static void soc_pcmcia_hw_enable(struct soc_pcmcia_socket *skt)
252{
253 int i;
254
255 for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
256 if (skt->stat[i].irq) {
257 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_RISING);
258 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_BOTH);
259 }
260}
261
262static void soc_pcmcia_hw_disable(struct soc_pcmcia_socket *skt)
263{
264 int i;
265
266 for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
267 if (skt->stat[i].irq)
268 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_NONE);
269}
270
271
272
273
274
275
276void soc_common_cf_socket_state(struct soc_pcmcia_socket *skt,
277 struct pcmcia_state *state)
278{
279 state->vs_3v = 1;
280}
281EXPORT_SYMBOL_GPL(soc_common_cf_socket_state);
282
283static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt)
284{
285 struct pcmcia_state state;
286 unsigned int stat;
287
288 memset(&state, 0, sizeof(struct pcmcia_state));
289
290
291 state.bvd1 = 1;
292 state.bvd2 = 1;
293
294 if (skt->stat[SOC_STAT_CD].desc)
295 state.detect = !!gpiod_get_value(skt->stat[SOC_STAT_CD].desc);
296 if (skt->stat[SOC_STAT_RDY].desc)
297 state.ready = !!gpiod_get_value(skt->stat[SOC_STAT_RDY].desc);
298 if (skt->stat[SOC_STAT_BVD1].desc)
299 state.bvd1 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD1].desc);
300 if (skt->stat[SOC_STAT_BVD2].desc)
301 state.bvd2 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD2].desc);
302 if (skt->stat[SOC_STAT_VS1].desc)
303 state.vs_3v = !!gpiod_get_value(skt->stat[SOC_STAT_VS1].desc);
304 if (skt->stat[SOC_STAT_VS2].desc)
305 state.vs_Xv = !!gpiod_get_value(skt->stat[SOC_STAT_VS2].desc);
306
307 skt->ops->socket_state(skt, &state);
308
309 stat = state.detect ? SS_DETECT : 0;
310 stat |= state.ready ? SS_READY : 0;
311 stat |= state.wrprot ? SS_WRPROT : 0;
312 stat |= state.vs_3v ? SS_3VCARD : 0;
313 stat |= state.vs_Xv ? SS_XVCARD : 0;
314
315
316
317
318
319 stat |= skt->cs_state.Vcc ? SS_POWERON : 0;
320
321 if (skt->cs_state.flags & SS_IOCARD)
322 stat |= state.bvd1 ? 0 : SS_STSCHG;
323 else {
324 if (state.bvd1 == 0)
325 stat |= SS_BATDEAD;
326 else if (state.bvd2 == 0)
327 stat |= SS_BATWARN;
328 }
329 return stat;
330}
331
332
333
334
335
336
337
338static int soc_common_pcmcia_config_skt(
339 struct soc_pcmcia_socket *skt, socket_state_t *state)
340{
341 int ret;
342
343 ret = skt->ops->configure_socket(skt, state);
344 if (ret < 0) {
345 pr_err("soc_common_pcmcia: unable to configure socket %d\n",
346 skt->nr);
347
348 WARN_ON(skt->ops->configure_socket(skt, &skt->cs_state));
349 return ret;
350 }
351
352 if (ret == 0) {
353 struct gpio_desc *descs[2];
354 DECLARE_BITMAP(values, 2);
355 int n = 0;
356
357 if (skt->gpio_reset) {
358 descs[n] = skt->gpio_reset;
359 __assign_bit(n++, values, state->flags & SS_RESET);
360 }
361 if (skt->gpio_bus_enable) {
362 descs[n] = skt->gpio_bus_enable;
363 __assign_bit(n++, values, state->flags & SS_OUTPUT_ENA);
364 }
365
366 if (n)
367 gpiod_set_array_value_cansleep(n, descs, NULL, values);
368
369
370
371
372
373 if (skt->irq_state != 1 && state->io_irq) {
374 skt->irq_state = 1;
375 irq_set_irq_type(skt->socket.pci_irq,
376 IRQ_TYPE_EDGE_FALLING);
377 } else if (skt->irq_state == 1 && state->io_irq == 0) {
378 skt->irq_state = 0;
379 irq_set_irq_type(skt->socket.pci_irq, IRQ_TYPE_NONE);
380 }
381
382 skt->cs_state = *state;
383 }
384
385 return ret;
386}
387
388
389
390
391
392
393
394
395
396
397static int soc_common_pcmcia_sock_init(struct pcmcia_socket *sock)
398{
399 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
400
401 debug(skt, 2, "initializing socket\n");
402 if (skt->ops->socket_init)
403 skt->ops->socket_init(skt);
404 soc_pcmcia_hw_enable(skt);
405 return 0;
406}
407
408
409
410
411
412
413
414
415
416
417
418static int soc_common_pcmcia_suspend(struct pcmcia_socket *sock)
419{
420 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
421
422 debug(skt, 2, "suspending socket\n");
423
424 soc_pcmcia_hw_disable(skt);
425 if (skt->ops->socket_suspend)
426 skt->ops->socket_suspend(skt);
427
428 return 0;
429}
430
431static DEFINE_SPINLOCK(status_lock);
432
433static void soc_common_check_status(struct soc_pcmcia_socket *skt)
434{
435 unsigned int events;
436
437 debug(skt, 4, "entering PCMCIA monitoring thread\n");
438
439 do {
440 unsigned int status;
441 unsigned long flags;
442
443 status = soc_common_pcmcia_skt_state(skt);
444
445 spin_lock_irqsave(&status_lock, flags);
446 events = (status ^ skt->status) & skt->cs_state.csc_mask;
447 skt->status = status;
448 spin_unlock_irqrestore(&status_lock, flags);
449
450 debug(skt, 4, "events: %s%s%s%s%s%s\n",
451 events == 0 ? "<NONE>" : "",
452 events & SS_DETECT ? "DETECT " : "",
453 events & SS_READY ? "READY " : "",
454 events & SS_BATDEAD ? "BATDEAD " : "",
455 events & SS_BATWARN ? "BATWARN " : "",
456 events & SS_STSCHG ? "STSCHG " : "");
457
458 if (events)
459 pcmcia_parse_events(&skt->socket, events);
460 } while (events);
461}
462
463
464static void soc_common_pcmcia_poll_event(struct timer_list *t)
465{
466 struct soc_pcmcia_socket *skt = from_timer(skt, t, poll_timer);
467 debug(skt, 4, "polling for events\n");
468
469 mod_timer(&skt->poll_timer, jiffies + SOC_PCMCIA_POLL_PERIOD);
470
471 soc_common_check_status(skt);
472}
473
474
475
476
477
478
479
480
481
482
483static irqreturn_t soc_common_pcmcia_interrupt(int irq, void *dev)
484{
485 struct soc_pcmcia_socket *skt = dev;
486
487 debug(skt, 3, "servicing IRQ %d\n", irq);
488
489 soc_common_check_status(skt);
490
491 return IRQ_HANDLED;
492}
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510static int
511soc_common_pcmcia_get_status(struct pcmcia_socket *sock, unsigned int *status)
512{
513 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
514
515 skt->status = soc_common_pcmcia_skt_state(skt);
516 *status = skt->status;
517
518 return 0;
519}
520
521
522
523
524
525
526
527
528
529static int soc_common_pcmcia_set_socket(
530 struct pcmcia_socket *sock, socket_state_t *state)
531{
532 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
533
534 debug(skt, 2, "mask: %s%s%s%s%s%s flags: %s%s%s%s%s%s Vcc %d Vpp %d irq %d\n",
535 (state->csc_mask == 0) ? "<NONE> " : "",
536 (state->csc_mask & SS_DETECT) ? "DETECT " : "",
537 (state->csc_mask & SS_READY) ? "READY " : "",
538 (state->csc_mask & SS_BATDEAD) ? "BATDEAD " : "",
539 (state->csc_mask & SS_BATWARN) ? "BATWARN " : "",
540 (state->csc_mask & SS_STSCHG) ? "STSCHG " : "",
541 (state->flags == 0) ? "<NONE> " : "",
542 (state->flags & SS_PWR_AUTO) ? "PWR_AUTO " : "",
543 (state->flags & SS_IOCARD) ? "IOCARD " : "",
544 (state->flags & SS_RESET) ? "RESET " : "",
545 (state->flags & SS_SPKR_ENA) ? "SPKR_ENA " : "",
546 (state->flags & SS_OUTPUT_ENA) ? "OUTPUT_ENA " : "",
547 state->Vcc, state->Vpp, state->io_irq);
548
549 return soc_common_pcmcia_config_skt(skt, state);
550}
551
552
553
554
555
556
557
558
559
560
561static int soc_common_pcmcia_set_io_map(
562 struct pcmcia_socket *sock, struct pccard_io_map *map)
563{
564 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
565 unsigned short speed = map->speed;
566
567 debug(skt, 2, "map %u speed %u start 0x%08llx stop 0x%08llx\n",
568 map->map, map->speed, (unsigned long long)map->start,
569 (unsigned long long)map->stop);
570 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n",
571 (map->flags == 0) ? "<NONE>" : "",
572 (map->flags & MAP_ACTIVE) ? "ACTIVE " : "",
573 (map->flags & MAP_16BIT) ? "16BIT " : "",
574 (map->flags & MAP_AUTOSZ) ? "AUTOSZ " : "",
575 (map->flags & MAP_0WS) ? "0WS " : "",
576 (map->flags & MAP_WRPROT) ? "WRPROT " : "",
577 (map->flags & MAP_USE_WAIT) ? "USE_WAIT " : "",
578 (map->flags & MAP_PREFETCH) ? "PREFETCH " : "");
579
580 if (map->map >= MAX_IO_WIN) {
581 printk(KERN_ERR "%s(): map (%d) out of range\n", __func__,
582 map->map);
583 return -1;
584 }
585
586 if (map->flags & MAP_ACTIVE) {
587 if (speed == 0)
588 speed = SOC_PCMCIA_IO_ACCESS;
589 } else {
590 speed = 0;
591 }
592
593 skt->spd_io[map->map] = speed;
594 skt->ops->set_timing(skt);
595
596 if (map->stop == 1)
597 map->stop = PAGE_SIZE-1;
598
599 map->stop -= map->start;
600 map->stop += skt->socket.io_offset;
601 map->start = skt->socket.io_offset;
602
603 return 0;
604}
605
606
607
608
609
610
611
612
613
614
615static int soc_common_pcmcia_set_mem_map(
616 struct pcmcia_socket *sock, struct pccard_mem_map *map)
617{
618 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
619 struct resource *res;
620 unsigned short speed = map->speed;
621
622 debug(skt, 2, "map %u speed %u card_start %08x\n",
623 map->map, map->speed, map->card_start);
624 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n",
625 (map->flags == 0) ? "<NONE>" : "",
626 (map->flags & MAP_ACTIVE) ? "ACTIVE " : "",
627 (map->flags & MAP_16BIT) ? "16BIT " : "",
628 (map->flags & MAP_AUTOSZ) ? "AUTOSZ " : "",
629 (map->flags & MAP_0WS) ? "0WS " : "",
630 (map->flags & MAP_WRPROT) ? "WRPROT " : "",
631 (map->flags & MAP_ATTRIB) ? "ATTRIB " : "",
632 (map->flags & MAP_USE_WAIT) ? "USE_WAIT " : "");
633
634 if (map->map >= MAX_WIN)
635 return -EINVAL;
636
637 if (map->flags & MAP_ACTIVE) {
638 if (speed == 0)
639 speed = 300;
640 } else {
641 speed = 0;
642 }
643
644 if (map->flags & MAP_ATTRIB) {
645 res = &skt->res_attr;
646 skt->spd_attr[map->map] = speed;
647 skt->spd_mem[map->map] = 0;
648 } else {
649 res = &skt->res_mem;
650 skt->spd_attr[map->map] = 0;
651 skt->spd_mem[map->map] = speed;
652 }
653
654 skt->ops->set_timing(skt);
655
656 map->static_start = res->start + map->card_start;
657
658 return 0;
659}
660
661struct bittbl {
662 unsigned int mask;
663 const char *name;
664};
665
666static struct bittbl status_bits[] = {
667 { SS_WRPROT, "SS_WRPROT" },
668 { SS_BATDEAD, "SS_BATDEAD" },
669 { SS_BATWARN, "SS_BATWARN" },
670 { SS_READY, "SS_READY" },
671 { SS_DETECT, "SS_DETECT" },
672 { SS_POWERON, "SS_POWERON" },
673 { SS_STSCHG, "SS_STSCHG" },
674 { SS_3VCARD, "SS_3VCARD" },
675 { SS_XVCARD, "SS_XVCARD" },
676};
677
678static struct bittbl conf_bits[] = {
679 { SS_PWR_AUTO, "SS_PWR_AUTO" },
680 { SS_IOCARD, "SS_IOCARD" },
681 { SS_RESET, "SS_RESET" },
682 { SS_DMA_MODE, "SS_DMA_MODE" },
683 { SS_SPKR_ENA, "SS_SPKR_ENA" },
684 { SS_OUTPUT_ENA, "SS_OUTPUT_ENA" },
685};
686
687static void dump_bits(char **p, const char *prefix,
688 unsigned int val, struct bittbl *bits, int sz)
689{
690 char *b = *p;
691 int i;
692
693 b += sprintf(b, "%-9s:", prefix);
694 for (i = 0; i < sz; i++)
695 if (val & bits[i].mask)
696 b += sprintf(b, " %s", bits[i].name);
697 *b++ = '\n';
698 *p = b;
699}
700
701
702
703
704
705
706static ssize_t show_status(
707 struct device *dev, struct device_attribute *attr, char *buf)
708{
709 struct soc_pcmcia_socket *skt =
710 container_of(dev, struct soc_pcmcia_socket, socket.dev);
711 char *p = buf;
712
713 p += sprintf(p, "slot : %d\n", skt->nr);
714
715 dump_bits(&p, "status", skt->status,
716 status_bits, ARRAY_SIZE(status_bits));
717 dump_bits(&p, "csc_mask", skt->cs_state.csc_mask,
718 status_bits, ARRAY_SIZE(status_bits));
719 dump_bits(&p, "cs_flags", skt->cs_state.flags,
720 conf_bits, ARRAY_SIZE(conf_bits));
721
722 p += sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc);
723 p += sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp);
724 p += sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq,
725 skt->socket.pci_irq);
726 if (skt->ops->show_timing)
727 p += skt->ops->show_timing(skt, p);
728
729 return p-buf;
730}
731static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
732
733
734static struct pccard_operations soc_common_pcmcia_operations = {
735 .init = soc_common_pcmcia_sock_init,
736 .suspend = soc_common_pcmcia_suspend,
737 .get_status = soc_common_pcmcia_get_status,
738 .set_socket = soc_common_pcmcia_set_socket,
739 .set_io_map = soc_common_pcmcia_set_io_map,
740 .set_mem_map = soc_common_pcmcia_set_mem_map,
741};
742
743
744#ifdef CONFIG_CPU_FREQ
745static int soc_common_pcmcia_cpufreq_nb(struct notifier_block *nb,
746 unsigned long val, void *data)
747{
748 struct soc_pcmcia_socket *skt = container_of(nb, struct soc_pcmcia_socket, cpufreq_nb);
749 struct cpufreq_freqs *freqs = data;
750
751 return skt->ops->frequency_change(skt, val, freqs);
752}
753#endif
754
755void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt,
756 const struct pcmcia_low_level *ops, struct device *dev)
757{
758 int i;
759
760 skt->ops = ops;
761 skt->socket.owner = ops->owner;
762 skt->socket.dev.parent = dev;
763 skt->socket.pci_irq = NO_IRQ;
764
765 for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
766 skt->stat[i].gpio = -EINVAL;
767}
768EXPORT_SYMBOL(soc_pcmcia_init_one);
769
770void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt)
771{
772 del_timer_sync(&skt->poll_timer);
773
774 pcmcia_unregister_socket(&skt->socket);
775
776#ifdef CONFIG_CPU_FREQ
777 if (skt->ops->frequency_change)
778 cpufreq_unregister_notifier(&skt->cpufreq_nb,
779 CPUFREQ_TRANSITION_NOTIFIER);
780#endif
781
782 soc_pcmcia_hw_shutdown(skt);
783
784
785 soc_common_pcmcia_config_skt(skt, &dead_socket);
786
787 iounmap(skt->virt_io);
788 skt->virt_io = NULL;
789 release_resource(&skt->res_attr);
790 release_resource(&skt->res_mem);
791 release_resource(&skt->res_io);
792 release_resource(&skt->res_skt);
793}
794EXPORT_SYMBOL(soc_pcmcia_remove_one);
795
796int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
797{
798 int ret;
799
800 skt->cs_state = dead_socket;
801
802 timer_setup(&skt->poll_timer, soc_common_pcmcia_poll_event, 0);
803 skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
804
805 ret = request_resource(&iomem_resource, &skt->res_skt);
806 if (ret)
807 goto out_err_1;
808
809 ret = request_resource(&skt->res_skt, &skt->res_io);
810 if (ret)
811 goto out_err_2;
812
813 ret = request_resource(&skt->res_skt, &skt->res_mem);
814 if (ret)
815 goto out_err_3;
816
817 ret = request_resource(&skt->res_skt, &skt->res_attr);
818 if (ret)
819 goto out_err_4;
820
821 skt->virt_io = ioremap(skt->res_io.start, 0x10000);
822 if (skt->virt_io == NULL) {
823 ret = -ENOMEM;
824 goto out_err_5;
825 }
826
827
828
829
830
831
832 skt->ops->set_timing(skt);
833
834 ret = soc_pcmcia_hw_init(skt);
835 if (ret)
836 goto out_err_6;
837
838 skt->socket.ops = &soc_common_pcmcia_operations;
839 skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD;
840 skt->socket.resource_ops = &pccard_static_ops;
841 skt->socket.irq_mask = 0;
842 skt->socket.map_size = PAGE_SIZE;
843 skt->socket.io_offset = (unsigned long)skt->virt_io;
844
845 skt->status = soc_common_pcmcia_skt_state(skt);
846
847#ifdef CONFIG_CPU_FREQ
848 if (skt->ops->frequency_change) {
849 skt->cpufreq_nb.notifier_call = soc_common_pcmcia_cpufreq_nb;
850
851 ret = cpufreq_register_notifier(&skt->cpufreq_nb,
852 CPUFREQ_TRANSITION_NOTIFIER);
853 if (ret < 0)
854 dev_err(skt->socket.dev.parent,
855 "unable to register CPU frequency change notifier for PCMCIA (%d)\n",
856 ret);
857 }
858#endif
859
860 ret = pcmcia_register_socket(&skt->socket);
861 if (ret)
862 goto out_err_7;
863
864 ret = device_create_file(&skt->socket.dev, &dev_attr_status);
865 if (ret)
866 goto out_err_8;
867
868 return ret;
869
870 out_err_8:
871 del_timer_sync(&skt->poll_timer);
872 pcmcia_unregister_socket(&skt->socket);
873
874 out_err_7:
875 soc_pcmcia_hw_shutdown(skt);
876 out_err_6:
877 iounmap(skt->virt_io);
878 out_err_5:
879 release_resource(&skt->res_attr);
880 out_err_4:
881 release_resource(&skt->res_mem);
882 out_err_3:
883 release_resource(&skt->res_io);
884 out_err_2:
885 release_resource(&skt->res_skt);
886 out_err_1:
887
888 return ret;
889}
890EXPORT_SYMBOL(soc_pcmcia_add_one);
891
892MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
893MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support");
894MODULE_LICENSE("Dual MPL/GPL");
895