void c_can_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj);
-can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
+int c_can_irq_handler(int irq, struct chip_t *chip);
int c_can_fill_chipspecops(struct chip_t *chip);
#define CHIP_IRQ_PCI (1<<3)
#define CHIP_IRQ_VME (1<<4)
+/* System independent defines of IRQ handled state */
+#define CANCHIP_IRQ_NONE 0
+#define CANCHIP_IRQ_HANDLED 1
+
/* These flags can be used for the candevices_t structure flags data entry */
#define CANDEV_PROGRAMMABLE_IRQ (1<<0)
#define CANDEV_IO_RESERVED (1<<1)
int i82527_start_chip(struct chip_t *chip);
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_irq_handler(int irq, struct chip_t *chip);
int i82527_fill_chipspecops(struct chip_t *chip);
* Version lincan-0.3 17 Jun 2004
*/
-can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
-can_irqreturn_t sja1000_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
-can_irqreturn_t dummy_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
+int i82527_irq_handler(int irq, struct chip_t *chip);
+int sja1000_irq_handler(int irq, struct chip_t *chip);
+int sja1000p_irq_handler(int irq, struct chip_t *chip);
+int dummy_irq_handler(int irq, struct chip_t *chip);
unsigned short btr1);
int (*start_chip)(struct chip_t *chip);
int (*stop_chip)(struct chip_t *chip);
- can_irqreturn_t (*irq_handler)(int irq, void *dev_id, struct pt_regs *regs);
+ int (*irq_handler)(int irq, struct chip_t *chip);
};
struct mem_addr {
unsigned short btr1);
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_irq_handler(int irq, struct chip_t *chip);
int sja1000_fill_chipspecops(struct chip_t *chip);
/* BasicCAN mode address map */
int sja1000p_send_msg(struct chip_t *chip, struct msgobj_t *obj,
struct canmsg_t *msg);
int sja1000p_fill_chipspecops(struct chip_t *chip);
+int sja1000p_irq_handler(int irq, struct chip_t *chip);
+
/* PeliCAN mode */
enum SJA1000_PeliCAN_regs {
// c_can_irq_handler
//
-can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+int c_can_irq_handler(int irq, struct chip_t *chip)
{
struct rtr_id *rtr_search = hardware_p->rtr_queue;
- struct chip_t *pchip = (struct chip_t *)dev_id;
u16 chip_status;
int id0=0, id1=0;
u16 errcount = 0;
DEBUGMSG( "\n(c%d)IRQ handler: addr=%.8lx spurious interrupt\n",
pchip->chip_idx,
(long)( pchip->/*v*/chip_base_addr/* + CCSR*/));
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
}
DEBUGMSG( "\n(c%d)IRQ handler: addr=%.8lx irqreg=0x%.4x\n",
// Get irq status again
irqreg = c_can_read_reg_w( pchip, CCINTR );
}
- return CAN_IRQ_HANDLED;
+ return CANCHIP_IRQ_HANDLED;
}
///////////////////////////////////////////////////////////////////////////////
return readb(address);
}
-extern can_irqreturn_t sja1000p_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
-
-can_irqreturn_t ems_cpcpci_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+int ems_cpcpci_irq_handler(int irq, struct chip_t *chip)
{
- struct chip_t *chip=(struct chip_t *)dev_id;
+ //struct chip_t *chip=(struct chip_t *)dev_id;
struct candevice_t *candev=chip->hostdevice;
int i;
unsigned long icr;
int test_irq_again;
icr=readl(candev->dev_base_addr + PITA2_ICR);
- if(!(icr & PITA2_ICR_INT0)) return CAN_IRQ_NONE;
+ if(!(icr & PITA2_ICR_INT0)) return CANCHIP_IRQ_NONE;
/* correct way to handle interrupts from all chips connected to the one PITA-2 */
do {
chip=candev->chip[i];
if(!chip || !(chip->flags&CHIP_CONFIGURED))
continue;
- if(sja1000p_irq_handler(irq, chip, regs))
+ if(sja1000p_irq_handler(irq, chip))
test_irq_again=1;
}
icr=readl(candev->dev_base_addr + PITA2_ICR);
} while((icr & PITA2_ICR_INT0)||test_irq_again);
- return CAN_IRQ_HANDLED;
+ return CANCHIP_IRQ_HANDLED;
}
int ems_cpcpci_reset(struct candevice_t *candev)
}
}
-can_irqreturn_t i82527_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+int i82527_irq_handler(int irq, struct chip_t *chip)
{
unsigned char msgcfg;
unsigned irq_register;
unsigned object;
- struct chip_t *chip=(struct chip_t *)dev_id;
struct msgobj_t *obj;
/*put_reg=device->hwspecops->write_register;*/
if(!irq_register) {
DEBUGMSG("i82527: spurious IRQ\n");
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
}
if (irq_register == 0x01) {
DEBUGMSG("Status register: 0x%x\n",can_read_reg(chip, iSTAT));
continue;
- /*return CAN_IRQ_NONE;*/
+ /*return CANCHIP_IRQ_NONE;*/
}
if (irq_register == 0x02)
else if(irq_register < 14)
object = irq_register-3;
else
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
obj=chip->msgobj[object];
} while((irq_register=i82527_seg_read_reg(chip, iIRQ)) != 0);
- return CAN_IRQ_HANDLED;
+ return CANCHIP_IRQ_HANDLED;
}
void i82527_irq_rtr_handler(struct chip_t *chip, struct msgobj_t *obj,
#include "../include/irq.h"
-can_irqreturn_t dummy_irq_handler(int irq, void *dev_id, struct pt_regs *regs) {
+int dummy_irq_handler(int irq, struct chip_t *chip) {
CANMSG("dummy_irq_handler called irq %d \n", irq);
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
}
#ifndef CAN_WITH_RTL
+can_irqreturn_t can_default_irq_dispatch(int irq, void *dev_id, struct pt_regs *regs)
+{
+ int retval;
+ struct chip_t *chip=(struct chip_t *)dev_id;
+
+ retval=chip->chipspecops->irq_handler(irq, chip);
+ return CAN_IRQ_RETVAL(retval);
+}
+
/**
* can_chip_setup_irq - attaches chip to the system interrupt processing
* @chip: pointer to CAN chip structure
return 0;
if ((chip->flags & CHIP_IRQ_VME) == 0) {
- if (request_irq(chip->chip_irq,chip->chipspecops->irq_handler,SA_SHIRQ,DEVICE_NAME,chip))
+ if (request_irq(chip->chip_irq,can_default_irq_dispatch,SA_SHIRQ,DEVICE_NAME,chip))
return -1;
else {
DEBUGMSG("Registered interrupt %d\n",chip->chip_irq);
}
-can_irqreturn_t sja1000_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+int sja1000_irq_handler(int irq, struct chip_t *chip)
{
unsigned irq_register;
- struct chip_t *chip=(struct chip_t *)dev_id;
struct msgobj_t *obj=chip->msgobj[0];
irq_register=can_read_reg(chip, SJAIR);
// can_read_reg(chip, SJASR));
if ((irq_register & (sjaIR_WUI|sjaIR_DOI|sjaIR_EI|sjaIR_TI|sjaIR_RI)) == 0)
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
if ((irq_register & sjaIR_RI) != 0)
sja1000_irq_read_handler(chip, obj);
}
}
- return CAN_IRQ_HANDLED;
+ return CANCHIP_IRQ_HANDLED;
}
void sja1000_irq_read_handler(struct chip_t *chip, struct msgobj_t *obj)
* message queues.
* File: src/sja1000p.c
*/
-can_irqreturn_t sja1000p_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+int sja1000p_irq_handler(int irq, struct chip_t *chip)
{
int irq_register, status, error_code;
- struct chip_t *chip=(struct chip_t *)dev_id;
struct msgobj_t *obj=chip->msgobj[0];
irq_register=can_read_reg(chip,SJAIR);
// can_read_reg(chip,SJASR));
if ((irq_register & (sjaIR_BEI|sjaIR_EPI|sjaIR_DOI|sjaIR_EI|sjaIR_TI|sjaIR_RI)) == 0)
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
if(!(chip->flags&CHIP_CONFIGURED)) {
CANMSG("sja1000p_irq_handler: called for non-configured device, irq_register 0x%02x\n", irq_register);
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
}
if ((irq_register & sjaIR_RI) != 0) {
obj->tx_retry_cnt=0;
}
- return CAN_IRQ_HANDLED;
+ return CANCHIP_IRQ_HANDLED;
}
/**
* message queues.
* File: src/unican.c
*/
-can_irqreturn_t unican_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+int unican_irq_handler(int irq, struct chip_t *chip)
{
- struct chip_t *chip=(struct chip_t *)dev_id;
sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
struct msgobj_t *obj=chip->msgobj[0];
__u16 status;
if(!(chip->flags&CHIP_CONFIGURED)) {
CANMSG("unican_irq_handler: called for non-configured device\n");
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
}
if (cl2_get_status(chipext, &status) == CL2_NO_REQUEST)
- return CAN_IRQ_NONE;
+ return CANCHIP_IRQ_NONE;
cl2_clear_interrupt(chipext);
cl2_gen_interrupt(chipext);
- return CAN_IRQ_HANDLED;
+ return CANCHIP_IRQ_HANDLED;
}
* message queues.
* File: src/virtual.c
*/
-can_irqreturn_t virtual_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+int virtual_irq_handler(int irq, struct chip_t *chip)
{
- return CAN_IRQ_HANDLED;
+ return CANCHIP_IRQ_HANDLED;
}