X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/af6f1816764635c4d495177b74fe89a9a0e5ac4f..8d06c4e166846c170775c086d1565a0e281d6dbc:/lincan/src/tscan1.c diff --git a/lincan/src/tscan1.c b/lincan/src/tscan1.c index 313f041..5f7ca7a 100644 --- a/lincan/src/tscan1.c +++ b/lincan/src/tscan1.c @@ -24,13 +24,8 @@ static CAN_DEFINE_SPINLOCK(ts7kv_win_lock); -long clock[MAX_HW_CARDS]={-1,-1,-1,-1,-1,-1,-1,-1}; -MODULE_PARM(clock, "1-" __MODULE_STRING(MAX_HW_CARDS)"i"); -MODULE_PARM_DESC(clock,"clock frequency for each board in step of 1kHz"); - -long tscanio[MAX_HW_CARDS]={-1,-1,-1,-1,-1,-1,-1,-1}; -MODULE_PARM(tscanio, "1-" __MODULE_STRING(MAX_HW_CARDS)"i"); -MODULE_PARM_DESC(tscanio,"TSCAN CAN controller IO address for each board"); +unsigned long tscanio[MAX_HW_CARDS]={-1,-1,-1,-1,-1,-1,-1,-1}; +unsigned int tscanio_specified; #if defined(TS7XXX_IO8_BASE)&&defined(TSXXX_BASE_IO) int tsxxx_base=TS7XXX_IO8_BASE+TSXXX_BASE_IO; @@ -39,10 +34,18 @@ int tsxxx_base=TS7XXX_IO8_BASE; #else /*TS7XXX_IO8_BASE*/ unsigned long tsxxx_base=0; #endif /*TS7XXX_IO8_BASE*/ + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)) +MODULE_PARM(tscanio, "1-" __MODULE_STRING(MAX_HW_CARDS)"i"); MODULE_PARM(tsxxx_base, "1i"); +#else /* LINUX_VERSION_CODE >= 2,6,12 */ +module_param_array(tscanio, int, &tscanio_specified, 0); +module_param(tsxxx_base, ulong, 0); +#endif /* LINUX_VERSION_CODE >= 2,6,12 */ + +MODULE_PARM_DESC(tscanio,"TSCAN CAN controller IO address for each board"); MODULE_PARM_DESC(tsxxx_base,"The base of the ISA/8-bit IO space for TSxxx CAN peripherals in the system"); -unsigned short ts7kv_isused = 0x0; /** * tscan1_request_io: - reserve io or memory range for can board @@ -133,8 +136,8 @@ int tscan1_request_io(struct candevice_t *candev) default: mode=0x60; break; } - outb(0x00, candev->io_addr+TSCAN1_WIN_REG); - outb(mode, candev->io_addr+TSCAN1_MOD_REG); + can_outb(0x00, candev->io_addr+TSCAN1_WIN_REG); + can_outb(mode, candev->io_addr+TSCAN1_MOD_REG); return 0; } @@ -174,7 +177,7 @@ int tscan1_release_io(struct candevice_t *candev) can_release_io_region(remap_can_io_addr, TSXXX_CAN_RANGE); } - outb(0x20, candev->io_addr+TSCAN1_MOD_REG); + can_outb(0x20, candev->io_addr+TSCAN1_MOD_REG); can_release_io_region(candev->io_addr, TSXXX_IO_RANGE); return 0; @@ -235,15 +238,15 @@ int tscan1_check_presence(unsigned long remap_io_addr, int *pjmp) return -ENODEV; do { - if (inb(remap_io_addr+TSXXX_ID0_REG)!=TSCAN1_ID0 || - inb(remap_io_addr+TSXXX_ID1_REG)!=TSCAN1_ID1) + if (can_inb(remap_io_addr+TSXXX_ID0_REG)!=TSCAN1_ID0 || + can_inb(remap_io_addr+TSXXX_ID1_REG)!=TSCAN1_ID1) break; - outb(0x00, remap_io_addr+TSCAN1_WIN_REG); - outb(0x20, remap_io_addr+TSCAN1_MOD_REG); + can_outb(0x00, remap_io_addr+TSCAN1_WIN_REG); + can_outb(0x20, remap_io_addr+TSCAN1_MOD_REG); if(pjmp) - *pjmp = inb(remap_io_addr+TSCAN1_JMP_REG); + *pjmp = can_inb(remap_io_addr+TSCAN1_JMP_REG); result = 0; } while (0); @@ -278,10 +281,11 @@ int tscan1_init_hw_data(struct candevice_t *candev) io_addr = candev->io_addr; if(io_addr && (io_addr != (unsigned long)-1)) { - remap_io_addr = io_addr = tsxxx_base; + remap_io_addr = io_addr + tsxxx_base; if(tscan1_check_presence(remap_io_addr, &jmp)){ - CANMSG("No TSCAN1 card found at address 0xlx\n"); + CANMSG("No TSCAN1 card found at address 0x%lx\n", + remap_io_addr); return -ENODEV; } } else { @@ -295,7 +299,7 @@ int tscan1_init_hw_data(struct candevice_t *candev) } io_addr = TSCAN1_BASE_IO + i*TSXXX_IO_RANGE; - remap_io_addr = io_addr = tsxxx_base; + remap_io_addr = io_addr + tsxxx_base; for (j = 0; j < MAX_HW_CARDS; j++) { if(io[j] == io_addr){ @@ -340,12 +344,12 @@ int ts7kv_check_presence(unsigned long remap_io_addr, int *pjmp) return -ENODEV; do { - if (inb(remap_io_addr+TSXXX_ID0_REG)!=TS7KV_ID0 || - inb(remap_io_addr+TSXXX_ID1_REG)!=TS7KV_ID1) + if (can_inb(remap_io_addr+TSXXX_ID0_REG)!=TS7KV_ID0 || + can_inb(remap_io_addr+TSXXX_ID1_REG)!=TS7KV_ID1) break; if(pjmp) - *pjmp = inb(remap_io_addr+TS7KV_JMP_REG); + *pjmp = can_inb(remap_io_addr+TS7KV_JMP_REG); result = 0; } while (0); @@ -365,10 +369,11 @@ int ts7kv_init_hw_data(struct candevice_t *candev) io_addr = candev->io_addr; if(io_addr && (io_addr != (unsigned long)-1)) { - remap_io_addr = io_addr = tsxxx_base; + remap_io_addr = io_addr + tsxxx_base; if(ts7kv_check_presence(remap_io_addr, &jmp)){ - CANMSG("No TS7KV card found at address 0xlx\n"); + CANMSG("No TS7KV card found at address 0x%lx\n", + remap_io_addr); return -ENODEV; } } else { @@ -382,7 +387,7 @@ int ts7kv_init_hw_data(struct candevice_t *candev) } io_addr = TS7KV_BASE_IO + i*TSXXX_IO_RANGE; - remap_io_addr = io_addr = tsxxx_base; + remap_io_addr = io_addr + tsxxx_base; for (j = 0; j < MAX_HW_CARDS; j++) { if(io[j] == io_addr){ @@ -457,16 +462,10 @@ int ts7kv_init_hw_data(struct candevice_t *candev) */ int tscan1_init_chip_data(struct candevice_t *candev, int chipnr) { - unsigned long clk; + unsigned long default_clk = 16000 * 1000; int jmp; int irq = -1; - clk = clock[candev->candev_idx]; - if(!clk || (clk == -1)) - clk = 16000 * 1000; - else - clk *= 1000; - /* unused reset address is used to store jumper setting */ jmp = candev->res_addr; @@ -483,7 +482,8 @@ int tscan1_init_chip_data(struct candevice_t *candev, int chipnr) sja1000p_fill_chipspecops(candev->chip[chipnr]); - candev->chip[chipnr]->clock = clk; + if(candev->chip[chipnr]->clock <= 0) + candev->chip[chipnr]->clock = default_clk; candev->chip[chipnr]->int_clk_reg = 0x0; candev->chip[chipnr]->int_bus_reg = 0x0; candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF; @@ -499,16 +499,10 @@ int tscan1_init_chip_data(struct candevice_t *candev, int chipnr) int ts7kv_init_chip_data(struct candevice_t *candev, int chipnr) { - unsigned long clk; + unsigned long default_clk = 16000 * 1000; int jmp; int irq = -1; - clk = clock[candev->candev_idx]; - if(!clk || (clk == -1)) - clk = 24000 * 1000; - else - clk *= 1000; - /* unused reset address is used to store jumper setting */ jmp = candev->res_addr; @@ -526,7 +520,8 @@ int ts7kv_init_chip_data(struct candevice_t *candev, int chipnr) sja1000p_fill_chipspecops(candev->chip[chipnr]); - candev->chip[chipnr]->clock = clk; + if(candev->chip[chipnr]->clock <= 0) + candev->chip[chipnr]->clock = default_clk; candev->chip[chipnr]->int_clk_reg = 0x0; candev->chip[chipnr]->int_bus_reg = 0x0; candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF; @@ -587,32 +582,33 @@ int tscan1_program_irq(struct candevice_t *candev) * Return Value: The function does not return a value * File: src/tscan1.c */ -void tscan1_write_register(unsigned data, unsigned long address) +void tscan1_write_register(unsigned data, can_ioptr_t address) { - outb(data, address); + can_outb(data, address); } -void ts7kv_write_register(unsigned data, unsigned long address) +void ts7kv_write_register(unsigned data, can_ioptr_t address) { - unsigned long base = address & ~0x1f; + unsigned long addr=can_ioptr2ulong(address); + can_ioptr_t base = can_ulong2ioptr(addr & ~0x1f); unsigned char nwin = 0x10; unsigned char savewin; can_spin_irqflags_t flags; - if((address&0x1f) > 0x1d) { + if((addr&0x1f) > 0x1d) { nwin++; address -= 0x10; } can_spin_lock_irqsave(&ts7kv_win_lock,flags); - savewin = inb(base+TS7KV_WIN_REG); + savewin = can_inb(base+TS7KV_WIN_REG); if(nwin == savewin) { - outb(data, address); + can_outb(data, address); }else{ - outb(nwin, base+TS7KV_WIN_REG); - outb(data, address); - outb(savewin, base+TS7KV_WIN_REG); + can_outb(nwin, base+TS7KV_WIN_REG); + can_outb(data, address); + can_outb(savewin, base+TS7KV_WIN_REG); } can_spin_unlock_irqrestore(&ts7kv_win_lock,flags); } @@ -627,33 +623,34 @@ void ts7kv_write_register(unsigned data, unsigned long address) * Return Value: The function returns the value stored in @address * File: src/tscan1.c */ -unsigned tscan1_read_register(unsigned long address) +unsigned tscan1_read_register(can_ioptr_t address) { - return inb(address); + return can_inb(address); } -unsigned ts7kv_read_register(unsigned long address) +unsigned ts7kv_read_register(can_ioptr_t address) { - unsigned long base = address & ~0x1f; + unsigned long addr=can_ioptr2ulong(address); + can_ioptr_t base = can_ulong2ioptr(addr & ~0x1f); unsigned char nwin = 0x10; unsigned char savewin; unsigned val; can_spin_irqflags_t flags; - if((address&0x1f) > 0x1d) { + if((addr&0x1f) > 0x1d) { nwin++; address -= 0x10; } can_spin_lock_irqsave(&ts7kv_win_lock,flags); - savewin = inb(base+TS7KV_WIN_REG); + savewin = can_inb(base+TS7KV_WIN_REG); if(nwin == savewin) { - val = inb(address); + val = can_inb(address); }else{ - outb(nwin, base+TS7KV_WIN_REG); - val = inb(address); - outb(savewin, base+TS7KV_WIN_REG); + can_outb(nwin, base+TS7KV_WIN_REG); + val = can_inb(address); + can_outb(savewin, base+TS7KV_WIN_REG); } can_spin_unlock_irqrestore(&ts7kv_win_lock,flags);