Loading drivers/pci/controller/pci-msm.c +44 −28 Original line number Diff line number Diff line Loading @@ -4584,32 +4584,16 @@ static irqreturn_t handle_wake_irq(int irq, void *data) return IRQ_HANDLED; } static irqreturn_t handle_linkdown_irq(int irq, void *data) static void msm_pcie_handle_linkdown(struct msm_pcie_dev_t *dev) { struct msm_pcie_dev_t *dev = data; int i; dev->linkdown_counter++; PCIE_DBG(dev, "PCIe: No. %ld linkdown IRQ for RC%d.\n", dev->linkdown_counter, dev->rc_idx); if (dev->link_status == MSM_PCIE_LINK_DOWN) return; if (!dev->enumerated || dev->link_status != MSM_PCIE_LINK_ENABLED) { PCIE_DBG(dev, "PCIe:Linkdown IRQ for RC%d when the link is not enabled\n", dev->rc_idx); } else if (dev->suspending) { PCIE_DBG(dev, "PCIe:the link of RC%d is suspending.\n", dev->rc_idx); } else { dev->link_status = MSM_PCIE_LINK_DOWN; dev->shadow_en = false; if (dev->linkdown_panic) panic("User has chosen to panic on linkdown\n"); /* assert PERST */ if (!(msm_pcie_keep_resources_on & BIT(dev->rc_idx))) gpio_set_value(dev->gpio[MSM_PCIE_GPIO_PERST].num, Loading @@ -4617,6 +4601,9 @@ static irqreturn_t handle_linkdown_irq(int irq, void *data) PCIE_ERR(dev, "PCIe link is down for RC%d\n", dev->rc_idx); if (dev->linkdown_panic) panic("User has chosen to panic on linkdown\n"); if (dev->num_ep > 1) { for (i = 0; i < MAX_DEVICE_NUM; i++) { dev->event_reg = Loading @@ -4629,6 +4616,27 @@ static irqreturn_t handle_linkdown_irq(int irq, void *data) } } static irqreturn_t handle_linkdown_irq(int irq, void *data) { struct msm_pcie_dev_t *dev = data; dev->linkdown_counter++; PCIE_DBG(dev, "PCIe: No. %ld linkdown IRQ for RC%d.\n", dev->linkdown_counter, dev->rc_idx); if (!dev->enumerated || dev->link_status != MSM_PCIE_LINK_ENABLED) PCIE_DBG(dev, "PCIe:Linkdown IRQ for RC%d when the link is not enabled\n", dev->rc_idx); else if (dev->suspending) PCIE_DBG(dev, "PCIe:the link of RC%d is suspending.\n", dev->rc_idx); else msm_pcie_handle_linkdown(dev); return IRQ_HANDLED; } Loading Loading @@ -6827,6 +6835,7 @@ int msm_pcie_pm_control(enum msm_pcie_pm_opt pm_opt, u32 busnr, void *user, int ret = 0; struct pci_dev *dev; u32 rc_idx = 0; unsigned long flags; struct msm_pcie_dev_t *pcie_dev; if (!user) { Loading Loading @@ -6972,6 +6981,13 @@ int msm_pcie_pm_control(enum msm_pcie_pm_opt pm_opt, u32 busnr, void *user, spin_unlock_irqrestore(&msm_pcie_dev[rc_idx].cfg_lock, msm_pcie_dev[rc_idx].irqsave_flags); break; case MSM_PCIE_HANDLE_LINKDOWN: PCIE_DBG(&msm_pcie_dev[rc_idx], "User of RC%d requests handling link down.\n", rc_idx); spin_lock_irqsave(&msm_pcie_dev[rc_idx].irq_lock, flags); msm_pcie_handle_linkdown(pcie_dev); spin_unlock_irqrestore(&msm_pcie_dev[rc_idx].irq_lock, flags); break; default: PCIE_ERR(&msm_pcie_dev[rc_idx], "PCIe: RC%d: unsupported pm operation:%d.\n", Loading include/linux/msm_pcie.h +1 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ enum msm_pcie_pm_opt { MSM_PCIE_RESUME, MSM_PCIE_DISABLE_PC, MSM_PCIE_ENABLE_PC, MSM_PCIE_HANDLE_LINKDOWN, }; enum msm_pcie_event { Loading Loading
drivers/pci/controller/pci-msm.c +44 −28 Original line number Diff line number Diff line Loading @@ -4584,32 +4584,16 @@ static irqreturn_t handle_wake_irq(int irq, void *data) return IRQ_HANDLED; } static irqreturn_t handle_linkdown_irq(int irq, void *data) static void msm_pcie_handle_linkdown(struct msm_pcie_dev_t *dev) { struct msm_pcie_dev_t *dev = data; int i; dev->linkdown_counter++; PCIE_DBG(dev, "PCIe: No. %ld linkdown IRQ for RC%d.\n", dev->linkdown_counter, dev->rc_idx); if (dev->link_status == MSM_PCIE_LINK_DOWN) return; if (!dev->enumerated || dev->link_status != MSM_PCIE_LINK_ENABLED) { PCIE_DBG(dev, "PCIe:Linkdown IRQ for RC%d when the link is not enabled\n", dev->rc_idx); } else if (dev->suspending) { PCIE_DBG(dev, "PCIe:the link of RC%d is suspending.\n", dev->rc_idx); } else { dev->link_status = MSM_PCIE_LINK_DOWN; dev->shadow_en = false; if (dev->linkdown_panic) panic("User has chosen to panic on linkdown\n"); /* assert PERST */ if (!(msm_pcie_keep_resources_on & BIT(dev->rc_idx))) gpio_set_value(dev->gpio[MSM_PCIE_GPIO_PERST].num, Loading @@ -4617,6 +4601,9 @@ static irqreturn_t handle_linkdown_irq(int irq, void *data) PCIE_ERR(dev, "PCIe link is down for RC%d\n", dev->rc_idx); if (dev->linkdown_panic) panic("User has chosen to panic on linkdown\n"); if (dev->num_ep > 1) { for (i = 0; i < MAX_DEVICE_NUM; i++) { dev->event_reg = Loading @@ -4629,6 +4616,27 @@ static irqreturn_t handle_linkdown_irq(int irq, void *data) } } static irqreturn_t handle_linkdown_irq(int irq, void *data) { struct msm_pcie_dev_t *dev = data; dev->linkdown_counter++; PCIE_DBG(dev, "PCIe: No. %ld linkdown IRQ for RC%d.\n", dev->linkdown_counter, dev->rc_idx); if (!dev->enumerated || dev->link_status != MSM_PCIE_LINK_ENABLED) PCIE_DBG(dev, "PCIe:Linkdown IRQ for RC%d when the link is not enabled\n", dev->rc_idx); else if (dev->suspending) PCIE_DBG(dev, "PCIe:the link of RC%d is suspending.\n", dev->rc_idx); else msm_pcie_handle_linkdown(dev); return IRQ_HANDLED; } Loading Loading @@ -6827,6 +6835,7 @@ int msm_pcie_pm_control(enum msm_pcie_pm_opt pm_opt, u32 busnr, void *user, int ret = 0; struct pci_dev *dev; u32 rc_idx = 0; unsigned long flags; struct msm_pcie_dev_t *pcie_dev; if (!user) { Loading Loading @@ -6972,6 +6981,13 @@ int msm_pcie_pm_control(enum msm_pcie_pm_opt pm_opt, u32 busnr, void *user, spin_unlock_irqrestore(&msm_pcie_dev[rc_idx].cfg_lock, msm_pcie_dev[rc_idx].irqsave_flags); break; case MSM_PCIE_HANDLE_LINKDOWN: PCIE_DBG(&msm_pcie_dev[rc_idx], "User of RC%d requests handling link down.\n", rc_idx); spin_lock_irqsave(&msm_pcie_dev[rc_idx].irq_lock, flags); msm_pcie_handle_linkdown(pcie_dev); spin_unlock_irqrestore(&msm_pcie_dev[rc_idx].irq_lock, flags); break; default: PCIE_ERR(&msm_pcie_dev[rc_idx], "PCIe: RC%d: unsupported pm operation:%d.\n", Loading
include/linux/msm_pcie.h +1 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ enum msm_pcie_pm_opt { MSM_PCIE_RESUME, MSM_PCIE_DISABLE_PC, MSM_PCIE_ENABLE_PC, MSM_PCIE_HANDLE_LINKDOWN, }; enum msm_pcie_event { Loading