adjacent locations:
 
        int vme_lm_attach(struct vme_resource *res, int num,
-               void (*callback)(int));
+               void (*callback)(void *));
 
        int vme_lm_detach(struct vme_resource *res, int num);
 
 The callback function is declared as follows.
 
-       void callback(int num);
+       void callback(void *data);
 
 
 Slot Detection
 
        for (i = 0; i < 4; i++) {
                if (stat & CA91CX42_LINT_LM[i]) {
                        /* We only enable interrupts if the callback is set */
-                       bridge->lm_callback[i](i);
+                       bridge->lm_callback[i](bridge->lm_data[i]);
                        serviced |= CA91CX42_LINT_LM[i];
                }
        }
  * Callback will be passed the monitor triggered.
  */
 static int ca91cx42_lm_attach(struct vme_lm_resource *lm, int monitor,
-       void (*callback)(int))
+       void (*callback)(void *), void *data)
 {
        u32 lm_ctl, tmp;
        struct ca91cx42_driver *bridge;
 
        /* Attach callback */
        bridge->lm_callback[monitor] = callback;
+       bridge->lm_data[monitor] = data;
 
        /* Enable Location Monitor interrupt */
        tmp = ioread32(bridge->base + LINT_EN);
 
        /* Detach callback */
        bridge->lm_callback[monitor] = NULL;
+       bridge->lm_data[monitor] = NULL;
 
        /* If all location monitors disabled, disable global Location Monitor */
        if ((tmp & (CA91CX42_LINT_LM0 | CA91CX42_LINT_LM1 | CA91CX42_LINT_LM2 |
 
        wait_queue_head_t dma_queue;
        wait_queue_head_t iack_queue;
        wait_queue_head_t mbox_queue;
-       void (*lm_callback[4])(int);    /* Called in interrupt handler */
+       void (*lm_callback[4])(void *); /* Called in interrupt handler */
+       void *lm_data[4];
        void *crcsr_kernel;
        dma_addr_t crcsr_bus;
        struct mutex vme_rmw;           /* Only one RMW cycle at a time */
 
        for (i = 0; i < 4; i++) {
                if (stat & TSI148_LCSR_INTS_LMS[i]) {
                        /* We only enable interrupts if the callback is set */
-                       bridge->lm_callback[i](i);
+                       bridge->lm_callback[i](bridge->lm_data[i]);
                        serviced |= TSI148_LCSR_INTC_LMC[i];
                }
        }
  * Callback will be passed the monitor triggered.
  */
 static int tsi148_lm_attach(struct vme_lm_resource *lm, int monitor,
-       void (*callback)(int))
+       void (*callback)(void *), void *data)
 {
        u32 lm_ctl, tmp;
        struct vme_bridge *tsi148_bridge;
 
        /* Attach callback */
        bridge->lm_callback[monitor] = callback;
+       bridge->lm_data[monitor] = data;
 
        /* Enable Location Monitor interrupt */
        tmp = ioread32be(bridge->base + TSI148_LCSR_INTEN);
 
        /* Detach callback */
        bridge->lm_callback[monitor] = NULL;
+       bridge->lm_data[monitor] = NULL;
 
        /* If all location monitors disabled, disable global Location Monitor */
        if ((lm_en & (TSI148_LCSR_INTS_LM0S | TSI148_LCSR_INTS_LM1S |
 
        void __iomem *base;     /* Base Address of device registers */
        wait_queue_head_t dma_queue[2];
        wait_queue_head_t iack_queue;
-       void (*lm_callback[4])(int);    /* Called in interrupt handler */
+       void (*lm_callback[4])(void *); /* Called in interrupt handler */
+       void *lm_data[4];
        void *crcsr_kernel;
        dma_addr_t crcsr_bus;
        struct vme_master_resource *flush_image;
 
 EXPORT_SYMBOL(vme_lm_get);
 
 int vme_lm_attach(struct vme_resource *resource, int monitor,
-       void (*callback)(int))
+       void (*callback)(void *), void *data)
 {
        struct vme_bridge *bridge = find_bridge(resource);
        struct vme_lm_resource *lm;
                return -EINVAL;
        }
 
-       return bridge->lm_attach(lm, monitor, callback);
+       return bridge->lm_attach(lm, monitor, callback, data);
 }
 EXPORT_SYMBOL(vme_lm_attach);
 
 
        int (*lm_set) (struct vme_lm_resource *, unsigned long long, u32, u32);
        int (*lm_get) (struct vme_lm_resource *, unsigned long long *, u32 *,
                u32 *);
-       int (*lm_attach) (struct vme_lm_resource *, int, void (*callback)(int));
+       int (*lm_attach)(struct vme_lm_resource *, int,
+                        void (*callback)(void *), void *);
        int (*lm_detach) (struct vme_lm_resource *, int);
 
        /* CR/CSR space functions */
 
 int vme_lm_count(struct vme_resource *);
 int vme_lm_set(struct vme_resource *, unsigned long long, u32, u32);
 int vme_lm_get(struct vme_resource *, unsigned long long *, u32 *, u32 *);
-int vme_lm_attach(struct vme_resource *, int, void (*callback)(int));
+int vme_lm_attach(struct vme_resource *, int, void (*callback)(void *), void *);
 int vme_lm_detach(struct vme_resource *, int);
 void vme_lm_free(struct vme_resource *);