32 #include <linux/module.h>
33 #include <linux/pci.h>
35 #include <linux/types.h>
47 static int vrc4173_cardu_slots;
92 static void cardu_pciregs_init(
struct pci_dev *
dev)
98 pci_write_config_dword(dev, 0x1c, 0x10000000);
99 pci_write_config_dword(dev, 0x20, 0x17fff000);
100 pci_write_config_dword(dev, 0x2c, 0);
101 pci_write_config_dword(dev, 0x30, 0xfffc);
103 pci_read_config_word(dev,
BRGCNT, &brgcnt);
105 pci_write_config_word(dev,
BRGCNT, brgcnt);
107 pci_read_config_dword(dev,
SYSCNT, &syscnt);
110 pci_write_config_dword(dev,
SYSCNT, syscnt);
112 pci_read_config_byte(dev,
DEVCNT, &devcnt);
115 pci_write_config_byte(dev,
DEVCNT, devcnt);
119 pci_write_config_byte(dev,
SERRDIS, 0);
122 static int cardu_init(
unsigned int slot)
126 cardu_pciregs_init(socket->
dev);
129 exca_writeb(socket,
GLO_CNT, 0);
132 socket->
cap.irq_mask = 0;
133 socket->
cap.map_size = 0x1000;
134 socket->
cap.pci_irq = socket->
dev->irq;
144 static int cardu_register_callback(
unsigned int sock,
145 void (*handler)(
void *,
unsigned int),
156 static int cardu_inquire_socket(
unsigned int sock, socket_cap_t *
cap)
165 static int cardu_get_status(
unsigned int sock,
u_int *
value)
226 static int cardu_set_socket(
unsigned int sock,
socket_state_t *state)
231 if (((state->
Vpp == 33) || (state->
Vpp == 50)) && (state->
Vpp != state->
Vcc))
234 val = set_Vcc_value(state->
Vcc);
235 val |= set_Vpp_value(state->
Vpp);
237 exca_writeb(socket,
PWR_CNT, val);
248 static int cardu_get_io_map(
unsigned int sock,
struct pccard_io_map *
io)
272 static int cardu_set_io_map(
unsigned int sock,
struct pccard_io_map *io)
286 if (window & enable) {
300 exca_writeb(socket,
ADR_WIN_EN, window | enable);
321 start = (start & 0x0fff) << 12;
324 stop = ((stop & 0x0fff) << 12) + 0x0fff;
329 offset = ((offset & 0x3fff) << 12) +
start;
333 mem->sys_start = start +
page;
334 mem->sys_stop = start +
page;
339 static int cardu_set_mem_map(
unsigned int sock,
struct pccard_mem_map *mem)
344 u_long sys_start, sys_stop, card_start;
348 sys_start = mem->sys_start;
349 sys_stop = mem->sys_stop;
352 if (map > 4 || sys_start > sys_stop || ((sys_start ^ sys_stop) >> 24) ||
358 if (window & enable) {
363 exca_writeb(socket,
MEM_WIN_SAU(map), sys_start >> 24);
365 value = (sys_start >> 12) & 0x0fff;
369 value = (sys_stop >> 12) & 0x0fff;
372 value = ((card_start - sys_start) >> 12) & 0x3fff;
378 exca_writeb(socket,
ADR_WIN_EN, window | enable);
383 static void cardu_proc_setup(
unsigned int sock,
struct proc_dir_entry *base)
389 .register_callback = cardu_register_callback,
390 .inquire_socket = cardu_inquire_socket,
391 .get_status = cardu_get_status,
392 .set_socket = cardu_set_socket,
393 .get_io_map = cardu_get_io_map,
394 .set_io_map = cardu_set_io_map,
395 .get_mem_map = cardu_get_mem_map,
396 .set_mem_map = cardu_set_mem_map,
397 .proc_setup = cardu_proc_setup,
400 static void cardu_bh(
void *
data)
420 csc = exca_readb(socket,
CARD_SC);
425 if ((csc &
RDY_CHG) && (status & READY))
428 if (exca_readb(socket,
INT_GEN_CNT) & CARD_TYPE_IO) {
443 static void cardu_interrupt(
int irq,
void *
dev_id)
450 events = get_events(socket);
466 slot = vrc4173_cardu_slots++;
467 socket = &cardu_sockets[
slot];
471 sprintf(socket->
name,
"NEC VRC4173 CARDU%1d", slot+1);
538 if (options ==
NULL || *options ==
'\0')
541 if (
strncmp(options,
"cardu1:", 7) == 0) {
543 if (*options !=
'\0') {
544 if (
strncmp(options,
"noprobe", 7) == 0) {
555 if (
strncmp(options,
"cardu2:", 7) == 0) {
557 if ((*options !=
'\0') && (
strncmp(options,
"noprobe", 7) == 0))
564 __setup(
"vrc4173_cardu=", vrc4173_cardu_setup);
571 static struct pci_driver vrc4173_cardu_driver = {
572 .name =
"NEC VRC4173 CARDU",
573 .probe = vrc4173_cardu_probe,
574 .id_table = vrc4173_cardu_id_table,
577 static int __devinit vrc4173_cardu_init(
void)
579 vrc4173_cardu_slots = 0;
581 return pci_register_driver(&vrc4173_cardu_driver);
584 static void __devexit vrc4173_cardu_exit(
void)