#define EXPORT_SYMTAB
#endif
-#include <linux/autoconf.h>
-
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/poll.h>
#include <linux/version.h>
-#include <linux/autoconf.h>
#include <linux/interrupt.h>
#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
+ #include <linux/autoconf.h>
#include <linux/wrapper.h>
#else
#include <linux/device.h>
#if defined(CONFIG_OC_LINCAN_CARD_usbcan)
#include "../include/usbcan.h"
#endif
+#if defined(CONFIG_OC_LINCAN_CARD_omap2_spican)
+ #include "../include/omap2_spican.h"
+#endif
can_spinlock_t canuser_manipulation_lock;
this_dev=class_device_create(can_class, MKDEV(major, dev_minor), NULL, "can%d", dev_minor);
#elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) /* >= 2.6.15 */
this_dev=class_device_create(can_class, NULL, MKDEV(major, dev_minor), NULL, "can%d", dev_minor);
- #else /* >= 2.6.26 */
+ #elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)
this_dev=device_create_drvdata(can_class, NULL, MKDEV(major, dev_minor), objects_p[i], "can%d", dev_minor);
- #endif /* >= 2.6.26 */
+ #else /* >= 2.6.28 */
+ this_dev=device_create(can_class, NULL, MKDEV(major, dev_minor), objects_p[i], "can%d", dev_minor);
+ #endif /* >= 2.6.28 */
if(IS_ERR(this_dev)){
CANMSG("problem to create device \"can%d\" in the class \"can\"\n", dev_minor);
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25)
res = usbcan_init();
if (res){
CANMSG("usb_register for usbcan failed. Error number %d.\n", res);
- return -ENODEV;
+ goto memory_error;
+ }
+#endif
+#if defined(CONFIG_OC_LINCAN_CARD_omap2_spican)
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
+ res = omap2_spican_init();
+ if (res){
+ CANMSG("omap2_spican_register for omap2_spican failed. Error number %d.\n", res);
+ goto memory_error;
}
+ #else
+ #error There's no support for OMAP2 SPI subsystem in kernel versions before 2.6.23
+ #endif
#endif
return 0;
-struct candevice_t* register_usbdev(const char *hwname,void *devdata,void (*chipdataregfnc)(struct canchip_t *ch,void *data)){
+struct candevice_t* register_hotplug_dev(const char *hwname,int (*chipdataregfnc)(struct canchip_t *ch,void *data),void *devdata){
int i=0, j, board=0;
struct candevice_t *candev;
struct canchip_t *chip;
}
brp = boardtype_find(hwname);
if(!brp) {
- CANMSG("Sorry, hardware \"%s\" is currently not supported.\n",hw[board]);
+ CANMSG("Sorry, hardware \"%s\" is currently not supported.\n",hwname);
return NULL;
}
if (board==MAX_HW_CARDS){
- CANMSG("Device \"%s\" could not be registered due to internal limits.\n",hw[board]);
+ CANMSG("Device \"%s\" could not be registered due to internal limits.\n",hwname);
return NULL;
}
hw[board]=brp->boardtype;
if((chip=candev->chip[j])==NULL)
continue;
- chipdataregfnc(chip,devdata);
+ if (chipdataregfnc && devdata){
+ if (chipdataregfnc(chip,devdata))
+ goto interrupt_error;
+ }
if(chip->chipspecops->attach_to_chip(chip)<0) {
CANMSG("Initial attach to the chip HW failed\n");
this_dev=class_device_create(can_class, MKDEV(major, dev_minor), NULL, "can%d", dev_minor);
#elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) /* >= 2.6.15 */
this_dev=class_device_create(can_class, NULL, MKDEV(major, dev_minor), NULL, "can%d", dev_minor);
- #else /* >= 2.6.26 */
+ #elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)
this_dev=device_create_drvdata(can_class, NULL, MKDEV(major, dev_minor), objects_p[i], "can%d", dev_minor);
- #endif /* >= 2.6.26 */
+ #else /* >= 2.6.28 */
+ this_dev=device_create(can_class, NULL, MKDEV(major, dev_minor), objects_p[i], "can%d", dev_minor);
+ #endif /* >= 2.6.28 */
if(IS_ERR(this_dev)){
CANMSG("problem to create device \"can%d\" in the class \"can\"\n", dev_minor);
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25)
#endif /*CAN_WITH_RTL*/
// register_error:
- if ( can_del_mem_list() )
- CANMSG("Error deallocating memory\n");
+// if ( can_del_mem_list() )
+// CANMSG("Error deallocating memory\n");
return NULL;
}
-
-
-
-
-
-
-void cleanup_usbdev(struct candevice_t *dev)
+void cleanup_hotplug_dev(struct candevice_t *dev)
{
int i=0;
int dev_minor;
if (!dev)
return;
+ DEBUGMSG("Cleaning up hotplug device.\n");
#ifdef CONFIG_PROC_FS
if (can_delete_procentry(dev))
#endif
#if defined(CONFIG_OC_LINCAN_CARD_usbcan)
+ DEBUGMSG("Unregistering usbcan.\n");
usbcan_exit();
#endif
-
+#if defined(CONFIG_OC_LINCAN_CARD_omap2_spican)
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
+ DEBUGMSG("Unregistering omap2_spican.\n");
+ omap2_spican_exit();
+ #endif
+#endif
+ DEBUGMSG("Continuing with coldplug cleanup.\n");
#ifdef CONFIG_PROC_FS
if (can_delete_procdir())
CANMSG("Error unregistering /proc/can entry.\n");
canqueue_rtl_done();
#endif /*CAN_WITH_RTL*/
+ DEBUGMSG("Can hardware cleanup done, freeing memory.\n");
+
if ( can_del_mem_list() )
CANMSG("Error deallocating memory\n");