From: Stephan Gerhold <stephan.gerhold@linaro.org>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Vinod Koul <vkoul@kernel.org>,
Kishon Vijay Abraham I <kishon@kernel.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
linux-phy@lists.infradead.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org,
Neil Armstrong <neil.armstrong@linaro.org>
Subject: Re: [PATCH v2 2/2] phy: add NXP PTN3222 eUSB2 to USB2 redriver
Date: Tue, 24 Sep 2024 18:43:16 +0200 [thread overview]
Message-ID: <ZvLsJEa2PhIxFRDC@linaro.org> (raw)
In-Reply-To: <20240830-nxp-ptn3222-v2-2-4c6d8535cf6c@linaro.org>
On Fri, Aug 30, 2024 at 11:20:46AM +0300, Dmitry Baryshkov wrote:
> The NXP PTN3222 is the single-port eUSB2 to USB2 redriver that performs
> translation between eUSB2 and USB2 signalling schemes. It supports all
> three data rates: Low Speed, Full Speed and High Speed.
>
> The reset state enables autonegotiation of the PHY role and of the data
> rate, so no additional programming is required.
>
> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
> Tested-by: Konrad Dybcio <konradybcio@kernel.org>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
This works well for the USB fingerprint reader on the Qualcomm X1E80100
CRD. Thanks a lot for the clean driver :-)
Reviewed-by: Stephan Gerhold <stephan.gerhold@linaro.org>
Tested-by: Stephan Gerhold <stephan.gerhold@linaro.org>
> ---
> drivers/phy/Kconfig | 11 ++++
> drivers/phy/Makefile | 1 +
> drivers/phy/phy-nxp-ptn3222.c | 123 ++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 135 insertions(+)
>
> diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> index dfab1c66b3e5..cb06a7f79740 100644
> --- a/drivers/phy/Kconfig
> +++ b/drivers/phy/Kconfig
> @@ -82,6 +82,17 @@ config PHY_AIROHA_PCIE
> This driver create the basic PHY instance and provides initialize
> callback for PCIe GEN3 port.
>
> +config PHY_NXP_PTN3222
> + tristate "NXP PTN3222 1-port eUSB2 to USB2 redriver"
> + depends on I2C
> + depends on OF
> + select GENERIC_PHY
> + help
> + Enable this to support NXP PTN3222 1-port eUSB2 to USB2 Redriver.
> + This redriver performs translation between eUSB2 and USB2 signalling
> + schemes. It supports all three USB 2.0 data rates: Low Speed, Full
> + Speed and High Speed.
> +
> source "drivers/phy/allwinner/Kconfig"
> source "drivers/phy/amlogic/Kconfig"
> source "drivers/phy/broadcom/Kconfig"
> diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
> index 5fcbce5f9ab1..b64247046575 100644
> --- a/drivers/phy/Makefile
> +++ b/drivers/phy/Makefile
> @@ -11,6 +11,7 @@ obj-$(CONFIG_PHY_XGENE) += phy-xgene.o
> obj-$(CONFIG_PHY_PISTACHIO_USB) += phy-pistachio-usb.o
> obj-$(CONFIG_USB_LGM_PHY) += phy-lgm-usb.o
> obj-$(CONFIG_PHY_AIROHA_PCIE) += phy-airoha-pcie.o
> +obj-$(CONFIG_PHY_NXP_PTN3222) += phy-nxp-ptn3222.o
> obj-y += allwinner/ \
> amlogic/ \
> broadcom/ \
> diff --git a/drivers/phy/phy-nxp-ptn3222.c b/drivers/phy/phy-nxp-ptn3222.c
> new file mode 100644
> index 000000000000..c6179d8701e6
> --- /dev/null
> +++ b/drivers/phy/phy-nxp-ptn3222.c
> @@ -0,0 +1,123 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2024, Linaro Limited
> + */
> +
> +#include <linux/gpio/consumer.h>
> +#include <linux/i2c.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/phy/phy.h>
> +#include <linux/regmap.h>
> +#include <linux/regulator/consumer.h>
> +
> +#define NUM_SUPPLIES 2
> +
> +struct ptn3222 {
> + struct i2c_client *client;
> + struct phy *phy;
> + struct gpio_desc *reset_gpio;
> + struct regulator_bulk_data *supplies;
> +};
> +
> +static int ptn3222_init(struct phy *phy)
> +{
> + struct ptn3222 *ptn3222 = phy_get_drvdata(phy);
> + int ret;
> +
> + ret = regulator_bulk_enable(NUM_SUPPLIES, ptn3222->supplies);
> + if (ret)
> + return ret;
> +
> + gpiod_set_value_cansleep(ptn3222->reset_gpio, 0);
> +
> + return 0;
> +}
> +
> +static int ptn3222_exit(struct phy *phy)
> +{
> + struct ptn3222 *ptn3222 = phy_get_drvdata(phy);
> +
> + gpiod_set_value_cansleep(ptn3222->reset_gpio, 1);
> +
> + return regulator_bulk_disable(NUM_SUPPLIES, ptn3222->supplies);
> +}
> +
> +static const struct phy_ops ptn3222_ops = {
> + .init = ptn3222_init,
> + .exit = ptn3222_exit,
> + .owner = THIS_MODULE,
> +};
> +
> +static const struct regulator_bulk_data ptn3222_supplies[NUM_SUPPLIES] = {
> + {
> + .supply = "vdd3v3",
> + .init_load_uA = 11000,
> + }, {
> + .supply = "vdd1v8",
> + .init_load_uA = 55000,
> + }
> +};
> +
> +static int ptn3222_probe(struct i2c_client *client)
> +{
> + struct device *dev = &client->dev;
> + struct phy_provider *phy_provider;
> + struct ptn3222 *ptn3222;
> + int ret;
> +
> + ptn3222 = devm_kzalloc(dev, sizeof(*ptn3222), GFP_KERNEL);
> + if (!ptn3222)
> + return -ENOMEM;
> +
> + ptn3222->client = client;
> +
> + ptn3222->reset_gpio = devm_gpiod_get_optional(dev, "reset",
> + GPIOD_OUT_HIGH);
> + if (IS_ERR(ptn3222->reset_gpio))
> + return dev_err_probe(dev, PTR_ERR(ptn3222->reset_gpio),
> + "unable to acquire reset gpio\n");
> +
> + ret = devm_regulator_bulk_get_const(dev, NUM_SUPPLIES, ptn3222_supplies,
> + &ptn3222->supplies);
> + if (ret)
> + return ret;
> +
> + ptn3222->phy = devm_phy_create(dev, dev->of_node, &ptn3222_ops);
> + if (IS_ERR(ptn3222->phy)) {
> + dev_err(dev, "failed to create PHY: %d\n", ret);
> + return PTR_ERR(ptn3222->phy);
> + }
> +
> + phy_set_drvdata(ptn3222->phy, ptn3222);
> +
> + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
> +
> + return PTR_ERR_OR_ZERO(phy_provider);
> +}
> +
> +static const struct i2c_device_id ptn3222_table[] = {
> + { "ptn3222" },
> + { }
> +};
> +MODULE_DEVICE_TABLE(i2c, ptn3222_table);
> +
> +static const struct of_device_id ptn3222_of_table[] = {
> + { .compatible = "nxp,ptn3222" },
> + { }
> +};
> +MODULE_DEVICE_TABLE(of, ptn3222_of_table);
> +
> +static struct i2c_driver ptn3222_driver = {
> + .driver = {
> + .name = "ptn3222",
> + .of_match_table = ptn3222_of_table,
> + },
> + .probe = ptn3222_probe,
> + .id_table = ptn3222_table,
> +};
> +
> +module_i2c_driver(ptn3222_driver);
> +
> +MODULE_DESCRIPTION("NXP PTN3222 eUSB2 Redriver driver");
> +MODULE_LICENSE("GPL");
>
> --
> 2.39.2
>
WARNING: multiple messages have this Message-ID (diff)
From: Stephan Gerhold <stephan.gerhold@linaro.org>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Vinod Koul <vkoul@kernel.org>,
Kishon Vijay Abraham I <kishon@kernel.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
linux-phy@lists.infradead.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org,
Neil Armstrong <neil.armstrong@linaro.org>
Subject: Re: [PATCH v2 2/2] phy: add NXP PTN3222 eUSB2 to USB2 redriver
Date: Tue, 24 Sep 2024 18:43:16 +0200 [thread overview]
Message-ID: <ZvLsJEa2PhIxFRDC@linaro.org> (raw)
In-Reply-To: <20240830-nxp-ptn3222-v2-2-4c6d8535cf6c@linaro.org>
On Fri, Aug 30, 2024 at 11:20:46AM +0300, Dmitry Baryshkov wrote:
> The NXP PTN3222 is the single-port eUSB2 to USB2 redriver that performs
> translation between eUSB2 and USB2 signalling schemes. It supports all
> three data rates: Low Speed, Full Speed and High Speed.
>
> The reset state enables autonegotiation of the PHY role and of the data
> rate, so no additional programming is required.
>
> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
> Tested-by: Konrad Dybcio <konradybcio@kernel.org>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
This works well for the USB fingerprint reader on the Qualcomm X1E80100
CRD. Thanks a lot for the clean driver :-)
Reviewed-by: Stephan Gerhold <stephan.gerhold@linaro.org>
Tested-by: Stephan Gerhold <stephan.gerhold@linaro.org>
> ---
> drivers/phy/Kconfig | 11 ++++
> drivers/phy/Makefile | 1 +
> drivers/phy/phy-nxp-ptn3222.c | 123 ++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 135 insertions(+)
>
> diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> index dfab1c66b3e5..cb06a7f79740 100644
> --- a/drivers/phy/Kconfig
> +++ b/drivers/phy/Kconfig
> @@ -82,6 +82,17 @@ config PHY_AIROHA_PCIE
> This driver create the basic PHY instance and provides initialize
> callback for PCIe GEN3 port.
>
> +config PHY_NXP_PTN3222
> + tristate "NXP PTN3222 1-port eUSB2 to USB2 redriver"
> + depends on I2C
> + depends on OF
> + select GENERIC_PHY
> + help
> + Enable this to support NXP PTN3222 1-port eUSB2 to USB2 Redriver.
> + This redriver performs translation between eUSB2 and USB2 signalling
> + schemes. It supports all three USB 2.0 data rates: Low Speed, Full
> + Speed and High Speed.
> +
> source "drivers/phy/allwinner/Kconfig"
> source "drivers/phy/amlogic/Kconfig"
> source "drivers/phy/broadcom/Kconfig"
> diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
> index 5fcbce5f9ab1..b64247046575 100644
> --- a/drivers/phy/Makefile
> +++ b/drivers/phy/Makefile
> @@ -11,6 +11,7 @@ obj-$(CONFIG_PHY_XGENE) += phy-xgene.o
> obj-$(CONFIG_PHY_PISTACHIO_USB) += phy-pistachio-usb.o
> obj-$(CONFIG_USB_LGM_PHY) += phy-lgm-usb.o
> obj-$(CONFIG_PHY_AIROHA_PCIE) += phy-airoha-pcie.o
> +obj-$(CONFIG_PHY_NXP_PTN3222) += phy-nxp-ptn3222.o
> obj-y += allwinner/ \
> amlogic/ \
> broadcom/ \
> diff --git a/drivers/phy/phy-nxp-ptn3222.c b/drivers/phy/phy-nxp-ptn3222.c
> new file mode 100644
> index 000000000000..c6179d8701e6
> --- /dev/null
> +++ b/drivers/phy/phy-nxp-ptn3222.c
> @@ -0,0 +1,123 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2024, Linaro Limited
> + */
> +
> +#include <linux/gpio/consumer.h>
> +#include <linux/i2c.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/phy/phy.h>
> +#include <linux/regmap.h>
> +#include <linux/regulator/consumer.h>
> +
> +#define NUM_SUPPLIES 2
> +
> +struct ptn3222 {
> + struct i2c_client *client;
> + struct phy *phy;
> + struct gpio_desc *reset_gpio;
> + struct regulator_bulk_data *supplies;
> +};
> +
> +static int ptn3222_init(struct phy *phy)
> +{
> + struct ptn3222 *ptn3222 = phy_get_drvdata(phy);
> + int ret;
> +
> + ret = regulator_bulk_enable(NUM_SUPPLIES, ptn3222->supplies);
> + if (ret)
> + return ret;
> +
> + gpiod_set_value_cansleep(ptn3222->reset_gpio, 0);
> +
> + return 0;
> +}
> +
> +static int ptn3222_exit(struct phy *phy)
> +{
> + struct ptn3222 *ptn3222 = phy_get_drvdata(phy);
> +
> + gpiod_set_value_cansleep(ptn3222->reset_gpio, 1);
> +
> + return regulator_bulk_disable(NUM_SUPPLIES, ptn3222->supplies);
> +}
> +
> +static const struct phy_ops ptn3222_ops = {
> + .init = ptn3222_init,
> + .exit = ptn3222_exit,
> + .owner = THIS_MODULE,
> +};
> +
> +static const struct regulator_bulk_data ptn3222_supplies[NUM_SUPPLIES] = {
> + {
> + .supply = "vdd3v3",
> + .init_load_uA = 11000,
> + }, {
> + .supply = "vdd1v8",
> + .init_load_uA = 55000,
> + }
> +};
> +
> +static int ptn3222_probe(struct i2c_client *client)
> +{
> + struct device *dev = &client->dev;
> + struct phy_provider *phy_provider;
> + struct ptn3222 *ptn3222;
> + int ret;
> +
> + ptn3222 = devm_kzalloc(dev, sizeof(*ptn3222), GFP_KERNEL);
> + if (!ptn3222)
> + return -ENOMEM;
> +
> + ptn3222->client = client;
> +
> + ptn3222->reset_gpio = devm_gpiod_get_optional(dev, "reset",
> + GPIOD_OUT_HIGH);
> + if (IS_ERR(ptn3222->reset_gpio))
> + return dev_err_probe(dev, PTR_ERR(ptn3222->reset_gpio),
> + "unable to acquire reset gpio\n");
> +
> + ret = devm_regulator_bulk_get_const(dev, NUM_SUPPLIES, ptn3222_supplies,
> + &ptn3222->supplies);
> + if (ret)
> + return ret;
> +
> + ptn3222->phy = devm_phy_create(dev, dev->of_node, &ptn3222_ops);
> + if (IS_ERR(ptn3222->phy)) {
> + dev_err(dev, "failed to create PHY: %d\n", ret);
> + return PTR_ERR(ptn3222->phy);
> + }
> +
> + phy_set_drvdata(ptn3222->phy, ptn3222);
> +
> + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
> +
> + return PTR_ERR_OR_ZERO(phy_provider);
> +}
> +
> +static const struct i2c_device_id ptn3222_table[] = {
> + { "ptn3222" },
> + { }
> +};
> +MODULE_DEVICE_TABLE(i2c, ptn3222_table);
> +
> +static const struct of_device_id ptn3222_of_table[] = {
> + { .compatible = "nxp,ptn3222" },
> + { }
> +};
> +MODULE_DEVICE_TABLE(of, ptn3222_of_table);
> +
> +static struct i2c_driver ptn3222_driver = {
> + .driver = {
> + .name = "ptn3222",
> + .of_match_table = ptn3222_of_table,
> + },
> + .probe = ptn3222_probe,
> + .id_table = ptn3222_table,
> +};
> +
> +module_i2c_driver(ptn3222_driver);
> +
> +MODULE_DESCRIPTION("NXP PTN3222 eUSB2 Redriver driver");
> +MODULE_LICENSE("GPL");
>
> --
> 2.39.2
>
--
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy
next prev parent reply other threads:[~2024-09-24 16:43 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-30 8:20 [PATCH v2 0/2] phy: add NXP PTN3222 eUSB2 to USB2 redriver Dmitry Baryshkov
2024-08-30 8:20 ` Dmitry Baryshkov
2024-08-30 8:20 ` [PATCH v2 1/2] dt-bindings: " Dmitry Baryshkov
2024-08-30 8:20 ` Dmitry Baryshkov
2024-09-24 16:41 ` Stephan Gerhold
2024-09-24 16:41 ` Stephan Gerhold
2024-08-30 8:20 ` [PATCH v2 2/2] " Dmitry Baryshkov
2024-08-30 8:20 ` Dmitry Baryshkov
2024-08-30 23:13 ` Song Xue
2024-08-30 23:13 ` Song Xue
2024-08-30 23:45 ` Dmitry Baryshkov
2024-08-30 23:45 ` Dmitry Baryshkov
2024-09-06 8:40 ` Song Xue
2024-09-06 8:40 ` Song Xue
2024-09-06 9:28 ` Dmitry Baryshkov
2024-09-06 9:28 ` Dmitry Baryshkov
2024-09-24 16:43 ` Stephan Gerhold [this message]
2024-09-24 16:43 ` Stephan Gerhold
2024-10-17 15:36 ` [PATCH v2 0/2] " Vinod Koul
2024-10-17 15:36 ` Vinod Koul
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=ZvLsJEa2PhIxFRDC@linaro.org \
--to=stephan.gerhold@linaro.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.baryshkov@linaro.org \
--cc=kishon@kernel.org \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=neil.armstrong@linaro.org \
--cc=robh@kernel.org \
--cc=vkoul@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.