+/**
+ * can_request_mem_region - request memory space region
+ * @start: the first memory port physical address
+ * @n: number of the consecutive memory port addresses
+ * @name: name/label for the requested region
+ *
+ * The function hides system specific implementation of the feature.
+ *
+ * Return Value: returns positive value (1) in the case, that region could
+ * be reserved for the driver. Returns zero (0) if there is collision with
+ * other driver or region cannot be taken for some other reason.
+ */
+int can_request_mem_region(unsigned long start, unsigned long n, const char *name)
+{
+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+ return 1;
+ #else
+ return (request_mem_region(start,n,name))?1:0;
+ #endif
+}
+
+/**
+ * can_release_mem_region - release memory space region
+ * @start: the first memory port physical address
+ * @n: number of the consecutive memory port addresses
+ */
+void can_release_mem_region(unsigned long start, unsigned long n)
+{
+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+ return;
+ #else
+ release_mem_region(start,n);
+ #endif
+}
+
+/**
+ * can_base_addr_fixup - relocates board physical memory addresses to the CPU accessible ones
+ * @candev: pointer to the previously filled device/board, chips and message objects structures
+ * @new_base: @candev new base address
+ *
+ * This function adapts base addresses of all structures of one board
+ * to the new board base address.
+ * It is required for translation between physical and virtual address mappings.
+ * This function is prepared to simplify board specific xxx_request_io() function
+ * for memory mapped devices.
+ */
+int can_base_addr_fixup(struct candevice_t *candev, unsigned long new_base)
+{
+ unsigned long offs;
+ int i, j;
+
+ offs=new_base-candev->dev_base_addr;
+ candev->dev_base_addr=new_base;
+ for(i=0;i<candev->nr_all_chips;i++){
+ candev->chip[i]->chip_base_addr += offs;
+ for(j=0;j<candev->chip[i]->max_objects;j++)
+ candev->chip[i]->msgobj[j]->obj_base_addr += offs;
+ }