vme: change LM callback argument to void pointer
authorAaron Sierra <asierra@xes-inc.com>
Fri, 29 Apr 2016 21:41:02 +0000 (16:41 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 31 Aug 2016 11:20:15 +0000 (13:20 +0200)
Make the location monitor callback function prototype more useful by
changing the argument from an integer to a void pointer.

All VME bridge drivers were simply passing the location monitor index
(e.g. 0-3) as the argument to these callbacks. It is much more useful
to pass back a pointer to data that the callback-registering driver
cares about.

There appear to be no in-kernel callers of vme_lm_attach (or
vme_lme_request for that matter), so this change only affects the VME
subsystem and bridge drivers.

This has been tested with Tsi148 hardware, but the CA91Cx42 changes
have only been compiled.

Signed-off-by: Aaron Sierra <asierra@xes-inc.com>
Acked-by: Martyn Welch <martyn@welchs.me.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/vme_api.txt
drivers/vme/bridges/vme_ca91cx42.c
drivers/vme/bridges/vme_ca91cx42.h
drivers/vme/bridges/vme_tsi148.c
drivers/vme/bridges/vme_tsi148.h
drivers/vme/vme.c
drivers/vme/vme_bridge.h
include/linux/vme.h

index ca5b82797f6c5c79c949a38cd7d7c19270035993..4ca63a6eca247f75e3074d590de39a63b83ced04 100644 (file)
@@ -385,13 +385,13 @@ location monitor location. Each location monitor can monitor a number of
 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
index 9f2c834e43e002bdaab5344c4d16e980f057692d..da29dbe6c9c8f1c1e2f1ead5f1b6396d03c96a35 100644 (file)
@@ -69,7 +69,7 @@ static u32 ca91cx42_LM_irqhandler(struct ca91cx42_driver *bridge, u32 stat)
        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];
                }
        }
@@ -1410,7 +1410,7 @@ static int ca91cx42_lm_get(struct vme_lm_resource *lm,
  * 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;
@@ -1438,6 +1438,7 @@ static int ca91cx42_lm_attach(struct vme_lm_resource *lm, int monitor,
 
        /* Attach callback */
        bridge->lm_callback[monitor] = callback;
+       bridge->lm_data[monitor] = data;
 
        /* Enable Location Monitor interrupt */
        tmp = ioread32(bridge->base + LINT_EN);
@@ -1477,6 +1478,7 @@ static int ca91cx42_lm_detach(struct vme_lm_resource *lm, int monitor)
 
        /* 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 |
index d54119e59d5513fdd81edd682becac5d071130ae..f35c9f5348a9d64d400a52b09e1225c3328b5a91 100644 (file)
@@ -43,7 +43,8 @@ struct ca91cx42_driver {
        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 */
index 4bc5d451ec6c001f446e1df444ab59c606fe116c..2d3ba1a1d42d337d4e76347a1cb7fcfd9fee093b 100644 (file)
@@ -102,7 +102,7 @@ static u32 tsi148_LM_irqhandler(struct tsi148_driver *bridge, u32 stat)
        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];
                }
        }
@@ -2047,7 +2047,7 @@ static int tsi148_lm_get(struct vme_lm_resource *lm,
  * 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;
@@ -2077,6 +2077,7 @@ static int tsi148_lm_attach(struct vme_lm_resource *lm, int monitor,
 
        /* Attach callback */
        bridge->lm_callback[monitor] = callback;
+       bridge->lm_data[monitor] = data;
 
        /* Enable Location Monitor interrupt */
        tmp = ioread32be(bridge->base + TSI148_LCSR_INTEN);
@@ -2124,6 +2125,7 @@ static int tsi148_lm_detach(struct vme_lm_resource *lm, int monitor)
 
        /* 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 |
index f5ed14382a8de69aaa7dd76525dd173d65a56ec9..0935d85d32ec2ad3a47a7f4085e05c497eed2229 100644 (file)
@@ -38,7 +38,8 @@ struct tsi148_driver {
        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;
index 37ac0a58e59a8cd56013ebdb33ddb7fee643d3ba..4693b7bd33648e823da991db287445eebdb6eab4 100644 (file)
@@ -1321,7 +1321,7 @@ int vme_lm_get(struct vme_resource *resource, unsigned long long *lm_base,
 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;
@@ -1338,7 +1338,7 @@ int vme_lm_attach(struct vme_resource *resource, int monitor,
                return -EINVAL;
        }
 
-       return bridge->lm_attach(lm, monitor, callback);
+       return bridge->lm_attach(lm, monitor, callback, data);
 }
 EXPORT_SYMBOL(vme_lm_attach);
 
index cb8246fd97beb4dbeeae2649196b59481e3a2dc4..2662e916b96af86892ec71315cc660702ba852a3 100644 (file)
@@ -160,7 +160,8 @@ struct vme_bridge {
        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 */
index 71e4a6dec5ac77a4cfdaf1483ae2c8866e7fd032..ea6095deba2078fcde296b9043c7b55f717cab4b 100644 (file)
@@ -166,7 +166,7 @@ struct vme_resource *vme_lm_request(struct vme_dev *);
 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 *);