summaryrefslogtreecommitdiff
path: root/drivers/pci/host/pci-msm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/host/pci-msm.c')
-rw-r--r--drivers/pci/host/pci-msm.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/drivers/pci/host/pci-msm.c b/drivers/pci/host/pci-msm.c
index 99535f6be2e0..810159df8707 100644
--- a/drivers/pci/host/pci-msm.c
+++ b/drivers/pci/host/pci-msm.c
@@ -360,6 +360,7 @@ enum msm_pcie_irq {
enum msm_pcie_gpio {
MSM_PCIE_GPIO_PERST,
MSM_PCIE_GPIO_WAKE,
+ MSM_PCIE_GPIO_EP,
MSM_PCIE_MAX_GPIO
};
@@ -376,6 +377,7 @@ struct msm_pcie_gpio_info_t {
bool out;
uint32_t on;
uint32_t init;
+ bool required;
};
/* voltage regulator info structrue */
@@ -567,8 +569,9 @@ static struct msm_pcie_vreg_info_t msm_pcie_vreg_info[MSM_PCIE_MAX_VREG] = {
/* GPIOs */
static struct msm_pcie_gpio_info_t msm_pcie_gpio_info[MSM_PCIE_MAX_GPIO] = {
- {"perst-gpio", 0, 1, 0, 0},
- {"wake-gpio", 0, 0, 0, 0}
+ {"perst-gpio", 0, 1, 0, 0, 1},
+ {"wake-gpio", 0, 0, 0, 0, 1},
+ {"qcom,ep-gpio", 0, 1, 1, 0, 0}
};
/* clocks */
@@ -3283,13 +3286,22 @@ static int msm_pcie_get_resources(struct msm_pcie_dev_t *dev,
gpio_info->name, 0);
if (ret >= 0) {
gpio_info->num = ret;
- ret = 0;
dev->gpio_n++;
PCIE_DBG(dev, "GPIO num for %s is %d\n",
gpio_info->name, gpio_info->num);
} else {
- goto out;
+ if (gpio_info->required) {
+ PCIE_ERR(dev,
+ "Could not get required GPIO %s\n",
+ gpio_info->name);
+ goto out;
+ } else {
+ PCIE_DBG(dev,
+ "Could not get optional GPIO %s\n",
+ gpio_info->name);
+ }
}
+ ret = 0;
}
for (i = 0; i < MSM_PCIE_MAX_CLK; i++) {
@@ -3583,6 +3595,10 @@ int msm_pcie_enable(struct msm_pcie_dev_t *dev, u32 options)
if (dev->ep_latency)
usleep_range(dev->ep_latency * 1000, dev->ep_latency * 1000);
+ if (dev->gpio[MSM_PCIE_GPIO_EP].num)
+ gpio_set_value(dev->gpio[MSM_PCIE_GPIO_EP].num,
+ dev->gpio[MSM_PCIE_GPIO_EP].on);
+
/* de-assert PCIe reset link to bring EP out of reset */
PCIE_INFO(dev, "PCIe: Release the reset of endpoint of RC%d.\n",
@@ -3641,6 +3657,9 @@ int msm_pcie_enable(struct msm_pcie_dev_t *dev, u32 options)
goto out;
link_fail:
+ if (dev->gpio[MSM_PCIE_GPIO_EP].num)
+ gpio_set_value(dev->gpio[MSM_PCIE_GPIO_EP].num,
+ 1 - dev->gpio[MSM_PCIE_GPIO_EP].on);
msm_pcie_write_reg(dev->phy,
PCIE_N_SW_RESET(dev->rc_idx, dev->common_phy), 0x1);
msm_pcie_write_reg(dev->phy,
@@ -3712,6 +3731,10 @@ void msm_pcie_disable(struct msm_pcie_dev_t *dev, u32 options)
if (options & PM_PIPE_CLK)
msm_pcie_pipe_clk_deinit(dev);
+ if (dev->gpio[MSM_PCIE_GPIO_EP].num)
+ gpio_set_value(dev->gpio[MSM_PCIE_GPIO_EP].num,
+ 1 - dev->gpio[MSM_PCIE_GPIO_EP].on);
+
mutex_unlock(&dev->setup_lock);
PCIE_DBG(dev, "RC%d: exit\n", dev->rc_idx);