All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kishon Vijay Abraham I <kishon@ti.com>
To: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
	Murali Karicheri <m-karicheri2@ti.com>,
	Jingoo Han <jingoohan1@gmail.com>,
	Gustavo Pimentel <gustavo.pimentel@synopsys.com>,
	Rob Herring <robh+dt@kernel.org>, <linux-pci@vger.kernel.org>,
	<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH 11/19] PCI: keystone: Cleanup PHY handling
Date: Wed, 17 Oct 2018 08:51:39 +0530	[thread overview]
Message-ID: <647103e4-1a38-d3f8-9779-3429530e2f31@ti.com> (raw)
In-Reply-To: <20181016170656.GD16390@e107981-ln.cambridge.arm.com>

Lorenzo,

On Tuesday 16 October 2018 10:36 PM, Lorenzo Pieralisi wrote:
> On Mon, Oct 15, 2018 at 06:37:13PM +0530, Kishon Vijay Abraham I wrote:
>> Cleanup PHY handling by using devm_phy_optional_get to get PHYs if
>> the PHYs are optional, creating a device link between the PHY device
>> and the controller device and disable PHY on error cases here.
>> Also invoke phy_reset() as part of initializing PHY.
> 
> Hi Kishon,
> 
> it is a bit of nitpicking, I know it is annoying but when I read "Also"
> in commit logs there is almost certainly a reason to split the patch
> into logical standalone entities, this one looks like one.
> 
> Every patch must be a self-contained change that, in case we have to
> revert it, must not affect other patches.
> 
> There are some more patches in the series that would benefit from
> splitting so I kindly ask you to go through them and repost, we
> should still be able to hit v4.20.

Sure, I'll repost them.

Thanks
Kishon
> 
> Thanks,
> Lorenzo
> 
>> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
>> ---
>>  drivers/pci/controller/dwc/pci-keystone.c | 126 +++++++++++++++++++---
>>  1 file changed, 110 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
>> index e22328f89c84..bf37609ad75b 100644
>> --- a/drivers/pci/controller/dwc/pci-keystone.c
>> +++ b/drivers/pci/controller/dwc/pci-keystone.c
>> @@ -105,6 +105,9 @@ struct keystone_pcie {
>>  
>>  	int			num_msi_host_irqs;
>>  	int			msi_host_irqs[MAX_MSI_HOST_IRQS];
>> +	int			num_lanes;
>> +	struct phy		**phy;
>> +	struct device_link	**link;
>>  	struct			device_node *msi_intc_np;
>>  	struct irq_domain	*legacy_irq_domain;
>>  	struct device_node	*np;
>> @@ -880,22 +883,61 @@ static const struct dw_pcie_ops ks_pcie_dw_pcie_ops = {
>>  	.link_up = ks_pcie_link_up,
>>  };
>>  
>> -static int __exit ks_pcie_remove(struct platform_device *pdev)
>> +static void ks_pcie_disable_phy(struct keystone_pcie *ks_pcie)
>>  {
>> -	struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
>> +	int num_lanes = ks_pcie->num_lanes;
>>  
>> -	clk_disable_unprepare(ks_pcie->clk);
>> +	while (num_lanes--) {
>> +		phy_power_off(ks_pcie->phy[num_lanes]);
>> +		phy_exit(ks_pcie->phy[num_lanes]);
>> +	}
>> +}
>> +
>> +static int ks_pcie_enable_phy(struct keystone_pcie *ks_pcie)
>> +{
>> +	int i;
>> +	int ret;
>> +	int num_lanes = ks_pcie->num_lanes;
>> +
>> +	for (i = 0; i < num_lanes; i++) {
>> +		ret = phy_reset(ks_pcie->phy[i]);
>> +		if (ret < 0)
>> +			goto err_phy;
>> +
>> +		ret = phy_init(ks_pcie->phy[i]);
>> +		if (ret < 0)
>> +			goto err_phy;
>> +
>> +		ret = phy_power_on(ks_pcie->phy[i]);
>> +		if (ret < 0) {
>> +			phy_exit(ks_pcie->phy[i]);
>> +			goto err_phy;
>> +		}
>> +	}
>>  
>>  	return 0;
>> +
>> +err_phy:
>> +	while (--i >= 0) {
>> +		phy_power_off(ks_pcie->phy[i]);
>> +		phy_exit(ks_pcie->phy[i]);
>> +	}
>> +
>> +	return ret;
>>  }
>>  
>>  static int __init ks_pcie_probe(struct platform_device *pdev)
>>  {
>>  	struct device *dev = &pdev->dev;
>> +	struct device_node *np = dev->of_node;
>>  	struct dw_pcie *pci;
>>  	struct keystone_pcie *ks_pcie;
>> -	struct phy *phy;
>> +	struct device_link **link;
>> +	struct phy **phy;
>> +	u32 num_lanes;
>> +	char name[10];
>>  	int ret;
>> +	int i;
>>  
>>  	ks_pcie = devm_kzalloc(dev, sizeof(*ks_pcie), GFP_KERNEL);
>>  	if (!ks_pcie)
>> @@ -908,29 +950,59 @@ static int __init ks_pcie_probe(struct platform_device *pdev)
>>  	pci->dev = dev;
>>  	pci->ops = &ks_pcie_dw_pcie_ops;
>>  
>> -	ks_pcie->pci = pci;
>> +	ret = of_property_read_u32(np, "num-lanes", &num_lanes);
>> +	if (ret)
>> +		num_lanes = 1;
>>  
>> -	/* initialize SerDes Phy if present */
>> -	phy = devm_phy_get(dev, "pcie-phy");
>> -	if (PTR_ERR_OR_ZERO(phy) == -EPROBE_DEFER)
>> -		return PTR_ERR(phy);
>> +	phy = devm_kzalloc(dev, sizeof(*phy) * num_lanes, GFP_KERNEL);
>> +	if (!phy)
>> +		return -ENOMEM;
>>  
>> -	if (!IS_ERR_OR_NULL(phy)) {
>> -		ret = phy_init(phy);
>> -		if (ret < 0)
>> -			return ret;
>> +	link = devm_kzalloc(dev, sizeof(*link) * num_lanes, GFP_KERNEL);
>> +	if (!link)
>> +		return -ENOMEM;
>> +
>> +	for (i = 0; i < num_lanes; i++) {
>> +		snprintf(name, sizeof(name), "pcie-phy%d", i);
>> +		phy[i] = devm_phy_optional_get(dev, name);
>> +		if (IS_ERR(phy[i])) {
>> +			ret = PTR_ERR(phy[i]);
>> +			goto err_link;
>> +		}
>> +
>> +		if (!phy[i])
>> +			continue;
>> +
>> +		link[i] = device_link_add(dev, &phy[i]->dev, DL_FLAG_STATELESS);
>> +		if (!link[i]) {
>> +			ret = -EINVAL;
>> +			goto err_link;
>> +		}
>> +	}
>> +
>> +	ks_pcie->np = np;
>> +	ks_pcie->pci = pci;
>> +	ks_pcie->link = link;
>> +	ks_pcie->num_lanes = num_lanes;
>> +	ks_pcie->phy = phy;
>> +
>> +	ret = ks_pcie_enable_phy(ks_pcie);
>> +	if (ret) {
>> +		dev_err(dev, "failed to enable phy\n");
>> +		goto err_link;
>>  	}
>>  
>> -	ks_pcie->np = dev->of_node;
>>  	platform_set_drvdata(pdev, ks_pcie);
>>  	ks_pcie->clk = devm_clk_get(dev, "pcie");
>>  	if (IS_ERR(ks_pcie->clk)) {
>>  		dev_err(dev, "Failed to get pcie rc clock\n");
>> -		return PTR_ERR(ks_pcie->clk);
>> +		ret = PTR_ERR(ks_pcie->clk);
>> +		goto err_phy;
>>  	}
>> +
>>  	ret = clk_prepare_enable(ks_pcie->clk);
>>  	if (ret)
>> -		return ret;
>> +		goto err_phy;
>>  
>>  	ret = ks_pcie_add_pcie_port(ks_pcie, pdev);
>>  	if (ret < 0)
>> @@ -940,9 +1012,31 @@ static int __init ks_pcie_probe(struct platform_device *pdev)
>>  fail_clk:
>>  	clk_disable_unprepare(ks_pcie->clk);
>>  
>> +err_phy:
>> +	ks_pcie_disable_phy(ks_pcie);
>> +
>> +err_link:
>> +	while (--i >= 0 && link[i])
>> +		device_link_del(link[i]);
>> +
>>  	return ret;
>>  }
>>  
>> +static int __exit ks_pcie_remove(struct platform_device *pdev)
>> +{
>> +	struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
>> +	struct device_link **link = ks_pcie->link;
>> +	int num_lanes = ks_pcie->num_lanes;
>> +
>> +	clk_disable_unprepare(ks_pcie->clk);
>> +	ks_pcie_disable_phy(ks_pcie);
>> +
>> +	while (num_lanes--)
>> +		device_link_del(link[num_lanes]);
>> +
>> +	return 0;
>> +}
>> +
>>  static struct platform_driver ks_pcie_driver __refdata = {
>>  	.probe  = ks_pcie_probe,
>>  	.remove = __exit_p(ks_pcie_remove),
>> -- 
>> 2.17.1
>>

WARNING: multiple messages have this Message-ID (diff)
From: Kishon Vijay Abraham I <kishon@ti.com>
To: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: devicetree@vger.kernel.org, Jingoo Han <jingoohan1@gmail.com>,
	linux-kernel@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
	Murali Karicheri <m-karicheri2@ti.com>,
	linux-pci@vger.kernel.org, Bjorn Helgaas <bhelgaas@google.com>,
	Gustavo Pimentel <gustavo.pimentel@synopsys.com>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 11/19] PCI: keystone: Cleanup PHY handling
Date: Wed, 17 Oct 2018 08:51:39 +0530	[thread overview]
Message-ID: <647103e4-1a38-d3f8-9779-3429530e2f31@ti.com> (raw)
In-Reply-To: <20181016170656.GD16390@e107981-ln.cambridge.arm.com>

Lorenzo,

On Tuesday 16 October 2018 10:36 PM, Lorenzo Pieralisi wrote:
> On Mon, Oct 15, 2018 at 06:37:13PM +0530, Kishon Vijay Abraham I wrote:
>> Cleanup PHY handling by using devm_phy_optional_get to get PHYs if
>> the PHYs are optional, creating a device link between the PHY device
>> and the controller device and disable PHY on error cases here.
>> Also invoke phy_reset() as part of initializing PHY.
> 
> Hi Kishon,
> 
> it is a bit of nitpicking, I know it is annoying but when I read "Also"
> in commit logs there is almost certainly a reason to split the patch
> into logical standalone entities, this one looks like one.
> 
> Every patch must be a self-contained change that, in case we have to
> revert it, must not affect other patches.
> 
> There are some more patches in the series that would benefit from
> splitting so I kindly ask you to go through them and repost, we
> should still be able to hit v4.20.

Sure, I'll repost them.

Thanks
Kishon
> 
> Thanks,
> Lorenzo
> 
>> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
>> ---
>>  drivers/pci/controller/dwc/pci-keystone.c | 126 +++++++++++++++++++---
>>  1 file changed, 110 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
>> index e22328f89c84..bf37609ad75b 100644
>> --- a/drivers/pci/controller/dwc/pci-keystone.c
>> +++ b/drivers/pci/controller/dwc/pci-keystone.c
>> @@ -105,6 +105,9 @@ struct keystone_pcie {
>>  
>>  	int			num_msi_host_irqs;
>>  	int			msi_host_irqs[MAX_MSI_HOST_IRQS];
>> +	int			num_lanes;
>> +	struct phy		**phy;
>> +	struct device_link	**link;
>>  	struct			device_node *msi_intc_np;
>>  	struct irq_domain	*legacy_irq_domain;
>>  	struct device_node	*np;
>> @@ -880,22 +883,61 @@ static const struct dw_pcie_ops ks_pcie_dw_pcie_ops = {
>>  	.link_up = ks_pcie_link_up,
>>  };
>>  
>> -static int __exit ks_pcie_remove(struct platform_device *pdev)
>> +static void ks_pcie_disable_phy(struct keystone_pcie *ks_pcie)
>>  {
>> -	struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
>> +	int num_lanes = ks_pcie->num_lanes;
>>  
>> -	clk_disable_unprepare(ks_pcie->clk);
>> +	while (num_lanes--) {
>> +		phy_power_off(ks_pcie->phy[num_lanes]);
>> +		phy_exit(ks_pcie->phy[num_lanes]);
>> +	}
>> +}
>> +
>> +static int ks_pcie_enable_phy(struct keystone_pcie *ks_pcie)
>> +{
>> +	int i;
>> +	int ret;
>> +	int num_lanes = ks_pcie->num_lanes;
>> +
>> +	for (i = 0; i < num_lanes; i++) {
>> +		ret = phy_reset(ks_pcie->phy[i]);
>> +		if (ret < 0)
>> +			goto err_phy;
>> +
>> +		ret = phy_init(ks_pcie->phy[i]);
>> +		if (ret < 0)
>> +			goto err_phy;
>> +
>> +		ret = phy_power_on(ks_pcie->phy[i]);
>> +		if (ret < 0) {
>> +			phy_exit(ks_pcie->phy[i]);
>> +			goto err_phy;
>> +		}
>> +	}
>>  
>>  	return 0;
>> +
>> +err_phy:
>> +	while (--i >= 0) {
>> +		phy_power_off(ks_pcie->phy[i]);
>> +		phy_exit(ks_pcie->phy[i]);
>> +	}
>> +
>> +	return ret;
>>  }
>>  
>>  static int __init ks_pcie_probe(struct platform_device *pdev)
>>  {
>>  	struct device *dev = &pdev->dev;
>> +	struct device_node *np = dev->of_node;
>>  	struct dw_pcie *pci;
>>  	struct keystone_pcie *ks_pcie;
>> -	struct phy *phy;
>> +	struct device_link **link;
>> +	struct phy **phy;
>> +	u32 num_lanes;
>> +	char name[10];
>>  	int ret;
>> +	int i;
>>  
>>  	ks_pcie = devm_kzalloc(dev, sizeof(*ks_pcie), GFP_KERNEL);
>>  	if (!ks_pcie)
>> @@ -908,29 +950,59 @@ static int __init ks_pcie_probe(struct platform_device *pdev)
>>  	pci->dev = dev;
>>  	pci->ops = &ks_pcie_dw_pcie_ops;
>>  
>> -	ks_pcie->pci = pci;
>> +	ret = of_property_read_u32(np, "num-lanes", &num_lanes);
>> +	if (ret)
>> +		num_lanes = 1;
>>  
>> -	/* initialize SerDes Phy if present */
>> -	phy = devm_phy_get(dev, "pcie-phy");
>> -	if (PTR_ERR_OR_ZERO(phy) == -EPROBE_DEFER)
>> -		return PTR_ERR(phy);
>> +	phy = devm_kzalloc(dev, sizeof(*phy) * num_lanes, GFP_KERNEL);
>> +	if (!phy)
>> +		return -ENOMEM;
>>  
>> -	if (!IS_ERR_OR_NULL(phy)) {
>> -		ret = phy_init(phy);
>> -		if (ret < 0)
>> -			return ret;
>> +	link = devm_kzalloc(dev, sizeof(*link) * num_lanes, GFP_KERNEL);
>> +	if (!link)
>> +		return -ENOMEM;
>> +
>> +	for (i = 0; i < num_lanes; i++) {
>> +		snprintf(name, sizeof(name), "pcie-phy%d", i);
>> +		phy[i] = devm_phy_optional_get(dev, name);
>> +		if (IS_ERR(phy[i])) {
>> +			ret = PTR_ERR(phy[i]);
>> +			goto err_link;
>> +		}
>> +
>> +		if (!phy[i])
>> +			continue;
>> +
>> +		link[i] = device_link_add(dev, &phy[i]->dev, DL_FLAG_STATELESS);
>> +		if (!link[i]) {
>> +			ret = -EINVAL;
>> +			goto err_link;
>> +		}
>> +	}
>> +
>> +	ks_pcie->np = np;
>> +	ks_pcie->pci = pci;
>> +	ks_pcie->link = link;
>> +	ks_pcie->num_lanes = num_lanes;
>> +	ks_pcie->phy = phy;
>> +
>> +	ret = ks_pcie_enable_phy(ks_pcie);
>> +	if (ret) {
>> +		dev_err(dev, "failed to enable phy\n");
>> +		goto err_link;
>>  	}
>>  
>> -	ks_pcie->np = dev->of_node;
>>  	platform_set_drvdata(pdev, ks_pcie);
>>  	ks_pcie->clk = devm_clk_get(dev, "pcie");
>>  	if (IS_ERR(ks_pcie->clk)) {
>>  		dev_err(dev, "Failed to get pcie rc clock\n");
>> -		return PTR_ERR(ks_pcie->clk);
>> +		ret = PTR_ERR(ks_pcie->clk);
>> +		goto err_phy;
>>  	}
>> +
>>  	ret = clk_prepare_enable(ks_pcie->clk);
>>  	if (ret)
>> -		return ret;
>> +		goto err_phy;
>>  
>>  	ret = ks_pcie_add_pcie_port(ks_pcie, pdev);
>>  	if (ret < 0)
>> @@ -940,9 +1012,31 @@ static int __init ks_pcie_probe(struct platform_device *pdev)
>>  fail_clk:
>>  	clk_disable_unprepare(ks_pcie->clk);
>>  
>> +err_phy:
>> +	ks_pcie_disable_phy(ks_pcie);
>> +
>> +err_link:
>> +	while (--i >= 0 && link[i])
>> +		device_link_del(link[i]);
>> +
>>  	return ret;
>>  }
>>  
>> +static int __exit ks_pcie_remove(struct platform_device *pdev)
>> +{
>> +	struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
>> +	struct device_link **link = ks_pcie->link;
>> +	int num_lanes = ks_pcie->num_lanes;
>> +
>> +	clk_disable_unprepare(ks_pcie->clk);
>> +	ks_pcie_disable_phy(ks_pcie);
>> +
>> +	while (num_lanes--)
>> +		device_link_del(link[num_lanes]);
>> +
>> +	return 0;
>> +}
>> +
>>  static struct platform_driver ks_pcie_driver __refdata = {
>>  	.probe  = ks_pcie_probe,
>>  	.remove = __exit_p(ks_pcie_remove),
>> -- 
>> 2.17.1
>>

WARNING: multiple messages have this Message-ID (diff)
From: kishon@ti.com (Kishon Vijay Abraham I)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 11/19] PCI: keystone: Cleanup PHY handling
Date: Wed, 17 Oct 2018 08:51:39 +0530	[thread overview]
Message-ID: <647103e4-1a38-d3f8-9779-3429530e2f31@ti.com> (raw)
In-Reply-To: <20181016170656.GD16390@e107981-ln.cambridge.arm.com>

Lorenzo,

On Tuesday 16 October 2018 10:36 PM, Lorenzo Pieralisi wrote:
> On Mon, Oct 15, 2018 at 06:37:13PM +0530, Kishon Vijay Abraham I wrote:
>> Cleanup PHY handling by using devm_phy_optional_get to get PHYs if
>> the PHYs are optional, creating a device link between the PHY device
>> and the controller device and disable PHY on error cases here.
>> Also invoke phy_reset() as part of initializing PHY.
> 
> Hi Kishon,
> 
> it is a bit of nitpicking, I know it is annoying but when I read "Also"
> in commit logs there is almost certainly a reason to split the patch
> into logical standalone entities, this one looks like one.
> 
> Every patch must be a self-contained change that, in case we have to
> revert it, must not affect other patches.
> 
> There are some more patches in the series that would benefit from
> splitting so I kindly ask you to go through them and repost, we
> should still be able to hit v4.20.

Sure, I'll repost them.

Thanks
Kishon
> 
> Thanks,
> Lorenzo
> 
>> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
>> ---
>>  drivers/pci/controller/dwc/pci-keystone.c | 126 +++++++++++++++++++---
>>  1 file changed, 110 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
>> index e22328f89c84..bf37609ad75b 100644
>> --- a/drivers/pci/controller/dwc/pci-keystone.c
>> +++ b/drivers/pci/controller/dwc/pci-keystone.c
>> @@ -105,6 +105,9 @@ struct keystone_pcie {
>>  
>>  	int			num_msi_host_irqs;
>>  	int			msi_host_irqs[MAX_MSI_HOST_IRQS];
>> +	int			num_lanes;
>> +	struct phy		**phy;
>> +	struct device_link	**link;
>>  	struct			device_node *msi_intc_np;
>>  	struct irq_domain	*legacy_irq_domain;
>>  	struct device_node	*np;
>> @@ -880,22 +883,61 @@ static const struct dw_pcie_ops ks_pcie_dw_pcie_ops = {
>>  	.link_up = ks_pcie_link_up,
>>  };
>>  
>> -static int __exit ks_pcie_remove(struct platform_device *pdev)
>> +static void ks_pcie_disable_phy(struct keystone_pcie *ks_pcie)
>>  {
>> -	struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
>> +	int num_lanes = ks_pcie->num_lanes;
>>  
>> -	clk_disable_unprepare(ks_pcie->clk);
>> +	while (num_lanes--) {
>> +		phy_power_off(ks_pcie->phy[num_lanes]);
>> +		phy_exit(ks_pcie->phy[num_lanes]);
>> +	}
>> +}
>> +
>> +static int ks_pcie_enable_phy(struct keystone_pcie *ks_pcie)
>> +{
>> +	int i;
>> +	int ret;
>> +	int num_lanes = ks_pcie->num_lanes;
>> +
>> +	for (i = 0; i < num_lanes; i++) {
>> +		ret = phy_reset(ks_pcie->phy[i]);
>> +		if (ret < 0)
>> +			goto err_phy;
>> +
>> +		ret = phy_init(ks_pcie->phy[i]);
>> +		if (ret < 0)
>> +			goto err_phy;
>> +
>> +		ret = phy_power_on(ks_pcie->phy[i]);
>> +		if (ret < 0) {
>> +			phy_exit(ks_pcie->phy[i]);
>> +			goto err_phy;
>> +		}
>> +	}
>>  
>>  	return 0;
>> +
>> +err_phy:
>> +	while (--i >= 0) {
>> +		phy_power_off(ks_pcie->phy[i]);
>> +		phy_exit(ks_pcie->phy[i]);
>> +	}
>> +
>> +	return ret;
>>  }
>>  
>>  static int __init ks_pcie_probe(struct platform_device *pdev)
>>  {
>>  	struct device *dev = &pdev->dev;
>> +	struct device_node *np = dev->of_node;
>>  	struct dw_pcie *pci;
>>  	struct keystone_pcie *ks_pcie;
>> -	struct phy *phy;
>> +	struct device_link **link;
>> +	struct phy **phy;
>> +	u32 num_lanes;
>> +	char name[10];
>>  	int ret;
>> +	int i;
>>  
>>  	ks_pcie = devm_kzalloc(dev, sizeof(*ks_pcie), GFP_KERNEL);
>>  	if (!ks_pcie)
>> @@ -908,29 +950,59 @@ static int __init ks_pcie_probe(struct platform_device *pdev)
>>  	pci->dev = dev;
>>  	pci->ops = &ks_pcie_dw_pcie_ops;
>>  
>> -	ks_pcie->pci = pci;
>> +	ret = of_property_read_u32(np, "num-lanes", &num_lanes);
>> +	if (ret)
>> +		num_lanes = 1;
>>  
>> -	/* initialize SerDes Phy if present */
>> -	phy = devm_phy_get(dev, "pcie-phy");
>> -	if (PTR_ERR_OR_ZERO(phy) == -EPROBE_DEFER)
>> -		return PTR_ERR(phy);
>> +	phy = devm_kzalloc(dev, sizeof(*phy) * num_lanes, GFP_KERNEL);
>> +	if (!phy)
>> +		return -ENOMEM;
>>  
>> -	if (!IS_ERR_OR_NULL(phy)) {
>> -		ret = phy_init(phy);
>> -		if (ret < 0)
>> -			return ret;
>> +	link = devm_kzalloc(dev, sizeof(*link) * num_lanes, GFP_KERNEL);
>> +	if (!link)
>> +		return -ENOMEM;
>> +
>> +	for (i = 0; i < num_lanes; i++) {
>> +		snprintf(name, sizeof(name), "pcie-phy%d", i);
>> +		phy[i] = devm_phy_optional_get(dev, name);
>> +		if (IS_ERR(phy[i])) {
>> +			ret = PTR_ERR(phy[i]);
>> +			goto err_link;
>> +		}
>> +
>> +		if (!phy[i])
>> +			continue;
>> +
>> +		link[i] = device_link_add(dev, &phy[i]->dev, DL_FLAG_STATELESS);
>> +		if (!link[i]) {
>> +			ret = -EINVAL;
>> +			goto err_link;
>> +		}
>> +	}
>> +
>> +	ks_pcie->np = np;
>> +	ks_pcie->pci = pci;
>> +	ks_pcie->link = link;
>> +	ks_pcie->num_lanes = num_lanes;
>> +	ks_pcie->phy = phy;
>> +
>> +	ret = ks_pcie_enable_phy(ks_pcie);
>> +	if (ret) {
>> +		dev_err(dev, "failed to enable phy\n");
>> +		goto err_link;
>>  	}
>>  
>> -	ks_pcie->np = dev->of_node;
>>  	platform_set_drvdata(pdev, ks_pcie);
>>  	ks_pcie->clk = devm_clk_get(dev, "pcie");
>>  	if (IS_ERR(ks_pcie->clk)) {
>>  		dev_err(dev, "Failed to get pcie rc clock\n");
>> -		return PTR_ERR(ks_pcie->clk);
>> +		ret = PTR_ERR(ks_pcie->clk);
>> +		goto err_phy;
>>  	}
>> +
>>  	ret = clk_prepare_enable(ks_pcie->clk);
>>  	if (ret)
>> -		return ret;
>> +		goto err_phy;
>>  
>>  	ret = ks_pcie_add_pcie_port(ks_pcie, pdev);
>>  	if (ret < 0)
>> @@ -940,9 +1012,31 @@ static int __init ks_pcie_probe(struct platform_device *pdev)
>>  fail_clk:
>>  	clk_disable_unprepare(ks_pcie->clk);
>>  
>> +err_phy:
>> +	ks_pcie_disable_phy(ks_pcie);
>> +
>> +err_link:
>> +	while (--i >= 0 && link[i])
>> +		device_link_del(link[i]);
>> +
>>  	return ret;
>>  }
>>  
>> +static int __exit ks_pcie_remove(struct platform_device *pdev)
>> +{
>> +	struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
>> +	struct device_link **link = ks_pcie->link;
>> +	int num_lanes = ks_pcie->num_lanes;
>> +
>> +	clk_disable_unprepare(ks_pcie->clk);
>> +	ks_pcie_disable_phy(ks_pcie);
>> +
>> +	while (num_lanes--)
>> +		device_link_del(link[num_lanes]);
>> +
>> +	return 0;
>> +}
>> +
>>  static struct platform_driver ks_pcie_driver __refdata = {
>>  	.probe  = ks_pcie_probe,
>>  	.remove = __exit_p(ks_pcie_remove),
>> -- 
>> 2.17.1
>>

  reply	other threads:[~2018-10-17  3:22 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-15 13:07 [PATCH 00/19] PCI: Cleanup pci-keystone driver Kishon Vijay Abraham I
2018-10-15 13:07 ` Kishon Vijay Abraham I
2018-10-15 13:07 ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 01/19] PCI: keystone: Use quirk to limit MRRS for K2G Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 02/19] PCI: keystone: Use quirk to set MRRS for PCI host bridge Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 03/19] PCI: keystone: Move dw_pcie_setup_rc out of ks_pcie_establish_link() Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 04/19] PCI: keystone: Do not initiate link training multiple times Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 05/19] PCI: keystone: Remove unused argument from ks_dw_pcie_host_init() Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 06/19] PCI: keystone: Merge pci-keystone-dw.c and pci-keystone.c Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 07/19] PCI: keystone: Remove redundant platform_set_drvdata Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 08/19] PCI: keystone: Use uniform function naming convention Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 09/19] dt-bindings: PCI: keystone: Add bindings to get device control module Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 10/19] PCI: keystone: Use syscon APIs to get device id from " Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 11/19] PCI: keystone: Cleanup PHY handling Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-16 17:06   ` Lorenzo Pieralisi
2018-10-16 17:06     ` Lorenzo Pieralisi
2018-10-17  3:21     ` Kishon Vijay Abraham I [this message]
2018-10-17  3:21       ` Kishon Vijay Abraham I
2018-10-17  3:21       ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 12/19] PCI: keystone: Invoke pm_runtime APIs to enable clock Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 13/19] PCI: keystone: Cleanup configuration space access Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 14/19] PCI: keystone: Get number of OB windows from DT and cleanup MEM space configuration Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 15/19] PCI: keystone: Cleanup set_dbi_mode and get_dbi_mode Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 16/19] PCI: keystone: Cleanup ks_pcie_link_up() Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 17/19] PCI: keystone: Add debug error message for all errors Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 18/19] PCI: keystone: Reorder header file in alphabetical order Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07 ` [PATCH 19/19] PCI: keystone: Cleanup macros defined in pci-keystone.c Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I
2018-10-15 13:07   ` Kishon Vijay Abraham I

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=647103e4-1a38-d3f8-9779-3429530e2f31@ti.com \
    --to=kishon@ti.com \
    --cc=bhelgaas@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=gustavo.pimentel@synopsys.com \
    --cc=jingoohan1@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=m-karicheri2@ti.com \
    --cc=robh+dt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.