@@ -15,6 +15,8 @@
#define MHI_PCI_DEFAULT_BAR_NUM 0
+#define DEV_RESET_REG (0xB0)
+
/**
* struct mhi_pci_dev_info - MHI PCI device specific information
* @config: MHI controller configuration
@@ -166,6 +168,11 @@ static void mhi_pci_status_cb(struct mhi_controller *mhi_cntrl,
/* Nothing to do for now */
}
+static inline void mhi_pci_reset(struct mhi_controller *mhi_cntrl)
+{
+ writel(1, mhi_cntrl->regs + DEV_RESET_REG);
+}
+
static int mhi_pci_claim(struct mhi_controller *mhi_cntrl,
unsigned int bar_num, u64 dma_mask)
{
@@ -329,6 +336,10 @@ static void mhi_pci_remove(struct pci_dev *pdev)
mhi_power_down(mhi_cntrl, true);
mhi_unprepare_after_power_down(mhi_cntrl);
mhi_unregister_controller(mhi_cntrl);
+
+ /* MHI-layer reset could not be enough, always hard-reset the device */
+ mhi_pci_reset(mhi_cntrl);
+
mhi_free_controller(mhi_cntrl);
}
Ensure that the device is hard-reset on remove to restore its initial state and avoid further issues on subsequent probe. This has been tested with Telit FN980m module. Signed-off-by: Loic Poulain <loic.poulain@linaro.org> --- drivers/bus/mhi/pci_generic.c | 11 +++++++++++ 1 file changed, 11 insertions(+) -- 2.7.4