Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e72daf3 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "pci: msm: Add support to handle ep driver requested link down"

parents 65a3cf72 0d97dfe5
Loading
Loading
Loading
Loading
+44 −28
Original line number Diff line number Diff line
@@ -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,
@@ -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 =
@@ -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;
}

@@ -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) {
@@ -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",
+1 −0
Original line number Diff line number Diff line
@@ -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 {