1*de31213fSSimon Glass /* 2*de31213fSSimon Glass * (C) Copyright 2015 Google, Inc 3*de31213fSSimon Glass * Written by Simon Glass <sjg@chromium.org> 4*de31213fSSimon Glass * 5*de31213fSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*de31213fSSimon Glass */ 7*de31213fSSimon Glass 8*de31213fSSimon Glass #include <common.h> 9*de31213fSSimon Glass #include <dm.h> 10*de31213fSSimon Glass #include <errno.h> 11*de31213fSSimon Glass #include <usb.h> 12*de31213fSSimon Glass #include <dm/device-internal.h> 13*de31213fSSimon Glass #include <dm/lists.h> 14*de31213fSSimon Glass #include <dm/root.h> 15*de31213fSSimon Glass #include <dm/uclass-internal.h> 16*de31213fSSimon Glass 17*de31213fSSimon Glass DECLARE_GLOBAL_DATA_PTR; 18*de31213fSSimon Glass 19*de31213fSSimon Glass extern bool usb_started; /* flag for the started/stopped USB status */ 20*de31213fSSimon Glass static bool asynch_allowed; 21*de31213fSSimon Glass 22*de31213fSSimon Glass int usb_disable_asynch(int disable) 23*de31213fSSimon Glass { 24*de31213fSSimon Glass int old_value = asynch_allowed; 25*de31213fSSimon Glass 26*de31213fSSimon Glass asynch_allowed = !disable; 27*de31213fSSimon Glass return old_value; 28*de31213fSSimon Glass } 29*de31213fSSimon Glass 30*de31213fSSimon Glass int submit_int_msg(struct usb_device *udev, unsigned long pipe, void *buffer, 31*de31213fSSimon Glass int length, int interval) 32*de31213fSSimon Glass { 33*de31213fSSimon Glass struct udevice *bus = udev->controller_dev; 34*de31213fSSimon Glass struct dm_usb_ops *ops = usb_get_ops(bus); 35*de31213fSSimon Glass 36*de31213fSSimon Glass if (!ops->interrupt) 37*de31213fSSimon Glass return -ENOSYS; 38*de31213fSSimon Glass 39*de31213fSSimon Glass return ops->interrupt(bus, udev, pipe, buffer, length, interval); 40*de31213fSSimon Glass } 41*de31213fSSimon Glass 42*de31213fSSimon Glass int submit_control_msg(struct usb_device *udev, unsigned long pipe, 43*de31213fSSimon Glass void *buffer, int length, struct devrequest *setup) 44*de31213fSSimon Glass { 45*de31213fSSimon Glass struct udevice *bus = udev->controller_dev; 46*de31213fSSimon Glass struct dm_usb_ops *ops = usb_get_ops(bus); 47*de31213fSSimon Glass 48*de31213fSSimon Glass if (!ops->control) 49*de31213fSSimon Glass return -ENOSYS; 50*de31213fSSimon Glass 51*de31213fSSimon Glass return ops->control(bus, udev, pipe, buffer, length, setup); 52*de31213fSSimon Glass } 53*de31213fSSimon Glass 54*de31213fSSimon Glass int submit_bulk_msg(struct usb_device *udev, unsigned long pipe, void *buffer, 55*de31213fSSimon Glass int length) 56*de31213fSSimon Glass { 57*de31213fSSimon Glass struct udevice *bus = udev->controller_dev; 58*de31213fSSimon Glass struct dm_usb_ops *ops = usb_get_ops(bus); 59*de31213fSSimon Glass 60*de31213fSSimon Glass if (!ops->bulk) 61*de31213fSSimon Glass return -ENOSYS; 62*de31213fSSimon Glass 63*de31213fSSimon Glass return ops->bulk(bus, udev, pipe, buffer, length); 64*de31213fSSimon Glass } 65*de31213fSSimon Glass 66*de31213fSSimon Glass int usb_alloc_device(struct usb_device *udev) 67*de31213fSSimon Glass { 68*de31213fSSimon Glass struct udevice *bus = udev->controller_dev; 69*de31213fSSimon Glass struct dm_usb_ops *ops = usb_get_ops(bus); 70*de31213fSSimon Glass 71*de31213fSSimon Glass /* This is only requird by some controllers - current XHCI */ 72*de31213fSSimon Glass if (!ops->alloc_device) 73*de31213fSSimon Glass return 0; 74*de31213fSSimon Glass 75*de31213fSSimon Glass return ops->alloc_device(bus, udev); 76*de31213fSSimon Glass } 77*de31213fSSimon Glass 78*de31213fSSimon Glass int usb_stop(void) 79*de31213fSSimon Glass { 80*de31213fSSimon Glass struct udevice *bus; 81*de31213fSSimon Glass struct uclass *uc; 82*de31213fSSimon Glass int err = 0, ret; 83*de31213fSSimon Glass 84*de31213fSSimon Glass /* De-activate any devices that have been activated */ 85*de31213fSSimon Glass ret = uclass_get(UCLASS_USB, &uc); 86*de31213fSSimon Glass if (ret) 87*de31213fSSimon Glass return ret; 88*de31213fSSimon Glass uclass_foreach_dev(bus, uc) { 89*de31213fSSimon Glass ret = device_remove(bus); 90*de31213fSSimon Glass if (ret && !err) 91*de31213fSSimon Glass err = ret; 92*de31213fSSimon Glass } 93*de31213fSSimon Glass 94*de31213fSSimon Glass usb_stor_reset(); 95*de31213fSSimon Glass usb_hub_reset(); 96*de31213fSSimon Glass usb_started = 0; 97*de31213fSSimon Glass 98*de31213fSSimon Glass return err; 99*de31213fSSimon Glass } 100*de31213fSSimon Glass 101*de31213fSSimon Glass static int usb_scan_bus(struct udevice *bus, bool recurse) 102*de31213fSSimon Glass { 103*de31213fSSimon Glass struct usb_bus_priv *priv; 104*de31213fSSimon Glass struct udevice *dev; 105*de31213fSSimon Glass int ret; 106*de31213fSSimon Glass 107*de31213fSSimon Glass priv = dev_get_uclass_priv(bus); 108*de31213fSSimon Glass 109*de31213fSSimon Glass assert(recurse); /* TODO: Support non-recusive */ 110*de31213fSSimon Glass 111*de31213fSSimon Glass ret = usb_scan_device(bus, 0, USB_SPEED_FULL, &dev); 112*de31213fSSimon Glass if (ret) 113*de31213fSSimon Glass return ret; 114*de31213fSSimon Glass 115*de31213fSSimon Glass return priv->next_addr; 116*de31213fSSimon Glass } 117*de31213fSSimon Glass 118*de31213fSSimon Glass int usb_init(void) 119*de31213fSSimon Glass { 120*de31213fSSimon Glass int controllers_initialized = 0; 121*de31213fSSimon Glass struct udevice *bus; 122*de31213fSSimon Glass struct uclass *uc; 123*de31213fSSimon Glass int count = 0; 124*de31213fSSimon Glass int ret; 125*de31213fSSimon Glass 126*de31213fSSimon Glass asynch_allowed = 1; 127*de31213fSSimon Glass usb_hub_reset(); 128*de31213fSSimon Glass 129*de31213fSSimon Glass ret = uclass_get(UCLASS_USB, &uc); 130*de31213fSSimon Glass if (ret) 131*de31213fSSimon Glass return ret; 132*de31213fSSimon Glass 133*de31213fSSimon Glass uclass_foreach_dev(bus, uc) { 134*de31213fSSimon Glass /* init low_level USB */ 135*de31213fSSimon Glass count++; 136*de31213fSSimon Glass printf("USB"); 137*de31213fSSimon Glass printf("%d: ", bus->seq); 138*de31213fSSimon Glass ret = device_probe(bus); 139*de31213fSSimon Glass if (ret == -ENODEV) { /* No such device. */ 140*de31213fSSimon Glass puts("Port not available.\n"); 141*de31213fSSimon Glass controllers_initialized++; 142*de31213fSSimon Glass continue; 143*de31213fSSimon Glass } 144*de31213fSSimon Glass 145*de31213fSSimon Glass if (ret) { /* Other error. */ 146*de31213fSSimon Glass printf("probe failed, error %d\n", ret); 147*de31213fSSimon Glass continue; 148*de31213fSSimon Glass } 149*de31213fSSimon Glass /* 150*de31213fSSimon Glass * lowlevel init is OK, now scan the bus for devices 151*de31213fSSimon Glass * i.e. search HUBs and configure them 152*de31213fSSimon Glass */ 153*de31213fSSimon Glass controllers_initialized++; 154*de31213fSSimon Glass printf("scanning bus %d for devices... ", bus->seq); 155*de31213fSSimon Glass debug("\n"); 156*de31213fSSimon Glass ret = usb_scan_bus(bus, true); 157*de31213fSSimon Glass if (ret < 0) 158*de31213fSSimon Glass printf("failed, error %d\n", ret); 159*de31213fSSimon Glass else if (!ret) 160*de31213fSSimon Glass printf("No USB Device found\n"); 161*de31213fSSimon Glass else 162*de31213fSSimon Glass printf("%d USB Device(s) found\n", ret); 163*de31213fSSimon Glass usb_started = true; 164*de31213fSSimon Glass } 165*de31213fSSimon Glass 166*de31213fSSimon Glass debug("scan end\n"); 167*de31213fSSimon Glass /* if we were not able to find at least one working bus, bail out */ 168*de31213fSSimon Glass if (!count) 169*de31213fSSimon Glass printf("No controllers found\n"); 170*de31213fSSimon Glass else if (controllers_initialized == 0) 171*de31213fSSimon Glass printf("USB error: all controllers failed lowlevel init\n"); 172*de31213fSSimon Glass 173*de31213fSSimon Glass return usb_started ? 0 : -1; 174*de31213fSSimon Glass } 175*de31213fSSimon Glass 176*de31213fSSimon Glass int usb_reset_root_port(void) 177*de31213fSSimon Glass { 178*de31213fSSimon Glass return -ENOSYS; 179*de31213fSSimon Glass } 180*de31213fSSimon Glass 181*de31213fSSimon Glass static struct usb_device *find_child_devnum(struct udevice *parent, int devnum) 182*de31213fSSimon Glass { 183*de31213fSSimon Glass struct usb_device *udev; 184*de31213fSSimon Glass struct udevice *dev; 185*de31213fSSimon Glass 186*de31213fSSimon Glass if (!device_active(parent)) 187*de31213fSSimon Glass return NULL; 188*de31213fSSimon Glass udev = dev_get_parentdata(parent); 189*de31213fSSimon Glass if (udev->devnum == devnum) 190*de31213fSSimon Glass return udev; 191*de31213fSSimon Glass 192*de31213fSSimon Glass for (device_find_first_child(parent, &dev); 193*de31213fSSimon Glass dev; 194*de31213fSSimon Glass device_find_next_child(&dev)) { 195*de31213fSSimon Glass udev = find_child_devnum(dev, devnum); 196*de31213fSSimon Glass if (udev) 197*de31213fSSimon Glass return udev; 198*de31213fSSimon Glass } 199*de31213fSSimon Glass 200*de31213fSSimon Glass return NULL; 201*de31213fSSimon Glass } 202*de31213fSSimon Glass 203*de31213fSSimon Glass struct usb_device *usb_get_dev_index(struct udevice *bus, int index) 204*de31213fSSimon Glass { 205*de31213fSSimon Glass struct udevice *hub; 206*de31213fSSimon Glass int devnum = index + 1; /* Addresses are allocated from 1 on USB */ 207*de31213fSSimon Glass 208*de31213fSSimon Glass device_find_first_child(bus, &hub); 209*de31213fSSimon Glass if (device_get_uclass_id(hub) == UCLASS_USB_HUB) 210*de31213fSSimon Glass return find_child_devnum(hub, devnum); 211*de31213fSSimon Glass 212*de31213fSSimon Glass return NULL; 213*de31213fSSimon Glass } 214*de31213fSSimon Glass 215*de31213fSSimon Glass int usb_post_bind(struct udevice *dev) 216*de31213fSSimon Glass { 217*de31213fSSimon Glass /* Scan the bus for devices */ 218*de31213fSSimon Glass return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false); 219*de31213fSSimon Glass } 220*de31213fSSimon Glass 221*de31213fSSimon Glass int usb_port_reset(struct usb_device *parent, int portnr) 222*de31213fSSimon Glass { 223*de31213fSSimon Glass unsigned short portstatus; 224*de31213fSSimon Glass int ret; 225*de31213fSSimon Glass 226*de31213fSSimon Glass debug("%s: start\n", __func__); 227*de31213fSSimon Glass 228*de31213fSSimon Glass if (parent) { 229*de31213fSSimon Glass /* reset the port for the second time */ 230*de31213fSSimon Glass assert(portnr > 0); 231*de31213fSSimon Glass debug("%s: reset %d\n", __func__, portnr - 1); 232*de31213fSSimon Glass ret = legacy_hub_port_reset(parent, portnr - 1, &portstatus); 233*de31213fSSimon Glass if (ret < 0) { 234*de31213fSSimon Glass printf("\n Couldn't reset port %i\n", portnr); 235*de31213fSSimon Glass return ret; 236*de31213fSSimon Glass } 237*de31213fSSimon Glass } else { 238*de31213fSSimon Glass debug("%s: reset root\n", __func__); 239*de31213fSSimon Glass usb_reset_root_port(); 240*de31213fSSimon Glass } 241*de31213fSSimon Glass 242*de31213fSSimon Glass return 0; 243*de31213fSSimon Glass } 244*de31213fSSimon Glass 245*de31213fSSimon Glass int usb_legacy_port_reset(struct usb_device *parent, int portnr) 246*de31213fSSimon Glass { 247*de31213fSSimon Glass return usb_port_reset(parent, portnr); 248*de31213fSSimon Glass } 249*de31213fSSimon Glass 250*de31213fSSimon Glass int usb_scan_device(struct udevice *parent, int port, 251*de31213fSSimon Glass enum usb_device_speed speed, struct udevice **devp) 252*de31213fSSimon Glass { 253*de31213fSSimon Glass struct udevice *dev; 254*de31213fSSimon Glass bool created = false; 255*de31213fSSimon Glass struct usb_dev_platdata *plat; 256*de31213fSSimon Glass struct usb_bus_priv *priv; 257*de31213fSSimon Glass struct usb_device *parent_udev; 258*de31213fSSimon Glass int ret; 259*de31213fSSimon Glass ALLOC_CACHE_ALIGN_BUFFER(struct usb_device, udev, 1); 260*de31213fSSimon Glass struct usb_interface_descriptor *iface = &udev->config.if_desc[0].desc; 261*de31213fSSimon Glass 262*de31213fSSimon Glass *devp = NULL; 263*de31213fSSimon Glass memset(udev, '\0', sizeof(*udev)); 264*de31213fSSimon Glass ret = usb_get_bus(parent, &udev->controller_dev); 265*de31213fSSimon Glass if (ret) 266*de31213fSSimon Glass return ret; 267*de31213fSSimon Glass priv = dev_get_uclass_priv(udev->controller_dev); 268*de31213fSSimon Glass 269*de31213fSSimon Glass /* 270*de31213fSSimon Glass * Somewhat nasty, this. We create a local device and use the normal 271*de31213fSSimon Glass * USB stack to read its descriptor. Then we know what type of device 272*de31213fSSimon Glass * to create for real. 273*de31213fSSimon Glass * 274*de31213fSSimon Glass * udev->dev is set to the parent, since we don't have a real device 275*de31213fSSimon Glass * yet. The USB stack should not access udev.dev anyway, except perhaps 276*de31213fSSimon Glass * to find the controller, and the controller will either be @parent, 277*de31213fSSimon Glass * or some parent of @parent. 278*de31213fSSimon Glass * 279*de31213fSSimon Glass * Another option might be to create the device as a generic USB 280*de31213fSSimon Glass * device, then morph it into the correct one when we know what it 281*de31213fSSimon Glass * should be. This means that a generic USB device would morph into 282*de31213fSSimon Glass * a network controller, or a USB flash stick, for example. However, 283*de31213fSSimon Glass * we don't support such morphing and it isn't clear that it would 284*de31213fSSimon Glass * be easy to do. 285*de31213fSSimon Glass * 286*de31213fSSimon Glass * Yet another option is to split out the USB stack parts of udev 287*de31213fSSimon Glass * into something like a 'struct urb' (as Linux does) which can exist 288*de31213fSSimon Glass * independently of any device. This feels cleaner, but calls for quite 289*de31213fSSimon Glass * a big change to the USB stack. 290*de31213fSSimon Glass * 291*de31213fSSimon Glass * For now, the approach is to set up an empty udev, read its 292*de31213fSSimon Glass * descriptor and assign it an address, then bind a real device and 293*de31213fSSimon Glass * stash the resulting information into the device's parent 294*de31213fSSimon Glass * platform data. Then when we probe it, usb_child_pre_probe() is called 295*de31213fSSimon Glass * and it will pull the information out of the stash. 296*de31213fSSimon Glass */ 297*de31213fSSimon Glass udev->dev = parent; 298*de31213fSSimon Glass udev->speed = speed; 299*de31213fSSimon Glass udev->devnum = priv->next_addr + 1; 300*de31213fSSimon Glass udev->portnr = port; 301*de31213fSSimon Glass debug("Calling usb_setup_device(), portnr=%d\n", udev->portnr); 302*de31213fSSimon Glass parent_udev = device_get_uclass_id(parent) == UCLASS_USB_HUB ? 303*de31213fSSimon Glass dev_get_parentdata(parent) : NULL; 304*de31213fSSimon Glass ret = usb_setup_device(udev, priv->desc_before_addr, parent_udev, port); 305*de31213fSSimon Glass debug("read_descriptor for '%s': ret=%d\n", parent->name, ret); 306*de31213fSSimon Glass if (ret) 307*de31213fSSimon Glass return ret; 308*de31213fSSimon Glass ret = usb_find_child(parent, &udev->descriptor, iface, &dev); 309*de31213fSSimon Glass debug("** usb_find_child returns %d\n", ret); 310*de31213fSSimon Glass 311*de31213fSSimon Glass /* TODO: Find a suitable driver and create the device */ 312*de31213fSSimon Glass return -ENOENT; 313*de31213fSSimon Glass } 314*de31213fSSimon Glass 315*de31213fSSimon Glass int usb_child_post_bind(struct udevice *dev) 316*de31213fSSimon Glass { 317*de31213fSSimon Glass struct usb_dev_platdata *plat = dev_get_parent_platdata(dev); 318*de31213fSSimon Glass const void *blob = gd->fdt_blob; 319*de31213fSSimon Glass int val; 320*de31213fSSimon Glass 321*de31213fSSimon Glass if (dev->of_offset == -1) 322*de31213fSSimon Glass return 0; 323*de31213fSSimon Glass 324*de31213fSSimon Glass /* We only support matching a few things */ 325*de31213fSSimon Glass val = fdtdec_get_int(blob, dev->of_offset, "usb,device-class", -1); 326*de31213fSSimon Glass if (val != -1) { 327*de31213fSSimon Glass plat->id.match_flags |= USB_DEVICE_ID_MATCH_DEV_CLASS; 328*de31213fSSimon Glass plat->id.bDeviceClass = val; 329*de31213fSSimon Glass } 330*de31213fSSimon Glass val = fdtdec_get_int(blob, dev->of_offset, "usb,interface-class", -1); 331*de31213fSSimon Glass if (val != -1) { 332*de31213fSSimon Glass plat->id.match_flags |= USB_DEVICE_ID_MATCH_INT_CLASS; 333*de31213fSSimon Glass plat->id.bInterfaceClass = val; 334*de31213fSSimon Glass } 335*de31213fSSimon Glass 336*de31213fSSimon Glass return 0; 337*de31213fSSimon Glass } 338*de31213fSSimon Glass 339*de31213fSSimon Glass int usb_get_bus(struct udevice *dev, struct udevice **busp) 340*de31213fSSimon Glass { 341*de31213fSSimon Glass struct udevice *bus; 342*de31213fSSimon Glass 343*de31213fSSimon Glass *busp = NULL; 344*de31213fSSimon Glass for (bus = dev; bus && device_get_uclass_id(bus) != UCLASS_USB; ) 345*de31213fSSimon Glass bus = bus->parent; 346*de31213fSSimon Glass if (!bus) { 347*de31213fSSimon Glass /* By design this cannot happen */ 348*de31213fSSimon Glass assert(bus); 349*de31213fSSimon Glass debug("USB HUB '%s' does not have a controller\n", dev->name); 350*de31213fSSimon Glass return -EXDEV; 351*de31213fSSimon Glass } 352*de31213fSSimon Glass *busp = bus; 353*de31213fSSimon Glass 354*de31213fSSimon Glass return 0; 355*de31213fSSimon Glass } 356*de31213fSSimon Glass 357*de31213fSSimon Glass int usb_child_pre_probe(struct udevice *dev) 358*de31213fSSimon Glass { 359*de31213fSSimon Glass struct udevice *bus; 360*de31213fSSimon Glass struct usb_device *udev = dev_get_parentdata(dev); 361*de31213fSSimon Glass struct usb_dev_platdata *plat = dev_get_parent_platdata(dev); 362*de31213fSSimon Glass int ret; 363*de31213fSSimon Glass 364*de31213fSSimon Glass ret = usb_get_bus(dev, &bus); 365*de31213fSSimon Glass if (ret) 366*de31213fSSimon Glass return ret; 367*de31213fSSimon Glass udev->controller_dev = bus; 368*de31213fSSimon Glass udev->dev = dev; 369*de31213fSSimon Glass udev->devnum = plat->devnum; 370*de31213fSSimon Glass udev->slot_id = plat->slot_id; 371*de31213fSSimon Glass udev->portnr = plat->portnr; 372*de31213fSSimon Glass udev->speed = plat->speed; 373*de31213fSSimon Glass debug("** device '%s': getting slot_id=%d\n", dev->name, plat->slot_id); 374*de31213fSSimon Glass 375*de31213fSSimon Glass ret = usb_select_config(udev); 376*de31213fSSimon Glass if (ret) 377*de31213fSSimon Glass return ret; 378*de31213fSSimon Glass 379*de31213fSSimon Glass return 0; 380*de31213fSSimon Glass } 381*de31213fSSimon Glass 382*de31213fSSimon Glass UCLASS_DRIVER(usb) = { 383*de31213fSSimon Glass .id = UCLASS_USB, 384*de31213fSSimon Glass .name = "usb", 385*de31213fSSimon Glass .flags = DM_UC_FLAG_SEQ_ALIAS, 386*de31213fSSimon Glass .post_bind = usb_post_bind, 387*de31213fSSimon Glass .per_child_auto_alloc_size = sizeof(struct usb_device), 388*de31213fSSimon Glass .per_device_auto_alloc_size = sizeof(struct usb_bus_priv), 389*de31213fSSimon Glass .child_post_bind = usb_child_post_bind, 390*de31213fSSimon Glass .child_pre_probe = usb_child_pre_probe, 391*de31213fSSimon Glass .per_child_platdata_auto_alloc_size = sizeof(struct usb_dev_platdata), 392*de31213fSSimon Glass }; 393