]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
phy: renesas: rcar-gen3-usb2: Allow SoC-specific OBINT bits via phy_data
authorLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Fri, 8 Aug 2025 21:52:07 +0000 (22:52 +0100)
committerVinod Koul <vkoul@kernel.org>
Wed, 20 Aug 2025 16:51:51 +0000 (22:21 +0530)
Update the PHY driver to support SoC-specific OBINT enable bits by
introducing the `obint_enable_bits` field in the `rcar_gen3_phy_drv_data`
structure. This allows each SoC to specify bits required.

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

index 7ac56102aed004e1354ebf45dca89304b1950c49..a37af7d8f2f470a172d45295dede419a767bdac0 100644 (file)
@@ -71,8 +71,7 @@
 /* OBINTSTA and OBINTEN */
 #define USB2_OBINT_SESSVLDCHG          BIT(12)
 #define USB2_OBINT_IDDIGCHG            BIT(11)
-#define USB2_OBINT_BITS                        (USB2_OBINT_SESSVLDCHG | \
-                                        USB2_OBINT_IDDIGCHG)
+#define USB2_OBINT_IDCHG_EN            BIT(0) /*  RZ/G2L specific */
 
 /* VBCTRL */
 #define USB2_VBCTRL_OCCLREN            BIT(16)
@@ -93,7 +92,6 @@
 #define USB2_ADPCTRL_DRVVBUS           BIT(4)
 
 /*  RZ/G2L specific */
-#define USB2_OBINT_IDCHG_EN            BIT(0)
 #define USB2_LINECTRL1_USB2_IDMON      BIT(0)
 
 #define NUM_OF_PHYS                    4
@@ -130,7 +128,6 @@ struct rcar_gen3_chan {
        struct work_struct work;
        spinlock_t lock;        /* protects access to hardware and driver data structure. */
        enum usb_dr_mode dr_mode;
-       u32 obint_enable_bits;
        bool extcon_host;
        bool is_otg_channel;
        bool uses_otg_pins;
@@ -141,6 +138,7 @@ struct rcar_gen3_phy_drv_data {
        bool no_adp_ctrl;
        bool init_bus;
        bool utmi_ctrl;
+       u32 obint_enable_bits;
 };
 
 /*
@@ -225,9 +223,9 @@ static void rcar_gen3_control_otg_irq(struct rcar_gen3_chan *ch, int enable)
        u32 val = readl(usb2_base + USB2_OBINTEN);
 
        if (ch->uses_otg_pins && enable)
-               val |= ch->obint_enable_bits;
+               val |= ch->phy_data->obint_enable_bits;
        else
-               val &= ~ch->obint_enable_bits;
+               val &= ~ch->phy_data->obint_enable_bits;
        writel(val, usb2_base + USB2_OBINTEN);
 }
 
@@ -430,7 +428,7 @@ static void rcar_gen3_init_otg(struct rcar_gen3_chan *ch)
        mdelay(20);
 
        writel(0xffffffff, usb2_base + USB2_OBINTSTA);
-       writel(ch->obint_enable_bits, usb2_base + USB2_OBINTEN);
+       writel(ch->phy_data->obint_enable_bits, usb2_base + USB2_OBINTEN);
 
        rcar_gen3_device_recognition(ch);
 }
@@ -450,9 +448,9 @@ static irqreturn_t rcar_gen3_phy_usb2_irq(int irq, void *_ch)
 
        scoped_guard(spinlock, &ch->lock) {
                status = readl(usb2_base + USB2_OBINTSTA);
-               if (status & ch->obint_enable_bits) {
+               if (status & ch->phy_data->obint_enable_bits) {
                        dev_vdbg(dev, "%s: %08x\n", __func__, status);
-                       writel(ch->obint_enable_bits, usb2_base + USB2_OBINTSTA);
+                       writel(ch->phy_data->obint_enable_bits, usb2_base + USB2_OBINTSTA);
                        rcar_gen3_device_recognition(ch);
                        ret = IRQ_HANDLED;
                }
@@ -591,28 +589,35 @@ static const struct phy_ops rz_g1c_phy_usb2_ops = {
 static const struct rcar_gen3_phy_drv_data rcar_gen3_phy_usb2_data = {
        .phy_usb2_ops = &rcar_gen3_phy_usb2_ops,
        .no_adp_ctrl = false,
+       .obint_enable_bits = USB2_OBINT_SESSVLDCHG |
+                            USB2_OBINT_IDDIGCHG,
 };
 
 static const struct rcar_gen3_phy_drv_data rz_g1c_phy_usb2_data = {
        .phy_usb2_ops = &rz_g1c_phy_usb2_ops,
        .no_adp_ctrl = false,
+       .obint_enable_bits = USB2_OBINT_SESSVLDCHG |
+                            USB2_OBINT_IDDIGCHG,
 };
 
 static const struct rcar_gen3_phy_drv_data rz_g2l_phy_usb2_data = {
        .phy_usb2_ops = &rcar_gen3_phy_usb2_ops,
        .no_adp_ctrl = true,
+       .obint_enable_bits = USB2_OBINT_IDCHG_EN,
 };
 
 static const struct rcar_gen3_phy_drv_data rz_g3s_phy_usb2_data = {
        .phy_usb2_ops = &rcar_gen3_phy_usb2_ops,
        .no_adp_ctrl = true,
        .init_bus = true,
+       .obint_enable_bits = USB2_OBINT_IDCHG_EN,
 };
 
 static const struct rcar_gen3_phy_drv_data rz_v2h_phy_usb2_data = {
        .phy_usb2_ops = &rcar_gen3_phy_usb2_ops,
        .no_adp_ctrl = true,
        .utmi_ctrl = true,
+       .obint_enable_bits = USB2_OBINT_IDCHG_EN,
 };
 
 static const struct of_device_id rcar_gen3_phy_usb2_match_table[] = {
@@ -747,7 +752,6 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
        if (IS_ERR(channel->base))
                return PTR_ERR(channel->base);
 
-       channel->obint_enable_bits = USB2_OBINT_BITS;
        channel->dr_mode = rcar_gen3_get_dr_mode(dev->of_node);
        if (channel->dr_mode != USB_DR_MODE_UNKNOWN) {
                channel->is_otg_channel = true;
@@ -786,9 +790,6 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
                        goto error;
        }
 
-       if (channel->phy_data->no_adp_ctrl)
-               channel->obint_enable_bits = USB2_OBINT_IDCHG_EN;
-
        spin_lock_init(&channel->lock);
        for (i = 0; i < NUM_OF_PHYS; i++) {
                channel->rphys[i].phy = devm_phy_create(dev, NULL,