All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hanjie Lin <hanjie.lin@amlogic.com>
To: Jerome Brunet <jbrunet@baylibre.com>,
	Kishon Vijay Abraham I <kishon@ti.com>
Cc: Yue Wang <yue.wang@amlogic.com>, <linux-kernel@vger.kernel.org>,
	<linux-amlogic@lists.infradead.org>, <linux-pci@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	Kevin Hilman <khilman@baylibre.com>,
	Carlo Caione <carlo@caione.org>, Rob Herring <robh@kernel.org>,
	<shawn.lin@rock-chips.com>
Subject: Re: [PATCH 2/2] PCI: meson: add the Amlogic Meson PCIe phy driver
Date: Thu, 16 Aug 2018 11:05:16 +0800	[thread overview]
Message-ID: <2b87e834-41e3-e418-95f0-c6d695cd8b3f@amlogic.com> (raw)
In-Reply-To: <486e8ab477cc22ff231d2e18d7de22efba2c5abd.camel@baylibre.com>



On 2018/8/14 18:41, Jerome Brunet wrote:
> On Tue, 2018-08-14 at 02:12 -0400, Hanjie Lin wrote:
>> From: Yue Wang <yue.wang@amlogic.com>
>>
>> The Meson-PCIE-PHY controller supports the 5-Gbps data rate
>> of the PCI Express Gen 2 specification and is backwardcompatible
>> with the 2.5-Gbps Gen 1.1 specification with only
>> inferred idle detection supported on AMLOGIC SoCs.
> 
> It looks like the sole purpose of this driver is to provide the reset lines to
> pcie driver.
> 
> I wonder why we need this ? Can't the pcie driver claim the reset lines itself.
> 
> Also, an init of this phy will always reset both port. What will happen if the
> first port is in use and the 2nd port comes up ?? 
> 
> Looks the the pcie driver should claim 'apb' and 'phy' reset lines as "shared"
> reset and the required 'port' as 'exclusive'
> 

Thank you for your response.

Yes, 'apb' and 'phy' reset lines are shared, and ‘port' reset line is exclusive.
If we handle all reset lines during the first port initial sequence, 
and when the second port comes up, we will do nothing about the rest lines, 
and don't need a extra API to do ‘port' reset;

>>
>> Signed-off-by: Yue Wang <yue.wang@amlogic.com>
>> Signed-off-by: Hanjie Lin <hanjie.lin@amlogic.com>
>> ---
>>  drivers/phy/amlogic/Kconfig              |   8 ++
>>  drivers/phy/amlogic/Makefile             |   1 +
>>  drivers/phy/amlogic/phy-meson-axg-pcie.c | 160 +++++++++++++++++++++++++++++++
>>  3 files changed, 169 insertions(+)
>>  create mode 100644 drivers/phy/amlogic/phy-meson-axg-pcie.c
>>
>> diff --git a/drivers/phy/amlogic/Kconfig b/drivers/phy/amlogic/Kconfig
>> index 23fe1cd..3ab07f9 100644
>> --- a/drivers/phy/amlogic/Kconfig
>> +++ b/drivers/phy/amlogic/Kconfig
>> @@ -36,3 +36,11 @@ config PHY_MESON_GXL_USB3
>>  	  Enable this to support the Meson USB3 PHY and OTG detection
>>  	  IP block found in Meson GXL and GXM SoCs.
>>  	  If unsure, say N.
>> +
>> +config PHY_MESON_AXG_PCIE
>> +	bool "Meson AXG PCIe PHY driver"
>> +	depends on OF && (ARCH_MESON || COMPILE_TEST)
>> +	select GENERIC_PHY
>> +	help
>> +	  Enable PCIe PHY support for Meson AXG SoC series.
>> +	  This driver provides PHY interface for Meson PCIe controller.
>> \ No newline at end of file
>> diff --git a/drivers/phy/amlogic/Makefile b/drivers/phy/amlogic/Makefile
>> index 4fd8848..5ab8578 100644
>> --- a/drivers/phy/amlogic/Makefile
>> +++ b/drivers/phy/amlogic/Makefile
>> @@ -1,3 +1,4 @@
>>  obj-$(CONFIG_PHY_MESON8B_USB2)		+= phy-meson8b-usb2.o
>>  obj-$(CONFIG_PHY_MESON_GXL_USB2)	+= phy-meson-gxl-usb2.o
>>  obj-$(CONFIG_PHY_MESON_GXL_USB3)	+= phy-meson-gxl-usb3.o
>> +obj-$(CONFIG_PHY_MESON_AXG_PCIE)	+= phy-meson-axg-pcie.o
>> diff --git a/drivers/phy/amlogic/phy-meson-axg-pcie.c b/drivers/phy/amlogic/phy-meson-axg-pcie.c
>> new file mode 100644
>> index 0000000..8bc5c49
>> --- /dev/null
>> +++ b/drivers/phy/amlogic/phy-meson-axg-pcie.c
>> @@ -0,0 +1,160 @@
>> +// SPDX-License-Identifier: (GPL-2.0+ or MIT)
>> +/*
>> + * Amlogic MESON SoC series PCIe PHY driver
>> + *
>> + * Phy provider for PCIe controller on MESON SoC series
>> + *
>> + * Copyright (c) 2018 Amlogic, inc.
>> + * Yue Wang <yue.wang@amlogic.com>
>> + */
>> +
>> +#include <linux/delay.h>
>> +#include <linux/io.h>
>> +#include <linux/of.h>
>> +#include <linux/of_platform.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/reset.h>
>> +
>> +struct meson_pcie_phy_data {
>> +	const struct phy_ops	*ops;
>> +};
>> +
>> +struct meson_pcie_reset {
>> +	struct reset_control	*port_a;
>> +	struct reset_control	*port_b;
>> +	struct reset_control	*phy;
>> +	struct reset_control	*apb;
>> +};
>> +
>> +struct meson_pcie_phy {
>> +	const struct meson_pcie_phy_data	*data;
>> +	struct meson_pcie_reset	reset;
>> +	void __iomem	*phy_base;
>> +};
>> +
>> +static int meson_pcie_phy_init(struct phy *phy)
>> +{
>> +	struct meson_pcie_phy *mphy = phy_get_drvdata(phy);
>> +	struct meson_pcie_reset *mrst = &mphy->reset;
>> +
>> +	writel(0x1c, mphy->phy_base);
>> +	reset_control_assert(mrst->port_a);
>> +	reset_control_assert(mrst->port_b);
>> +	reset_control_assert(mrst->phy);
>> +	reset_control_assert(mrst->apb);
>> +	udelay(400);
>> +	reset_control_deassert(mrst->port_a);
>> +	reset_control_deassert(mrst->port_b);
>> +	reset_control_deassert(mrst->phy);
>> +	reset_control_deassert(mrst->apb);
>> +	udelay(500);
>> +
>> +	return 0;
>> +}
>> +
>> +static const struct phy_ops meson_phy_ops = {
>> +	.init		= meson_pcie_phy_init,
>> +	.owner		= THIS_MODULE,
>> +};
>> +
>> +static const struct meson_pcie_phy_data meson_pcie_phy_data = {
>> +	.ops		= &meson_phy_ops,
>> +};
>> +
>> +static const struct of_device_id meson_pcie_phy_match[] = {
>> +	{
>> +		.compatible = "amlogic,axg-pcie-phy",
>> +		.data = &meson_pcie_phy_data,
>> +	},
>> +	{},
>> +};
>> +
>> +static int meson_pcie_phy_probe(struct platform_device *pdev)
>> +{
>> +	struct device *dev = &pdev->dev;
>> +	struct meson_pcie_phy *mphy;
>> +	struct meson_pcie_reset *mrst;
>> +	struct phy *generic_phy;
>> +	struct phy_provider *phy_provider;
>> +	struct resource *res;
>> +	const struct meson_pcie_phy_data *data;
>> +
>> +	data = of_device_get_match_data(dev);
>> +	if (!data)
>> +		return -ENODEV;
>> +
>> +	mphy = devm_kzalloc(dev, sizeof(*mphy), GFP_KERNEL);
>> +	if (!mphy)
>> +		return -ENOMEM;
>> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> +	mphy->phy_base = devm_ioremap_resource(dev, res);
>> +	if (IS_ERR(mphy->phy_base))
>> +		return PTR_ERR(mphy->phy_base);
>> +
>> +	mrst = &mphy->reset;
>> +
>> +	mrst->port_a = devm_reset_control_get_shared(dev, "port_a");
>> +	if (IS_ERR(mrst->port_a)) {
>> +		if (PTR_ERR(mrst->port_a) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get port a reset %ld\n",
>> +				PTR_ERR(mrst->port_a));
>> +
>> +		return PTR_ERR(mrst->port_a);
>> +	}
>> +
>> +	mrst->port_b = devm_reset_control_get_shared(dev, "port_b");
>> +	if (IS_ERR(mrst->port_b)) {
>> +		if (PTR_ERR(mrst->port_b) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get port b reset %ld\n",
>> +				PTR_ERR(mrst->port_b));
>> +
>> +		return PTR_ERR(mrst->port_b);
>> +	}
>> +
>> +	mrst->phy = devm_reset_control_get_shared(dev, "phy");
>> +	if (IS_ERR(mrst->phy)) {
>> +		if (PTR_ERR(mrst->phy) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get phy reset\n");
>> +
>> +		return PTR_ERR(mrst->phy);
>> +	}
>> +
>> +	mrst->apb = devm_reset_control_get_shared(dev, "apb");
>> +	if (IS_ERR(mrst->apb)) {
>> +		if (PTR_ERR(mrst->apb) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get apb reset\n");
>> +
>> +		return PTR_ERR(mrst->apb);
>> +	}
>> +
>> +	reset_control_deassert(mrst->port_a);
>> +	reset_control_deassert(mrst->port_b);
>> +	reset_control_deassert(mrst->phy);
>> +	reset_control_deassert(mrst->apb);
>> +
>> +	mphy->data = data;
>> +
>> +	generic_phy = devm_phy_create(dev, dev->of_node, mphy->data->ops);
>> +	if (IS_ERR(generic_phy)) {
>> +		if (PTR_ERR(generic_phy) != -EPROBE_DEFER)
>> +			dev_err(dev, "failed to create PHY\n");
>> +
>> +		return PTR_ERR(generic_phy);
>> +	}
>> +
>> +	phy_set_drvdata(generic_phy, mphy);
>> +	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
>> +
>> +	return PTR_ERR_OR_ZERO(phy_provider);
>> +}
>> +
>> +static struct platform_driver meson_pcie_phy_driver = {
>> +	.probe	= meson_pcie_phy_probe,
>> +	.driver = {
>> +		.of_match_table	= meson_pcie_phy_match,
>> +		.name		= "meson-pcie-phy",
>> +	}
>> +};
>> +
>> +builtin_platform_driver(meson_pcie_phy_driver);
> 
> 
> .
> 

WARNING: multiple messages have this Message-ID (diff)
From: Hanjie Lin <hanjie.lin@amlogic.com>
To: Jerome Brunet <jbrunet@baylibre.com>,
	Kishon Vijay Abraham I <kishon@ti.com>
Cc: Rob Herring <robh@kernel.org>,
	Kevin Hilman <khilman@baylibre.com>,
	shawn.lin@rock-chips.com, linux-kernel@vger.kernel.org,
	Yue Wang <yue.wang@amlogic.com>,
	linux-pci@vger.kernel.org, Carlo Caione <carlo@caione.org>,
	linux-amlogic@lists.infradead.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 2/2] PCI: meson: add the Amlogic Meson PCIe phy driver
Date: Thu, 16 Aug 2018 11:05:16 +0800	[thread overview]
Message-ID: <2b87e834-41e3-e418-95f0-c6d695cd8b3f@amlogic.com> (raw)
In-Reply-To: <486e8ab477cc22ff231d2e18d7de22efba2c5abd.camel@baylibre.com>

CgpPbiAyMDE4LzgvMTQgMTg6NDEsIEplcm9tZSBCcnVuZXQgd3JvdGU6Cj4gT24gVHVlLCAyMDE4
LTA4LTE0IGF0IDAyOjEyIC0wNDAwLCBIYW5qaWUgTGluIHdyb3RlOgo+PiBGcm9tOiBZdWUgV2Fu
ZyA8eXVlLndhbmdAYW1sb2dpYy5jb20+Cj4+Cj4+IFRoZSBNZXNvbi1QQ0lFLVBIWSBjb250cm9s
bGVyIHN1cHBvcnRzIHRoZSA1LUdicHMgZGF0YSByYXRlCj4+IG9mIHRoZSBQQ0kgRXhwcmVzcyBH
ZW4gMiBzcGVjaWZpY2F0aW9uIGFuZCBpcyBiYWNrd2FyZGNvbXBhdGlibGUKPj4gd2l0aCB0aGUg
Mi41LUdicHMgR2VuIDEuMSBzcGVjaWZpY2F0aW9uIHdpdGggb25seQo+PiBpbmZlcnJlZCBpZGxl
IGRldGVjdGlvbiBzdXBwb3J0ZWQgb24gQU1MT0dJQyBTb0NzLgo+IAo+IEl0IGxvb2tzIGxpa2Ug
dGhlIHNvbGUgcHVycG9zZSBvZiB0aGlzIGRyaXZlciBpcyB0byBwcm92aWRlIHRoZSByZXNldCBs
aW5lcyB0bwo+IHBjaWUgZHJpdmVyLgo+IAo+IEkgd29uZGVyIHdoeSB3ZSBuZWVkIHRoaXMgPyBD
YW4ndCB0aGUgcGNpZSBkcml2ZXIgY2xhaW0gdGhlIHJlc2V0IGxpbmVzIGl0c2VsZi4KPiAKPiBB
bHNvLCBhbiBpbml0IG9mIHRoaXMgcGh5IHdpbGwgYWx3YXlzIHJlc2V0IGJvdGggcG9ydC4gV2hh
dCB3aWxsIGhhcHBlbiBpZiB0aGUKPiBmaXJzdCBwb3J0IGlzIGluIHVzZSBhbmQgdGhlIDJuZCBw
b3J0IGNvbWVzIHVwID8/IAo+IAo+IExvb2tzIHRoZSB0aGUgcGNpZSBkcml2ZXIgc2hvdWxkIGNs
YWltICdhcGInIGFuZCAncGh5JyByZXNldCBsaW5lcyBhcyAic2hhcmVkIgo+IHJlc2V0IGFuZCB0
aGUgcmVxdWlyZWQgJ3BvcnQnIGFzICdleGNsdXNpdmUnCj4gCgpUaGFuayB5b3UgZm9yIHlvdXIg
cmVzcG9uc2UuCgpZZXMsICdhcGInIGFuZCAncGh5JyByZXNldCBsaW5lcyBhcmUgc2hhcmVkLCBh
bmQg4oCYcG9ydCcgcmVzZXQgbGluZSBpcyBleGNsdXNpdmUuCklmIHdlIGhhbmRsZSBhbGwgcmVz
ZXQgbGluZXMgZHVyaW5nIHRoZSBmaXJzdCBwb3J0IGluaXRpYWwgc2VxdWVuY2UsIAphbmQgd2hl
biB0aGUgc2Vjb25kIHBvcnQgY29tZXMgdXAsIHdlIHdpbGwgZG8gbm90aGluZyBhYm91dCB0aGUg
cmVzdCBsaW5lcywgCmFuZCBkb24ndCBuZWVkIGEgZXh0cmEgQVBJIHRvIGRvIOKAmHBvcnQnIHJl
c2V0OwoKPj4KPj4gU2lnbmVkLW9mZi1ieTogWXVlIFdhbmcgPHl1ZS53YW5nQGFtbG9naWMuY29t
Pgo+PiBTaWduZWQtb2ZmLWJ5OiBIYW5qaWUgTGluIDxoYW5qaWUubGluQGFtbG9naWMuY29tPgo+
PiAtLS0KPj4gIGRyaXZlcnMvcGh5L2FtbG9naWMvS2NvbmZpZyAgICAgICAgICAgICAgfCAgIDgg
KysKPj4gIGRyaXZlcnMvcGh5L2FtbG9naWMvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDEgKwo+
PiAgZHJpdmVycy9waHkvYW1sb2dpYy9waHktbWVzb24tYXhnLXBjaWUuYyB8IDE2MCArKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrCj4+ICAzIGZpbGVzIGNoYW5nZWQsIDE2OSBpbnNlcnRp
b25zKCspCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9waHkvYW1sb2dpYy9waHktbWVz
b24tYXhnLXBjaWUuYwo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvYW1sb2dpYy9LY29u
ZmlnIGIvZHJpdmVycy9waHkvYW1sb2dpYy9LY29uZmlnCj4+IGluZGV4IDIzZmUxY2QuLjNhYjA3
ZjkgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvcGh5L2FtbG9naWMvS2NvbmZpZwo+PiArKysgYi9k
cml2ZXJzL3BoeS9hbWxvZ2ljL0tjb25maWcKPj4gQEAgLTM2LDMgKzM2LDExIEBAIGNvbmZpZyBQ
SFlfTUVTT05fR1hMX1VTQjMKPj4gIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIE1lc29u
IFVTQjMgUEhZIGFuZCBPVEcgZGV0ZWN0aW9uCj4+ICAJICBJUCBibG9jayBmb3VuZCBpbiBNZXNv
biBHWEwgYW5kIEdYTSBTb0NzLgo+PiAgCSAgSWYgdW5zdXJlLCBzYXkgTi4KPj4gKwo+PiArY29u
ZmlnIFBIWV9NRVNPTl9BWEdfUENJRQo+PiArCWJvb2wgIk1lc29uIEFYRyBQQ0llIFBIWSBkcml2
ZXIiCj4+ICsJZGVwZW5kcyBvbiBPRiAmJiAoQVJDSF9NRVNPTiB8fCBDT01QSUxFX1RFU1QpCj4+
ICsJc2VsZWN0IEdFTkVSSUNfUEhZCj4+ICsJaGVscAo+PiArCSAgRW5hYmxlIFBDSWUgUEhZIHN1
cHBvcnQgZm9yIE1lc29uIEFYRyBTb0Mgc2VyaWVzLgo+PiArCSAgVGhpcyBkcml2ZXIgcHJvdmlk
ZXMgUEhZIGludGVyZmFjZSBmb3IgTWVzb24gUENJZSBjb250cm9sbGVyLgo+PiBcIE5vIG5ld2xp
bmUgYXQgZW5kIG9mIGZpbGUKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2FtbG9naWMvTWFr
ZWZpbGUgYi9kcml2ZXJzL3BoeS9hbWxvZ2ljL01ha2VmaWxlCj4+IGluZGV4IDRmZDg4NDguLjVh
Yjg1NzggMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvcGh5L2FtbG9naWMvTWFrZWZpbGUKPj4gKysr
IGIvZHJpdmVycy9waHkvYW1sb2dpYy9NYWtlZmlsZQo+PiBAQCAtMSwzICsxLDQgQEAKPj4gIG9i
ai0kKENPTkZJR19QSFlfTUVTT044Ql9VU0IyKQkJKz0gcGh5LW1lc29uOGItdXNiMi5vCj4+ICBv
YmotJChDT05GSUdfUEhZX01FU09OX0dYTF9VU0IyKQkrPSBwaHktbWVzb24tZ3hsLXVzYjIubwo+
PiAgb2JqLSQoQ09ORklHX1BIWV9NRVNPTl9HWExfVVNCMykJKz0gcGh5LW1lc29uLWd4bC11c2Iz
Lm8KPj4gK29iai0kKENPTkZJR19QSFlfTUVTT05fQVhHX1BDSUUpCSs9IHBoeS1tZXNvbi1heGct
cGNpZS5vCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9hbWxvZ2ljL3BoeS1tZXNvbi1heGct
cGNpZS5jIGIvZHJpdmVycy9waHkvYW1sb2dpYy9waHktbWVzb24tYXhnLXBjaWUuYwo+PiBuZXcg
ZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi44YmM1YzQ5Cj4+IC0tLSAvZGV2L251
bGwKPj4gKysrIGIvZHJpdmVycy9waHkvYW1sb2dpYy9waHktbWVzb24tYXhnLXBjaWUuYwo+PiBA
QCAtMCwwICsxLDE2MCBAQAo+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IChHUEwtMi4w
KyBvciBNSVQpCj4+ICsvKgo+PiArICogQW1sb2dpYyBNRVNPTiBTb0Mgc2VyaWVzIFBDSWUgUEhZ
IGRyaXZlcgo+PiArICoKPj4gKyAqIFBoeSBwcm92aWRlciBmb3IgUENJZSBjb250cm9sbGVyIG9u
IE1FU09OIFNvQyBzZXJpZXMKPj4gKyAqCj4+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTggQW1sb2dp
YywgaW5jLgo+PiArICogWXVlIFdhbmcgPHl1ZS53YW5nQGFtbG9naWMuY29tPgo+PiArICovCj4+
ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+
Cj4+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9y
bS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+PiArI2luY2x1ZGUg
PGxpbnV4L3BoeS9waHkuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgo+PiArCj4+ICtz
dHJ1Y3QgbWVzb25fcGNpZV9waHlfZGF0YSB7Cj4+ICsJY29uc3Qgc3RydWN0IHBoeV9vcHMJKm9w
czsKPj4gK307Cj4+ICsKPj4gK3N0cnVjdCBtZXNvbl9wY2llX3Jlc2V0IHsKPj4gKwlzdHJ1Y3Qg
cmVzZXRfY29udHJvbAkqcG9ydF9hOwo+PiArCXN0cnVjdCByZXNldF9jb250cm9sCSpwb3J0X2I7
Cj4+ICsJc3RydWN0IHJlc2V0X2NvbnRyb2wJKnBoeTsKPj4gKwlzdHJ1Y3QgcmVzZXRfY29udHJv
bAkqYXBiOwo+PiArfTsKPj4gKwo+PiArc3RydWN0IG1lc29uX3BjaWVfcGh5IHsKPj4gKwljb25z
dCBzdHJ1Y3QgbWVzb25fcGNpZV9waHlfZGF0YQkqZGF0YTsKPj4gKwlzdHJ1Y3QgbWVzb25fcGNp
ZV9yZXNldAlyZXNldDsKPj4gKwl2b2lkIF9faW9tZW0JKnBoeV9iYXNlOwo+PiArfTsKPj4gKwo+
PiArc3RhdGljIGludCBtZXNvbl9wY2llX3BoeV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKPj4gK3sK
Pj4gKwlzdHJ1Y3QgbWVzb25fcGNpZV9waHkgKm1waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsK
Pj4gKwlzdHJ1Y3QgbWVzb25fcGNpZV9yZXNldCAqbXJzdCA9ICZtcGh5LT5yZXNldDsKPj4gKwo+
PiArCXdyaXRlbCgweDFjLCBtcGh5LT5waHlfYmFzZSk7Cj4+ICsJcmVzZXRfY29udHJvbF9hc3Nl
cnQobXJzdC0+cG9ydF9hKTsKPj4gKwlyZXNldF9jb250cm9sX2Fzc2VydChtcnN0LT5wb3J0X2Ip
Owo+PiArCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KG1yc3QtPnBoeSk7Cj4+ICsJcmVzZXRfY29udHJv
bF9hc3NlcnQobXJzdC0+YXBiKTsKPj4gKwl1ZGVsYXkoNDAwKTsKPj4gKwlyZXNldF9jb250cm9s
X2RlYXNzZXJ0KG1yc3QtPnBvcnRfYSk7Cj4+ICsJcmVzZXRfY29udHJvbF9kZWFzc2VydChtcnN0
LT5wb3J0X2IpOwo+PiArCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQobXJzdC0+cGh5KTsKPj4gKwly
ZXNldF9jb250cm9sX2RlYXNzZXJ0KG1yc3QtPmFwYik7Cj4+ICsJdWRlbGF5KDUwMCk7Cj4+ICsK
Pj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3Bz
IG1lc29uX3BoeV9vcHMgPSB7Cj4+ICsJLmluaXQJCT0gbWVzb25fcGNpZV9waHlfaW5pdCwKPj4g
Kwkub3duZXIJCT0gVEhJU19NT0RVTEUsCj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3Ry
dWN0IG1lc29uX3BjaWVfcGh5X2RhdGEgbWVzb25fcGNpZV9waHlfZGF0YSA9IHsKPj4gKwkub3Bz
CQk9ICZtZXNvbl9waHlfb3BzLAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBv
Zl9kZXZpY2VfaWQgbWVzb25fcGNpZV9waHlfbWF0Y2hbXSA9IHsKPj4gKwl7Cj4+ICsJCS5jb21w
YXRpYmxlID0gImFtbG9naWMsYXhnLXBjaWUtcGh5IiwKPj4gKwkJLmRhdGEgPSAmbWVzb25fcGNp
ZV9waHlfZGF0YSwKPj4gKwl9LAo+PiArCXt9LAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGludCBt
ZXNvbl9wY2llX3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+PiArewo+
PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4+ICsJc3RydWN0IG1lc29uX3Bj
aWVfcGh5ICptcGh5Owo+PiArCXN0cnVjdCBtZXNvbl9wY2llX3Jlc2V0ICptcnN0Owo+PiArCXN0
cnVjdCBwaHkgKmdlbmVyaWNfcGh5Owo+PiArCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92
aWRlcjsKPj4gKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPj4gKwljb25zdCBzdHJ1Y3QgbWVzb25f
cGNpZV9waHlfZGF0YSAqZGF0YTsKPj4gKwo+PiArCWRhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNo
X2RhdGEoZGV2KTsKPj4gKwlpZiAoIWRhdGEpCj4+ICsJCXJldHVybiAtRU5PREVWOwo+PiArCj4+
ICsJbXBoeSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbXBoeSksIEdGUF9LRVJORUwpOwo+
PiArCWlmICghbXBoeSkKPj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4+ICsJcmVzID0gcGxhdGZvcm1f
Z2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPj4gKwltcGh5LT5waHlfYmFz
ZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7Cj4+ICsJaWYgKElTX0VSUihtcGh5
LT5waHlfYmFzZSkpCj4+ICsJCXJldHVybiBQVFJfRVJSKG1waHktPnBoeV9iYXNlKTsKPj4gKwo+
PiArCW1yc3QgPSAmbXBoeS0+cmVzZXQ7Cj4+ICsKPj4gKwltcnN0LT5wb3J0X2EgPSBkZXZtX3Jl
c2V0X2NvbnRyb2xfZ2V0X3NoYXJlZChkZXYsICJwb3J0X2EiKTsKPj4gKwlpZiAoSVNfRVJSKG1y
c3QtPnBvcnRfYSkpIHsKPj4gKwkJaWYgKFBUUl9FUlIobXJzdC0+cG9ydF9hKSAhPSAtRVBST0JF
X0RFRkVSKQo+PiArCQkJZGV2X2VycihkZXYsICJjb3VsZG4ndCBnZXQgcG9ydCBhIHJlc2V0ICVs
ZFxuIiwKPj4gKwkJCQlQVFJfRVJSKG1yc3QtPnBvcnRfYSkpOwo+PiArCj4+ICsJCXJldHVybiBQ
VFJfRVJSKG1yc3QtPnBvcnRfYSk7Cj4+ICsJfQo+PiArCj4+ICsJbXJzdC0+cG9ydF9iID0gZGV2
bV9yZXNldF9jb250cm9sX2dldF9zaGFyZWQoZGV2LCAicG9ydF9iIik7Cj4+ICsJaWYgKElTX0VS
UihtcnN0LT5wb3J0X2IpKSB7Cj4+ICsJCWlmIChQVFJfRVJSKG1yc3QtPnBvcnRfYikgIT0gLUVQ
Uk9CRV9ERUZFUikKPj4gKwkJCWRldl9lcnIoZGV2LCAiY291bGRuJ3QgZ2V0IHBvcnQgYiByZXNl
dCAlbGRcbiIsCj4+ICsJCQkJUFRSX0VSUihtcnN0LT5wb3J0X2IpKTsKPj4gKwo+PiArCQlyZXR1
cm4gUFRSX0VSUihtcnN0LT5wb3J0X2IpOwo+PiArCX0KPj4gKwo+PiArCW1yc3QtPnBoeSA9IGRl
dm1fcmVzZXRfY29udHJvbF9nZXRfc2hhcmVkKGRldiwgInBoeSIpOwo+PiArCWlmIChJU19FUlIo
bXJzdC0+cGh5KSkgewo+PiArCQlpZiAoUFRSX0VSUihtcnN0LT5waHkpICE9IC1FUFJPQkVfREVG
RVIpCj4+ICsJCQlkZXZfZXJyKGRldiwgImNvdWxkbid0IGdldCBwaHkgcmVzZXRcbiIpOwo+PiAr
Cj4+ICsJCXJldHVybiBQVFJfRVJSKG1yc3QtPnBoeSk7Cj4+ICsJfQo+PiArCj4+ICsJbXJzdC0+
YXBiID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9zaGFyZWQoZGV2LCAiYXBiIik7Cj4+ICsJaWYg
KElTX0VSUihtcnN0LT5hcGIpKSB7Cj4+ICsJCWlmIChQVFJfRVJSKG1yc3QtPmFwYikgIT0gLUVQ
Uk9CRV9ERUZFUikKPj4gKwkJCWRldl9lcnIoZGV2LCAiY291bGRuJ3QgZ2V0IGFwYiByZXNldFxu
Iik7Cj4+ICsKPj4gKwkJcmV0dXJuIFBUUl9FUlIobXJzdC0+YXBiKTsKPj4gKwl9Cj4+ICsKPj4g
KwlyZXNldF9jb250cm9sX2RlYXNzZXJ0KG1yc3QtPnBvcnRfYSk7Cj4+ICsJcmVzZXRfY29udHJv
bF9kZWFzc2VydChtcnN0LT5wb3J0X2IpOwo+PiArCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQobXJz
dC0+cGh5KTsKPj4gKwlyZXNldF9jb250cm9sX2RlYXNzZXJ0KG1yc3QtPmFwYik7Cj4+ICsKPj4g
KwltcGh5LT5kYXRhID0gZGF0YTsKPj4gKwo+PiArCWdlbmVyaWNfcGh5ID0gZGV2bV9waHlfY3Jl
YXRlKGRldiwgZGV2LT5vZl9ub2RlLCBtcGh5LT5kYXRhLT5vcHMpOwo+PiArCWlmIChJU19FUlIo
Z2VuZXJpY19waHkpKSB7Cj4+ICsJCWlmIChQVFJfRVJSKGdlbmVyaWNfcGh5KSAhPSAtRVBST0JF
X0RFRkVSKQo+PiArCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIFBIWVxuIik7Cj4+
ICsKPj4gKwkJcmV0dXJuIFBUUl9FUlIoZ2VuZXJpY19waHkpOwo+PiArCX0KPj4gKwo+PiArCXBo
eV9zZXRfZHJ2ZGF0YShnZW5lcmljX3BoeSwgbXBoeSk7Cj4+ICsJcGh5X3Byb3ZpZGVyID0gZGV2
bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9waHlfc2ltcGxlX3hsYXRlKTsKPj4g
Kwo+PiArCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGh5X3Byb3ZpZGVyKTsKPj4gK30KPj4gKwo+
PiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWVzb25fcGNpZV9waHlfZHJpdmVyID0g
ewo+PiArCS5wcm9iZQk9IG1lc29uX3BjaWVfcGh5X3Byb2JlLAo+PiArCS5kcml2ZXIgPSB7Cj4+
ICsJCS5vZl9tYXRjaF90YWJsZQk9IG1lc29uX3BjaWVfcGh5X21hdGNoLAo+PiArCQkubmFtZQkJ
PSAibWVzb24tcGNpZS1waHkiLAo+PiArCX0KPj4gK307Cj4+ICsKPj4gK2J1aWx0aW5fcGxhdGZv
cm1fZHJpdmVyKG1lc29uX3BjaWVfcGh5X2RyaXZlcik7Cj4gCj4gCj4gLgo+IAoKX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBt
YWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9s
aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=

WARNING: multiple messages have this Message-ID (diff)
From: hanjie.lin@amlogic.com (Hanjie Lin)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] PCI: meson: add the Amlogic Meson PCIe phy driver
Date: Thu, 16 Aug 2018 11:05:16 +0800	[thread overview]
Message-ID: <2b87e834-41e3-e418-95f0-c6d695cd8b3f@amlogic.com> (raw)
In-Reply-To: <486e8ab477cc22ff231d2e18d7de22efba2c5abd.camel@baylibre.com>



On 2018/8/14 18:41, Jerome Brunet wrote:
> On Tue, 2018-08-14 at 02:12 -0400, Hanjie Lin wrote:
>> From: Yue Wang <yue.wang@amlogic.com>
>>
>> The Meson-PCIE-PHY controller supports the 5-Gbps data rate
>> of the PCI Express Gen 2 specification and is backwardcompatible
>> with the 2.5-Gbps Gen 1.1 specification with only
>> inferred idle detection supported on AMLOGIC SoCs.
> 
> It looks like the sole purpose of this driver is to provide the reset lines to
> pcie driver.
> 
> I wonder why we need this ? Can't the pcie driver claim the reset lines itself.
> 
> Also, an init of this phy will always reset both port. What will happen if the
> first port is in use and the 2nd port comes up ?? 
> 
> Looks the the pcie driver should claim 'apb' and 'phy' reset lines as "shared"
> reset and the required 'port' as 'exclusive'
> 

Thank you for your response.

Yes, 'apb' and 'phy' reset lines are shared, and ?port' reset line is exclusive.
If we handle all reset lines during the first port initial sequence, 
and when the second port comes up, we will do nothing about the rest lines, 
and don't need a extra API to do ?port' reset;

>>
>> Signed-off-by: Yue Wang <yue.wang@amlogic.com>
>> Signed-off-by: Hanjie Lin <hanjie.lin@amlogic.com>
>> ---
>>  drivers/phy/amlogic/Kconfig              |   8 ++
>>  drivers/phy/amlogic/Makefile             |   1 +
>>  drivers/phy/amlogic/phy-meson-axg-pcie.c | 160 +++++++++++++++++++++++++++++++
>>  3 files changed, 169 insertions(+)
>>  create mode 100644 drivers/phy/amlogic/phy-meson-axg-pcie.c
>>
>> diff --git a/drivers/phy/amlogic/Kconfig b/drivers/phy/amlogic/Kconfig
>> index 23fe1cd..3ab07f9 100644
>> --- a/drivers/phy/amlogic/Kconfig
>> +++ b/drivers/phy/amlogic/Kconfig
>> @@ -36,3 +36,11 @@ config PHY_MESON_GXL_USB3
>>  	  Enable this to support the Meson USB3 PHY and OTG detection
>>  	  IP block found in Meson GXL and GXM SoCs.
>>  	  If unsure, say N.
>> +
>> +config PHY_MESON_AXG_PCIE
>> +	bool "Meson AXG PCIe PHY driver"
>> +	depends on OF && (ARCH_MESON || COMPILE_TEST)
>> +	select GENERIC_PHY
>> +	help
>> +	  Enable PCIe PHY support for Meson AXG SoC series.
>> +	  This driver provides PHY interface for Meson PCIe controller.
>> \ No newline at end of file
>> diff --git a/drivers/phy/amlogic/Makefile b/drivers/phy/amlogic/Makefile
>> index 4fd8848..5ab8578 100644
>> --- a/drivers/phy/amlogic/Makefile
>> +++ b/drivers/phy/amlogic/Makefile
>> @@ -1,3 +1,4 @@
>>  obj-$(CONFIG_PHY_MESON8B_USB2)		+= phy-meson8b-usb2.o
>>  obj-$(CONFIG_PHY_MESON_GXL_USB2)	+= phy-meson-gxl-usb2.o
>>  obj-$(CONFIG_PHY_MESON_GXL_USB3)	+= phy-meson-gxl-usb3.o
>> +obj-$(CONFIG_PHY_MESON_AXG_PCIE)	+= phy-meson-axg-pcie.o
>> diff --git a/drivers/phy/amlogic/phy-meson-axg-pcie.c b/drivers/phy/amlogic/phy-meson-axg-pcie.c
>> new file mode 100644
>> index 0000000..8bc5c49
>> --- /dev/null
>> +++ b/drivers/phy/amlogic/phy-meson-axg-pcie.c
>> @@ -0,0 +1,160 @@
>> +// SPDX-License-Identifier: (GPL-2.0+ or MIT)
>> +/*
>> + * Amlogic MESON SoC series PCIe PHY driver
>> + *
>> + * Phy provider for PCIe controller on MESON SoC series
>> + *
>> + * Copyright (c) 2018 Amlogic, inc.
>> + * Yue Wang <yue.wang@amlogic.com>
>> + */
>> +
>> +#include <linux/delay.h>
>> +#include <linux/io.h>
>> +#include <linux/of.h>
>> +#include <linux/of_platform.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/reset.h>
>> +
>> +struct meson_pcie_phy_data {
>> +	const struct phy_ops	*ops;
>> +};
>> +
>> +struct meson_pcie_reset {
>> +	struct reset_control	*port_a;
>> +	struct reset_control	*port_b;
>> +	struct reset_control	*phy;
>> +	struct reset_control	*apb;
>> +};
>> +
>> +struct meson_pcie_phy {
>> +	const struct meson_pcie_phy_data	*data;
>> +	struct meson_pcie_reset	reset;
>> +	void __iomem	*phy_base;
>> +};
>> +
>> +static int meson_pcie_phy_init(struct phy *phy)
>> +{
>> +	struct meson_pcie_phy *mphy = phy_get_drvdata(phy);
>> +	struct meson_pcie_reset *mrst = &mphy->reset;
>> +
>> +	writel(0x1c, mphy->phy_base);
>> +	reset_control_assert(mrst->port_a);
>> +	reset_control_assert(mrst->port_b);
>> +	reset_control_assert(mrst->phy);
>> +	reset_control_assert(mrst->apb);
>> +	udelay(400);
>> +	reset_control_deassert(mrst->port_a);
>> +	reset_control_deassert(mrst->port_b);
>> +	reset_control_deassert(mrst->phy);
>> +	reset_control_deassert(mrst->apb);
>> +	udelay(500);
>> +
>> +	return 0;
>> +}
>> +
>> +static const struct phy_ops meson_phy_ops = {
>> +	.init		= meson_pcie_phy_init,
>> +	.owner		= THIS_MODULE,
>> +};
>> +
>> +static const struct meson_pcie_phy_data meson_pcie_phy_data = {
>> +	.ops		= &meson_phy_ops,
>> +};
>> +
>> +static const struct of_device_id meson_pcie_phy_match[] = {
>> +	{
>> +		.compatible = "amlogic,axg-pcie-phy",
>> +		.data = &meson_pcie_phy_data,
>> +	},
>> +	{},
>> +};
>> +
>> +static int meson_pcie_phy_probe(struct platform_device *pdev)
>> +{
>> +	struct device *dev = &pdev->dev;
>> +	struct meson_pcie_phy *mphy;
>> +	struct meson_pcie_reset *mrst;
>> +	struct phy *generic_phy;
>> +	struct phy_provider *phy_provider;
>> +	struct resource *res;
>> +	const struct meson_pcie_phy_data *data;
>> +
>> +	data = of_device_get_match_data(dev);
>> +	if (!data)
>> +		return -ENODEV;
>> +
>> +	mphy = devm_kzalloc(dev, sizeof(*mphy), GFP_KERNEL);
>> +	if (!mphy)
>> +		return -ENOMEM;
>> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> +	mphy->phy_base = devm_ioremap_resource(dev, res);
>> +	if (IS_ERR(mphy->phy_base))
>> +		return PTR_ERR(mphy->phy_base);
>> +
>> +	mrst = &mphy->reset;
>> +
>> +	mrst->port_a = devm_reset_control_get_shared(dev, "port_a");
>> +	if (IS_ERR(mrst->port_a)) {
>> +		if (PTR_ERR(mrst->port_a) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get port a reset %ld\n",
>> +				PTR_ERR(mrst->port_a));
>> +
>> +		return PTR_ERR(mrst->port_a);
>> +	}
>> +
>> +	mrst->port_b = devm_reset_control_get_shared(dev, "port_b");
>> +	if (IS_ERR(mrst->port_b)) {
>> +		if (PTR_ERR(mrst->port_b) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get port b reset %ld\n",
>> +				PTR_ERR(mrst->port_b));
>> +
>> +		return PTR_ERR(mrst->port_b);
>> +	}
>> +
>> +	mrst->phy = devm_reset_control_get_shared(dev, "phy");
>> +	if (IS_ERR(mrst->phy)) {
>> +		if (PTR_ERR(mrst->phy) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get phy reset\n");
>> +
>> +		return PTR_ERR(mrst->phy);
>> +	}
>> +
>> +	mrst->apb = devm_reset_control_get_shared(dev, "apb");
>> +	if (IS_ERR(mrst->apb)) {
>> +		if (PTR_ERR(mrst->apb) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get apb reset\n");
>> +
>> +		return PTR_ERR(mrst->apb);
>> +	}
>> +
>> +	reset_control_deassert(mrst->port_a);
>> +	reset_control_deassert(mrst->port_b);
>> +	reset_control_deassert(mrst->phy);
>> +	reset_control_deassert(mrst->apb);
>> +
>> +	mphy->data = data;
>> +
>> +	generic_phy = devm_phy_create(dev, dev->of_node, mphy->data->ops);
>> +	if (IS_ERR(generic_phy)) {
>> +		if (PTR_ERR(generic_phy) != -EPROBE_DEFER)
>> +			dev_err(dev, "failed to create PHY\n");
>> +
>> +		return PTR_ERR(generic_phy);
>> +	}
>> +
>> +	phy_set_drvdata(generic_phy, mphy);
>> +	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
>> +
>> +	return PTR_ERR_OR_ZERO(phy_provider);
>> +}
>> +
>> +static struct platform_driver meson_pcie_phy_driver = {
>> +	.probe	= meson_pcie_phy_probe,
>> +	.driver = {
>> +		.of_match_table	= meson_pcie_phy_match,
>> +		.name		= "meson-pcie-phy",
>> +	}
>> +};
>> +
>> +builtin_platform_driver(meson_pcie_phy_driver);
> 
> 
> .
> 

WARNING: multiple messages have this Message-ID (diff)
From: hanjie.lin@amlogic.com (Hanjie Lin)
To: linus-amlogic@lists.infradead.org
Subject: [PATCH 2/2] PCI: meson: add the Amlogic Meson PCIe phy driver
Date: Thu, 16 Aug 2018 11:05:16 +0800	[thread overview]
Message-ID: <2b87e834-41e3-e418-95f0-c6d695cd8b3f@amlogic.com> (raw)
In-Reply-To: <486e8ab477cc22ff231d2e18d7de22efba2c5abd.camel@baylibre.com>



On 2018/8/14 18:41, Jerome Brunet wrote:
> On Tue, 2018-08-14 at 02:12 -0400, Hanjie Lin wrote:
>> From: Yue Wang <yue.wang@amlogic.com>
>>
>> The Meson-PCIE-PHY controller supports the 5-Gbps data rate
>> of the PCI Express Gen 2 specification and is backwardcompatible
>> with the 2.5-Gbps Gen 1.1 specification with only
>> inferred idle detection supported on AMLOGIC SoCs.
> 
> It looks like the sole purpose of this driver is to provide the reset lines to
> pcie driver.
> 
> I wonder why we need this ? Can't the pcie driver claim the reset lines itself.
> 
> Also, an init of this phy will always reset both port. What will happen if the
> first port is in use and the 2nd port comes up ?? 
> 
> Looks the the pcie driver should claim 'apb' and 'phy' reset lines as "shared"
> reset and the required 'port' as 'exclusive'
> 

Thank you for your response.

Yes, 'apb' and 'phy' reset lines are shared, and ?port' reset line is exclusive.
If we handle all reset lines during the first port initial sequence, 
and when the second port comes up, we will do nothing about the rest lines, 
and don't need a extra API to do ?port' reset;

>>
>> Signed-off-by: Yue Wang <yue.wang@amlogic.com>
>> Signed-off-by: Hanjie Lin <hanjie.lin@amlogic.com>
>> ---
>>  drivers/phy/amlogic/Kconfig              |   8 ++
>>  drivers/phy/amlogic/Makefile             |   1 +
>>  drivers/phy/amlogic/phy-meson-axg-pcie.c | 160 +++++++++++++++++++++++++++++++
>>  3 files changed, 169 insertions(+)
>>  create mode 100644 drivers/phy/amlogic/phy-meson-axg-pcie.c
>>
>> diff --git a/drivers/phy/amlogic/Kconfig b/drivers/phy/amlogic/Kconfig
>> index 23fe1cd..3ab07f9 100644
>> --- a/drivers/phy/amlogic/Kconfig
>> +++ b/drivers/phy/amlogic/Kconfig
>> @@ -36,3 +36,11 @@ config PHY_MESON_GXL_USB3
>>  	  Enable this to support the Meson USB3 PHY and OTG detection
>>  	  IP block found in Meson GXL and GXM SoCs.
>>  	  If unsure, say N.
>> +
>> +config PHY_MESON_AXG_PCIE
>> +	bool "Meson AXG PCIe PHY driver"
>> +	depends on OF && (ARCH_MESON || COMPILE_TEST)
>> +	select GENERIC_PHY
>> +	help
>> +	  Enable PCIe PHY support for Meson AXG SoC series.
>> +	  This driver provides PHY interface for Meson PCIe controller.
>> \ No newline at end of file
>> diff --git a/drivers/phy/amlogic/Makefile b/drivers/phy/amlogic/Makefile
>> index 4fd8848..5ab8578 100644
>> --- a/drivers/phy/amlogic/Makefile
>> +++ b/drivers/phy/amlogic/Makefile
>> @@ -1,3 +1,4 @@
>>  obj-$(CONFIG_PHY_MESON8B_USB2)		+= phy-meson8b-usb2.o
>>  obj-$(CONFIG_PHY_MESON_GXL_USB2)	+= phy-meson-gxl-usb2.o
>>  obj-$(CONFIG_PHY_MESON_GXL_USB3)	+= phy-meson-gxl-usb3.o
>> +obj-$(CONFIG_PHY_MESON_AXG_PCIE)	+= phy-meson-axg-pcie.o
>> diff --git a/drivers/phy/amlogic/phy-meson-axg-pcie.c b/drivers/phy/amlogic/phy-meson-axg-pcie.c
>> new file mode 100644
>> index 0000000..8bc5c49
>> --- /dev/null
>> +++ b/drivers/phy/amlogic/phy-meson-axg-pcie.c
>> @@ -0,0 +1,160 @@
>> +// SPDX-License-Identifier: (GPL-2.0+ or MIT)
>> +/*
>> + * Amlogic MESON SoC series PCIe PHY driver
>> + *
>> + * Phy provider for PCIe controller on MESON SoC series
>> + *
>> + * Copyright (c) 2018 Amlogic, inc.
>> + * Yue Wang <yue.wang@amlogic.com>
>> + */
>> +
>> +#include <linux/delay.h>
>> +#include <linux/io.h>
>> +#include <linux/of.h>
>> +#include <linux/of_platform.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/reset.h>
>> +
>> +struct meson_pcie_phy_data {
>> +	const struct phy_ops	*ops;
>> +};
>> +
>> +struct meson_pcie_reset {
>> +	struct reset_control	*port_a;
>> +	struct reset_control	*port_b;
>> +	struct reset_control	*phy;
>> +	struct reset_control	*apb;
>> +};
>> +
>> +struct meson_pcie_phy {
>> +	const struct meson_pcie_phy_data	*data;
>> +	struct meson_pcie_reset	reset;
>> +	void __iomem	*phy_base;
>> +};
>> +
>> +static int meson_pcie_phy_init(struct phy *phy)
>> +{
>> +	struct meson_pcie_phy *mphy = phy_get_drvdata(phy);
>> +	struct meson_pcie_reset *mrst = &mphy->reset;
>> +
>> +	writel(0x1c, mphy->phy_base);
>> +	reset_control_assert(mrst->port_a);
>> +	reset_control_assert(mrst->port_b);
>> +	reset_control_assert(mrst->phy);
>> +	reset_control_assert(mrst->apb);
>> +	udelay(400);
>> +	reset_control_deassert(mrst->port_a);
>> +	reset_control_deassert(mrst->port_b);
>> +	reset_control_deassert(mrst->phy);
>> +	reset_control_deassert(mrst->apb);
>> +	udelay(500);
>> +
>> +	return 0;
>> +}
>> +
>> +static const struct phy_ops meson_phy_ops = {
>> +	.init		= meson_pcie_phy_init,
>> +	.owner		= THIS_MODULE,
>> +};
>> +
>> +static const struct meson_pcie_phy_data meson_pcie_phy_data = {
>> +	.ops		= &meson_phy_ops,
>> +};
>> +
>> +static const struct of_device_id meson_pcie_phy_match[] = {
>> +	{
>> +		.compatible = "amlogic,axg-pcie-phy",
>> +		.data = &meson_pcie_phy_data,
>> +	},
>> +	{},
>> +};
>> +
>> +static int meson_pcie_phy_probe(struct platform_device *pdev)
>> +{
>> +	struct device *dev = &pdev->dev;
>> +	struct meson_pcie_phy *mphy;
>> +	struct meson_pcie_reset *mrst;
>> +	struct phy *generic_phy;
>> +	struct phy_provider *phy_provider;
>> +	struct resource *res;
>> +	const struct meson_pcie_phy_data *data;
>> +
>> +	data = of_device_get_match_data(dev);
>> +	if (!data)
>> +		return -ENODEV;
>> +
>> +	mphy = devm_kzalloc(dev, sizeof(*mphy), GFP_KERNEL);
>> +	if (!mphy)
>> +		return -ENOMEM;
>> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> +	mphy->phy_base = devm_ioremap_resource(dev, res);
>> +	if (IS_ERR(mphy->phy_base))
>> +		return PTR_ERR(mphy->phy_base);
>> +
>> +	mrst = &mphy->reset;
>> +
>> +	mrst->port_a = devm_reset_control_get_shared(dev, "port_a");
>> +	if (IS_ERR(mrst->port_a)) {
>> +		if (PTR_ERR(mrst->port_a) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get port a reset %ld\n",
>> +				PTR_ERR(mrst->port_a));
>> +
>> +		return PTR_ERR(mrst->port_a);
>> +	}
>> +
>> +	mrst->port_b = devm_reset_control_get_shared(dev, "port_b");
>> +	if (IS_ERR(mrst->port_b)) {
>> +		if (PTR_ERR(mrst->port_b) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get port b reset %ld\n",
>> +				PTR_ERR(mrst->port_b));
>> +
>> +		return PTR_ERR(mrst->port_b);
>> +	}
>> +
>> +	mrst->phy = devm_reset_control_get_shared(dev, "phy");
>> +	if (IS_ERR(mrst->phy)) {
>> +		if (PTR_ERR(mrst->phy) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get phy reset\n");
>> +
>> +		return PTR_ERR(mrst->phy);
>> +	}
>> +
>> +	mrst->apb = devm_reset_control_get_shared(dev, "apb");
>> +	if (IS_ERR(mrst->apb)) {
>> +		if (PTR_ERR(mrst->apb) != -EPROBE_DEFER)
>> +			dev_err(dev, "couldn't get apb reset\n");
>> +
>> +		return PTR_ERR(mrst->apb);
>> +	}
>> +
>> +	reset_control_deassert(mrst->port_a);
>> +	reset_control_deassert(mrst->port_b);
>> +	reset_control_deassert(mrst->phy);
>> +	reset_control_deassert(mrst->apb);
>> +
>> +	mphy->data = data;
>> +
>> +	generic_phy = devm_phy_create(dev, dev->of_node, mphy->data->ops);
>> +	if (IS_ERR(generic_phy)) {
>> +		if (PTR_ERR(generic_phy) != -EPROBE_DEFER)
>> +			dev_err(dev, "failed to create PHY\n");
>> +
>> +		return PTR_ERR(generic_phy);
>> +	}
>> +
>> +	phy_set_drvdata(generic_phy, mphy);
>> +	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
>> +
>> +	return PTR_ERR_OR_ZERO(phy_provider);
>> +}
>> +
>> +static struct platform_driver meson_pcie_phy_driver = {
>> +	.probe	= meson_pcie_phy_probe,
>> +	.driver = {
>> +		.of_match_table	= meson_pcie_phy_match,
>> +		.name		= "meson-pcie-phy",
>> +	}
>> +};
>> +
>> +builtin_platform_driver(meson_pcie_phy_driver);
> 
> 
> .
> 

  reply	other threads:[~2018-08-16  3:05 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-14  6:12 [PATCH 0/2] add the Amlogic Meson PCIe phy driver Hanjie Lin
2018-08-14  6:12 ` Hanjie Lin
2018-08-14  6:12 ` Hanjie Lin
2018-08-14  6:12 ` Hanjie Lin
2018-08-14  6:12 ` Hanjie Lin
2018-08-14  6:12 ` [PATCH 1/2] dt-bindings: PCI: meson: add DT bindings for Amlogic Meson PCIe Phy controller Hanjie Lin
2018-08-14  6:12   ` Hanjie Lin
2018-08-14  6:12   ` Hanjie Lin
2018-08-14  6:12   ` Hanjie Lin
2018-08-14  6:12   ` Hanjie Lin
2018-08-14 22:50   ` Rob Herring
2018-08-14 22:50     ` Rob Herring
2018-08-14 22:50     ` Rob Herring
2018-08-14 22:50     ` Rob Herring
2018-08-16  3:01     ` Hanjie Lin
2018-08-16  3:01       ` Hanjie Lin
2018-08-16  3:01       ` Hanjie Lin
2018-08-16  3:01       ` Hanjie Lin
2018-08-16  3:01       ` Hanjie Lin
2018-08-14  6:12 ` [PATCH 2/2] PCI: meson: add the Amlogic Meson PCIe phy driver Hanjie Lin
2018-08-14  6:12   ` Hanjie Lin
2018-08-14  6:12   ` Hanjie Lin
2018-08-14  6:12   ` Hanjie Lin
2018-08-14 10:41   ` Jerome Brunet
2018-08-14 10:41     ` Jerome Brunet
2018-08-14 10:41     ` Jerome Brunet
2018-08-14 10:41     ` Jerome Brunet
2018-08-16  3:05     ` Hanjie Lin [this message]
2018-08-16  3:05       ` Hanjie Lin
2018-08-16  3:05       ` Hanjie Lin
2018-08-16  3:05       ` Hanjie Lin
2018-08-16  8:33       ` Jerome Brunet
2018-08-16  8:33         ` Jerome Brunet
2018-08-16  8:33         ` Jerome Brunet
2018-08-16  8:33         ` Jerome Brunet
2018-08-17  6:12         ` Hanjie Lin
2018-08-17  6:12           ` Hanjie Lin
2018-08-17  6:12           ` Hanjie Lin
2018-08-17  6:12           ` Hanjie Lin
2018-08-17  8:09           ` Jerome Brunet
2018-08-17  8:09             ` Jerome Brunet
2018-08-17  8:09             ` Jerome Brunet
2018-08-17  8:09             ` Jerome Brunet
2018-08-17 11:17             ` Hanjie Lin
2018-08-17 11:17               ` Hanjie Lin
2018-08-17 11:17               ` Hanjie Lin
2018-08-17 11:17               ` Hanjie Lin

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=2b87e834-41e3-e418-95f0-c6d695cd8b3f@amlogic.com \
    --to=hanjie.lin@amlogic.com \
    --cc=carlo@caione.org \
    --cc=jbrunet@baylibre.com \
    --cc=khilman@baylibre.com \
    --cc=kishon@ti.com \
    --cc=linux-amlogic@lists.infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=robh@kernel.org \
    --cc=shawn.lin@rock-chips.com \
    --cc=yue.wang@amlogic.com \
    /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.