Merge tag '5.17-rc-part1-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6
[linux-2.6-microblaze.git] / drivers / thunderbolt / retimer.c
index 7226940..8c29bd5 100644 (file)
@@ -324,15 +324,10 @@ struct device_type tb_retimer_type = {
 
 static int tb_retimer_add(struct tb_port *port, u8 index, u32 auth_status)
 {
-       struct usb4_port *usb4;
        struct tb_retimer *rt;
        u32 vendor, device;
        int ret;
 
-       usb4 = port->usb4;
-       if (!usb4)
-               return -EINVAL;
-
        ret = usb4_port_retimer_read(port, index, USB4_SB_VENDOR_ID, &vendor,
                                     sizeof(vendor));
        if (ret) {
@@ -374,7 +369,7 @@ static int tb_retimer_add(struct tb_port *port, u8 index, u32 auth_status)
        rt->port = port;
        rt->tb = port->sw->tb;
 
-       rt->dev.parent = &usb4->dev;
+       rt->dev.parent = &port->usb4->dev;
        rt->dev.bus = &tb_bus_type;
        rt->dev.type = &tb_retimer_type;
        dev_set_name(&rt->dev, "%s:%u.%u", dev_name(&port->sw->dev),
@@ -453,6 +448,13 @@ int tb_retimer_scan(struct tb_port *port, bool add)
 {
        u32 status[TB_MAX_RETIMER_INDEX + 1] = {};
        int ret, i, last_idx = 0;
+       struct usb4_port *usb4;
+
+       usb4 = port->usb4;
+       if (!usb4)
+               return 0;
+
+       pm_runtime_get_sync(&usb4->dev);
 
        /*
         * Send broadcast RT to make sure retimer indices facing this
@@ -460,7 +462,7 @@ int tb_retimer_scan(struct tb_port *port, bool add)
         */
        ret = usb4_port_enumerate_retimers(port);
        if (ret)
-               return ret;
+               goto out;
 
        /*
         * Enable sideband channel for each retimer. We can do this
@@ -490,8 +492,10 @@ int tb_retimer_scan(struct tb_port *port, bool add)
                        break;
        }
 
-       if (!last_idx)
-               return 0;
+       if (!last_idx) {
+               ret = 0;
+               goto out;
+       }
 
        /* Add on-board retimers if they do not exist already */
        for (i = 1; i <= last_idx; i++) {
@@ -507,7 +511,11 @@ int tb_retimer_scan(struct tb_port *port, bool add)
                }
        }
 
-       return 0;
+out:
+       pm_runtime_mark_last_busy(&usb4->dev);
+       pm_runtime_put_autosuspend(&usb4->dev);
+
+       return ret;
 }
 
 static int remove_retimer(struct device *dev, void *data)