can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
+int c_can_fill_chipspecops(struct chip_t *chip);
+
/* BasicCAN mode address map */
#define CCCR 0x0000 /* Control Register */
#define CCSR 0x0004 /* Status Register */
/* Version of the driver */
#define CAN_DRV_VER_MAJOR 0
-#define CAN_DRV_VER_MINOR 2
-#define CAN_DRV_VER_PATCH 2
+#define CAN_DRV_VER_MINOR 3
+#define CAN_DRV_VER_PATCH 0
#define CAN_DRV_VER ((CAN_DRV_VER_MAJOR<<16) | (CAN_DRV_VER_MINOR<<8) | CAN_DRV_VER_PATCH)
/* Default driver major number, see /usr/src/linux/Documentation/devices.txt */
int i82527_stop_chip(struct chip_t *chip);
int i82527_check_tx_stat(struct chip_t *chip);
can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
+int i82527_fill_chipspecops(struct chip_t *chip);
+
#define MSG_OFFSET(object) ((object)*0x10)
int sja1000_start_chip(struct chip_t *chip);
int sja1000_stop_chip(struct chip_t *chip);
can_irqreturn_t sja1000_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
+int sja1000_fill_chipspecops(struct chip_t *chip);
/* BasicCAN mode address map */
#define SJACR 0x00 /* Control register */
struct canmsg_t *msg);
int sja1000p_send_msg(struct chip_t *chip, struct msgobj_t *obj,
struct canmsg_t *msg);
+int sja1000p_fill_chipspecops(struct chip_t *chip);
/* PeliCAN mode */
enum SJA1000_PeliCAN_regs {
return 0;
}
-#define CHIP_TYPE "sja1000"
/**
* template_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
*/
int aim104_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ sja1000_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
candev->chip[chipnr]->flags = 0;
return 0;
}
-#define CHIP_TYPE "sja1000p"
/**
* bfadcan_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
int bfadcan_init_chip_data(struct candevice_t *candev, int chipnr)
{
unsigned int id1, id2;
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ sja1000p_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = clock_freq;
candev->chip[chipnr]->int_cpu_reg = iCPU_DSC;
id2 = inb(0xe285);
- CANMSG("can driver ver lincan-0.2, at %04lx, CPLD v%d.%d.%d.%d\n",
+ CANMSG("can driver ver lincan-0.3, at %04lx, CPLD v%d.%d.%d.%d\n",
candev->chip[chipnr]->chip_base_addr,
id1>>4, id1&0x0f, id2>>4, id2&0x0f);
return 0;
}
-/*int c_can_register(struct chip_t *pchip)
+int c_can_fill_chipspecops(struct chip_t *chip)
{
- DEBUGMSG("(c%d)call c_can_register\n", pchip->chip_idx);
-
- // Validate pointer
- if ( NULL == pchip ) return -1;
-
- pchip->chip_config = c_can_chip_config;
- pchip->set_baud_rate = c_can_baud_rate;
- pchip->set_mask = c_can_mask;
- pchip->set_use_mask = c_can_use_mask;
- //pchip->set_message15_mask = c_can_extended_mask;
- pchip->clear_objects = c_can_clear_objects;
- pchip->config_irqs = c_can_config_irqs;
- pchip->pre_read_config = c_can_pre_read_config;
- //pchip->pre_write_config = c_can_pre_write_config;
- pchip->send_msg = c_can_send_msg;
- pchip->check_tx_stat = c_can_check_tx_stat;
- pchip->remote_request = c_can_remote_request;
- pchip->enable_configuration = c_can_enable_configuration;
- pchip->disable_configuration = c_can_disable_configuration;
- pchip->set_btregs = c_can_set_btregs;
- pchip->start_chip = c_can_start_chip;
- pchip->stop_chip = c_can_stop_chip;
- pchip->register_dump = c_can_registerdump;
-
- DEBUGMSG("-> ok\n");
- return 0;
+ chip->chip_type="c_can";
+ chip->max_objects = 32;
+ c_can_register(chip->chipspecops);
+ return 0;
}
-*/
return 0;
}
-#define CHIP_TYPE "sja1000"
/**
* template_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
*/
int cc104_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ sja1000_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
candev->chip[chipnr]->flags = 0;
int ems_cpcpci_init_chip_data(struct candevice_t *candev, int chipnr)
{
-
if(candev->sysdevptr.pcidev==NULL)
return -ENODEV;
+ sja1000p_fill_chipspecops(candev->chip[chipnr]);
+
candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq;
- candev->chip[chipnr]->chip_type="sja1000p";
candev->chip[chipnr]->chip_base_addr = candev->io_addr+
0x400 + chipnr*EMS_CPCPCI_BYTES_PER_CIRCUIT;
candev->chip[chipnr]->flags = 0;
*/
int hms30c7202_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ // Register chip operations
+ c_can_fill_chipspecops(candev->chip[chipnr]);
+ /* override chip provided default value */
+ candev->chip[chipnr]->max_objects = NR_MSGOBJ;
+
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
- candev->chip[chipnr]->max_objects = NR_MSGOBJ;
-
/*candev->chip[chipnr]->int_clk_reg = 0x0;
candev->chip[chipnr]->int_bus_reg = 0x0;
candev->chip[chipnr]->sja_cdr_reg = 0x0;
candev->chip[chipnr]->sja_ocr_reg = 0x0;*/
- // Register chip operations
- c_can_register(candev->chip[chipnr]->chipspecops);
return 0;
}
chipspecops->irq_handler = i82527_irq_handler;
return 0;
}
+
+int i82527_fill_chipspecops(struct chip_t *chip)
+{
+ chip->chip_type="i82527";
+ chip->max_objects=15;
+ i82527_register(chip->chipspecops);
+ return 0;
+}
candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq;
- candev->chip[chipnr]->chip_type="sja1000p";
+ sja1000p_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=
candev->io_addr+chipnr*KV_PCICAN_BYTES_PER_CIRCUIT;
candev->chip[chipnr]->flags = 0;
return 0;
}
-#define CHIP_TYPE "i82527"
/**
* m437_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
*/
int m437_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ i82527_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
candev->chip[chipnr]->int_cpu_reg = iCPU_DSC | iCPU_CEN;
* argument supplied at module loading time.
* The clock argument holds the chip clock value in Hz.
*/
-#define CHIP_TYPE "i82527"
int msmcan_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ i82527_fill_chipspecops(candev->chip[chipnr]);
/* device uses indexed access */
candev->chip[chipnr]->chip_base_addr=
candev->io_addr << 16;
* argument supplied at module loading time.
* The clock argument holds the chip clock value in Hz.
*/
-#define CHIP_TYPE "i82527"
int nsi_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ i82527_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=
candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
return 0;
}
-#define CHIP_TYPE "sja1000"
/**
* pci03_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
*/
int pci03_init_chip_data(struct candevice_t *candev, int chipnr)
{
+ sja1000_fill_chipspecops(candev->chip[chipnr]);
pci03_base_addr = candev->io_addr;
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
{
if (!strcmp(candev->hwname,"pccan-q")) {
if (chipnr<2) {
- candev->chip[chipnr]->chip_type="i82527";
+ i82527_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->flags = CHIP_SEGMENTED;
candev->chip[chipnr]->int_cpu_reg=iCPU_DSC;
candev->chip[chipnr]->int_clk_reg=iCLK_SL1;
candev->chip[chipnr]->sja_ocr_reg = 0;
}
else{
- candev->chip[chipnr]->chip_type="sja1000";
+ sja1000_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->flags = 0;
candev->chip[chipnr]->int_cpu_reg = 0;
candev->chip[chipnr]->int_clk_reg = 0;
candev->chip[chipnr]->chip_base_addr=0x1000*chipnr+0x2000+candev->io_addr;
}
else {
- candev->chip[chipnr]->chip_type="sja1000";
+ sja1000_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=0x1000*chipnr+0x4000+candev->io_addr;
candev->chip[chipnr]->flags = 0;
candev->chip[chipnr]->int_cpu_reg = 0;
return 0;
}
-#define CHIP_TYPE "i82527"
/**
* pcccan_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
*/
int pcccan_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ i82527_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
candev->chip[chipnr]->int_cpu_reg = iCPU_DSC | iCPU_DMC;
return 0;
}
-#define CHIP_TYPE "sja1000p"
/**
* template_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
*/
int pcm3680_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ sja1000p_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=
candev->io_addr + 0x200*chipnr;
candev->chip[chipnr]->clock = 16000000;
return 0;
}
-#define CHIP_TYPE "sja1000p"
-/* #define CHIP_TYPE "sja1000" */
-
/**
* pikronisa_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
*/
int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ /*sja1000_fill_chipspecops(candev->chip[chipnr]);*/
+ sja1000p_fill_chipspecops(candev->chip[chipnr]);
+
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 24000000;
candev->chip[chipnr]->int_clk_reg = 0x0;
int pip_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type="i82527";
+ i82527_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
if (!strcmp(candev->hwname,"pip5"))
#include "../include/setup.h"
#include "../include/finish.h"
-extern int sja1000_register(struct chipspecops_t *chipspecops);
-extern int sja1000p_register(struct chipspecops_t *chipspecops);
-extern int i82527_register(struct chipspecops_t *chipspecops);
-
int init_hwspecops(struct candevice_t *candev, int *irqnum_p);
int init_device_struct(int card, int *chan_param_idx_p, int *irq_param_idx_p);
int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudrate);
int init_obj_struct(struct candevice_t *candev, struct chip_t *hostchip, int objnr);
-int init_chipspecops(struct candevice_t *candev, int chipnr);
/**
* can_checked_malloc - memory allocation with registering of requested blocks
* @baudrate: baudrate in the units of 1Bd
*
* Chip structure is allocated and chip specific operations are filled by
- * call to board specific init_chip_data() function and generic
- * init_chipspecops() function. The message objects are generated by
+ * call to board specific init_chip_data() which calls chip specific
+ * fill_chipspecops(). The message objects are generated by
* calls to init_obj_struct() function.
*
* Return Value: returns negative number in the case of fail
chip->baudrate=baudrate;
chip->flags=0x0;
- candev->hwspecops->init_chip_data(candev,chipnr);
-
- if (init_chipspecops(candev,chipnr))
+ if(candev->hwspecops->init_chip_data(candev,chipnr)<0)
return -ENODEV;
for (objnr=0; objnr<chip->max_objects; objnr++) {
}
-/**
- * init_chipspecops - fills chip specific operations for board for known chip types
- * @candev: pointer to the corresponding CAN device/board
- * @chipnr: index of the chip in the device/board structure
- *
- * The function fills chip specific operations for next known generic chip
- * types "i82527", "sja1000", "sja1000p" (PeliCAN). Other non generic chip types
- * operations has to be initialized in the board specific init_chip_data() function.
- *
- * Return Value: returns negative number in the case of fail
- */
-int init_chipspecops(struct candevice_t *candev, int chipnr)
-{
- if (!strcmp(candev->chip[chipnr]->chip_type,"i82527")) {
- candev->chip[chipnr]->max_objects=15;
- i82527_register(candev->chip[chipnr]->chipspecops);
- }
- if (!strcmp(candev->chip[chipnr]->chip_type,"sja1000")) {
- candev->chip[chipnr]->max_objects=1;
- sja1000_register(candev->chip[chipnr]->chipspecops);
- }
- if (!strcmp(candev->chip[chipnr]->chip_type,"sja1000p")) {
- candev->chip[chipnr]->max_objects=1;
- sja1000p_register(candev->chip[chipnr]->chipspecops);
- }
-
- return 0;
-}
-
#ifndef CAN_WITH_RTL
/**
chipspecops->irq_handler = sja1000_irq_handler;
return 0;
}
+
+int sja1000_fill_chipspecops(struct chip_t *chip)
+{
+ chip->chip_type="sja1000";
+ chip->max_objects=1;
+ sja1000_register(chip->chipspecops);
+ return 0;
+}
+
chipspecops->irq_handler=sja1000p_irq_handler;
return 0;
}
+
+/**
+ * sja1000p_fill_chipspecops - fills chip specific operations
+ * @chip: pointer to chip representation structure
+ *
+ * The function fills chip specific operations for sja1000 (PeliCAN) chip.
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int sja1000p_fill_chipspecops(struct chip_t *chip)
+{
+ chip->chip_type="sja1000p";
+ chip->max_objects=1;
+ sja1000p_register(chip->chipspecops);
+ return 0;
+}
int smartcan_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type="i82527";
+ i82527_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
candev->chip[chipnr]->int_cpu_reg = iCPU_DSC;
* argument supplied at module loading time.
* The clock argument holds the chip clock value in Hz.
*/
-#define CHIP_TYPE "i82527"
-
int ssv_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ i82527_fill_chipspecops(candev->chip[chipnr]);
candev->chip[chipnr]->chip_base_addr=
candev->io_addr+0x100*chipnr;
candev->chip[chipnr]->clock = 16000000;
return 0;
}
-#define CHIP_TYPE "i82527"
/**
* template_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
*/
int template_init_chip_data(struct candevice_t *candev, int chipnr)
{
- candev->chip[chipnr]->chip_type=CHIP_TYPE;
+ i82527_fill_chipspecops(candev->chip[chipnr]);
+ /*sja1000_fill_chipspecops(candev->chip[chipnr]);*/
+ /*sja1000p_fill_chipspecops(candev->chip[chipnr]);*/
+
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
candev->chip[chipnr]->clock = 16000000;
candev->chip[chipnr]->int_cpu_reg = iCPU_DSC;
return 0;
}
-#define CHIP_TYPE "unican"
-
/**
* unican_init_chip_data - Initialize chips
* @candev: Pointer to candevice/board structure
int unican_init_chip_data(struct candevice_t *candev, int chipnr)
{
struct chip_t *chip = candev->chip[chipnr];
- chip->chip_type = CHIP_TYPE;
+ chip->chip_type = "unican";
chip->chip_base_addr = 0;
chip->clock = 10000000;
chip->int_clk_reg = 0x0;