]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
phy: renesas: rcar-gen3-usb2: store drvdata pointer in channel
authorLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Fri, 8 Aug 2025 21:52:06 +0000 (22:52 +0100)
committerVinod Koul <vkoul@kernel.org>
Wed, 20 Aug 2025 16:51:51 +0000 (22:21 +0530)
Store the SoC-specific driver data pointer (struct rcar_gen3_phy_drv_data)
directly in struct rcar_gen3_chan instead of copying individual flags into
separate channel members.

Obtain the drvdata with of_device_get_match_data() in probe and assign it
to channel->phy_data. Update all call sites to reference
`channel->phy_data->*` for SoC-specific behaviour (for example no_adp_ctrl
and utmi_ctrl). Remove the redundant soc_no_adp_ctrl and utmi_ctrl fields
from struct rcar_gen3_chan.

This simplifies the probe path, reduces duplication, and makes it easier
to extend the driver with additional platform-specific fields in the
future.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Link: https://lore.kernel.org/r/20250808215209.3692744-3-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/renesas/phy-rcar-gen3-usb2.c

index 47beb94cd4244c6b95ec0c3bc180d10b73de18ed..7ac56102aed004e1354ebf45dca89304b1950c49 100644 (file)
@@ -122,6 +122,7 @@ struct rcar_gen3_phy {
 struct rcar_gen3_chan {
        void __iomem *base;
        struct device *dev;     /* platform_device's device */
+       const struct rcar_gen3_phy_drv_data *phy_data;
        struct extcon_dev *extcon;
        struct rcar_gen3_phy rphys[NUM_OF_PHYS];
        struct regulator *vbus;
@@ -133,8 +134,6 @@ struct rcar_gen3_chan {
        bool extcon_host;
        bool is_otg_channel;
        bool uses_otg_pins;
-       bool soc_no_adp_ctrl;
-       bool utmi_ctrl;
 };
 
 struct rcar_gen3_phy_drv_data {
@@ -204,7 +203,7 @@ static void rcar_gen3_enable_vbus_ctrl(struct rcar_gen3_chan *ch, int vbus)
        u32 val;
 
        dev_vdbg(ch->dev, "%s: %08x, %d\n", __func__, val, vbus);
-       if (ch->soc_no_adp_ctrl) {
+       if (ch->phy_data->no_adp_ctrl) {
                if (ch->vbus)
                        regulator_hardware_enable(ch->vbus, vbus);
 
@@ -290,7 +289,7 @@ static bool rcar_gen3_check_id(struct rcar_gen3_chan *ch)
        if (!ch->uses_otg_pins)
                return (ch->dr_mode == USB_DR_MODE_HOST) ? false : true;
 
-       if (ch->soc_no_adp_ctrl)
+       if (ch->phy_data->no_adp_ctrl)
                return !!(readl(ch->base + USB2_LINECTRL1) & USB2_LINECTRL1_USB2_IDMON);
 
        return !!(readl(ch->base + USB2_ADPCTRL) & USB2_ADPCTRL_IDDIG);
@@ -421,7 +420,7 @@ static void rcar_gen3_init_otg(struct rcar_gen3_chan *ch)
              USB2_LINECTRL1_DMRPD_EN | USB2_LINECTRL1_DM_RPD;
        writel(val, usb2_base + USB2_LINECTRL1);
 
-       if (!ch->soc_no_adp_ctrl) {
+       if (!ch->phy_data->no_adp_ctrl) {
                val = readl(usb2_base + USB2_VBCTRL);
                val &= ~USB2_VBCTRL_OCCLREN;
                writel(val | USB2_VBCTRL_DRVVBUSSEL, usb2_base + USB2_VBCTRL);
@@ -487,7 +486,7 @@ static int rcar_gen3_phy_usb2_init(struct phy *p)
        if (rphy->int_enable_bits)
                rcar_gen3_init_otg(channel);
 
-       if (channel->utmi_ctrl) {
+       if (channel->phy_data->utmi_ctrl) {
                val = readl(usb2_base + USB2_REGEN_CG_CTRL) | USB2_REGEN_CG_CTRL_UPHY_WEN;
                writel(val, usb2_base + USB2_REGEN_CG_CTRL);
 
@@ -730,7 +729,6 @@ rpm_put:
 
 static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
 {
-       const struct rcar_gen3_phy_drv_data *phy_data;
        struct device *dev = &pdev->dev;
        struct rcar_gen3_chan *channel;
        struct phy_provider *provider;
@@ -773,8 +771,8 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
         */
        pm_runtime_enable(dev);
 
-       phy_data = of_device_get_match_data(dev);
-       if (!phy_data) {
+       channel->phy_data = of_device_get_match_data(dev);
+       if (!channel->phy_data) {
                ret = -EINVAL;
                goto error;
        }
@@ -782,22 +780,19 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, channel);
        channel->dev = dev;
 
-       if (phy_data->init_bus) {
+       if (channel->phy_data->init_bus) {
                ret = rcar_gen3_phy_usb2_init_bus(channel);
                if (ret)
                        goto error;
        }
 
-       channel->soc_no_adp_ctrl = phy_data->no_adp_ctrl;
-       if (phy_data->no_adp_ctrl)
+       if (channel->phy_data->no_adp_ctrl)
                channel->obint_enable_bits = USB2_OBINT_IDCHG_EN;
 
-       channel->utmi_ctrl = phy_data->utmi_ctrl;
-
        spin_lock_init(&channel->lock);
        for (i = 0; i < NUM_OF_PHYS; i++) {
                channel->rphys[i].phy = devm_phy_create(dev, NULL,
-                                                       phy_data->phy_usb2_ops);
+                                                       channel->phy_data->phy_usb2_ops);
                if (IS_ERR(channel->rphys[i].phy)) {
                        dev_err(dev, "Failed to create USB2 PHY\n");
                        ret = PTR_ERR(channel->rphys[i].phy);
@@ -808,7 +803,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
                phy_set_drvdata(channel->rphys[i].phy, &channel->rphys[i]);
        }
 
-       if (channel->soc_no_adp_ctrl && channel->is_otg_channel)
+       if (channel->phy_data->no_adp_ctrl && channel->is_otg_channel)
                channel->vbus = devm_regulator_get_exclusive(dev, "vbus");
        else
                channel->vbus = devm_regulator_get_optional(dev, "vbus");