usb4_port.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * USB4 port device
  4. *
  5. * Copyright (C) 2021, Intel Corporation
  6. * Author: Mika Westerberg <[email protected]>
  7. */
  8. #include <linux/pm_runtime.h>
  9. #include <linux/component.h>
  10. #include <linux/property.h>
  11. #include "tb.h"
  12. static int connector_bind(struct device *dev, struct device *connector, void *data)
  13. {
  14. int ret;
  15. ret = sysfs_create_link(&dev->kobj, &connector->kobj, "connector");
  16. if (ret)
  17. return ret;
  18. ret = sysfs_create_link(&connector->kobj, &dev->kobj, dev_name(dev));
  19. if (ret)
  20. sysfs_remove_link(&dev->kobj, "connector");
  21. return ret;
  22. }
  23. static void connector_unbind(struct device *dev, struct device *connector, void *data)
  24. {
  25. sysfs_remove_link(&connector->kobj, dev_name(dev));
  26. sysfs_remove_link(&dev->kobj, "connector");
  27. }
  28. static const struct component_ops connector_ops = {
  29. .bind = connector_bind,
  30. .unbind = connector_unbind,
  31. };
  32. static ssize_t link_show(struct device *dev, struct device_attribute *attr,
  33. char *buf)
  34. {
  35. struct usb4_port *usb4 = tb_to_usb4_port_device(dev);
  36. struct tb_port *port = usb4->port;
  37. struct tb *tb = port->sw->tb;
  38. const char *link;
  39. if (mutex_lock_interruptible(&tb->lock))
  40. return -ERESTARTSYS;
  41. if (tb_is_upstream_port(port))
  42. link = port->sw->link_usb4 ? "usb4" : "tbt";
  43. else if (tb_port_has_remote(port))
  44. link = port->remote->sw->link_usb4 ? "usb4" : "tbt";
  45. else if (port->xdomain)
  46. link = port->xdomain->link_usb4 ? "usb4" : "tbt";
  47. else
  48. link = "none";
  49. mutex_unlock(&tb->lock);
  50. return sysfs_emit(buf, "%s\n", link);
  51. }
  52. static DEVICE_ATTR_RO(link);
  53. static struct attribute *common_attrs[] = {
  54. &dev_attr_link.attr,
  55. NULL
  56. };
  57. static const struct attribute_group common_group = {
  58. .attrs = common_attrs,
  59. };
  60. static int usb4_port_offline(struct usb4_port *usb4)
  61. {
  62. struct tb_port *port = usb4->port;
  63. int ret;
  64. ret = tb_acpi_power_on_retimers(port);
  65. if (ret)
  66. return ret;
  67. ret = usb4_port_router_offline(port);
  68. if (ret) {
  69. tb_acpi_power_off_retimers(port);
  70. return ret;
  71. }
  72. ret = tb_retimer_scan(port, false);
  73. if (ret) {
  74. usb4_port_router_online(port);
  75. tb_acpi_power_off_retimers(port);
  76. }
  77. return ret;
  78. }
  79. static void usb4_port_online(struct usb4_port *usb4)
  80. {
  81. struct tb_port *port = usb4->port;
  82. usb4_port_router_online(port);
  83. tb_acpi_power_off_retimers(port);
  84. }
  85. static ssize_t offline_show(struct device *dev,
  86. struct device_attribute *attr, char *buf)
  87. {
  88. struct usb4_port *usb4 = tb_to_usb4_port_device(dev);
  89. return sysfs_emit(buf, "%d\n", usb4->offline);
  90. }
  91. static ssize_t offline_store(struct device *dev,
  92. struct device_attribute *attr, const char *buf, size_t count)
  93. {
  94. struct usb4_port *usb4 = tb_to_usb4_port_device(dev);
  95. struct tb_port *port = usb4->port;
  96. struct tb *tb = port->sw->tb;
  97. bool val;
  98. int ret;
  99. ret = kstrtobool(buf, &val);
  100. if (ret)
  101. return ret;
  102. pm_runtime_get_sync(&usb4->dev);
  103. if (mutex_lock_interruptible(&tb->lock)) {
  104. ret = -ERESTARTSYS;
  105. goto out_rpm;
  106. }
  107. if (val == usb4->offline)
  108. goto out_unlock;
  109. /* Offline mode works only for ports that are not connected */
  110. if (tb_port_has_remote(port)) {
  111. ret = -EBUSY;
  112. goto out_unlock;
  113. }
  114. if (val) {
  115. ret = usb4_port_offline(usb4);
  116. if (ret)
  117. goto out_unlock;
  118. } else {
  119. usb4_port_online(usb4);
  120. tb_retimer_remove_all(port);
  121. }
  122. usb4->offline = val;
  123. tb_port_dbg(port, "%s offline mode\n", val ? "enter" : "exit");
  124. out_unlock:
  125. mutex_unlock(&tb->lock);
  126. out_rpm:
  127. pm_runtime_mark_last_busy(&usb4->dev);
  128. pm_runtime_put_autosuspend(&usb4->dev);
  129. return ret ? ret : count;
  130. }
  131. static DEVICE_ATTR_RW(offline);
  132. static ssize_t rescan_store(struct device *dev,
  133. struct device_attribute *attr, const char *buf, size_t count)
  134. {
  135. struct usb4_port *usb4 = tb_to_usb4_port_device(dev);
  136. struct tb_port *port = usb4->port;
  137. struct tb *tb = port->sw->tb;
  138. bool val;
  139. int ret;
  140. ret = kstrtobool(buf, &val);
  141. if (ret)
  142. return ret;
  143. if (!val)
  144. return count;
  145. pm_runtime_get_sync(&usb4->dev);
  146. if (mutex_lock_interruptible(&tb->lock)) {
  147. ret = -ERESTARTSYS;
  148. goto out_rpm;
  149. }
  150. /* Must be in offline mode already */
  151. if (!usb4->offline) {
  152. ret = -EINVAL;
  153. goto out_unlock;
  154. }
  155. tb_retimer_remove_all(port);
  156. ret = tb_retimer_scan(port, true);
  157. out_unlock:
  158. mutex_unlock(&tb->lock);
  159. out_rpm:
  160. pm_runtime_mark_last_busy(&usb4->dev);
  161. pm_runtime_put_autosuspend(&usb4->dev);
  162. return ret ? ret : count;
  163. }
  164. static DEVICE_ATTR_WO(rescan);
  165. static struct attribute *service_attrs[] = {
  166. &dev_attr_offline.attr,
  167. &dev_attr_rescan.attr,
  168. NULL
  169. };
  170. static umode_t service_attr_is_visible(struct kobject *kobj,
  171. struct attribute *attr, int n)
  172. {
  173. struct device *dev = kobj_to_dev(kobj);
  174. struct usb4_port *usb4 = tb_to_usb4_port_device(dev);
  175. /*
  176. * Always need some platform help to cycle the modes so that
  177. * retimers can be accessed through the sideband.
  178. */
  179. return usb4->can_offline ? attr->mode : 0;
  180. }
  181. static const struct attribute_group service_group = {
  182. .attrs = service_attrs,
  183. .is_visible = service_attr_is_visible,
  184. };
  185. static const struct attribute_group *usb4_port_device_groups[] = {
  186. &common_group,
  187. &service_group,
  188. NULL
  189. };
  190. static void usb4_port_device_release(struct device *dev)
  191. {
  192. struct usb4_port *usb4 = container_of(dev, struct usb4_port, dev);
  193. kfree(usb4);
  194. }
  195. struct device_type usb4_port_device_type = {
  196. .name = "usb4_port",
  197. .groups = usb4_port_device_groups,
  198. .release = usb4_port_device_release,
  199. };
  200. /**
  201. * usb4_port_device_add() - Add USB4 port device
  202. * @port: Lane 0 adapter port to add the USB4 port
  203. *
  204. * Creates and registers a USB4 port device for @port. Returns the new
  205. * USB4 port device pointer or ERR_PTR() in case of error.
  206. */
  207. struct usb4_port *usb4_port_device_add(struct tb_port *port)
  208. {
  209. struct usb4_port *usb4;
  210. int ret;
  211. usb4 = kzalloc(sizeof(*usb4), GFP_KERNEL);
  212. if (!usb4)
  213. return ERR_PTR(-ENOMEM);
  214. usb4->port = port;
  215. usb4->dev.type = &usb4_port_device_type;
  216. usb4->dev.parent = &port->sw->dev;
  217. dev_set_name(&usb4->dev, "usb4_port%d", port->port);
  218. ret = device_register(&usb4->dev);
  219. if (ret) {
  220. put_device(&usb4->dev);
  221. return ERR_PTR(ret);
  222. }
  223. if (dev_fwnode(&usb4->dev)) {
  224. ret = component_add(&usb4->dev, &connector_ops);
  225. if (ret) {
  226. dev_err(&usb4->dev, "failed to add component\n");
  227. device_unregister(&usb4->dev);
  228. }
  229. }
  230. pm_runtime_no_callbacks(&usb4->dev);
  231. pm_runtime_set_active(&usb4->dev);
  232. pm_runtime_enable(&usb4->dev);
  233. pm_runtime_set_autosuspend_delay(&usb4->dev, TB_AUTOSUSPEND_DELAY);
  234. pm_runtime_mark_last_busy(&usb4->dev);
  235. pm_runtime_use_autosuspend(&usb4->dev);
  236. return usb4;
  237. }
  238. /**
  239. * usb4_port_device_remove() - Removes USB4 port device
  240. * @usb4: USB4 port device
  241. *
  242. * Unregisters the USB4 port device from the system. The device will be
  243. * released when the last reference is dropped.
  244. */
  245. void usb4_port_device_remove(struct usb4_port *usb4)
  246. {
  247. if (dev_fwnode(&usb4->dev))
  248. component_del(&usb4->dev, &connector_ops);
  249. device_unregister(&usb4->dev);
  250. }
  251. /**
  252. * usb4_port_device_resume() - Resumes USB4 port device
  253. * @usb4: USB4 port device
  254. *
  255. * Used to resume USB4 port device after sleep state.
  256. */
  257. int usb4_port_device_resume(struct usb4_port *usb4)
  258. {
  259. return usb4->offline ? usb4_port_offline(usb4) : 0;
  260. }