Lines Matching full:hub
3 * Driver for Microchip USB251xB USB 2.0 Hi-Speed Hub Controller
113 #define DRIVER_DESC "Microchip USB 2.0 Hi-Speed Hub Controller"
225 static void usb251xb_reset(struct usb251xb *hub, int state) in usb251xb_reset() argument
227 if (!hub->gpio_reset) in usb251xb_reset()
230 gpiod_set_value_cansleep(hub->gpio_reset, state); in usb251xb_reset()
232 /* wait for hub recovery/stabilization */ in usb251xb_reset()
239 static int usb251xb_connect(struct usb251xb *hub) in usb251xb_connect() argument
241 struct device *dev = hub->dev; in usb251xb_connect()
247 if (hub->skip_config) { in usb251xb_connect()
248 dev_info(dev, "Skip hub configuration, only attach.\n"); in usb251xb_connect()
252 usb251xb_reset(hub, 0); in usb251xb_connect()
254 err = i2c_smbus_write_i2c_block_data(hub->i2c, in usb251xb_connect()
257 dev_err(dev, "attaching hub failed: %d\n", err); in usb251xb_connect()
263 i2c_wb[USB251XB_ADDR_VENDOR_ID_MSB] = (hub->vendor_id >> 8) & 0xFF; in usb251xb_connect()
264 i2c_wb[USB251XB_ADDR_VENDOR_ID_LSB] = hub->vendor_id & 0xFF; in usb251xb_connect()
265 i2c_wb[USB251XB_ADDR_PRODUCT_ID_MSB] = (hub->product_id >> 8) & 0xFF; in usb251xb_connect()
266 i2c_wb[USB251XB_ADDR_PRODUCT_ID_LSB] = hub->product_id & 0xFF; in usb251xb_connect()
267 i2c_wb[USB251XB_ADDR_DEVICE_ID_MSB] = (hub->device_id >> 8) & 0xFF; in usb251xb_connect()
268 i2c_wb[USB251XB_ADDR_DEVICE_ID_LSB] = hub->device_id & 0xFF; in usb251xb_connect()
269 i2c_wb[USB251XB_ADDR_CONFIG_DATA_1] = hub->conf_data1; in usb251xb_connect()
270 i2c_wb[USB251XB_ADDR_CONFIG_DATA_2] = hub->conf_data2; in usb251xb_connect()
271 i2c_wb[USB251XB_ADDR_CONFIG_DATA_3] = hub->conf_data3; in usb251xb_connect()
272 i2c_wb[USB251XB_ADDR_NON_REMOVABLE_DEVICES] = hub->non_rem_dev; in usb251xb_connect()
273 i2c_wb[USB251XB_ADDR_PORT_DISABLE_SELF] = hub->port_disable_sp; in usb251xb_connect()
274 i2c_wb[USB251XB_ADDR_PORT_DISABLE_BUS] = hub->port_disable_bp; in usb251xb_connect()
275 i2c_wb[USB251XB_ADDR_MAX_POWER_SELF] = hub->max_power_sp; in usb251xb_connect()
276 i2c_wb[USB251XB_ADDR_MAX_POWER_BUS] = hub->max_power_bp; in usb251xb_connect()
277 i2c_wb[USB251XB_ADDR_MAX_CURRENT_SELF] = hub->max_current_sp; in usb251xb_connect()
278 i2c_wb[USB251XB_ADDR_MAX_CURRENT_BUS] = hub->max_current_bp; in usb251xb_connect()
279 i2c_wb[USB251XB_ADDR_POWER_ON_TIME] = hub->power_on_time; in usb251xb_connect()
280 i2c_wb[USB251XB_ADDR_LANGUAGE_ID_HIGH] = (hub->lang_id >> 8) & 0xFF; in usb251xb_connect()
281 i2c_wb[USB251XB_ADDR_LANGUAGE_ID_LOW] = hub->lang_id & 0xFF; in usb251xb_connect()
282 i2c_wb[USB251XB_ADDR_MANUFACTURER_STRING_LEN] = hub->manufacturer_len; in usb251xb_connect()
283 i2c_wb[USB251XB_ADDR_PRODUCT_STRING_LEN] = hub->product_len; in usb251xb_connect()
284 i2c_wb[USB251XB_ADDR_SERIAL_STRING_LEN] = hub->serial_len; in usb251xb_connect()
285 memcpy(&i2c_wb[USB251XB_ADDR_MANUFACTURER_STRING], hub->manufacturer, in usb251xb_connect()
287 memcpy(&i2c_wb[USB251XB_ADDR_SERIAL_STRING], hub->serial, in usb251xb_connect()
289 memcpy(&i2c_wb[USB251XB_ADDR_PRODUCT_STRING], hub->product, in usb251xb_connect()
291 i2c_wb[USB251XB_ADDR_BATTERY_CHARGING_ENABLE] = hub->bat_charge_en; in usb251xb_connect()
292 i2c_wb[USB251XB_ADDR_BOOST_UP] = hub->boost_up; in usb251xb_connect()
293 i2c_wb[USB251XB_ADDR_BOOST_57] = hub->boost_57; in usb251xb_connect()
294 i2c_wb[USB251XB_ADDR_BOOST_14] = hub->boost_14; in usb251xb_connect()
295 i2c_wb[USB251XB_ADDR_PORT_SWAP] = hub->port_swap; in usb251xb_connect()
296 i2c_wb[USB251XB_ADDR_PORT_MAP_12] = hub->port_map12; in usb251xb_connect()
297 i2c_wb[USB251XB_ADDR_PORT_MAP_34] = hub->port_map34; in usb251xb_connect()
298 i2c_wb[USB251XB_ADDR_PORT_MAP_56] = hub->port_map56; in usb251xb_connect()
299 i2c_wb[USB251XB_ADDR_PORT_MAP_7] = hub->port_map7; in usb251xb_connect()
302 usb251xb_reset(hub, 0); in usb251xb_connect()
309 /* The first data byte transferred tells the hub how many data in usb251xb_connect()
318 err = i2c_smbus_write_i2c_block_data(hub->i2c, offset, in usb251xb_connect()
325 dev_info(dev, "Hub configuration was successful.\n"); in usb251xb_connect()
334 static int usb251xb_get_ofdata(struct usb251xb *hub, in usb251xb_get_ofdata() argument
337 struct device *dev = hub->dev; in usb251xb_get_ofdata()
351 hub->skip_config = 1; in usb251xb_get_ofdata()
353 hub->skip_config = 0; in usb251xb_get_ofdata()
355 hub->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); in usb251xb_get_ofdata()
356 if (PTR_ERR(hub->gpio_reset) == -EPROBE_DEFER) { in usb251xb_get_ofdata()
358 } else if (IS_ERR(hub->gpio_reset)) { in usb251xb_get_ofdata()
359 err = PTR_ERR(hub->gpio_reset); in usb251xb_get_ofdata()
364 if (of_property_read_u16_array(np, "vendor-id", &hub->vendor_id, 1)) in usb251xb_get_ofdata()
365 hub->vendor_id = USB251XB_DEF_VENDOR_ID; in usb251xb_get_ofdata()
368 &hub->product_id, 1)) in usb251xb_get_ofdata()
369 hub->product_id = data->product_id; in usb251xb_get_ofdata()
371 if (of_property_read_u16_array(np, "device-id", &hub->device_id, 1)) in usb251xb_get_ofdata()
372 hub->device_id = USB251XB_DEF_DEVICE_ID; in usb251xb_get_ofdata()
374 hub->conf_data1 = USB251XB_DEF_CONFIG_DATA_1; in usb251xb_get_ofdata()
376 hub->conf_data1 |= BIT(7); in usb251xb_get_ofdata()
379 hub->conf_data1 &= ~BIT(2); in usb251xb_get_ofdata()
381 hub->conf_data1 &= ~BIT(1); in usb251xb_get_ofdata()
383 hub->conf_data1 |= BIT(1); in usb251xb_get_ofdata()
385 hub->conf_data1 &= ~BIT(7); in usb251xb_get_ofdata()
388 hub->conf_data1 |= BIT(2); in usb251xb_get_ofdata()
392 hub->conf_data1 |= BIT(5); in usb251xb_get_ofdata()
395 hub->conf_data1 |= BIT(4); in usb251xb_get_ofdata()
397 hub->conf_data1 &= ~BIT(4); in usb251xb_get_ofdata()
400 hub->conf_data1 |= BIT(3); in usb251xb_get_ofdata()
403 hub->conf_data1 |= BIT(0); in usb251xb_get_ofdata()
405 hub->conf_data1 &= ~BIT(0); in usb251xb_get_ofdata()
407 hub->conf_data2 = USB251XB_DEF_CONFIG_DATA_2; in usb251xb_get_ofdata()
409 hub->conf_data2 |= BIT(7); in usb251xb_get_ofdata()
414 hub->conf_data2 &= ~BIT(5); in usb251xb_get_ofdata()
415 hub->conf_data2 &= ~BIT(4); in usb251xb_get_ofdata()
418 hub->conf_data2 &= ~BIT(5); in usb251xb_get_ofdata()
419 hub->conf_data2 |= BIT(4); in usb251xb_get_ofdata()
422 hub->conf_data2 |= BIT(5); in usb251xb_get_ofdata()
423 hub->conf_data2 |= BIT(4); in usb251xb_get_ofdata()
426 hub->conf_data2 |= BIT(5); in usb251xb_get_ofdata()
427 hub->conf_data2 &= ~BIT(4); in usb251xb_get_ofdata()
432 hub->conf_data2 |= BIT(3); in usb251xb_get_ofdata()
434 hub->conf_data3 = USB251XB_DEF_CONFIG_DATA_3; in usb251xb_get_ofdata()
436 hub->conf_data3 |= BIT(3); in usb251xb_get_ofdata()
439 hub->conf_data3 &= ~BIT(1); in usb251xb_get_ofdata()
442 hub->conf_data3 |= BIT(0); in usb251xb_get_ofdata()
444 hub->non_rem_dev = USB251XB_DEF_NON_REMOVABLE_DEVICES; in usb251xb_get_ofdata()
451 hub->non_rem_dev |= BIT(port); in usb251xb_get_ofdata()
458 hub->port_disable_sp = USB251XB_DEF_PORT_DISABLE_SELF; in usb251xb_get_ofdata()
465 hub->port_disable_sp |= BIT(port); in usb251xb_get_ofdata()
472 hub->port_disable_bp = USB251XB_DEF_PORT_DISABLE_BUS; in usb251xb_get_ofdata()
479 hub->port_disable_bp |= BIT(port); in usb251xb_get_ofdata()
486 hub->max_power_sp = USB251XB_DEF_MAX_POWER_SELF; in usb251xb_get_ofdata()
489 hub->max_power_sp = min_t(u8, property_u32 / 2000, 50); in usb251xb_get_ofdata()
491 hub->max_power_bp = USB251XB_DEF_MAX_POWER_BUS; in usb251xb_get_ofdata()
494 hub->max_power_bp = min_t(u8, property_u32 / 2000, 255); in usb251xb_get_ofdata()
496 hub->max_current_sp = USB251XB_DEF_MAX_CURRENT_SELF; in usb251xb_get_ofdata()
499 hub->max_current_sp = min_t(u8, property_u32 / 2000, 50); in usb251xb_get_ofdata()
501 hub->max_current_bp = USB251XB_DEF_MAX_CURRENT_BUS; in usb251xb_get_ofdata()
504 hub->max_current_bp = min_t(u8, property_u32 / 2000, 255); in usb251xb_get_ofdata()
506 hub->power_on_time = USB251XB_DEF_POWER_ON_TIME; in usb251xb_get_ofdata()
508 hub->power_on_time = min_t(u8, property_u32 / 2, 255); in usb251xb_get_ofdata()
510 if (of_property_read_u16_array(np, "language-id", &hub->lang_id, 1)) in usb251xb_get_ofdata()
511 hub->lang_id = USB251XB_DEF_LANGUAGE_ID; in usb251xb_get_ofdata()
516 hub->manufacturer_len = strlen(str) & 0xFF; in usb251xb_get_ofdata()
517 memset(hub->manufacturer, 0, USB251XB_STRING_BUFSIZE); in usb251xb_get_ofdata()
520 (wchar_t *)hub->manufacturer, in usb251xb_get_ofdata()
525 hub->product_len = strlen(str) & 0xFF; in usb251xb_get_ofdata()
526 memset(hub->product, 0, USB251XB_STRING_BUFSIZE); in usb251xb_get_ofdata()
529 (wchar_t *)hub->product, in usb251xb_get_ofdata()
535 hub->serial_len = strlen(str) & 0xFF; in usb251xb_get_ofdata()
536 memset(hub->serial, 0, USB251XB_STRING_BUFSIZE); in usb251xb_get_ofdata()
539 (wchar_t *)hub->serial, in usb251xb_get_ofdata()
545 hub->bat_charge_en = USB251XB_DEF_BATTERY_CHARGING_ENABLE; in usb251xb_get_ofdata()
546 hub->boost_up = USB251XB_DEF_BOOST_UP; in usb251xb_get_ofdata()
547 hub->boost_57 = USB251XB_DEF_BOOST_57; in usb251xb_get_ofdata()
548 hub->boost_14 = USB251XB_DEF_BOOST_14; in usb251xb_get_ofdata()
549 hub->port_swap = USB251XB_DEF_PORT_SWAP; in usb251xb_get_ofdata()
550 hub->port_map12 = USB251XB_DEF_PORT_MAP_12; in usb251xb_get_ofdata()
551 hub->port_map34 = USB251XB_DEF_PORT_MAP_34; in usb251xb_get_ofdata()
552 hub->port_map56 = USB251XB_DEF_PORT_MAP_56; in usb251xb_get_ofdata()
553 hub->port_map7 = USB251XB_DEF_PORT_MAP_7; in usb251xb_get_ofdata()
589 static int usb251xb_get_ofdata(struct usb251xb *hub, in usb251xb_get_ofdata() argument
596 static int usb251xb_probe(struct usb251xb *hub) in usb251xb_probe() argument
598 struct device *dev = hub->dev; in usb251xb_probe()
605 err = usb251xb_get_ofdata(hub, in usb251xb_probe()
613 err = usb251xb_connect(hub); in usb251xb_probe()
615 dev_err(dev, "Failed to connect hub (%d)\n", err); in usb251xb_probe()
619 dev_info(dev, "Hub probed successfully\n"); in usb251xb_probe()
627 struct usb251xb *hub; in usb251xb_i2c_probe() local
629 hub = devm_kzalloc(&i2c->dev, sizeof(struct usb251xb), GFP_KERNEL); in usb251xb_i2c_probe()
630 if (!hub) in usb251xb_i2c_probe()
633 i2c_set_clientdata(i2c, hub); in usb251xb_i2c_probe()
634 hub->dev = &i2c->dev; in usb251xb_i2c_probe()
635 hub->i2c = i2c; in usb251xb_i2c_probe()
637 return usb251xb_probe(hub); in usb251xb_i2c_probe()
665 MODULE_DESCRIPTION("USB251x/xBi USB 2.0 Hub Controller Driver");