diff --git a/drivers/misc/rp1-pio.c b/drivers/misc/rp1-pio.c index 91c20ad5d696f9..1d9c6ac35057c5 100644 --- a/drivers/misc/rp1-pio.c +++ b/drivers/misc/rp1-pio.c @@ -971,6 +971,24 @@ int rp1_pio_sm_xfer_data(struct rp1_pio_client *client, uint sm, uint dir, } EXPORT_SYMBOL_GPL(rp1_pio_sm_xfer_data); +void *rp1_pio_sm_buffer_virt(struct rp1_pio_client *client, + unsigned sm, unsigned dir, int index) +{ + struct rp1_pio_device *pio = client->pio; + struct dma_info *dma; + + if (sm >= RP1_PIO_SMS_COUNT || dir >= RP1_PIO_DIR_COUNT) + return NULL; + + dma = &pio->dma_configs[sm][dir]; + + if (index >= dma->buf_count) + return NULL; + + return dma->bufs[index].buf; +} +EXPORT_SYMBOL_GPL(rp1_pio_sm_buffer_virt); + struct handler_info { const char *name; int (*func)(struct rp1_pio_client *client, void *param); diff --git a/include/linux/pio_rp1.h b/include/linux/pio_rp1.h index f262fdd9c8f1c3..14d05bef7d139f 100644 --- a/include/linux/pio_rp1.h +++ b/include/linux/pio_rp1.h @@ -190,6 +190,7 @@ int rp1_pio_sm_config_xfer(struct rp1_pio_client *client, uint sm, uint dir, int rp1_pio_sm_xfer_data(struct rp1_pio_client *client, uint sm, uint dir, uint data_bytes, void *data, dma_addr_t dma_addr, void (*callback)(void *param), void *param); +void *rp1_pio_sm_buffer_virt(struct rp1_pio_client *client, unsigned sm, unsigned dir, int index); int rp1_pio_can_add_program(struct rp1_pio_client *client, void *param); int rp1_pio_add_program(struct rp1_pio_client *client, void *param);