#include "../include/finish.h"
#include "../include/fasync.h"
+#ifdef CAN_WITH_RTL
+#include <rtl_posixio.h>
+#include "../include/can_iortl.h"
+#endif /*CAN_WITH_RTL*/
+
#define EXPORT_SYMTAB
+can_spinlock_t canuser_manipulation_lock;
+
/* Module parameters, some must be supplied at module loading time */
int major=CAN_MAJOR;
MODULE_PARM(major,"1i");
#ifdef MODULE_DESCRIPTION
MODULE_DESCRIPTION("Universal Linux CAN-bus device driver");
#endif
+#ifdef MODULE_AUTHOR
+MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>, Arnaud Westenberg");
+#endif
/* Global structures, used to describe the installed hardware. */
struct canhardware_t canhardware;
EXPORT_SYMBOL(can_fops);
+
+#ifdef CAN_WITH_RTL
+struct rtl_file_operations can_fops_rtl = {
+ llseek: NULL,
+ read: can_read_rtl_posix,
+ write: can_write_rtl_posix,
+ ioctl: can_ioctl_rtl_posix,
+ mmap: NULL,
+ open: can_open_rtl_posix,
+ release: can_release_rtl_posix
+};
+#endif /*CAN_WITH_RTL*/
+
+
int init_module(void)
{
int res=0,i=0, j;
if (parse_mod_parms())
return -EINVAL;
+ can_spin_lock_init(&canuser_manipulation_lock);
canqueue_kern_initialize();
if (init_hw_struct())
return -ENODEV;
}
+ #ifdef CAN_WITH_RTL
+ canqueue_rtl_initialize();
+ res=rtl_register_rtldev(major,DEVICE_NAME,&can_fops_rtl);
+ if (res<0) {
+ CANMSG("Error registering RT-Linux major number.\n");
+ goto rtldev_error;
+ }
+ #endif /*CAN_WITH_RTL*/
+
for (i=0; i<hardware_p->nr_boards; i++) {
candev=hardware_p->candevice[i];
if (candev->hwspecops->request_io(candev))
for(j=0; j<candev->nr_all_chips; j++) {
if((chip=candev->chip[j])==NULL)
continue;
- if(!chip->chipspecops->irq_handler)
- continue;
-
- if (request_irq(chip->chip_irq,chip->chipspecops->irq_handler,SA_SHIRQ,DEVICE_NAME,chip))
+ if(can_chip_setup_irq(chip)<0) {
+ CANMSG("IRQ setup failed\n");
goto interrupt_error;
- else {
- DEBUGMSG("Registered interrupt %d\n",chip->chip_irq);
- chip->flags |= CHIP_IRQ_SETUP;
}
}
memory_error: ;
canhardware_done(hardware_p);
+ #ifdef CAN_WITH_RTL
+ rtl_unregister_rtldev(major,DEVICE_NAME);
+ rtldev_error:
+ canqueue_rtl_done();
+ #endif /*CAN_WITH_RTL*/
+
res=unregister_chrdev(major,DEVICE_NAME);
if (res<0)
CANMSG("Error unloading CAN driver, error: %d\n",res);
canhardware_done(hardware_p);
+ #ifdef CAN_WITH_RTL
+ rtl_unregister_rtldev(major,DEVICE_NAME);
+ canqueue_rtl_done();
+ #endif /*CAN_WITH_RTL*/
+
if ( can_del_mem_list() )
CANMSG("Error deallocating memory\n");