bus: mhi: pci_generic: Implement PCI shutdown callback
authorLoic Poulain <loic.poulain@linaro.org>
Fri, 19 Mar 2021 15:50:37 +0000 (16:50 +0100)
committerManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Wed, 7 Apr 2021 08:15:29 +0000 (13:45 +0530)
Deinit the device on shutdown to halt MHI/PCI operation on device
side. This change fixes floating device state with some hosts that
do not fully shutdown PCIe device when rebooting.

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/1616169037-7969-1-git-send-email-loic.poulain@linaro.org
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
drivers/bus/mhi/pci_generic.c

index 544853c67e0295a7220eb7616ccb062815133633..f5992ec7eeb7f42a19aeb9edc8dca8a434707278 100644 (file)
@@ -641,6 +641,12 @@ static void mhi_pci_remove(struct pci_dev *pdev)
        mhi_unregister_controller(mhi_cntrl);
 }
 
+static void mhi_pci_shutdown(struct pci_dev *pdev)
+{
+       mhi_pci_remove(pdev);
+       pci_set_power_state(pdev, PCI_D3hot);
+}
+
 static void mhi_pci_reset_prepare(struct pci_dev *pdev)
 {
        struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev);
@@ -857,6 +863,7 @@ static struct pci_driver mhi_pci_driver = {
        .id_table       = mhi_pci_id_table,
        .probe          = mhi_pci_probe,
        .remove         = mhi_pci_remove,
+       .shutdown       = mhi_pci_shutdown,
        .err_handler    = &mhi_pci_err_handler,
        .driver.pm      = &mhi_pci_pm_ops
 };