10 #include <linux/module.h>
13 #include <linux/types.h>
14 #include <linux/fcntl.h>
15 #include <linux/string.h>
16 #include <linux/kernel.h>
17 #include <linux/errno.h>
24 #include <linux/bitops.h>
27 #include <asm/addrspace.h>
37 #define CHAOS_PCC_DEBUG
38 #ifdef CHAOS_PCC_DEBUG
39 static volatile u_short dummy_readbuf;
42 #define PCC_DEBUG_DBEX
46 static int poll_interval = 0;
64 #ifdef CHAOS_PCC_DEBUG
72 static int pcc_sockets = 0;
79 static unsigned int pcc_get(
u_short,
unsigned int);
80 static void pcc_set(
u_short,
unsigned int ,
unsigned int );
93 #ifdef CHAOS_PCC_DEBUG
103 need_ex = (size > 1 && flag == 0) ?
PCMOD_DBEX : 0;
104 #ifdef PCC_DEBUG_DBEX
124 pcc_set(sock,
PCCR, 0);
131 pcc_set(sock,
PCADR, addr & 0x1ff00000);
136 pcc_set(sock,
PCCR, 1);
138 #ifdef CHAOS_PCC_DEBUG
153 unsigned char *bp = (
unsigned char *)buf;
157 dummy_readbuf =
readb(addr);
173 unsigned short *bp = (
unsigned short *)buf;
175 #ifdef CHAOS_PCC_DEBUG
177 dummy_readbuf =
readw(addr);
183 #ifdef PCC_DEBUG_DBEX
185 unsigned char *
cp = (
unsigned char *)bp;
187 tmp = cp[1] << 8 | cp[0];
197 #ifdef PCC_DEBUG_DBEX
199 unsigned char *
cp = (
unsigned char *)bp;
203 cp[1] = (tmp >> 8) & 0xff;
215 printk(
"m32r_pcc: BWERR detected : port 0x%04lx : iosize %dbit\n",
217 pcc_set(sock,
PCIRC, addr);
228 spin_unlock_irqrestore(&pcc_lock,flags);
234 pcc_iorw(sock, port, buf, size, nmemb, 0, flag);
238 pcc_iorw(sock, port, buf, size, nmemb, 1, flag);
243 #define IS_REGISTERED 0x2000
244 #define IS_ALIVE 0x8000
246 typedef struct pcc_t {
251 static pcc_t pcc[] = {
252 {
"xnux2", 0 }, {
"xnux2", 0 },
263 return inl(socket[sock].
base + reg);
269 outl(data, socket[sock].
base + reg);
286 stat = pcc_get(sock,
PCIRC);
289 printk(
"m32r_pcc: No Card is detected at socket %d : stat = 0x%08x\n",stat,sock);
293 printk(
"m32r_pcc: Insertion fail (%.8x) at socket %d\n",stat,sock);
295 printk(
"m32r_pcc: Card is Inserted at socket %d(%.8x)\n",sock,stat);
308 #ifdef CHAOS_PCC_DEBUG
313 if (is_alive(pcc_sockets))
327 t->
socket.io_offset = ioaddr;
329 t->
socket.pci_irq = 2 + pcc_sockets;
331 request_irq(irq, pcc_interrupt, 0,
"m32r-pcc", pcc_interrupt);
347 pr_debug(
"m32r_pcc: pcc_interrupt(%d)\n", irq);
349 for (j = 0; j < 20; j++) {
351 for (i = 0; i < pcc_sockets; i++) {
352 if ((socket[i].cs_irq != irq) &&
353 (socket[i].socket.pci_irq != irq))
356 irc = pcc_get(i,
PCIRC);
358 pr_debug(
"m32r_pcc: interrupt: socket %d pcirc 0x%02x ",
365 pr_debug(
"m32r_pcc: event 0x%02x\n", events);
378 pr_debug(
"m32r_pcc: interrupt done\n");
383 static void pcc_interrupt_wrapper(
u_long data)
385 pcc_interrupt(0,
NULL);
387 poll_timer.expires =
jiffies + poll_interval;
397 status = pcc_get(sock,
PCIRC);
401 status = pcc_get(sock,
PCCR);
412 pr_debug(
"m32r_pcc: GetStatus(%d) = %#4.4x\n", sock, *value);
422 pr_debug(
"m32r_pcc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
423 "io_irq %d, csc_mask %#2.2x)", sock, state->
flags,
430 if (state->
Vcc == 50) {
442 pr_debug(
"m32r_pcc: :OUTPUT_ENA\n");
457 pr_debug(
"m32r_pcc: :csc-SS_DETECT");
479 pr_debug(
"m32r_pcc: SetIOMap(%d, %d, %#2.2x, %d ns, "
480 "%#llx-%#llx)\n", sock, io->
map, io->
flags,
482 (
unsigned long long)io->
stop);
497 #ifdef CHAOS_PCC_DEBUG
503 pr_debug(
"m32r_pcc: SetMemMap(%d, %d, %#2.2x, %d ns, "
504 "%#llx, %#x)\n", sock, map, mem->
flags,
526 pcc_set(sock,
PCCR, 0);
538 pcc_set(sock,
PCMOD, mode);
544 pcc_set(sock,
PCADR, addr);
551 pcc_set(sock,
PCCR, 1);
553 #ifdef CHAOS_PCC_DEBUG
575 static ssize_t show_info(
struct class_device *class_dev,
char *
buf)
580 return sprintf(buf,
"type: %s\nbase addr: 0x%08lx\n",
584 static ssize_t show_exca(
struct class_device *class_dev,
char *
buf)
592 static CLASS_DEVICE_ATTR(exca,
S_IRUGO, show_exca,
NULL);
599 #define LOCKED(x) do { \
601 unsigned long flags; \
602 spin_lock_irqsave(&pcc_lock, flags); \
604 spin_unlock_irqrestore(&pcc_lock, flags); \
617 LOCKED(_pcc_get_status(sock, value));
627 LOCKED(_pcc_set_socket(sock, state));
634 if (socket[sock].
flags & IS_ALIVE)
636 LOCKED(_pcc_set_io_map(sock, io));
643 if (socket[sock].
flags & IS_ALIVE)
645 LOCKED(_pcc_set_mem_map(sock, mem));
656 .get_status = pcc_get_status,
657 .set_socket = pcc_set_socket,
658 .set_io_map = pcc_set_io_map,
659 .set_mem_map = pcc_set_mem_map,
678 static int __init init_m32r_pcc(
void)
698 #ifdef CONFIG_M32RPCC_SLOT2
702 if (pcc_sockets == 0) {
703 printk(
"socket is not found.\n");
711 for (i = 0 ; i < pcc_sockets ; i++) {
712 socket[
i].
socket.dev.parent = &pcc_device.
dev;
713 socket[
i].
socket.ops = &pcc_operations;
722 class_device_create_file(&socket[i].socket.dev,
723 &class_device_attr_info);
724 class_device_create_file(&socket[i].socket.dev,
725 &class_device_attr_exca);
730 if (poll_interval != 0) {
731 poll_timer.function = pcc_interrupt_wrapper;
734 poll_timer.expires =
jiffies + poll_interval;
741 static void __exit exit_m32r_pcc(
void)
745 for (i = 0; i < pcc_sockets; i++)
750 if (poll_interval != 0)