0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #include <linux/cpufreq.h>
0035 #include <linux/gpio.h>
0036 #include <linux/gpio/consumer.h>
0037 #include <linux/init.h>
0038 #include <linux/interrupt.h>
0039 #include <linux/io.h>
0040 #include <linux/irq.h>
0041 #include <linux/kernel.h>
0042 #include <linux/mm.h>
0043 #include <linux/module.h>
0044 #include <linux/moduleparam.h>
0045 #include <linux/mutex.h>
0046 #include <linux/regulator/consumer.h>
0047 #include <linux/spinlock.h>
0048 #include <linux/timer.h>
0049 #include <linux/pci.h>
0050
0051 #include "soc_common.h"
0052
0053 static irqreturn_t soc_common_pcmcia_interrupt(int irq, void *dev);
0054
0055 #ifdef CONFIG_PCMCIA_DEBUG
0056
0057 static int pc_debug;
0058 module_param(pc_debug, int, 0644);
0059
0060 void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func,
0061 int lvl, const char *fmt, ...)
0062 {
0063 struct va_format vaf;
0064 va_list args;
0065 if (pc_debug > lvl) {
0066 va_start(args, fmt);
0067
0068 vaf.fmt = fmt;
0069 vaf.va = &args;
0070
0071 printk(KERN_DEBUG "skt%u: %s: %pV", skt->nr, func, &vaf);
0072
0073 va_end(args);
0074 }
0075 }
0076 EXPORT_SYMBOL(soc_pcmcia_debug);
0077
0078 #endif
0079
0080 #define to_soc_pcmcia_socket(x) \
0081 container_of(x, struct soc_pcmcia_socket, socket)
0082
0083 int soc_pcmcia_regulator_set(struct soc_pcmcia_socket *skt,
0084 struct soc_pcmcia_regulator *r, int v)
0085 {
0086 bool on;
0087 int ret;
0088
0089 if (!r->reg)
0090 return 0;
0091
0092 on = v != 0;
0093 if (r->on == on)
0094 return 0;
0095
0096 if (on) {
0097 ret = regulator_set_voltage(r->reg, v * 100000, v * 100000);
0098 if (ret) {
0099 int vout = regulator_get_voltage(r->reg) / 100000;
0100
0101 dev_warn(&skt->socket.dev,
0102 "CS requested %s=%u.%uV, applying %u.%uV\n",
0103 r == &skt->vcc ? "Vcc" : "Vpp",
0104 v / 10, v % 10, vout / 10, vout % 10);
0105 }
0106
0107 ret = regulator_enable(r->reg);
0108 } else {
0109 ret = regulator_disable(r->reg);
0110 }
0111 if (ret == 0)
0112 r->on = on;
0113
0114 return ret;
0115 }
0116 EXPORT_SYMBOL_GPL(soc_pcmcia_regulator_set);
0117
0118 static unsigned short
0119 calc_speed(unsigned short *spds, int num, unsigned short dflt)
0120 {
0121 unsigned short speed = 0;
0122 int i;
0123
0124 for (i = 0; i < num; i++)
0125 if (speed < spds[i])
0126 speed = spds[i];
0127 if (speed == 0)
0128 speed = dflt;
0129
0130 return speed;
0131 }
0132
0133 void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *skt,
0134 struct soc_pcmcia_timing *timing)
0135 {
0136 timing->io =
0137 calc_speed(skt->spd_io, MAX_IO_WIN, SOC_PCMCIA_IO_ACCESS);
0138 timing->mem =
0139 calc_speed(skt->spd_mem, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS);
0140 timing->attr =
0141 calc_speed(skt->spd_attr, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS);
0142 }
0143 EXPORT_SYMBOL(soc_common_pcmcia_get_timing);
0144
0145 static void __soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt,
0146 unsigned int nr)
0147 {
0148 unsigned int i;
0149
0150 for (i = 0; i < nr; i++)
0151 if (skt->stat[i].irq)
0152 free_irq(skt->stat[i].irq, skt);
0153
0154 if (skt->ops->hw_shutdown)
0155 skt->ops->hw_shutdown(skt);
0156
0157 clk_disable_unprepare(skt->clk);
0158 }
0159
0160 static void soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
0161 {
0162 __soc_pcmcia_hw_shutdown(skt, ARRAY_SIZE(skt->stat));
0163 }
0164
0165 int soc_pcmcia_request_gpiods(struct soc_pcmcia_socket *skt)
0166 {
0167 struct device *dev = skt->socket.dev.parent;
0168 struct gpio_desc *desc;
0169 int i;
0170
0171 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) {
0172 if (!skt->stat[i].name)
0173 continue;
0174
0175 desc = devm_gpiod_get(dev, skt->stat[i].name, GPIOD_IN);
0176 if (IS_ERR(desc)) {
0177 dev_err(dev, "Failed to get GPIO for %s: %ld\n",
0178 skt->stat[i].name, PTR_ERR(desc));
0179 return PTR_ERR(desc);
0180 }
0181
0182 skt->stat[i].desc = desc;
0183 }
0184
0185 return 0;
0186 }
0187 EXPORT_SYMBOL_GPL(soc_pcmcia_request_gpiods);
0188
0189 static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
0190 {
0191 int ret = 0, i;
0192
0193 ret = clk_prepare_enable(skt->clk);
0194 if (ret)
0195 return ret;
0196
0197 if (skt->ops->hw_init) {
0198 ret = skt->ops->hw_init(skt);
0199 if (ret) {
0200 clk_disable_unprepare(skt->clk);
0201 return ret;
0202 }
0203 }
0204
0205 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) {
0206 if (gpio_is_valid(skt->stat[i].gpio)) {
0207 unsigned long flags = GPIOF_IN;
0208
0209
0210 if (i == SOC_STAT_CD)
0211 flags |= GPIOF_ACTIVE_LOW;
0212
0213 ret = devm_gpio_request_one(skt->socket.dev.parent,
0214 skt->stat[i].gpio, flags,
0215 skt->stat[i].name);
0216 if (ret) {
0217 __soc_pcmcia_hw_shutdown(skt, i);
0218 return ret;
0219 }
0220
0221 skt->stat[i].desc = gpio_to_desc(skt->stat[i].gpio);
0222 }
0223
0224 if (i < SOC_STAT_VS1 && skt->stat[i].desc) {
0225 int irq = gpiod_to_irq(skt->stat[i].desc);
0226
0227 if (irq > 0) {
0228 if (i == SOC_STAT_RDY)
0229 skt->socket.pci_irq = irq;
0230 else
0231 skt->stat[i].irq = irq;
0232 }
0233 }
0234
0235 if (skt->stat[i].irq) {
0236 ret = request_irq(skt->stat[i].irq,
0237 soc_common_pcmcia_interrupt,
0238 IRQF_TRIGGER_NONE,
0239 skt->stat[i].name, skt);
0240 if (ret) {
0241 __soc_pcmcia_hw_shutdown(skt, i);
0242 return ret;
0243 }
0244 }
0245 }
0246
0247 return ret;
0248 }
0249
0250 static void soc_pcmcia_hw_enable(struct soc_pcmcia_socket *skt)
0251 {
0252 int i;
0253
0254 for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
0255 if (skt->stat[i].irq) {
0256 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_RISING);
0257 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_BOTH);
0258 }
0259 }
0260
0261 static void soc_pcmcia_hw_disable(struct soc_pcmcia_socket *skt)
0262 {
0263 int i;
0264
0265 for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
0266 if (skt->stat[i].irq)
0267 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_NONE);
0268 }
0269
0270
0271
0272
0273
0274
0275 void soc_common_cf_socket_state(struct soc_pcmcia_socket *skt,
0276 struct pcmcia_state *state)
0277 {
0278 state->vs_3v = 1;
0279 }
0280 EXPORT_SYMBOL_GPL(soc_common_cf_socket_state);
0281
0282 static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt)
0283 {
0284 struct pcmcia_state state;
0285 unsigned int stat;
0286
0287 memset(&state, 0, sizeof(struct pcmcia_state));
0288
0289
0290 state.bvd1 = 1;
0291 state.bvd2 = 1;
0292
0293 if (skt->stat[SOC_STAT_CD].desc)
0294 state.detect = !!gpiod_get_value(skt->stat[SOC_STAT_CD].desc);
0295 if (skt->stat[SOC_STAT_RDY].desc)
0296 state.ready = !!gpiod_get_value(skt->stat[SOC_STAT_RDY].desc);
0297 if (skt->stat[SOC_STAT_BVD1].desc)
0298 state.bvd1 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD1].desc);
0299 if (skt->stat[SOC_STAT_BVD2].desc)
0300 state.bvd2 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD2].desc);
0301 if (skt->stat[SOC_STAT_VS1].desc)
0302 state.vs_3v = !!gpiod_get_value(skt->stat[SOC_STAT_VS1].desc);
0303 if (skt->stat[SOC_STAT_VS2].desc)
0304 state.vs_Xv = !!gpiod_get_value(skt->stat[SOC_STAT_VS2].desc);
0305
0306 skt->ops->socket_state(skt, &state);
0307
0308 stat = state.detect ? SS_DETECT : 0;
0309 stat |= state.ready ? SS_READY : 0;
0310 stat |= state.wrprot ? SS_WRPROT : 0;
0311 stat |= state.vs_3v ? SS_3VCARD : 0;
0312 stat |= state.vs_Xv ? SS_XVCARD : 0;
0313
0314
0315
0316
0317
0318 stat |= skt->cs_state.Vcc ? SS_POWERON : 0;
0319
0320 if (skt->cs_state.flags & SS_IOCARD)
0321 stat |= state.bvd1 ? 0 : SS_STSCHG;
0322 else {
0323 if (state.bvd1 == 0)
0324 stat |= SS_BATDEAD;
0325 else if (state.bvd2 == 0)
0326 stat |= SS_BATWARN;
0327 }
0328 return stat;
0329 }
0330
0331
0332
0333
0334
0335
0336
0337 static int soc_common_pcmcia_config_skt(
0338 struct soc_pcmcia_socket *skt, socket_state_t *state)
0339 {
0340 int ret;
0341
0342 ret = skt->ops->configure_socket(skt, state);
0343 if (ret < 0) {
0344 pr_err("soc_common_pcmcia: unable to configure socket %d\n",
0345 skt->nr);
0346
0347 WARN_ON(skt->ops->configure_socket(skt, &skt->cs_state));
0348 return ret;
0349 }
0350
0351 if (ret == 0) {
0352 struct gpio_desc *descs[2];
0353 DECLARE_BITMAP(values, 2);
0354 int n = 0;
0355
0356 if (skt->gpio_reset) {
0357 descs[n] = skt->gpio_reset;
0358 __assign_bit(n++, values, state->flags & SS_RESET);
0359 }
0360 if (skt->gpio_bus_enable) {
0361 descs[n] = skt->gpio_bus_enable;
0362 __assign_bit(n++, values, state->flags & SS_OUTPUT_ENA);
0363 }
0364
0365 if (n)
0366 gpiod_set_array_value_cansleep(n, descs, NULL, values);
0367
0368
0369
0370
0371
0372 if (skt->irq_state != 1 && state->io_irq) {
0373 skt->irq_state = 1;
0374 irq_set_irq_type(skt->socket.pci_irq,
0375 IRQ_TYPE_EDGE_FALLING);
0376 } else if (skt->irq_state == 1 && state->io_irq == 0) {
0377 skt->irq_state = 0;
0378 irq_set_irq_type(skt->socket.pci_irq, IRQ_TYPE_NONE);
0379 }
0380
0381 skt->cs_state = *state;
0382 }
0383
0384 return ret;
0385 }
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396 static int soc_common_pcmcia_sock_init(struct pcmcia_socket *sock)
0397 {
0398 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
0399
0400 debug(skt, 2, "initializing socket\n");
0401 if (skt->ops->socket_init)
0402 skt->ops->socket_init(skt);
0403 soc_pcmcia_hw_enable(skt);
0404 return 0;
0405 }
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417 static int soc_common_pcmcia_suspend(struct pcmcia_socket *sock)
0418 {
0419 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
0420
0421 debug(skt, 2, "suspending socket\n");
0422
0423 soc_pcmcia_hw_disable(skt);
0424 if (skt->ops->socket_suspend)
0425 skt->ops->socket_suspend(skt);
0426
0427 return 0;
0428 }
0429
0430 static DEFINE_SPINLOCK(status_lock);
0431
0432 static void soc_common_check_status(struct soc_pcmcia_socket *skt)
0433 {
0434 unsigned int events;
0435
0436 debug(skt, 4, "entering PCMCIA monitoring thread\n");
0437
0438 do {
0439 unsigned int status;
0440 unsigned long flags;
0441
0442 status = soc_common_pcmcia_skt_state(skt);
0443
0444 spin_lock_irqsave(&status_lock, flags);
0445 events = (status ^ skt->status) & skt->cs_state.csc_mask;
0446 skt->status = status;
0447 spin_unlock_irqrestore(&status_lock, flags);
0448
0449 debug(skt, 4, "events: %s%s%s%s%s%s\n",
0450 events == 0 ? "<NONE>" : "",
0451 events & SS_DETECT ? "DETECT " : "",
0452 events & SS_READY ? "READY " : "",
0453 events & SS_BATDEAD ? "BATDEAD " : "",
0454 events & SS_BATWARN ? "BATWARN " : "",
0455 events & SS_STSCHG ? "STSCHG " : "");
0456
0457 if (events)
0458 pcmcia_parse_events(&skt->socket, events);
0459 } while (events);
0460 }
0461
0462
0463 static void soc_common_pcmcia_poll_event(struct timer_list *t)
0464 {
0465 struct soc_pcmcia_socket *skt = from_timer(skt, t, poll_timer);
0466 debug(skt, 4, "polling for events\n");
0467
0468 mod_timer(&skt->poll_timer, jiffies + SOC_PCMCIA_POLL_PERIOD);
0469
0470 soc_common_check_status(skt);
0471 }
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482 static irqreturn_t soc_common_pcmcia_interrupt(int irq, void *dev)
0483 {
0484 struct soc_pcmcia_socket *skt = dev;
0485
0486 debug(skt, 3, "servicing IRQ %d\n", irq);
0487
0488 soc_common_check_status(skt);
0489
0490 return IRQ_HANDLED;
0491 }
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509 static int
0510 soc_common_pcmcia_get_status(struct pcmcia_socket *sock, unsigned int *status)
0511 {
0512 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
0513
0514 skt->status = soc_common_pcmcia_skt_state(skt);
0515 *status = skt->status;
0516
0517 return 0;
0518 }
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528 static int soc_common_pcmcia_set_socket(
0529 struct pcmcia_socket *sock, socket_state_t *state)
0530 {
0531 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
0532
0533 debug(skt, 2, "mask: %s%s%s%s%s%s flags: %s%s%s%s%s%s Vcc %d Vpp %d irq %d\n",
0534 (state->csc_mask == 0) ? "<NONE> " : "",
0535 (state->csc_mask & SS_DETECT) ? "DETECT " : "",
0536 (state->csc_mask & SS_READY) ? "READY " : "",
0537 (state->csc_mask & SS_BATDEAD) ? "BATDEAD " : "",
0538 (state->csc_mask & SS_BATWARN) ? "BATWARN " : "",
0539 (state->csc_mask & SS_STSCHG) ? "STSCHG " : "",
0540 (state->flags == 0) ? "<NONE> " : "",
0541 (state->flags & SS_PWR_AUTO) ? "PWR_AUTO " : "",
0542 (state->flags & SS_IOCARD) ? "IOCARD " : "",
0543 (state->flags & SS_RESET) ? "RESET " : "",
0544 (state->flags & SS_SPKR_ENA) ? "SPKR_ENA " : "",
0545 (state->flags & SS_OUTPUT_ENA) ? "OUTPUT_ENA " : "",
0546 state->Vcc, state->Vpp, state->io_irq);
0547
0548 return soc_common_pcmcia_config_skt(skt, state);
0549 }
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560 static int soc_common_pcmcia_set_io_map(
0561 struct pcmcia_socket *sock, struct pccard_io_map *map)
0562 {
0563 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
0564 unsigned short speed = map->speed;
0565
0566 debug(skt, 2, "map %u speed %u start 0x%08llx stop 0x%08llx\n",
0567 map->map, map->speed, (unsigned long long)map->start,
0568 (unsigned long long)map->stop);
0569 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n",
0570 (map->flags == 0) ? "<NONE>" : "",
0571 (map->flags & MAP_ACTIVE) ? "ACTIVE " : "",
0572 (map->flags & MAP_16BIT) ? "16BIT " : "",
0573 (map->flags & MAP_AUTOSZ) ? "AUTOSZ " : "",
0574 (map->flags & MAP_0WS) ? "0WS " : "",
0575 (map->flags & MAP_WRPROT) ? "WRPROT " : "",
0576 (map->flags & MAP_USE_WAIT) ? "USE_WAIT " : "",
0577 (map->flags & MAP_PREFETCH) ? "PREFETCH " : "");
0578
0579 if (map->map >= MAX_IO_WIN) {
0580 printk(KERN_ERR "%s(): map (%d) out of range\n", __func__,
0581 map->map);
0582 return -1;
0583 }
0584
0585 if (map->flags & MAP_ACTIVE) {
0586 if (speed == 0)
0587 speed = SOC_PCMCIA_IO_ACCESS;
0588 } else {
0589 speed = 0;
0590 }
0591
0592 skt->spd_io[map->map] = speed;
0593 skt->ops->set_timing(skt);
0594
0595 if (map->stop == 1)
0596 map->stop = PAGE_SIZE-1;
0597
0598 map->stop -= map->start;
0599 map->stop += skt->socket.io_offset;
0600 map->start = skt->socket.io_offset;
0601
0602 return 0;
0603 }
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614 static int soc_common_pcmcia_set_mem_map(
0615 struct pcmcia_socket *sock, struct pccard_mem_map *map)
0616 {
0617 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
0618 struct resource *res;
0619 unsigned short speed = map->speed;
0620
0621 debug(skt, 2, "map %u speed %u card_start %08x\n",
0622 map->map, map->speed, map->card_start);
0623 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n",
0624 (map->flags == 0) ? "<NONE>" : "",
0625 (map->flags & MAP_ACTIVE) ? "ACTIVE " : "",
0626 (map->flags & MAP_16BIT) ? "16BIT " : "",
0627 (map->flags & MAP_AUTOSZ) ? "AUTOSZ " : "",
0628 (map->flags & MAP_0WS) ? "0WS " : "",
0629 (map->flags & MAP_WRPROT) ? "WRPROT " : "",
0630 (map->flags & MAP_ATTRIB) ? "ATTRIB " : "",
0631 (map->flags & MAP_USE_WAIT) ? "USE_WAIT " : "");
0632
0633 if (map->map >= MAX_WIN)
0634 return -EINVAL;
0635
0636 if (map->flags & MAP_ACTIVE) {
0637 if (speed == 0)
0638 speed = 300;
0639 } else {
0640 speed = 0;
0641 }
0642
0643 if (map->flags & MAP_ATTRIB) {
0644 res = &skt->res_attr;
0645 skt->spd_attr[map->map] = speed;
0646 skt->spd_mem[map->map] = 0;
0647 } else {
0648 res = &skt->res_mem;
0649 skt->spd_attr[map->map] = 0;
0650 skt->spd_mem[map->map] = speed;
0651 }
0652
0653 skt->ops->set_timing(skt);
0654
0655 map->static_start = res->start + map->card_start;
0656
0657 return 0;
0658 }
0659
0660 struct bittbl {
0661 unsigned int mask;
0662 const char *name;
0663 };
0664
0665 static struct bittbl status_bits[] = {
0666 { SS_WRPROT, "SS_WRPROT" },
0667 { SS_BATDEAD, "SS_BATDEAD" },
0668 { SS_BATWARN, "SS_BATWARN" },
0669 { SS_READY, "SS_READY" },
0670 { SS_DETECT, "SS_DETECT" },
0671 { SS_POWERON, "SS_POWERON" },
0672 { SS_STSCHG, "SS_STSCHG" },
0673 { SS_3VCARD, "SS_3VCARD" },
0674 { SS_XVCARD, "SS_XVCARD" },
0675 };
0676
0677 static struct bittbl conf_bits[] = {
0678 { SS_PWR_AUTO, "SS_PWR_AUTO" },
0679 { SS_IOCARD, "SS_IOCARD" },
0680 { SS_RESET, "SS_RESET" },
0681 { SS_DMA_MODE, "SS_DMA_MODE" },
0682 { SS_SPKR_ENA, "SS_SPKR_ENA" },
0683 { SS_OUTPUT_ENA, "SS_OUTPUT_ENA" },
0684 };
0685
0686 static void dump_bits(char **p, const char *prefix,
0687 unsigned int val, struct bittbl *bits, int sz)
0688 {
0689 char *b = *p;
0690 int i;
0691
0692 b += sprintf(b, "%-9s:", prefix);
0693 for (i = 0; i < sz; i++)
0694 if (val & bits[i].mask)
0695 b += sprintf(b, " %s", bits[i].name);
0696 *b++ = '\n';
0697 *p = b;
0698 }
0699
0700
0701
0702
0703
0704
0705 static ssize_t show_status(
0706 struct device *dev, struct device_attribute *attr, char *buf)
0707 {
0708 struct soc_pcmcia_socket *skt =
0709 container_of(dev, struct soc_pcmcia_socket, socket.dev);
0710 char *p = buf;
0711
0712 p += sprintf(p, "slot : %d\n", skt->nr);
0713
0714 dump_bits(&p, "status", skt->status,
0715 status_bits, ARRAY_SIZE(status_bits));
0716 dump_bits(&p, "csc_mask", skt->cs_state.csc_mask,
0717 status_bits, ARRAY_SIZE(status_bits));
0718 dump_bits(&p, "cs_flags", skt->cs_state.flags,
0719 conf_bits, ARRAY_SIZE(conf_bits));
0720
0721 p += sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc);
0722 p += sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp);
0723 p += sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq,
0724 skt->socket.pci_irq);
0725 if (skt->ops->show_timing)
0726 p += skt->ops->show_timing(skt, p);
0727
0728 return p-buf;
0729 }
0730 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
0731
0732
0733 static struct pccard_operations soc_common_pcmcia_operations = {
0734 .init = soc_common_pcmcia_sock_init,
0735 .suspend = soc_common_pcmcia_suspend,
0736 .get_status = soc_common_pcmcia_get_status,
0737 .set_socket = soc_common_pcmcia_set_socket,
0738 .set_io_map = soc_common_pcmcia_set_io_map,
0739 .set_mem_map = soc_common_pcmcia_set_mem_map,
0740 };
0741
0742
0743 #ifdef CONFIG_CPU_FREQ
0744 static int soc_common_pcmcia_cpufreq_nb(struct notifier_block *nb,
0745 unsigned long val, void *data)
0746 {
0747 struct soc_pcmcia_socket *skt = container_of(nb, struct soc_pcmcia_socket, cpufreq_nb);
0748 struct cpufreq_freqs *freqs = data;
0749
0750 return skt->ops->frequency_change(skt, val, freqs);
0751 }
0752 #endif
0753
0754 void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt,
0755 const struct pcmcia_low_level *ops, struct device *dev)
0756 {
0757 int i;
0758
0759 skt->ops = ops;
0760 skt->socket.owner = ops->owner;
0761 skt->socket.dev.parent = dev;
0762 skt->socket.pci_irq = NO_IRQ;
0763
0764 for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
0765 skt->stat[i].gpio = -EINVAL;
0766 }
0767 EXPORT_SYMBOL(soc_pcmcia_init_one);
0768
0769 void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt)
0770 {
0771 del_timer_sync(&skt->poll_timer);
0772
0773 pcmcia_unregister_socket(&skt->socket);
0774
0775 #ifdef CONFIG_CPU_FREQ
0776 if (skt->ops->frequency_change)
0777 cpufreq_unregister_notifier(&skt->cpufreq_nb,
0778 CPUFREQ_TRANSITION_NOTIFIER);
0779 #endif
0780
0781 soc_pcmcia_hw_shutdown(skt);
0782
0783
0784 soc_common_pcmcia_config_skt(skt, &dead_socket);
0785
0786 iounmap(PCI_IOBASE + skt->res_io_io.start);
0787 release_resource(&skt->res_attr);
0788 release_resource(&skt->res_mem);
0789 release_resource(&skt->res_io);
0790 release_resource(&skt->res_skt);
0791 }
0792 EXPORT_SYMBOL(soc_pcmcia_remove_one);
0793
0794 int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
0795 {
0796 int ret;
0797
0798 skt->cs_state = dead_socket;
0799
0800 timer_setup(&skt->poll_timer, soc_common_pcmcia_poll_event, 0);
0801 skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
0802
0803 ret = request_resource(&iomem_resource, &skt->res_skt);
0804 if (ret)
0805 goto out_err_1;
0806
0807 ret = request_resource(&skt->res_skt, &skt->res_io);
0808 if (ret)
0809 goto out_err_2;
0810
0811 ret = request_resource(&skt->res_skt, &skt->res_mem);
0812 if (ret)
0813 goto out_err_3;
0814
0815 ret = request_resource(&skt->res_skt, &skt->res_attr);
0816 if (ret)
0817 goto out_err_4;
0818
0819 skt->res_io_io = (struct resource)
0820 DEFINE_RES_IO_NAMED(skt->nr * 0x1000 + 0x10000, 0x1000,
0821 "PCMCIA I/O");
0822 ret = pci_remap_iospace(&skt->res_io_io, skt->res_io.start);
0823 if (ret)
0824 goto out_err_5;
0825
0826
0827
0828
0829
0830
0831 skt->ops->set_timing(skt);
0832
0833 ret = soc_pcmcia_hw_init(skt);
0834 if (ret)
0835 goto out_err_6;
0836
0837 skt->socket.ops = &soc_common_pcmcia_operations;
0838 skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD;
0839 skt->socket.resource_ops = &pccard_static_ops;
0840 skt->socket.irq_mask = 0;
0841 skt->socket.map_size = PAGE_SIZE;
0842 skt->socket.io_offset = (unsigned long)skt->res_io_io.start;
0843
0844 skt->status = soc_common_pcmcia_skt_state(skt);
0845
0846 #ifdef CONFIG_CPU_FREQ
0847 if (skt->ops->frequency_change) {
0848 skt->cpufreq_nb.notifier_call = soc_common_pcmcia_cpufreq_nb;
0849
0850 ret = cpufreq_register_notifier(&skt->cpufreq_nb,
0851 CPUFREQ_TRANSITION_NOTIFIER);
0852 if (ret < 0)
0853 dev_err(skt->socket.dev.parent,
0854 "unable to register CPU frequency change notifier for PCMCIA (%d)\n",
0855 ret);
0856 }
0857 #endif
0858
0859 ret = pcmcia_register_socket(&skt->socket);
0860 if (ret)
0861 goto out_err_7;
0862
0863 ret = device_create_file(&skt->socket.dev, &dev_attr_status);
0864 if (ret)
0865 goto out_err_8;
0866
0867 return ret;
0868
0869 out_err_8:
0870 del_timer_sync(&skt->poll_timer);
0871 pcmcia_unregister_socket(&skt->socket);
0872
0873 out_err_7:
0874 soc_pcmcia_hw_shutdown(skt);
0875 out_err_6:
0876 iounmap(PCI_IOBASE + skt->res_io_io.start);
0877 out_err_5:
0878 release_resource(&skt->res_attr);
0879 out_err_4:
0880 release_resource(&skt->res_mem);
0881 out_err_3:
0882 release_resource(&skt->res_io);
0883 out_err_2:
0884 release_resource(&skt->res_skt);
0885 out_err_1:
0886
0887 return ret;
0888 }
0889 EXPORT_SYMBOL(soc_pcmcia_add_one);
0890
0891 MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
0892 MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support");
0893 MODULE_LICENSE("Dual MPL/GPL");