aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia/soc_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pcmcia/soc_common.c')
-rw-r--r--drivers/pcmcia/soc_common.c128
1 files changed, 68 insertions, 60 deletions
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index 2fe8cb8e95cd..5a9a392eacdf 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -31,20 +31,20 @@
31======================================================================*/ 31======================================================================*/
32 32
33 33
34#include <linux/module.h> 34#include <linux/cpufreq.h>
35#include <linux/moduleparam.h>
36#include <linux/init.h> 35#include <linux/init.h>
36#include <linux/interrupt.h>
37#include <linux/io.h>
38#include <linux/irq.h>
37#include <linux/kernel.h> 39#include <linux/kernel.h>
38#include <linux/timer.h>
39#include <linux/mm.h> 40#include <linux/mm.h>
41#include <linux/module.h>
42#include <linux/moduleparam.h>
40#include <linux/mutex.h> 43#include <linux/mutex.h>
41#include <linux/interrupt.h>
42#include <linux/irq.h>
43#include <linux/spinlock.h> 44#include <linux/spinlock.h>
44#include <linux/cpufreq.h> 45#include <linux/timer.h>
45 46
46#include <mach/hardware.h> 47#include <mach/hardware.h>
47#include <asm/io.h>
48#include <asm/system.h> 48#include <asm/system.h>
49 49
50#include "soc_common.h" 50#include "soc_common.h"
@@ -74,7 +74,8 @@ EXPORT_SYMBOL(soc_pcmcia_debug);
74 74
75#endif 75#endif
76 76
77#define to_soc_pcmcia_socket(x) container_of(x, struct soc_pcmcia_socket, socket) 77#define to_soc_pcmcia_socket(x) \
78 container_of(x, struct soc_pcmcia_socket, socket)
78 79
79static unsigned short 80static unsigned short
80calc_speed(unsigned short *spds, int num, unsigned short dflt) 81calc_speed(unsigned short *spds, int num, unsigned short dflt)
@@ -91,11 +92,15 @@ calc_speed(unsigned short *spds, int num, unsigned short dflt)
91 return speed; 92 return speed;
92} 93}
93 94
94void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *skt, struct soc_pcmcia_timing *timing) 95void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *skt,
96 struct soc_pcmcia_timing *timing)
95{ 97{
96 timing->io = calc_speed(skt->spd_io, MAX_IO_WIN, SOC_PCMCIA_IO_ACCESS); 98 timing->io =
97 timing->mem = calc_speed(skt->spd_mem, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS); 99 calc_speed(skt->spd_io, MAX_IO_WIN, SOC_PCMCIA_IO_ACCESS);
98 timing->attr = calc_speed(skt->spd_attr, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS); 100 timing->mem =
101 calc_speed(skt->spd_mem, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS);
102 timing->attr =
103 calc_speed(skt->spd_attr, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS);
99} 104}
100EXPORT_SYMBOL(soc_common_pcmcia_get_timing); 105EXPORT_SYMBOL(soc_common_pcmcia_get_timing);
101 106
@@ -137,8 +142,8 @@ static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt)
137 * 142 *
138 * Convert PCMCIA socket state to our socket configure structure. 143 * Convert PCMCIA socket state to our socket configure structure.
139 */ 144 */
140static int 145static int soc_common_pcmcia_config_skt(
141soc_common_pcmcia_config_skt(struct soc_pcmcia_socket *skt, socket_state_t *state) 146 struct soc_pcmcia_socket *skt, socket_state_t *state)
142{ 147{
143 int ret; 148 int ret;
144 149
@@ -150,7 +155,8 @@ soc_common_pcmcia_config_skt(struct soc_pcmcia_socket *skt, socket_state_t *stat
150 */ 155 */
151 if (skt->irq_state != 1 && state->io_irq) { 156 if (skt->irq_state != 1 && state->io_irq) {
152 skt->irq_state = 1; 157 skt->irq_state = 1;
153 set_irq_type(skt->socket.pci_irq, IRQ_TYPE_EDGE_FALLING); 158 set_irq_type(skt->socket.pci_irq,
159 IRQ_TYPE_EDGE_FALLING);
154 } else if (skt->irq_state == 1 && state->io_irq == 0) { 160 } else if (skt->irq_state == 1 && state->io_irq == 0) {
155 skt->irq_state = 0; 161 skt->irq_state = 0;
156 set_irq_type(skt->socket.pci_irq, IRQ_TYPE_NONE); 162 set_irq_type(skt->socket.pci_irq, IRQ_TYPE_NONE);
@@ -304,24 +310,24 @@ soc_common_pcmcia_get_status(struct pcmcia_socket *sock, unsigned int *status)
304 * of power configuration, reset, &c. We also record the value of 310 * of power configuration, reset, &c. We also record the value of
305 * `state' in order to regurgitate it to the PCMCIA core later. 311 * `state' in order to regurgitate it to the PCMCIA core later.
306 */ 312 */
307static int 313static int soc_common_pcmcia_set_socket(
308soc_common_pcmcia_set_socket(struct pcmcia_socket *sock, socket_state_t *state) 314 struct pcmcia_socket *sock, socket_state_t *state)
309{ 315{
310 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); 316 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
311 317
312 debug(skt, 2, "mask: %s%s%s%s%s%sflags: %s%s%s%s%s%sVcc %d Vpp %d irq %d\n", 318 debug(skt, 2, "mask: %s%s%s%s%s%s flags: %s%s%s%s%s%s Vcc %d Vpp %d irq %d\n",
313 (state->csc_mask==0)?"<NONE> ":"", 319 (state->csc_mask == 0) ? "<NONE> " : "",
314 (state->csc_mask&SS_DETECT)?"DETECT ":"", 320 (state->csc_mask & SS_DETECT) ? "DETECT " : "",
315 (state->csc_mask&SS_READY)?"READY ":"", 321 (state->csc_mask & SS_READY) ? "READY " : "",
316 (state->csc_mask&SS_BATDEAD)?"BATDEAD ":"", 322 (state->csc_mask & SS_BATDEAD) ? "BATDEAD " : "",
317 (state->csc_mask&SS_BATWARN)?"BATWARN ":"", 323 (state->csc_mask & SS_BATWARN) ? "BATWARN " : "",
318 (state->csc_mask&SS_STSCHG)?"STSCHG ":"", 324 (state->csc_mask & SS_STSCHG) ? "STSCHG " : "",
319 (state->flags==0)?"<NONE> ":"", 325 (state->flags == 0) ? "<NONE> " : "",
320 (state->flags&SS_PWR_AUTO)?"PWR_AUTO ":"", 326 (state->flags & SS_PWR_AUTO) ? "PWR_AUTO " : "",
321 (state->flags&SS_IOCARD)?"IOCARD ":"", 327 (state->flags & SS_IOCARD) ? "IOCARD " : "",
322 (state->flags&SS_RESET)?"RESET ":"", 328 (state->flags & SS_RESET) ? "RESET " : "",
323 (state->flags&SS_SPKR_ENA)?"SPKR_ENA ":"", 329 (state->flags & SS_SPKR_ENA) ? "SPKR_ENA " : "",
324 (state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"", 330 (state->flags & SS_OUTPUT_ENA) ? "OUTPUT_ENA " : "",
325 state->Vcc, state->Vpp, state->io_irq); 331 state->Vcc, state->Vpp, state->io_irq);
326 332
327 return soc_common_pcmcia_config_skt(skt, state); 333 return soc_common_pcmcia_config_skt(skt, state);
@@ -336,8 +342,8 @@ soc_common_pcmcia_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
336 * 342 *
337 * Returns: 0 on success, -1 on error 343 * Returns: 0 on success, -1 on error
338 */ 344 */
339static int 345static int soc_common_pcmcia_set_io_map(
340soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *map) 346 struct pcmcia_socket *sock, struct pccard_io_map *map)
341{ 347{
342 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); 348 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
343 unsigned short speed = map->speed; 349 unsigned short speed = map->speed;
@@ -346,14 +352,14 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m
346 map->map, map->speed, (unsigned long long)map->start, 352 map->map, map->speed, (unsigned long long)map->start,
347 (unsigned long long)map->stop); 353 (unsigned long long)map->stop);
348 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", 354 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n",
349 (map->flags==0)?"<NONE>":"", 355 (map->flags == 0) ? "<NONE>" : "",
350 (map->flags&MAP_ACTIVE)?"ACTIVE ":"", 356 (map->flags & MAP_ACTIVE) ? "ACTIVE " : "",
351 (map->flags&MAP_16BIT)?"16BIT ":"", 357 (map->flags & MAP_16BIT) ? "16BIT " : "",
352 (map->flags&MAP_AUTOSZ)?"AUTOSZ ":"", 358 (map->flags & MAP_AUTOSZ) ? "AUTOSZ " : "",
353 (map->flags&MAP_0WS)?"0WS ":"", 359 (map->flags & MAP_0WS) ? "0WS " : "",
354 (map->flags&MAP_WRPROT)?"WRPROT ":"", 360 (map->flags & MAP_WRPROT) ? "WRPROT " : "",
355 (map->flags&MAP_USE_WAIT)?"USE_WAIT ":"", 361 (map->flags & MAP_USE_WAIT) ? "USE_WAIT " : "",
356 (map->flags&MAP_PREFETCH)?"PREFETCH ":""); 362 (map->flags & MAP_PREFETCH) ? "PREFETCH " : "");
357 363
358 if (map->map >= MAX_IO_WIN) { 364 if (map->map >= MAX_IO_WIN) {
359 printk(KERN_ERR "%s(): map (%d) out of range\n", __func__, 365 printk(KERN_ERR "%s(): map (%d) out of range\n", __func__,
@@ -390,8 +396,8 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m
390 * 396 *
391 * Returns: 0 on success, -ERRNO on error 397 * Returns: 0 on success, -ERRNO on error
392 */ 398 */
393static int 399static int soc_common_pcmcia_set_mem_map(
394soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *map) 400 struct pcmcia_socket *sock, struct pccard_mem_map *map)
395{ 401{
396 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); 402 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock);
397 struct resource *res; 403 struct resource *res;
@@ -400,14 +406,14 @@ soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map
400 debug(skt, 2, "map %u speed %u card_start %08x\n", 406 debug(skt, 2, "map %u speed %u card_start %08x\n",
401 map->map, map->speed, map->card_start); 407 map->map, map->speed, map->card_start);
402 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", 408 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n",
403 (map->flags==0)?"<NONE>":"", 409 (map->flags == 0) ? "<NONE>" : "",
404 (map->flags&MAP_ACTIVE)?"ACTIVE ":"", 410 (map->flags & MAP_ACTIVE) ? "ACTIVE " : "",
405 (map->flags&MAP_16BIT)?"16BIT ":"", 411 (map->flags & MAP_16BIT) ? "16BIT " : "",
406 (map->flags&MAP_AUTOSZ)?"AUTOSZ ":"", 412 (map->flags & MAP_AUTOSZ) ? "AUTOSZ " : "",
407 (map->flags&MAP_0WS)?"0WS ":"", 413 (map->flags & MAP_0WS) ? "0WS " : "",
408 (map->flags&MAP_WRPROT)?"WRPROT ":"", 414 (map->flags & MAP_WRPROT) ? "WRPROT " : "",
409 (map->flags&MAP_ATTRIB)?"ATTRIB ":"", 415 (map->flags & MAP_ATTRIB) ? "ATTRIB " : "",
410 (map->flags&MAP_USE_WAIT)?"USE_WAIT ":""); 416 (map->flags & MAP_USE_WAIT) ? "USE_WAIT " : "");
411 417
412 if (map->map >= MAX_WIN) 418 if (map->map >= MAX_WIN)
413 return -EINVAL; 419 return -EINVAL;
@@ -462,8 +468,8 @@ static struct bittbl conf_bits[] = {
462 { SS_OUTPUT_ENA, "SS_OUTPUT_ENA" }, 468 { SS_OUTPUT_ENA, "SS_OUTPUT_ENA" },
463}; 469};
464 470
465static void 471static void dump_bits(char **p, const char *prefix,
466dump_bits(char **p, const char *prefix, unsigned int val, struct bittbl *bits, int sz) 472 unsigned int val, struct bittbl *bits, int sz)
467{ 473{
468 char *b = *p; 474 char *b = *p;
469 int i; 475 int i;
@@ -481,13 +487,14 @@ dump_bits(char **p, const char *prefix, unsigned int val, struct bittbl *bits, i
481 * 487 *
482 * Returns: the number of characters added to the buffer 488 * Returns: the number of characters added to the buffer
483 */ 489 */
484static ssize_t show_status(struct device *dev, struct device_attribute *attr, char *buf) 490static ssize_t show_status(
491 struct device *dev, struct device_attribute *attr, char *buf)
485{ 492{
486 struct soc_pcmcia_socket *skt = 493 struct soc_pcmcia_socket *skt =
487 container_of(dev, struct soc_pcmcia_socket, socket.dev); 494 container_of(dev, struct soc_pcmcia_socket, socket.dev);
488 char *p = buf; 495 char *p = buf;
489 496
490 p+=sprintf(p, "slot : %d\n", skt->nr); 497 p += sprintf(p, "slot : %d\n", skt->nr);
491 498
492 dump_bits(&p, "status", skt->status, 499 dump_bits(&p, "status", skt->status,
493 status_bits, ARRAY_SIZE(status_bits)); 500 status_bits, ARRAY_SIZE(status_bits));
@@ -496,12 +503,12 @@ static ssize_t show_status(struct device *dev, struct device_attribute *attr, ch
496 dump_bits(&p, "cs_flags", skt->cs_state.flags, 503 dump_bits(&p, "cs_flags", skt->cs_state.flags,
497 conf_bits, ARRAY_SIZE(conf_bits)); 504 conf_bits, ARRAY_SIZE(conf_bits));
498 505
499 p+=sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc); 506 p += sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc);
500 p+=sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp); 507 p += sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp);
501 p+=sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq, 508 p += sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq,
502 skt->socket.pci_irq); 509 skt->socket.pci_irq);
503 if (skt->ops->show_timing) 510 if (skt->ops->show_timing)
504 p+=skt->ops->show_timing(skt, p); 511 p += skt->ops->show_timing(skt, p);
505 512
506 return p-buf; 513 return p-buf;
507} 514}
@@ -594,7 +601,7 @@ soc_pcmcia_notifier(struct notifier_block *nb, unsigned long val, void *data)
594 601
595 mutex_lock(&soc_pcmcia_sockets_lock); 602 mutex_lock(&soc_pcmcia_sockets_lock);
596 list_for_each_entry(skt, &soc_pcmcia_sockets, node) 603 list_for_each_entry(skt, &soc_pcmcia_sockets, node)
597 if ( skt->ops->frequency_change ) 604 if (skt->ops->frequency_change)
598 ret += skt->ops->frequency_change(skt, val, freqs); 605 ret += skt->ops->frequency_change(skt, val, freqs);
599 mutex_unlock(&soc_pcmcia_sockets_lock); 606 mutex_unlock(&soc_pcmcia_sockets_lock);
600 607
@@ -620,7 +627,8 @@ fs_initcall(soc_pcmcia_cpufreq_register);
620 627
621static void soc_pcmcia_cpufreq_unregister(void) 628static void soc_pcmcia_cpufreq_unregister(void)
622{ 629{
623 cpufreq_unregister_notifier(&soc_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER); 630 cpufreq_unregister_notifier(&soc_pcmcia_notifier_block,
631 CPUFREQ_TRANSITION_NOTIFIER);
624} 632}
625module_exit(soc_pcmcia_cpufreq_unregister); 633module_exit(soc_pcmcia_cpufreq_unregister);
626 634