bus: mhi: core: Add support for basic PM operations
This commit adds support for basic MHI PM operations such as mhi_async_power_up, mhi_sync_power_up, and mhi_power_down. These routines places the MHI bus into respective power domain states and calls the state_transition APIs when necessary. The MHI controller driver is expected to call these PM routines for MHI powerup and powerdown. This is based on the patch submitted by Sujeev Dias: https://lkml.org/lkml/2018/7/9/989 Signed-off-by: Sujeev Dias <sdias@codeaurora.org> Signed-off-by: Siddartha Mohanadoss <smohanad@codeaurora.org> [mani: splitted the pm 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-8-manivannan.sadhasivam@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
a6e2e3522f
commit
3000f85b8f
@@ -81,6 +81,17 @@ enum mhi_ch_type {
|
||||
MHI_CH_TYPE_INBOUND_COALESCED = 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct image_info - Firmware and RDDM table table
|
||||
* @mhi_buf - Buffer for firmware and RDDM table
|
||||
* @entries - # of entries in table
|
||||
*/
|
||||
struct image_info {
|
||||
struct mhi_buf *mhi_buf;
|
||||
struct bhi_vec_entry *bhi_vec;
|
||||
u32 entries;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_ee_type - Execution environment types
|
||||
* @MHI_EE_PBL: Primary Bootloader
|
||||
@@ -266,6 +277,7 @@ struct mhi_controller_config {
|
||||
* @mhi_dev: MHI device instance for the controller
|
||||
* @regs: Base address of MHI MMIO register space (required)
|
||||
* @bhi: Points to base of MHI BHI register space
|
||||
* @bhie: Points to base of MHI BHIe register space
|
||||
* @wake_db: MHI WAKE doorbell register address
|
||||
* @iova_start: IOMMU starting address for data (required)
|
||||
* @iova_stop: IOMMU stop address for data (required)
|
||||
@@ -273,6 +285,7 @@ struct mhi_controller_config {
|
||||
* @edl_image: Firmware image name for emergency download mode (optional)
|
||||
* @sbl_size: SBL image size downloaded through BHIe (optional)
|
||||
* @seg_len: BHIe vector size (optional)
|
||||
* @fbc_image: Points to firmware image buffer
|
||||
* @mhi_chan: Points to the channel configuration table
|
||||
* @lpm_chans: List of channels that require LPM notifications
|
||||
* @irq: base irq # to request (required)
|
||||
@@ -323,6 +336,7 @@ struct mhi_controller {
|
||||
struct mhi_device *mhi_dev;
|
||||
void __iomem *regs;
|
||||
void __iomem *bhi;
|
||||
void __iomem *bhie;
|
||||
void __iomem *wake_db;
|
||||
|
||||
dma_addr_t iova_start;
|
||||
@@ -331,6 +345,7 @@ struct mhi_controller {
|
||||
const char *edl_image;
|
||||
size_t sbl_size;
|
||||
size_t seg_len;
|
||||
struct image_info *fbc_image;
|
||||
struct mhi_chan *mhi_chan;
|
||||
struct list_head lpm_chans;
|
||||
int *irq;
|
||||
@@ -494,4 +509,40 @@ void mhi_driver_unregister(struct mhi_driver *mhi_drv);
|
||||
void mhi_set_mhi_state(struct mhi_controller *mhi_cntrl,
|
||||
enum mhi_state state);
|
||||
|
||||
/**
|
||||
* mhi_prepare_for_power_up - Do pre-initialization before power up.
|
||||
* This is optional, call this before power up if
|
||||
* the controller does not want bus framework to
|
||||
* automatically free any allocated memory during
|
||||
* shutdown process.
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_async_power_up - Start MHI power up sequence
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
int mhi_async_power_up(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_sync_power_up - Start MHI power up sequence and wait till the device
|
||||
* device enters valid EE state
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
int mhi_sync_power_up(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_power_down - Start MHI power down sequence
|
||||
* @mhi_cntrl: MHI controller
|
||||
* @graceful: Link is still accessible, so do a graceful shutdown process
|
||||
*/
|
||||
void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful);
|
||||
|
||||
/**
|
||||
* mhi_unprepare_after_power_down - Free any allocated memory after power down
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
void mhi_unprepare_after_power_down(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
#endif /* _MHI_H_ */
|
||||
|
Reference in New Issue
Block a user