From: ppisa Date: Sun, 23 Nov 2008 22:52:27 +0000 (+0100) Subject: Merge branch 'master' into can-usb1 X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/commitdiff_plain/0789c67983b502e2b83f9a447e3f6b2d0eff2a54?hp=94246cff7c0f45941a8b97317f9dd06d1956acce Merge branch 'master' into can-usb1 Conflicts: lincan/src/Makefile.omk --- diff --git a/lincan/README b/lincan/README index faf2677..0c89a19 100644 --- a/lincan/README +++ b/lincan/README @@ -252,7 +252,8 @@ The hw argument can be one of: - m437, for the M436 PC/104 card by SECO - bfadcan for sja1000 CAN embedded card made by BFAD GmbH - gensja1000io for many sja1000 I/O mapped cards (PCAN-PC/104 for example). -- pikronisa for ISA memory mapped sja1000 CAN card made by PiKRON Ltd. +- gensja1000mm for ISA memory mapped sja1000 CAN cards + (for pikronisa card used by PiKRON Ltd. the clockfreq=24000 has to be specified) - pimx1 for MX1_DIS1 extension board for PiMX1 ARM based BCC - msmcan for MICROSPACE IO space indexed i82527 - unican for Unicontrols PCAN card @@ -268,7 +269,8 @@ The hw argument can be one of: - ts7kv for Technologic Systems' TS-7KV Multi-function board with SJA1000 both these cards require CONFIG_OC_LINCAN_CARD_tscan1=y - pcan_pci for PEAK System PCAN-PCI single, double or quad SJA1000 based board -- esdpci200 for the CAN/PCI-200 card by ESD Electronics board +- esdpci200 for the CAN/PCI-200 card by ESD Electronics +- esdpci266 for the ESD PCI/PMC 266 card by ESD Electronics - template, for yet unsupported hardware (you need to edit src/template.c) - virtual, CAN channel for testing of software and driver without CAN hardware diff --git a/lincan/include/gensja1000mm.h b/lincan/include/gensja1000mm.h new file mode 100644 index 0000000..cfa7dbe --- /dev/null +++ b/lincan/include/gensja1000mm.h @@ -0,0 +1,22 @@ +/* gensja1000mm.h + * Header file for the Linux CAN-bus driver. + * Written by Arnaud Westenberg email:arnaud@wanadoo.nl + * Added by Pavel Pisa pisa@cmp.felk.cvut.cz + * email:pisa@cmp.felk.cvut.cz + * This software is released under the GPL-License. + * Version lincan-0.3 17 Jun 2004 + * + * Generic support for SJA1000 memory mapped CAN cards + * memory mapped SJA1000 controller + */ + +int gensja1000mm_request_io(struct candevice_t *candev); +int gensja1000mm_release_io(struct candevice_t *candev); +int gensja1000mm_reset(struct candevice_t *candev); +int gensja1000mm_init_hw_data(struct candevice_t *candev); +int gensja1000mm_init_chip_data(struct candevice_t *candev, int chipnr); +int gensja1000mm_init_obj_data(struct canchip_t *chip, int objnr); +int gensja1000mm_program_irq(struct candevice_t *candev); +void gensja1000mm_write_register(unsigned data, can_ioptr_t address); +unsigned gensja1000mm_read_register(can_ioptr_t address); + diff --git a/lincan/include/pikronisa.h b/lincan/include/pikronisa.h deleted file mode 100644 index 292c46e..0000000 --- a/lincan/include/pikronisa.h +++ /dev/null @@ -1,22 +0,0 @@ -/* pikronisa.h - * Header file for the Linux CAN-bus driver. - * Written by Arnaud Westenberg email:arnaud@wanadoo.nl - * Added by Pavel Pisa pisa@cmp.felk.cvut.cz - * email:pisa@cmp.felk.cvut.cz - * This software is released under the GPL-License. - * Version lincan-0.3 17 Jun 2004 - * - * Support for PiKRON Ltd ISA CAN card using - * memory mapped SJA1000 controller - */ - -int pikronisa_request_io(struct candevice_t *candev); -int pikronisa_release_io(struct candevice_t *candev); -int pikronisa_reset(struct candevice_t *candev); -int pikronisa_init_hw_data(struct candevice_t *candev); -int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr); -int pikronisa_init_obj_data(struct canchip_t *chip, int objnr); -int pikronisa_program_irq(struct candevice_t *candev); -void pikronisa_write_register(unsigned data, can_ioptr_t address); -unsigned pikronisa_read_register(can_ioptr_t address); - diff --git a/lincan/src/Makefile.omk b/lincan/src/Makefile.omk index 29e0ba4..a273b78 100644 --- a/lincan/src/Makefile.omk +++ b/lincan/src/Makefile.omk @@ -1,8 +1,8 @@ lincan_cards_NAMES = pip pccan smartcan nsi cc_can104 ems_cpcpci \ - pc_i03 pcm3680 aim104 m437 pcccan ssv bfadcan gensja1000io pikronisa eb8245 \ + pc_i03 pcm3680 aim104 m437 pcccan ssv bfadcan gensja1000io gensja1000mm eb8245 \ kv_pcican msmcan oscar adlink7841 pcan_pci esdpci200 unican usbcan virtual template -lincan_morecards_NAMES = hms30c7202_can ns_dev_can ipci165 pimx1 tscan1 ts7kv nsi_canpci sh7760 +lincan_morecards_NAMES = esdpci266 hms30c7202_can ns_dev_can ipci165 pimx1 tscan1 ts7kv nsi_canpci sh7760 default_CONFIG = CONFIG_OC_LINCAN=y CONFIG_OC_LINCANRTL=n CONFIG_OC_LINCANVME=n default_CONFIG += CONFIG_OC_LINCAN_PORTIO_ONLY=n CONFIG_OC_LINCAN_MEMIO_ONLY=n diff --git a/lincan/src/Makefile.std b/lincan/src/Makefile.std index 2087c6c..037766c 100644 --- a/lincan/src/Makefile.std +++ b/lincan/src/Makefile.std @@ -63,13 +63,13 @@ endif SUPPORTED_CARDS = pip pccan smartcan nsi cc_can104 \ pc_i03 pcm3680 aim104 m437 pcccan ssv \ - bfadcan pikronisa kv_pcican msmcan virtual template \ + bfadcan gensja1000mm gensja1000io kv_pcican msmcan virtual template \ unican unican_cl2 ems_cpcpci adlink7841 oscar \ pcan_pci esdpci200 # hms30c7202_can c_can c_can_irq tscan1 # pcan_dongle -#SUPPORTED_CARDS = pcm3680 bfadcan pikronisa template +#SUPPORTED_CARDS = pcm3680 bfadcan template #SUPPORTED_CARDS = virtual diff --git a/lincan/src/boardlist.c b/lincan/src/boardlist.c index d7cf342..ab0bd09 100644 --- a/lincan/src/boardlist.c +++ b/lincan/src/boardlist.c @@ -29,7 +29,7 @@ extern int aim104_register(struct hwspecops_t *hwspecops); extern int pcccan_register(struct hwspecops_t *hwspecops); extern int ssv_register(struct hwspecops_t *hwspecops); extern int bfadcan_register(struct hwspecops_t *hwspecops); -extern int pikronisa_register(struct hwspecops_t *hwspecops); +extern int gensja1000mm_register(struct hwspecops_t *hwspecops); extern int gensja1000io_register(struct hwspecops_t *hwspecops); extern int pimx1_register(struct hwspecops_t *hwspecops); extern int msmcan_register(struct hwspecops_t *hwspecops); @@ -49,6 +49,7 @@ extern int nsi_canpci_register(struct hwspecops_t *hwspecops); extern int usbcan_register(struct hwspecops_t *hwspecops); extern int pcan_pci_register(struct hwspecops_t *hwspecops); extern int esdpci200_register(struct hwspecops_t *hwspecops); +extern int esdpci266_register(struct hwspecops_t *hwspecops); extern int sh7760_register(struct hwspecops_t *hwspecops); const struct boardtype_t can_boardtypes[]={ @@ -111,8 +112,8 @@ const struct boardtype_t can_boardtypes[]={ #ifdef CONFIG_OC_LINCAN_CARD_bfadcan {"bfadcan", bfadcan_register, 1}, #endif - #ifdef CONFIG_OC_LINCAN_CARD_pikronisa - {"pikronisa", pikronisa_register, 1}, + #ifdef CONFIG_OC_LINCAN_CARD_gensja1000mm + {"gensja1000mm", gensja1000mm_register, 1}, #endif #ifdef CONFIG_OC_LINCAN_CARD_gensja1000io {"gensja1000io", gensja1000io_register, 1}, @@ -147,6 +148,9 @@ const struct boardtype_t can_boardtypes[]={ #if defined(CONFIG_OC_LINCAN_CARD_esdpci200) {"esdpci200", esdpci200_register, 0}, #endif + #if defined(CONFIG_OC_LINCAN_CARD_esdpci266) + {"esdpci266", esdpci200_register, 0}, + #endif #if defined(CONFIG_OC_LINCAN_CARD_tscan1) {"tscan1", tscan1_register, 1}, {"tscan1mmio", tscan1mmio_register, 1}, diff --git a/lincan/src/esdpci200.c b/lincan/src/esdpci200.c index 1b62e7e..1d10d64 100644 --- a/lincan/src/esdpci200.c +++ b/lincan/src/esdpci200.c @@ -173,7 +173,7 @@ int esdpci200_request_io(struct candevice_t *candev) can_base_addr_fixup(candev, remap_addr); CANMSG("esdpci200_sja IO-memory: 0x%lx - 0x%lx (VMA 0x%lx)\n", (unsigned long) bar2_addr, - (unsigned long) bar2_addr + pci_resource_len(pcidev,2) - 1, + (unsigned long) (bar2_addr + pci_resource_len(pcidev,2) - 1), (long) remap_addr); return 0; @@ -208,13 +208,13 @@ int esdpci200_release_io(struct candevice_t *candev) void esdpci200_write_register(unsigned data, can_ioptr_t address) { - iowrite8((u8)data,(void*)address); + iowrite8((u8)data,address); wmb(); } unsigned esdpci200_read_register(can_ioptr_t address) { - return ioread8((void*)address); + return ioread8(address); } int esdpci200_reset(struct candevice_t *candev) diff --git a/lincan/src/esdpci266.c b/lincan/src/esdpci266.c new file mode 100644 index 0000000..a2f3183 --- /dev/null +++ b/lincan/src/esdpci266.c @@ -0,0 +1,263 @@ +/* esdpci266.c - support for ESD PCI/PMC 266 cards + * Linux CAN-bus device driver. + * Written by Arnaud Westenberg email:arnaud@wanadoo.nl + * Rewritten for new CAN queues by Pavel Pisa - OCERA team member + * email:pisa@cmp.felk.cvut.cz + * This software is released under the GPL-License. + * Version lincan-0.3 17 Jun 2004 + */ + +#include "../include/can.h" +#include "../include/can_sysdep.h" +#include "../include/main.h" +#include "../include/sja1000p.h" + +#ifdef CAN_ENABLE_PCI_SUPPORT + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)) +#define ioread32 can_readl +#define iowrite32 can_writel +#define ioread8 can_readb +#define iowrite8 can_writeb +#define wmb() +#define rmb() +#endif + +#define PLX_9056_VENDOR_ID 0x10B5 +#define PLX_9056_DEVICE_ID 0x9056 +#define ESDPCI266_PCI_VENDOR_ID 0x12FE +#define ESDPCI266_PCI_PRODUCT_ID 0x000E + +/* PCI to local bus bridge PLX9050 */ +#define ESDPCI266_BYTES_PER_CIRCUIT 0x100 + +void esdpci266_enable_irq(struct candevice_t *candev) +{ + uint32_t intcsr; + can_ioptr_t addr = candev->aux_base_addr + 0x68; + intcsr = ioread32(addr); + intcsr |= 0x900; + iowrite32(intcsr, addr); +} + +void esdpci266_disable_irq(struct candevice_t *candev) +{ + uint32_t intcsr; + can_ioptr_t addr = candev->aux_base_addr + 0x68; + intcsr = ioread32(addr); + intcsr &= ~0x900; + iowrite32(intcsr, addr); +} + +int esdpci266_request_io(struct candevice_t *candev) +{ + unsigned long addr, size; + can_ioptr_t remap_addr; + struct pci_dev *dev = candev->sysdevptr.pcidev; + + /* request memory region for SJA chips window */ + if (pci_request_region(dev, 2, "ESD PCI/PMC 266 - MEM") != 0) { + printk("lincan: request of memory range failed\n"); + return -ENODEV; + } + + /* determine address and size of memory window #2 */ + addr = pci_resource_start(dev, 2); + size = pci_resource_len(dev, 2); + + /* remap to kernel address space */ + remap_addr = ioremap(addr, size); + + if (!remap_addr) { + printk("lincan: Unable to access I/O memory at: 0x%lx\n", addr); + pci_release_region(dev, 2); + return -ENODEV; + } + + /* remap base device address */ + can_base_addr_fixup(candev, remap_addr); + + /* request memory region for PLX registers */ + if (pci_request_region(dev, 0, "ESD PCI/PMC 266 - PLX9056") != 0) { + printk("lincan: request of memory range failed\n"); + iounmap(candev->dev_base_addr); + pci_release_region(dev, 2); + return -ENODEV; + } + + /* determine address and size of memory window #2 */ + addr = pci_resource_start(dev, 0); + size = pci_resource_len(dev, 0); + + /* remap to kernel address space */ + remap_addr = ioremap(addr, size); + + if (!remap_addr) { + printk("lincan: Unable to access I/O memory at: 0x%lx\n", addr); + pci_release_region(dev, 0); + iounmap(candev->dev_base_addr); + pci_release_region(dev, 2); + return -ENODEV; + } + + /* save address of PLX regs */ + candev->aux_base_addr = remap_addr; + + /* enable irqs */ + esdpci266_enable_irq(candev); + + return 0; +} + +int esdpci266_release_io(struct candevice_t *candev) +{ + esdpci266_disable_irq(candev); + iounmap(candev->aux_base_addr); + pci_release_region(candev->sysdevptr.pcidev, 0); + iounmap(candev->dev_base_addr); + pci_release_region(candev->sysdevptr.pcidev, 2); + return 0; +} + +void esdpci266_write_register(unsigned data, can_ioptr_t address) +{ + iowrite8(data, address); + wmb(); +} + +unsigned esdpci266_read_register(can_ioptr_t address) +{ + return ioread8(address); +} + +int esdpci266_reset(struct candevice_t *candev) +{ + int i = 0, chip_nr; + struct canchip_t *chip; + unsigned cdr; + + printk("lincan: resetting ESD PCI/PMC 266 hardware ...\n"); + + for (chip_nr = 0; chip_nr < candev->nr_all_chips; chip_nr++) { + if (!candev->chip[chip_nr]) + continue; + + printk("lincan: resetting SJA1000 chip nr. %d\n", chip_nr); + + chip = candev->chip[chip_nr]; + + esdpci266_write_register(sjaMOD_RM, + chip->chip_base_addr + SJAMOD); + udelay(1000); + + cdr = esdpci266_read_register(chip->chip_base_addr + SJACDR); + esdpci266_write_register(cdr | sjaCDR_PELICAN, + chip->chip_base_addr + SJACDR); + esdpci266_write_register(0, chip->chip_base_addr + SJAIER); + + i = 20; + esdpci266_write_register(0, chip->chip_base_addr + SJAMOD); + while (esdpci266_read_register(chip->chip_base_addr + SJAMOD) & + sjaMOD_RM) { + if (!i--) + return -ENODEV; + udelay(1000); + esdpci266_write_register(0, + chip->chip_base_addr + SJAMOD); + } + + cdr = esdpci266_read_register(chip->chip_base_addr + SJACDR); + esdpci266_write_register(cdr | sjaCDR_PELICAN, + chip->chip_base_addr + SJACDR); + esdpci266_write_register(0, chip->chip_base_addr + SJAIER); + esdpci266_read_register(chip->chip_base_addr + SJAIR); + } + + return 0; +} + +int esdpci266_init_hw_data(struct candevice_t *candev) +{ + struct pci_dev *pcidev = NULL; + + printk("lincan: search for ESD PCI/PMC 266 board ...\n"); + + do { + pcidev = + pci_find_device(PLX_9056_VENDOR_ID, PLX_9056_DEVICE_ID, + pcidev); + if (pcidev == NULL) + return -ENODEV; + if (pcidev->subsystem_vendor != ESDPCI266_PCI_VENDOR_ID + || pcidev->subsystem_device != ESDPCI266_PCI_PRODUCT_ID) { + printk + ("PLX9056 found, subvendor/subdevice mismatch (%04d:%04d)\n", + pcidev->subsystem_vendor, + pcidev->subsystem_device); + continue; + } + } while (can_check_dev_taken(pcidev)); + + if (pci_enable_device(pcidev)) { + printk("lincan: pci_enable_device() failed\n"); + return -EIO; + } + + candev->sysdevptr.pcidev = pcidev; + + candev->io_addr = pci_resource_start(pcidev, 2); + candev->dev_base_addr = 0; + candev->res_addr = 0; + candev->nr_82527_chips = 0; + candev->nr_sja1000_chips = 2; + candev->nr_all_chips = 2; + + printk("lincan: ESD PCI/PMC 266 board found (%lx)\n", candev->io_addr); + + return 0; +} + +int esdpci266_init_chip_data(struct candevice_t *candev, int chipnr) +{ + if (candev->sysdevptr.pcidev == NULL) + return -ENODEV; + + candev->chip[chipnr]->chip_irq = candev->sysdevptr.pcidev->irq; + sja1000p_fill_chipspecops(candev->chip[chipnr]); + candev->chip[chipnr]->chip_base_addr = + candev->dev_base_addr + chipnr * ESDPCI266_BYTES_PER_CIRCUIT; + candev->chip[chipnr]->clock = 16000000; + candev->chip[chipnr]->int_clk_reg = 0; + candev->chip[chipnr]->int_bus_reg = 0; + candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF; + candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH; + candev->chip[chipnr]->flags |= CHIP_IRQ_PCI; + return 0; +} + +int esdpci266_init_obj_data(struct canchip_t *chip, int objnr) +{ + chip->msgobj[objnr]->obj_base_addr = chip->chip_base_addr; + return 0; +} + +int esdpci266_program_irq(struct candevice_t *candev) +{ + return 0; +} + +int esdpci266_register(struct hwspecops_t *hwspecops) +{ + hwspecops->request_io = esdpci266_request_io; + hwspecops->release_io = esdpci266_release_io; + hwspecops->reset = esdpci266_reset; + hwspecops->init_hw_data = esdpci266_init_hw_data; + hwspecops->init_chip_data = esdpci266_init_chip_data; + hwspecops->init_obj_data = esdpci266_init_obj_data; + hwspecops->write_register = esdpci266_write_register; + hwspecops->read_register = esdpci266_read_register; + hwspecops->program_irq = esdpci266_program_irq; + return 0; +} + +#endif /* CAN_ENABLE_PCI_SUPPORT */ diff --git a/lincan/src/gensja1000io.c b/lincan/src/gensja1000io.c index 8dcf9fb..6d994ed 100644 --- a/lincan/src/gensja1000io.c +++ b/lincan/src/gensja1000io.c @@ -172,7 +172,7 @@ int gensja1000io_init_chip_data(struct candevice_t *candev, int chipnr) candev->chip[chipnr]->chip_base_addr=can_ioport2ioptr(candev->io_addr); if(candev->chip[chipnr]->clock<=0) - candev->chip[chipnr]->clock = 16000000; + candev->chip[chipnr]->clock = 16000000; 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; diff --git a/lincan/src/pikronisa.c b/lincan/src/gensja1000mm.c similarity index 68% rename from lincan/src/pikronisa.c rename to lincan/src/gensja1000mm.c index 2a4fd22..100a267 100644 --- a/lincan/src/pikronisa.c +++ b/lincan/src/gensja1000mm.c @@ -1,4 +1,4 @@ -/* pikronisa.c +/* gensja1000mm.c * Linux CAN-bus device driver. * Written by Arnaud Westenberg email:arnaud@wanadoo.nl * Rewritten for new CAN queues by Pavel Pisa - OCERA team member @@ -10,7 +10,7 @@ #include "../include/can.h" #include "../include/can_sysdep.h" #include "../include/main.h" -#include "../include/pikronisa.h" +#include "../include/gensja1000mm.h" #include "../include/sja1000p.h" /* @@ -21,24 +21,24 @@ #define IO_RANGE 0x100 /** - * pikronisa_request_io: - reserve io or memory range for can board + * gensja1000mm_request_io: - reserve io or memory range for can board * @candev: pointer to candevice/board which asks for io. Field @io_addr * of @candev is used in most cases to define start of the range * - * The function pikronisa_request_io() is used to reserve the io-memory. If your + * The function gensja1000mm_request_io() is used to reserve the io-memory. If your * hardware uses a dedicated memory range as hardware control registers you * will have to add the code to reserve this memory as well. * %IO_RANGE is the io-memory range that gets reserved, please adjust according * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode. * Return Value: The function returns zero on success or %-ENODEV on failure - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_request_io(struct candevice_t *candev) +int gensja1000mm_request_io(struct candevice_t *candev) { can_ioptr_t remap_addr; - if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME " - pikronisa")) { + if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) { CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr); return -ENODEV; } @@ -54,18 +54,18 @@ int pikronisa_request_io(struct candevice_t *candev) } /** - * pikronisa_elease_io - free reserved io memory range + * gensja1000mm_elease_io - free reserved io memory range * @candev: pointer to candevice/board which releases io * - * The function pikronisa_release_io() is used to free reserved io-memory. + * The function gensja1000mm_release_io() is used to free reserved io-memory. * In case you have reserved more io memory, don't forget to free it here. * IO_RANGE is the io-memory range that gets released, please adjust according * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode. * Return Value: The function always returns zero - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_release_io(struct candevice_t *candev) +int gensja1000mm_release_io(struct candevice_t *candev) { /* release I/O memory mapping */ iounmap(candev->dev_base_addr); @@ -75,41 +75,41 @@ int pikronisa_release_io(struct candevice_t *candev) } /** - * pikronisa_reset - hardware reset routine + * gensja1000mm_reset - hardware reset routine * @candev: Pointer to candevice/board structure * - * The function pikronisa_reset() is used to give a hardware reset. This is + * The function gensja1000mm_reset() is used to give a hardware reset. This is * rather hardware specific so I haven't included example code. Don't forget to * check the reset status of the chip before returning. * Return Value: The function returns zero on success or %-ENODEV on failure - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_reset(struct candevice_t *candev) +int gensja1000mm_reset(struct candevice_t *candev) { int i; struct canchip_t *chip=candev->chip[0]; unsigned cdr; - pikronisa_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD); + gensja1000mm_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD); udelay(1000); - cdr=pikronisa_read_register(chip->chip_base_addr+SJACDR); - pikronisa_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR); + cdr=gensja1000mm_read_register(chip->chip_base_addr+SJACDR); + gensja1000mm_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR); - pikronisa_write_register(0, chip->chip_base_addr+SJAIER); + gensja1000mm_write_register(0, chip->chip_base_addr+SJAIER); i=20; - pikronisa_write_register(0, chip->chip_base_addr+SJAMOD); - while (pikronisa_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){ + gensja1000mm_write_register(0, chip->chip_base_addr+SJAMOD); + while (gensja1000mm_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){ if(!i--) return -ENODEV; udelay(1000); - pikronisa_write_register(0, chip->chip_base_addr+SJAMOD); + gensja1000mm_write_register(0, chip->chip_base_addr+SJAMOD); } - cdr=pikronisa_read_register(chip->chip_base_addr+SJACDR); - pikronisa_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR); + cdr=gensja1000mm_read_register(chip->chip_base_addr+SJACDR); + gensja1000mm_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR); - pikronisa_write_register(0, chip->chip_base_addr+SJAIER); + gensja1000mm_write_register(0, chip->chip_base_addr+SJAIER); return 0; } @@ -119,10 +119,10 @@ int pikronisa_reset(struct candevice_t *candev) #define NR_SJA1000 1 /** - * pikronisa_init_hw_data - Initialize hardware cards + * gensja1000mm_init_hw_data - Initialize hardware cards * @candev: Pointer to candevice/board structure * - * The function pikronisa_init_hw_data() is used to initialize the hardware + * The function gensja1000mm_init_hw_data() is used to initialize the hardware * structure containing information about the installed CAN-board. * %RESET_ADDR represents the io-address of the hardware reset register. * %NR_82527 represents the number of intel 82527 chips on the board. @@ -130,9 +130,9 @@ int pikronisa_reset(struct candevice_t *candev) * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that * the hardware uses programmable interrupts. * Return Value: The function always returns zero - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_init_hw_data(struct candevice_t *candev) +int gensja1000mm_init_hw_data(struct candevice_t *candev) { candev->res_addr=RESET_ADDR; candev->nr_82527_chips=0; @@ -144,11 +144,11 @@ int pikronisa_init_hw_data(struct candevice_t *candev) } /** - * pikronisa_init_chip_data - Initialize chips + * gensja1000mm_init_chip_data - Initialize chips * @candev: Pointer to candevice/board structure * @chipnr: Number of the CAN chip on the hardware card * - * The function pikronisa_init_chip_data() is used to initialize the hardware + * The function gensja1000mm_init_chip_data() is used to initialize the hardware * structure containing information about the CAN chips. * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or * "sja1000". @@ -173,15 +173,16 @@ int pikronisa_init_hw_data(struct candevice_t *candev) * register. Options defined in the %i82527.h file: * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST. * Return Value: The function always returns zero - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr) +int gensja1000mm_init_chip_data(struct candevice_t *candev, int chipnr) { /*sja1000_fill_chipspecops(candev->chip[chipnr]);*/ sja1000p_fill_chipspecops(candev->chip[chipnr]); candev->chip[chipnr]->chip_base_addr=candev->dev_base_addr; - candev->chip[chipnr]->clock = 24000000; + if(candev->chip[chipnr]->clock<=0) + candev->chip[chipnr]->clock = 16000000; 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; @@ -191,11 +192,11 @@ int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr) } /** - * pikronisa_init_obj_data - Initialize message buffers + * gensja1000mm_init_obj_data - Initialize message buffers * @chip: Pointer to chip specific structure * @objnr: Number of the message buffer * - * The function pikronisa_init_obj_data() is used to initialize the hardware + * The function gensja1000mm_init_obj_data() is used to initialize the hardware * structure containing information about the different message objects on the * CAN chip. In case of the sja1000 there's only one message object but on the * i82527 chip there are 15. @@ -205,75 +206,75 @@ int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr) * base address. * Unless the hardware uses a segmented memory map, flags can be set zero. * Return Value: The function always returns zero - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_init_obj_data(struct canchip_t *chip, int objnr) +int gensja1000mm_init_obj_data(struct canchip_t *chip, int objnr) { chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr; return 0; } /** - * pikronisa_program_irq - program interrupts + * gensja1000mm_program_irq - program interrupts * @candev: Pointer to candevice/board structure * - * The function pikronisa_program_irq() is used for hardware that uses + * The function gensja1000mm_program_irq() is used for hardware that uses * programmable interrupts. If your hardware doesn't use programmable interrupts * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and * leave this function unedited. Again this function is hardware specific so * there's no example code. * Return value: The function returns zero on success or %-ENODEV on failure - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_program_irq(struct candevice_t *candev) +int gensja1000mm_program_irq(struct candevice_t *candev) { return 0; } /** - * pikronisa_write_register - Low level write register routine + * gensja1000mm_write_register - Low level write register routine * @data: data to be written * @address: memory address to write to * - * The function pikronisa_write_register() is used to write to hardware registers + * The function gensja1000mm_write_register() is used to write to hardware registers * on the CAN chip. You should only have to edit this function if your hardware * uses some specific write process. * Return Value: The function does not return a value - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -void pikronisa_write_register(unsigned data, can_ioptr_t address) +void gensja1000mm_write_register(unsigned data, can_ioptr_t address) { - /*DEBUGMSG("pikronisa_write_register: addr=0x%lx data=0x%x", + /*DEBUGMSG("gensja1000mm_write_register: addr=0x%lx data=0x%x", address,data);*/ can_writeb(data,address); } /** - * pikronisa_read_register - Low level read register routine + * gensja1000mm_read_register - Low level read register routine * @address: memory address to read from * - * The function pikronisa_read_register() is used to read from hardware registers + * The function gensja1000mm_read_register() is used to read from hardware registers * on the CAN chip. You should only have to edit this function if your hardware * uses some specific read process. * Return Value: The function returns the value stored in @address - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -unsigned pikronisa_read_register(can_ioptr_t address) +unsigned gensja1000mm_read_register(can_ioptr_t address) { return can_readb(address); } /* !!! Don't change this function !!! */ -int pikronisa_register(struct hwspecops_t *hwspecops) +int gensja1000mm_register(struct hwspecops_t *hwspecops) { - hwspecops->request_io = pikronisa_request_io; - hwspecops->release_io = pikronisa_release_io; - hwspecops->reset = pikronisa_reset; - hwspecops->init_hw_data = pikronisa_init_hw_data; - hwspecops->init_chip_data = pikronisa_init_chip_data; - hwspecops->init_obj_data = pikronisa_init_obj_data; - hwspecops->write_register = pikronisa_write_register; - hwspecops->read_register = pikronisa_read_register; - hwspecops->program_irq = pikronisa_program_irq; + hwspecops->request_io = gensja1000mm_request_io; + hwspecops->release_io = gensja1000mm_release_io; + hwspecops->reset = gensja1000mm_reset; + hwspecops->init_hw_data = gensja1000mm_init_hw_data; + hwspecops->init_chip_data = gensja1000mm_init_chip_data; + hwspecops->init_obj_data = gensja1000mm_init_obj_data; + hwspecops->write_register = gensja1000mm_write_register; + hwspecops->read_register = gensja1000mm_read_register; + hwspecops->program_irq = gensja1000mm_program_irq; return 0; }