[PATCH v2] vme: change LM callback argument to void pointer
Martyn Welch
mwelchuk at gmail.com
Thu Jul 7 08:22:47 UTC 2016
On 29/04/16 22:41, Aaron Sierra wrote:
> 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 at xes-inc.com>
Sorry for the long delay - I've only just found time to write the test
module I wanted to validate this.
Acked-by: Martyn Welch <martyn at welchs.me.uk>
> ---
> v2 - change new argument name from cookie to data
> - add data cleanup to vme_tsi148.c
> - update VME API documentation with new prototype
> - fix checkpatch.pl style warning in vme_bridge.h
>
> Documentation/vme_api.txt | 4 ++--
> drivers/vme/bridges/vme_ca91cx42.c | 6 ++++--
> drivers/vme/bridges/vme_ca91cx42.h | 3 ++-
> drivers/vme/bridges/vme_tsi148.c | 6 ++++--
> drivers/vme/bridges/vme_tsi148.h | 3 ++-
> drivers/vme/vme.c | 4 ++--
> drivers/vme/vme_bridge.h | 3 ++-
> include/linux/vme.h | 2 +-
> 8 files changed, 19 insertions(+), 12 deletions(-)
>
> diff --git a/Documentation/vme_api.txt b/Documentation/vme_api.txt
> index ca5b827..4ca63a6 100644
> --- a/Documentation/vme_api.txt
> +++ b/Documentation/vme_api.txt
> @@ -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
> diff --git a/drivers/vme/bridges/vme_ca91cx42.c b/drivers/vme/bridges/vme_ca91cx42.c
> index 5fbeab3..d6aab95 100644
> --- a/drivers/vme/bridges/vme_ca91cx42.c
> +++ b/drivers/vme/bridges/vme_ca91cx42.c
> @@ -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];
> }
> }
> @@ -1414,7 +1414,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;
> @@ -1442,6 +1442,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);
> @@ -1481,6 +1482,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 |
> diff --git a/drivers/vme/bridges/vme_ca91cx42.h b/drivers/vme/bridges/vme_ca91cx42.h
> index d54119e..f35c9f5 100644
> --- a/drivers/vme/bridges/vme_ca91cx42.h
> +++ b/drivers/vme/bridges/vme_ca91cx42.h
> @@ -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 */
> diff --git a/drivers/vme/bridges/vme_tsi148.c b/drivers/vme/bridges/vme_tsi148.c
> index 6052483..5a96e9c 100644
> --- a/drivers/vme/bridges/vme_tsi148.c
> +++ b/drivers/vme/bridges/vme_tsi148.c
> @@ -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];
> }
> }
> @@ -2051,7 +2051,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;
> @@ -2081,6 +2081,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);
> @@ -2128,6 +2129,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 |
> diff --git a/drivers/vme/bridges/vme_tsi148.h b/drivers/vme/bridges/vme_tsi148.h
> index f5ed143..0935d85 100644
> --- a/drivers/vme/bridges/vme_tsi148.h
> +++ b/drivers/vme/bridges/vme_tsi148.h
> @@ -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;
> diff --git a/drivers/vme/vme.c b/drivers/vme/vme.c
> index 72924b0..e429048 100644
> --- a/drivers/vme/vme.c
> +++ b/drivers/vme/vme.c
> @@ -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);
>
> diff --git a/drivers/vme/vme_bridge.h b/drivers/vme/vme_bridge.h
> index b59cbee..ab93f7d 100644
> --- a/drivers/vme/vme_bridge.h
> +++ b/drivers/vme/vme_bridge.h
> @@ -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 */
> diff --git a/include/linux/vme.h b/include/linux/vme.h
> index 71e4a6d..ea6095d 100644
> --- a/include/linux/vme.h
> +++ b/include/linux/vme.h
> @@ -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 *);
>
More information about the devel
mailing list