2 * Linux CAN-bus device driver.
3 * This software is released under the GPL-License.
6 #include "../include/can.h"
7 #include "../include/can_sysdep.h"
8 #include "../include/main.h"
9 #include "../include/sh7760.h"
10 #include "../include/hcan2.h"
12 int sh7760_request_io(struct candevice_t *candev)
14 if (!can_request_io_region(candev->io_addr, candev->nr_all_chips * IO_RANGE, DEVICE_NAME)) {
15 CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
19 DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + candev->nr_all_chips * IO_RANGE - 1);
23 int sh7760_release_io(struct candevice_t *candev)
25 can_release_io_region(candev->io_addr, candev->nr_all_chips * IO_RANGE);
30 int sh7760_reset(struct candevice_t *candev)
33 DEBUGMSG("Resetting HCAN2 chips ...\n");
35 for (i = 0; i < candev->nr_all_chips; i++)
37 /* !!! Assuming this card has ONLY HCAN2 chips !!! */
38 if (hcan2_reset_chip(candev->chip[i])) return -ENODEV;
44 int sh7760_init_hw_data(struct candevice_t *candev)
46 /* candev->res_addr = RESET_ADDR; */
47 candev->nr_82527_chips = NR_82527;
48 candev->nr_sja1000_chips = NR_SJA1000;
49 candev->nr_all_chips = NR_ALL;
50 /* candev->flags |= CANDEV_PROGRAMMABLE_IRQ; */
54 int sh7760_init_chip_data(struct candevice_t *candev, int chipnr)
56 hcan2_fill_chipspecops(candev->chip[chipnr]);
58 candev->chip[chipnr]->chip_base_addr = can_ioport2ioptr(candev->io_addr) + chipnr * SH7760_CAN_CHIP_OFFSET; /* one chip with 2 interfaces */
59 candev->chip[chipnr]->clock = SH7760_CAN_CLOCK;
60 candev->chip[chipnr]->chip_irq = SH7760_CAN_IRQ + chipnr;
61 candev->chip[chipnr]->hostdevice = candev;
66 int sh7760_init_obj_data(struct canchip_t *chip, int objnr)
68 chip->msgobj[objnr]->obj_base_addr = (can_ioptr_t) HCAN2_MB0 + HCAN2_MB_OFFSET * objnr;
73 int sh7760_program_irq(struct candevice_t *candev)
75 /* sh7760 doesn't use programmable interrupt */
80 void sh7760_write_register(unsigned data, can_ioptr_t address)
82 /* address is an absolute address */
83 writew(data, address);
86 unsigned sh7760_read_register(can_ioptr_t address)
88 /* address is an absolute address */
89 return readw(address);
92 int sh7760_register(struct hwspecops_t *hwspecops)
94 hwspecops->request_io = sh7760_request_io;
95 hwspecops->release_io = sh7760_release_io;
96 hwspecops->reset = sh7760_reset;
97 hwspecops->init_hw_data = sh7760_init_hw_data;
98 hwspecops->init_chip_data = sh7760_init_chip_data;
99 hwspecops->init_obj_data = sh7760_init_obj_data;
100 hwspecops->program_irq = sh7760_program_irq;
101 hwspecops->write_register = sh7760_write_register;
102 hwspecops->read_register = sh7760_read_register;