]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: cdns3-ti: move reg writes to separate function
authorThéo Lebrun <theo.lebrun@bootlin.com>
Wed, 5 Feb 2025 17:36:50 +0000 (18:36 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Mar 2025 08:18:02 +0000 (09:18 +0100)
The device probe function mixes management code and hardware
initialisation code. Extract the latter into an explicitly named
cdns_ti_reset_and_init_hw() function to clarify intent. It also will
allow easier transition to using runtime PM for triggering HW init.

Reviewed-by: Roger Quadros <rogerq@kernel.org>
Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
Link: https://lore.kernel.org/r/20250205-s2r-cdns-v7-5-13658a271c3c@bootlin.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/cdns3/cdns3-ti.c

index 040bb91e9c017d8298a7e251fd0e192a336e8a52..d573a259f1ae5c4efd59a496a43b23b75e859dd8 100644 (file)
@@ -58,6 +58,7 @@ struct cdns_ti {
        unsigned vbus_divider:1;
        struct clk *usb2_refclk;
        struct clk *lpm_clk;
+       int usb2_refclk_rate_code;
 };
 
 static const int cdns_ti_rate_table[] = {      /* in KHZ */
@@ -98,15 +99,50 @@ static const struct of_dev_auxdata cdns_ti_auxdata[] = {
        {},
 };
 
+static void cdns_ti_reset_and_init_hw(struct cdns_ti *data)
+{
+       u32 reg;
+
+       /* assert RESET */
+       reg = cdns_ti_readl(data, USBSS_W1);
+       reg &= ~USBSS_W1_PWRUP_RST;
+       cdns_ti_writel(data, USBSS_W1, reg);
+
+       /* set static config */
+       reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG);
+       reg &= ~USBSS1_STATIC_PLL_REF_SEL_MASK;
+       reg |= data->usb2_refclk_rate_code << USBSS1_STATIC_PLL_REF_SEL_SHIFT;
+
+       reg &= ~USBSS1_STATIC_VBUS_SEL_MASK;
+       if (data->vbus_divider)
+               reg |= 1 << USBSS1_STATIC_VBUS_SEL_SHIFT;
+
+       cdns_ti_writel(data, USBSS_STATIC_CONFIG, reg);
+       reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG);
+
+       /* set USB2_ONLY mode if requested */
+       reg = cdns_ti_readl(data, USBSS_W1);
+       if (data->usb2_only)
+               reg |= USBSS_W1_USB2_ONLY;
+
+       /* set default modestrap */
+       reg |= USBSS_W1_MODESTRAP_SEL;
+       reg &= ~USBSS_W1_MODESTRAP_MASK;
+       reg |= USBSS_MODESTRAP_MODE_NONE << USBSS_W1_MODESTRAP_SHIFT;
+       cdns_ti_writel(data, USBSS_W1, reg);
+
+       /* de-assert RESET */
+       reg |= USBSS_W1_PWRUP_RST;
+       cdns_ti_writel(data, USBSS_W1, reg);
+}
+
 static int cdns_ti_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = pdev->dev.of_node;
        struct cdns_ti *data;
-       int error;
-       u32 reg;
-       int rate_code, i;
        unsigned long rate;
+       int error, i;
 
        data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
        if (!data)
@@ -146,7 +182,11 @@ static int cdns_ti_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
-       rate_code = i;
+       data->usb2_refclk_rate_code = i;
+       data->vbus_divider = device_property_read_bool(dev, "ti,vbus-divider");
+       data->usb2_only = device_property_read_bool(dev, "ti,usb2-only");
+
+       cdns_ti_reset_and_init_hw(data);
 
        pm_runtime_enable(dev);
        error = pm_runtime_get_sync(dev);
@@ -155,40 +195,6 @@ static int cdns_ti_probe(struct platform_device *pdev)
                goto err;
        }
 
-       /* assert RESET */
-       reg = cdns_ti_readl(data, USBSS_W1);
-       reg &= ~USBSS_W1_PWRUP_RST;
-       cdns_ti_writel(data, USBSS_W1, reg);
-
-       /* set static config */
-       reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG);
-       reg &= ~USBSS1_STATIC_PLL_REF_SEL_MASK;
-       reg |= rate_code << USBSS1_STATIC_PLL_REF_SEL_SHIFT;
-
-       reg &= ~USBSS1_STATIC_VBUS_SEL_MASK;
-       data->vbus_divider = device_property_read_bool(dev, "ti,vbus-divider");
-       if (data->vbus_divider)
-               reg |= 1 << USBSS1_STATIC_VBUS_SEL_SHIFT;
-
-       cdns_ti_writel(data, USBSS_STATIC_CONFIG, reg);
-       reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG);
-
-       /* set USB2_ONLY mode if requested */
-       reg = cdns_ti_readl(data, USBSS_W1);
-       data->usb2_only = device_property_read_bool(dev, "ti,usb2-only");
-       if (data->usb2_only)
-               reg |= USBSS_W1_USB2_ONLY;
-
-       /* set default modestrap */
-       reg |= USBSS_W1_MODESTRAP_SEL;
-       reg &= ~USBSS_W1_MODESTRAP_MASK;
-       reg |= USBSS_MODESTRAP_MODE_NONE << USBSS_W1_MODESTRAP_SHIFT;
-       cdns_ti_writel(data, USBSS_W1, reg);
-
-       /* de-assert RESET */
-       reg |= USBSS_W1_PWRUP_RST;
-       cdns_ti_writel(data, USBSS_W1, reg);
-
        error = of_platform_populate(node, NULL, cdns_ti_auxdata, dev);
        if (error) {
                dev_err(dev, "failed to create children: %d\n", error);