mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-15 22:41:38 +00:00
bus: mhi: core: Add support for data transfer
Add support for transferring data between external modem and host processor using MHI protocol. This is based on the patch submitted by Sujeev Dias: https://lkml.org/lkml/2018/7/9/988 Signed-off-by: Sujeev Dias <sdias@codeaurora.org> Signed-off-by: Siddartha Mohanadoss <smohanad@codeaurora.org> [mani: splitted the data transfer patch and cleaned up for upstream] Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Reviewed-by: Jeffrey Hugo <jhugo@codeaurora.org> Tested-by: Jeffrey Hugo <jhugo@codeaurora.org> Link: https://lore.kernel.org/r/20200220095854.4804-12-manivannan.sadhasivam@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1d3173a3ba
commit
189ff97cca
@@ -10,6 +10,7 @@
|
||||
#include <linux/dma-direction.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/rwlock_types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock_types.h>
|
||||
#include <linux/wait.h>
|
||||
@@ -336,6 +337,8 @@ struct mhi_controller_config {
|
||||
* @wake_toggle: CB function to assert and de-assert device wake (optional)
|
||||
* @runtime_get: CB function to controller runtime resume (required)
|
||||
* @runtimet_put: CB function to decrement pm usage (required)
|
||||
* @map_single: CB function to create TRE buffer
|
||||
* @unmap_single: CB function to destroy TRE buffer
|
||||
* @buffer_len: Bounce buffer length
|
||||
* @bounce_buf: Use of bounce buffer
|
||||
* @fbc_download: MHI host needs to do complete image transfer (optional)
|
||||
@@ -403,6 +406,10 @@ struct mhi_controller {
|
||||
void (*wake_toggle)(struct mhi_controller *mhi_cntrl);
|
||||
int (*runtime_get)(struct mhi_controller *mhi_cntrl);
|
||||
void (*runtime_put)(struct mhi_controller *mhi_cntrl);
|
||||
int (*map_single)(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_buf_info *buf);
|
||||
void (*unmap_single)(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_buf_info *buf);
|
||||
|
||||
size_t buffer_len;
|
||||
bool bounce_buf;
|
||||
@@ -583,4 +590,77 @@ int mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl);
|
||||
*/
|
||||
enum mhi_state mhi_get_mhi_state(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_device_get - Disable device low power mode
|
||||
* @mhi_dev: Device associated with the channel
|
||||
*/
|
||||
void mhi_device_get(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_device_get_sync - Disable device low power mode. Synchronously
|
||||
* take the controller out of suspended state
|
||||
* @mhi_dev: Device associated with the channel
|
||||
*/
|
||||
int mhi_device_get_sync(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_device_put - Re-enable device low power mode
|
||||
* @mhi_dev: Device associated with the channel
|
||||
*/
|
||||
void mhi_device_put(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_prepare_for_transfer - Setup channel for data transfer
|
||||
* @mhi_dev: Device associated with the channels
|
||||
*/
|
||||
int mhi_prepare_for_transfer(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_unprepare_from_transfer - Unprepare the channels
|
||||
* @mhi_dev: Device associated with the channels
|
||||
*/
|
||||
void mhi_unprepare_from_transfer(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_poll - Poll for any available data in DL direction
|
||||
* @mhi_dev: Device associated with the channels
|
||||
* @budget: # of events to process
|
||||
*/
|
||||
int mhi_poll(struct mhi_device *mhi_dev, u32 budget);
|
||||
|
||||
/**
|
||||
* mhi_queue_dma - Send or receive DMA mapped buffers from client device
|
||||
* over MHI channel
|
||||
* @mhi_dev: Device associated with the channels
|
||||
* @dir: DMA direction for the channel
|
||||
* @mhi_buf: Buffer for holding the DMA mapped data
|
||||
* @len: Buffer length
|
||||
* @mflags: MHI transfer flags used for the transfer
|
||||
*/
|
||||
int mhi_queue_dma(struct mhi_device *mhi_dev, enum dma_data_direction dir,
|
||||
struct mhi_buf *mhi_buf, size_t len, enum mhi_flags mflags);
|
||||
|
||||
/**
|
||||
* mhi_queue_buf - Send or receive raw buffers from client device over MHI
|
||||
* channel
|
||||
* @mhi_dev: Device associated with the channels
|
||||
* @dir: DMA direction for the channel
|
||||
* @buf: Buffer for holding the data
|
||||
* @len: Buffer length
|
||||
* @mflags: MHI transfer flags used for the transfer
|
||||
*/
|
||||
int mhi_queue_buf(struct mhi_device *mhi_dev, enum dma_data_direction dir,
|
||||
void *buf, size_t len, enum mhi_flags mflags);
|
||||
|
||||
/**
|
||||
* mhi_queue_skb - Send or receive SKBs from client device over MHI channel
|
||||
* @mhi_dev: Device associated with the channels
|
||||
* @dir: DMA direction for the channel
|
||||
* @skb: Buffer for holding SKBs
|
||||
* @len: Buffer length
|
||||
* @mflags: MHI transfer flags used for the transfer
|
||||
*/
|
||||
int mhi_queue_skb(struct mhi_device *mhi_dev, enum dma_data_direction dir,
|
||||
struct sk_buff *skb, size_t len, enum mhi_flags mflags);
|
||||
|
||||
#endif /* _MHI_H_ */
|
||||
|
||||
Reference in New Issue
Block a user