xref: /linux/drivers/usb/misc/usb251xb.c (revision 5fd54ace4721fc5ce2bb5aef6318fcf17f421460)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Driver for Microchip USB251xB USB 2.0 Hi-Speed Hub Controller
4  * Configuration via SMBus.
5  *
6  * Copyright (c) 2017 SKIDATA AG
7  *
8  * This work is based on the USB3503 driver by Dongjin Kim and
9  * a not-accepted patch by Fabien Lahoudere, see:
10  * https://patchwork.kernel.org/patch/9257715/
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  */
22 
23 #include <linux/delay.h>
24 #include <linux/gpio/consumer.h>
25 #include <linux/i2c.h>
26 #include <linux/module.h>
27 #include <linux/nls.h>
28 #include <linux/of_device.h>
29 #include <linux/slab.h>
30 
31 /* Internal Register Set Addresses & Default Values acc. to DS00001692C */
32 #define USB251XB_ADDR_VENDOR_ID_LSB	0x00
33 #define USB251XB_ADDR_VENDOR_ID_MSB	0x01
34 #define USB251XB_DEF_VENDOR_ID		0x0424
35 
36 #define USB251XB_ADDR_PRODUCT_ID_LSB	0x02
37 #define USB251XB_ADDR_PRODUCT_ID_MSB	0x03
38 #define USB251XB_DEF_PRODUCT_ID_12	0x2512 /* USB2512B/12Bi */
39 #define USB251XB_DEF_PRODUCT_ID_13	0x2513 /* USB2513B/13Bi */
40 #define USB251XB_DEF_PRODUCT_ID_14	0x2514 /* USB2514B/14Bi */
41 #define USB251XB_DEF_PRODUCT_ID_17	0x2517 /* USB2517/17i */
42 
43 #define USB251XB_ADDR_DEVICE_ID_LSB	0x04
44 #define USB251XB_ADDR_DEVICE_ID_MSB	0x05
45 #define USB251XB_DEF_DEVICE_ID		0x0BB3
46 
47 #define USB251XB_ADDR_CONFIG_DATA_1	0x06
48 #define USB251XB_DEF_CONFIG_DATA_1	0x9B
49 #define USB251XB_ADDR_CONFIG_DATA_2	0x07
50 #define USB251XB_DEF_CONFIG_DATA_2	0x20
51 #define USB251XB_ADDR_CONFIG_DATA_3	0x08
52 #define USB251XB_DEF_CONFIG_DATA_3	0x02
53 
54 #define USB251XB_ADDR_NON_REMOVABLE_DEVICES	0x09
55 #define USB251XB_DEF_NON_REMOVABLE_DEVICES	0x00
56 
57 #define USB251XB_ADDR_PORT_DISABLE_SELF	0x0A
58 #define USB251XB_DEF_PORT_DISABLE_SELF	0x00
59 #define USB251XB_ADDR_PORT_DISABLE_BUS	0x0B
60 #define USB251XB_DEF_PORT_DISABLE_BUS	0x00
61 
62 #define USB251XB_ADDR_MAX_POWER_SELF	0x0C
63 #define USB251XB_DEF_MAX_POWER_SELF	0x01
64 #define USB251XB_ADDR_MAX_POWER_BUS	0x0D
65 #define USB251XB_DEF_MAX_POWER_BUS	0x32
66 
67 #define USB251XB_ADDR_MAX_CURRENT_SELF	0x0E
68 #define USB251XB_DEF_MAX_CURRENT_SELF	0x01
69 #define USB251XB_ADDR_MAX_CURRENT_BUS	0x0F
70 #define USB251XB_DEF_MAX_CURRENT_BUS	0x32
71 
72 #define USB251XB_ADDR_POWER_ON_TIME	0x10
73 #define USB251XB_DEF_POWER_ON_TIME	0x32
74 
75 #define USB251XB_ADDR_LANGUAGE_ID_HIGH	0x11
76 #define USB251XB_ADDR_LANGUAGE_ID_LOW	0x12
77 #define USB251XB_DEF_LANGUAGE_ID	0x0000
78 
79 #define USB251XB_STRING_BUFSIZE			62
80 #define USB251XB_ADDR_MANUFACTURER_STRING_LEN	0x13
81 #define USB251XB_ADDR_MANUFACTURER_STRING	0x16
82 #define USB251XB_DEF_MANUFACTURER_STRING	"Microchip"
83 
84 #define USB251XB_ADDR_PRODUCT_STRING_LEN	0x14
85 #define USB251XB_ADDR_PRODUCT_STRING		0x54
86 #define USB251XB_DEF_PRODUCT_STRING		"USB251xB/xBi/7i"
87 
88 #define USB251XB_ADDR_SERIAL_STRING_LEN		0x15
89 #define USB251XB_ADDR_SERIAL_STRING		0x92
90 #define USB251XB_DEF_SERIAL_STRING		""
91 
92 #define USB251XB_ADDR_BATTERY_CHARGING_ENABLE	0xD0
93 #define USB251XB_DEF_BATTERY_CHARGING_ENABLE	0x00
94 
95 #define USB251XB_ADDR_BOOST_UP	0xF6
96 #define USB251XB_DEF_BOOST_UP	0x00
97 #define USB251XB_ADDR_BOOST_57	0xF7
98 #define USB251XB_DEF_BOOST_57	0x00
99 #define USB251XB_ADDR_BOOST_14	0xF8
100 #define USB251XB_DEF_BOOST_14	0x00
101 
102 #define USB251XB_ADDR_PORT_SWAP	0xFA
103 #define USB251XB_DEF_PORT_SWAP	0x00
104 
105 #define USB251XB_ADDR_PORT_MAP_12	0xFB
106 #define USB251XB_DEF_PORT_MAP_12	0x00
107 #define USB251XB_ADDR_PORT_MAP_34	0xFC
108 #define USB251XB_DEF_PORT_MAP_34	0x00 /* USB251{3B/i,4B/i,7/i} only */
109 #define USB251XB_ADDR_PORT_MAP_56	0xFD
110 #define USB251XB_DEF_PORT_MAP_56	0x00 /* USB2517/i only */
111 #define USB251XB_ADDR_PORT_MAP_7	0xFE
112 #define USB251XB_DEF_PORT_MAP_7		0x00 /* USB2517/i only */
113 
114 #define USB251XB_ADDR_STATUS_COMMAND		0xFF
115 #define USB251XB_STATUS_COMMAND_SMBUS_DOWN	0x04
116 #define USB251XB_STATUS_COMMAND_RESET		0x02
117 #define USB251XB_STATUS_COMMAND_ATTACH		0x01
118 
119 #define USB251XB_I2C_REG_SZ	0x100
120 #define USB251XB_I2C_WRITE_SZ	0x10
121 
122 #define DRIVER_NAME	"usb251xb"
123 #define DRIVER_DESC	"Microchip USB 2.0 Hi-Speed Hub Controller"
124 
125 struct usb251xb {
126 	struct device *dev;
127 	struct i2c_client *i2c;
128 	u8 skip_config;
129 	struct gpio_desc *gpio_reset;
130 	u16 vendor_id;
131 	u16 product_id;
132 	u16 device_id;
133 	u8  conf_data1;
134 	u8  conf_data2;
135 	u8  conf_data3;
136 	u8  non_rem_dev;
137 	u8  port_disable_sp;
138 	u8  port_disable_bp;
139 	u8  max_power_sp;
140 	u8  max_power_bp;
141 	u8  max_current_sp;
142 	u8  max_current_bp;
143 	u8  power_on_time;
144 	u16 lang_id;
145 	u8 manufacturer_len;
146 	u8 product_len;
147 	u8 serial_len;
148 	char manufacturer[USB251XB_STRING_BUFSIZE];
149 	char product[USB251XB_STRING_BUFSIZE];
150 	char serial[USB251XB_STRING_BUFSIZE];
151 	u8  bat_charge_en;
152 	u8  boost_up;
153 	u8  boost_57;
154 	u8  boost_14;
155 	u8  port_swap;
156 	u8  port_map12;
157 	u8  port_map34;
158 	u8  port_map56;
159 	u8  port_map7;
160 	u8  status;
161 };
162 
163 struct usb251xb_data {
164 	u16 product_id;
165 	u8 port_cnt;
166 	bool led_support;
167 	bool bat_support;
168 	char product_str[USB251XB_STRING_BUFSIZE / 2]; /* ASCII string */
169 };
170 
171 static const struct usb251xb_data usb2512b_data = {
172 	.product_id = 0x2512,
173 	.port_cnt = 2,
174 	.led_support = false,
175 	.bat_support = true,
176 	.product_str = "USB2512B",
177 };
178 
179 static const struct usb251xb_data usb2512bi_data = {
180 	.product_id = 0x2512,
181 	.port_cnt = 2,
182 	.led_support = false,
183 	.bat_support = true,
184 	.product_str = "USB2512Bi",
185 };
186 
187 static const struct usb251xb_data usb2513b_data = {
188 	.product_id = 0x2513,
189 	.port_cnt = 3,
190 	.led_support = false,
191 	.bat_support = true,
192 	.product_str = "USB2513B",
193 };
194 
195 static const struct usb251xb_data usb2513bi_data = {
196 	.product_id = 0x2513,
197 	.port_cnt = 3,
198 	.led_support = false,
199 	.bat_support = true,
200 	.product_str = "USB2513Bi",
201 };
202 
203 static const struct usb251xb_data usb2514b_data = {
204 	.product_id = 0x2514,
205 	.port_cnt = 4,
206 	.led_support = false,
207 	.bat_support = true,
208 	.product_str = "USB2514B",
209 };
210 
211 static const struct usb251xb_data usb2514bi_data = {
212 	.product_id = 0x2514,
213 	.port_cnt = 4,
214 	.led_support = false,
215 	.bat_support = true,
216 	.product_str = "USB2514Bi",
217 };
218 
219 static const struct usb251xb_data usb2517_data = {
220 	.product_id = 0x2517,
221 	.port_cnt = 7,
222 	.led_support = true,
223 	.bat_support = false,
224 	.product_str = "USB2517",
225 };
226 
227 static const struct usb251xb_data usb2517i_data = {
228 	.product_id = 0x2517,
229 	.port_cnt = 7,
230 	.led_support = true,
231 	.bat_support = false,
232 	.product_str = "USB2517i",
233 };
234 
235 static void usb251xb_reset(struct usb251xb *hub, int state)
236 {
237 	if (!hub->gpio_reset)
238 		return;
239 
240 	gpiod_set_value_cansleep(hub->gpio_reset, state);
241 
242 	/* wait for hub recovery/stabilization */
243 	if (!state)
244 		usleep_range(500, 750);	/* >=500us at power on */
245 	else
246 		usleep_range(1, 10);	/* >=1us at power down */
247 }
248 
249 static int usb251xb_connect(struct usb251xb *hub)
250 {
251 	struct device *dev = hub->dev;
252 	int err, i;
253 	char i2c_wb[USB251XB_I2C_REG_SZ];
254 
255 	memset(i2c_wb, 0, USB251XB_I2C_REG_SZ);
256 
257 	if (hub->skip_config) {
258 		dev_info(dev, "Skip hub configuration, only attach.\n");
259 		i2c_wb[0] = 0x01;
260 		i2c_wb[1] = USB251XB_STATUS_COMMAND_ATTACH;
261 
262 		usb251xb_reset(hub, 0);
263 
264 		err = i2c_smbus_write_i2c_block_data(hub->i2c,
265 				USB251XB_ADDR_STATUS_COMMAND, 2, i2c_wb);
266 		if (err) {
267 			dev_err(dev, "attaching hub failed: %d\n", err);
268 			return err;
269 		}
270 		return 0;
271 	}
272 
273 	i2c_wb[USB251XB_ADDR_VENDOR_ID_MSB]     = (hub->vendor_id >> 8) & 0xFF;
274 	i2c_wb[USB251XB_ADDR_VENDOR_ID_LSB]     = hub->vendor_id & 0xFF;
275 	i2c_wb[USB251XB_ADDR_PRODUCT_ID_MSB]    = (hub->product_id >> 8) & 0xFF;
276 	i2c_wb[USB251XB_ADDR_PRODUCT_ID_LSB]    = hub->product_id & 0xFF;
277 	i2c_wb[USB251XB_ADDR_DEVICE_ID_MSB]     = (hub->device_id >> 8) & 0xFF;
278 	i2c_wb[USB251XB_ADDR_DEVICE_ID_LSB]     = hub->device_id & 0xFF;
279 	i2c_wb[USB251XB_ADDR_CONFIG_DATA_1]     = hub->conf_data1;
280 	i2c_wb[USB251XB_ADDR_CONFIG_DATA_2]     = hub->conf_data2;
281 	i2c_wb[USB251XB_ADDR_CONFIG_DATA_3]     = hub->conf_data3;
282 	i2c_wb[USB251XB_ADDR_NON_REMOVABLE_DEVICES] = hub->non_rem_dev;
283 	i2c_wb[USB251XB_ADDR_PORT_DISABLE_SELF] = hub->port_disable_sp;
284 	i2c_wb[USB251XB_ADDR_PORT_DISABLE_BUS]  = hub->port_disable_bp;
285 	i2c_wb[USB251XB_ADDR_MAX_POWER_SELF]    = hub->max_power_sp;
286 	i2c_wb[USB251XB_ADDR_MAX_POWER_BUS]     = hub->max_power_bp;
287 	i2c_wb[USB251XB_ADDR_MAX_CURRENT_SELF]  = hub->max_current_sp;
288 	i2c_wb[USB251XB_ADDR_MAX_CURRENT_BUS]   = hub->max_current_bp;
289 	i2c_wb[USB251XB_ADDR_POWER_ON_TIME]     = hub->power_on_time;
290 	i2c_wb[USB251XB_ADDR_LANGUAGE_ID_HIGH]  = (hub->lang_id >> 8) & 0xFF;
291 	i2c_wb[USB251XB_ADDR_LANGUAGE_ID_LOW]   = hub->lang_id & 0xFF;
292 	i2c_wb[USB251XB_ADDR_MANUFACTURER_STRING_LEN] = hub->manufacturer_len;
293 	i2c_wb[USB251XB_ADDR_PRODUCT_STRING_LEN]      = hub->product_len;
294 	i2c_wb[USB251XB_ADDR_SERIAL_STRING_LEN]       = hub->serial_len;
295 	memcpy(&i2c_wb[USB251XB_ADDR_MANUFACTURER_STRING], hub->manufacturer,
296 	       USB251XB_STRING_BUFSIZE);
297 	memcpy(&i2c_wb[USB251XB_ADDR_SERIAL_STRING], hub->serial,
298 	       USB251XB_STRING_BUFSIZE);
299 	memcpy(&i2c_wb[USB251XB_ADDR_PRODUCT_STRING], hub->product,
300 	       USB251XB_STRING_BUFSIZE);
301 	i2c_wb[USB251XB_ADDR_BATTERY_CHARGING_ENABLE] = hub->bat_charge_en;
302 	i2c_wb[USB251XB_ADDR_BOOST_UP]          = hub->boost_up;
303 	i2c_wb[USB251XB_ADDR_BOOST_57]          = hub->boost_57;
304 	i2c_wb[USB251XB_ADDR_BOOST_14]          = hub->boost_14;
305 	i2c_wb[USB251XB_ADDR_PORT_SWAP]         = hub->port_swap;
306 	i2c_wb[USB251XB_ADDR_PORT_MAP_12]       = hub->port_map12;
307 	i2c_wb[USB251XB_ADDR_PORT_MAP_34]       = hub->port_map34;
308 	i2c_wb[USB251XB_ADDR_PORT_MAP_56]       = hub->port_map56;
309 	i2c_wb[USB251XB_ADDR_PORT_MAP_7]        = hub->port_map7;
310 	i2c_wb[USB251XB_ADDR_STATUS_COMMAND] = USB251XB_STATUS_COMMAND_ATTACH;
311 
312 	usb251xb_reset(hub, 0);
313 
314 	/* write registers */
315 	for (i = 0; i < (USB251XB_I2C_REG_SZ / USB251XB_I2C_WRITE_SZ); i++) {
316 		int offset = i * USB251XB_I2C_WRITE_SZ;
317 		char wbuf[USB251XB_I2C_WRITE_SZ + 1];
318 
319 		/* The first data byte transferred tells the hub how many data
320 		 * bytes will follow (byte count).
321 		 */
322 		wbuf[0] = USB251XB_I2C_WRITE_SZ;
323 		memcpy(&wbuf[1], &i2c_wb[offset], USB251XB_I2C_WRITE_SZ);
324 
325 		dev_dbg(dev, "writing %d byte block %d to 0x%02X\n",
326 			USB251XB_I2C_WRITE_SZ, i, offset);
327 
328 		err = i2c_smbus_write_i2c_block_data(hub->i2c, offset,
329 						     USB251XB_I2C_WRITE_SZ + 1,
330 						     wbuf);
331 		if (err)
332 			goto out_err;
333 	}
334 
335 	dev_info(dev, "Hub configuration was successful.\n");
336 	return 0;
337 
338 out_err:
339 	dev_err(dev, "configuring block %d failed: %d\n", i, err);
340 	return err;
341 }
342 
343 #ifdef CONFIG_OF
344 static int usb251xb_get_ofdata(struct usb251xb *hub,
345 			       struct usb251xb_data *data)
346 {
347 	struct device *dev = hub->dev;
348 	struct device_node *np = dev->of_node;
349 	int len, err, i;
350 	u32 property_u32 = 0;
351 	const u32 *cproperty_u32;
352 	const char *cproperty_char;
353 	char str[USB251XB_STRING_BUFSIZE / 2];
354 
355 	if (!np) {
356 		dev_err(dev, "failed to get ofdata\n");
357 		return -ENODEV;
358 	}
359 
360 	if (of_get_property(np, "skip-config", NULL))
361 		hub->skip_config = 1;
362 	else
363 		hub->skip_config = 0;
364 
365 	hub->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
366 	if (PTR_ERR(hub->gpio_reset) == -EPROBE_DEFER) {
367 		return -EPROBE_DEFER;
368 	} else if (IS_ERR(hub->gpio_reset)) {
369 		err = PTR_ERR(hub->gpio_reset);
370 		dev_err(dev, "unable to request GPIO reset pin (%d)\n", err);
371 		return err;
372 	}
373 
374 	if (of_property_read_u16_array(np, "vendor-id", &hub->vendor_id, 1))
375 		hub->vendor_id = USB251XB_DEF_VENDOR_ID;
376 
377 	if (of_property_read_u16_array(np, "product-id",
378 				       &hub->product_id, 1))
379 		hub->product_id = data->product_id;
380 
381 	if (of_property_read_u16_array(np, "device-id", &hub->device_id, 1))
382 		hub->device_id = USB251XB_DEF_DEVICE_ID;
383 
384 	hub->conf_data1 = USB251XB_DEF_CONFIG_DATA_1;
385 	if (of_get_property(np, "self-powered", NULL)) {
386 		hub->conf_data1 |= BIT(7);
387 
388 		/* Configure Over-Current sens when self-powered */
389 		hub->conf_data1 &= ~BIT(2);
390 		if (of_get_property(np, "ganged-sensing", NULL))
391 			hub->conf_data1 &= ~BIT(1);
392 		else if (of_get_property(np, "individual-sensing", NULL))
393 			hub->conf_data1 |= BIT(1);
394 	} else if (of_get_property(np, "bus-powered", NULL)) {
395 		hub->conf_data1 &= ~BIT(7);
396 
397 		/* Disable Over-Current sense when bus-powered */
398 		hub->conf_data1 |= BIT(2);
399 	}
400 
401 	if (of_get_property(np, "disable-hi-speed", NULL))
402 		hub->conf_data1 |= BIT(5);
403 
404 	if (of_get_property(np, "multi-tt", NULL))
405 		hub->conf_data1 |= BIT(4);
406 	else if (of_get_property(np, "single-tt", NULL))
407 		hub->conf_data1 &= ~BIT(4);
408 
409 	if (of_get_property(np, "disable-eop", NULL))
410 		hub->conf_data1 |= BIT(3);
411 
412 	if (of_get_property(np, "individual-port-switching", NULL))
413 		hub->conf_data1 |= BIT(0);
414 	else if (of_get_property(np, "ganged-port-switching", NULL))
415 		hub->conf_data1 &= ~BIT(0);
416 
417 	hub->conf_data2 = USB251XB_DEF_CONFIG_DATA_2;
418 	if (of_get_property(np, "dynamic-power-switching", NULL))
419 		hub->conf_data2 |= BIT(7);
420 
421 	if (!of_property_read_u32(np, "oc-delay-us", &property_u32)) {
422 		if (property_u32 == 100) {
423 			/* 100 us*/
424 			hub->conf_data2 &= ~BIT(5);
425 			hub->conf_data2 &= ~BIT(4);
426 		} else if (property_u32 == 4000) {
427 			/* 4 ms */
428 			hub->conf_data2 &= ~BIT(5);
429 			hub->conf_data2 |= BIT(4);
430 		} else if (property_u32 == 16000) {
431 			/* 16 ms */
432 			hub->conf_data2 |= BIT(5);
433 			hub->conf_data2 |= BIT(4);
434 		} else {
435 			/* 8 ms (DEFAULT) */
436 			hub->conf_data2 |= BIT(5);
437 			hub->conf_data2 &= ~BIT(4);
438 		}
439 	}
440 
441 	if (of_get_property(np, "compound-device", NULL))
442 		hub->conf_data2 |= BIT(3);
443 
444 	hub->conf_data3 = USB251XB_DEF_CONFIG_DATA_3;
445 	if (of_get_property(np, "port-mapping-mode", NULL))
446 		hub->conf_data3 |= BIT(3);
447 
448 	if (data->led_support && of_get_property(np, "led-usb-mode", NULL))
449 		hub->conf_data3 &= ~BIT(1);
450 
451 	if (of_get_property(np, "string-support", NULL))
452 		hub->conf_data3 |= BIT(0);
453 
454 	hub->non_rem_dev = USB251XB_DEF_NON_REMOVABLE_DEVICES;
455 	cproperty_u32 = of_get_property(np, "non-removable-ports", &len);
456 	if (cproperty_u32 && (len / sizeof(u32)) > 0) {
457 		for (i = 0; i < len / sizeof(u32); i++) {
458 			u32 port = be32_to_cpu(cproperty_u32[i]);
459 
460 			if ((port >= 1) && (port <= data->port_cnt))
461 				hub->non_rem_dev |= BIT(port);
462 			else
463 				dev_warn(dev, "NRD port %u doesn't exist\n",
464 					port);
465 		}
466 	}
467 
468 	hub->port_disable_sp = USB251XB_DEF_PORT_DISABLE_SELF;
469 	cproperty_u32 = of_get_property(np, "sp-disabled-ports", &len);
470 	if (cproperty_u32 && (len / sizeof(u32)) > 0) {
471 		for (i = 0; i < len / sizeof(u32); i++) {
472 			u32 port = be32_to_cpu(cproperty_u32[i]);
473 
474 			if ((port >= 1) && (port <= data->port_cnt))
475 				hub->port_disable_sp |= BIT(port);
476 			else
477 				dev_warn(dev, "PDS port %u doesn't exist\n",
478 					port);
479 		}
480 	}
481 
482 	hub->port_disable_bp = USB251XB_DEF_PORT_DISABLE_BUS;
483 	cproperty_u32 = of_get_property(np, "bp-disabled-ports", &len);
484 	if (cproperty_u32 && (len / sizeof(u32)) > 0) {
485 		for (i = 0; i < len / sizeof(u32); i++) {
486 			u32 port = be32_to_cpu(cproperty_u32[i]);
487 
488 			if ((port >= 1) && (port <= data->port_cnt))
489 				hub->port_disable_bp |= BIT(port);
490 			else
491 				dev_warn(dev, "PDB port %u doesn't exist\n",
492 					port);
493 		}
494 	}
495 
496 	hub->max_power_sp = USB251XB_DEF_MAX_POWER_SELF;
497 	if (!of_property_read_u32(np, "sp-max-total-current-microamp",
498 	    &property_u32))
499 		hub->max_power_sp = min_t(u8, property_u32 / 2000, 50);
500 
501 	hub->max_power_bp = USB251XB_DEF_MAX_POWER_BUS;
502 	if (!of_property_read_u32(np, "bp-max-total-current-microamp",
503 	    &property_u32))
504 		hub->max_power_bp = min_t(u8, property_u32 / 2000, 255);
505 
506 	hub->max_current_sp = USB251XB_DEF_MAX_CURRENT_SELF;
507 	if (!of_property_read_u32(np, "sp-max-removable-current-microamp",
508 	    &property_u32))
509 		hub->max_current_sp = min_t(u8, property_u32 / 2000, 50);
510 
511 	hub->max_current_bp = USB251XB_DEF_MAX_CURRENT_BUS;
512 	if (!of_property_read_u32(np, "bp-max-removable-current-microamp",
513 	    &property_u32))
514 		hub->max_current_bp = min_t(u8, property_u32 / 2000, 255);
515 
516 	hub->power_on_time = USB251XB_DEF_POWER_ON_TIME;
517 	if (!of_property_read_u32(np, "power-on-time-ms", &property_u32))
518 		hub->power_on_time = min_t(u8, property_u32 / 2, 255);
519 
520 	if (of_property_read_u16_array(np, "language-id", &hub->lang_id, 1))
521 		hub->lang_id = USB251XB_DEF_LANGUAGE_ID;
522 
523 	cproperty_char = of_get_property(np, "manufacturer", NULL);
524 	strlcpy(str, cproperty_char ? : USB251XB_DEF_MANUFACTURER_STRING,
525 		sizeof(str));
526 	hub->manufacturer_len = strlen(str) & 0xFF;
527 	memset(hub->manufacturer, 0, USB251XB_STRING_BUFSIZE);
528 	len = min_t(size_t, USB251XB_STRING_BUFSIZE / 2, strlen(str));
529 	len = utf8s_to_utf16s(str, len, UTF16_LITTLE_ENDIAN,
530 			      (wchar_t *)hub->manufacturer,
531 			      USB251XB_STRING_BUFSIZE);
532 
533 	cproperty_char = of_get_property(np, "product", NULL);
534 	strlcpy(str, cproperty_char ? : data->product_str, sizeof(str));
535 	hub->product_len = strlen(str) & 0xFF;
536 	memset(hub->product, 0, USB251XB_STRING_BUFSIZE);
537 	len = min_t(size_t, USB251XB_STRING_BUFSIZE / 2, strlen(str));
538 	len = utf8s_to_utf16s(str, len, UTF16_LITTLE_ENDIAN,
539 			      (wchar_t *)hub->product,
540 			      USB251XB_STRING_BUFSIZE);
541 
542 	cproperty_char = of_get_property(np, "serial", NULL);
543 	strlcpy(str, cproperty_char ? : USB251XB_DEF_SERIAL_STRING,
544 		sizeof(str));
545 	hub->serial_len = strlen(str) & 0xFF;
546 	memset(hub->serial, 0, USB251XB_STRING_BUFSIZE);
547 	len = min_t(size_t, USB251XB_STRING_BUFSIZE / 2, strlen(str));
548 	len = utf8s_to_utf16s(str, len, UTF16_LITTLE_ENDIAN,
549 			      (wchar_t *)hub->serial,
550 			      USB251XB_STRING_BUFSIZE);
551 
552 	/* The following parameters are currently not exposed to devicetree, but
553 	 * may be as soon as needed.
554 	 */
555 	hub->bat_charge_en = USB251XB_DEF_BATTERY_CHARGING_ENABLE;
556 	hub->boost_up = USB251XB_DEF_BOOST_UP;
557 	hub->boost_57 = USB251XB_DEF_BOOST_57;
558 	hub->boost_14 = USB251XB_DEF_BOOST_14;
559 	hub->port_swap = USB251XB_DEF_PORT_SWAP;
560 	hub->port_map12 = USB251XB_DEF_PORT_MAP_12;
561 	hub->port_map34 = USB251XB_DEF_PORT_MAP_34;
562 	hub->port_map56 = USB251XB_DEF_PORT_MAP_56;
563 	hub->port_map7  = USB251XB_DEF_PORT_MAP_7;
564 
565 	return 0;
566 }
567 
568 static const struct of_device_id usb251xb_of_match[] = {
569 	{
570 		.compatible = "microchip,usb2512b",
571 		.data = &usb2512b_data,
572 	}, {
573 		.compatible = "microchip,usb2512bi",
574 		.data = &usb2512bi_data,
575 	}, {
576 		.compatible = "microchip,usb2513b",
577 		.data = &usb2513b_data,
578 	}, {
579 		.compatible = "microchip,usb2513bi",
580 		.data = &usb2513bi_data,
581 	}, {
582 		.compatible = "microchip,usb2514b",
583 		.data = &usb2514b_data,
584 	}, {
585 		.compatible = "microchip,usb2514bi",
586 		.data = &usb2514bi_data,
587 	}, {
588 		.compatible = "microchip,usb2517",
589 		.data = &usb2517_data,
590 	}, {
591 		.compatible = "microchip,usb2517i",
592 		.data = &usb2517i_data,
593 	}, {
594 		/* sentinel */
595 	}
596 };
597 MODULE_DEVICE_TABLE(of, usb251xb_of_match);
598 #else /* CONFIG_OF */
599 static int usb251xb_get_ofdata(struct usb251xb *hub,
600 			       struct usb251xb_data *data)
601 {
602 	return 0;
603 }
604 #endif /* CONFIG_OF */
605 
606 static int usb251xb_probe(struct usb251xb *hub)
607 {
608 	struct device *dev = hub->dev;
609 	struct device_node *np = dev->of_node;
610 	const struct of_device_id *of_id = of_match_device(usb251xb_of_match,
611 							   dev);
612 	int err;
613 
614 	if (np) {
615 		err = usb251xb_get_ofdata(hub,
616 					  (struct usb251xb_data *)of_id->data);
617 		if (err) {
618 			dev_err(dev, "failed to get ofdata: %d\n", err);
619 			return err;
620 		}
621 	}
622 
623 	err = usb251xb_connect(hub);
624 	if (err) {
625 		dev_err(dev, "Failed to connect hub (%d)\n", err);
626 		return err;
627 	}
628 
629 	dev_info(dev, "Hub probed successfully\n");
630 
631 	return 0;
632 }
633 
634 static int usb251xb_i2c_probe(struct i2c_client *i2c,
635 			      const struct i2c_device_id *id)
636 {
637 	struct usb251xb *hub;
638 
639 	hub = devm_kzalloc(&i2c->dev, sizeof(struct usb251xb), GFP_KERNEL);
640 	if (!hub)
641 		return -ENOMEM;
642 
643 	i2c_set_clientdata(i2c, hub);
644 	hub->dev = &i2c->dev;
645 	hub->i2c = i2c;
646 
647 	return usb251xb_probe(hub);
648 }
649 
650 static const struct i2c_device_id usb251xb_id[] = {
651 	{ "usb2512b", 0 },
652 	{ "usb2512bi", 0 },
653 	{ "usb2513b", 0 },
654 	{ "usb2513bi", 0 },
655 	{ "usb2514b", 0 },
656 	{ "usb2514bi", 0 },
657 	{ "usb2517", 0 },
658 	{ "usb2517i", 0 },
659 	{ /* sentinel */ }
660 };
661 MODULE_DEVICE_TABLE(i2c, usb251xb_id);
662 
663 static struct i2c_driver usb251xb_i2c_driver = {
664 	.driver = {
665 		.name = DRIVER_NAME,
666 		.of_match_table = of_match_ptr(usb251xb_of_match),
667 	},
668 	.probe    = usb251xb_i2c_probe,
669 	.id_table = usb251xb_id,
670 };
671 
672 module_i2c_driver(usb251xb_i2c_driver);
673 
674 MODULE_AUTHOR("Richard Leitner <richard.leitner@skidata.com>");
675 MODULE_DESCRIPTION("USB251x/xBi USB 2.0 Hub Controller Driver");
676 MODULE_LICENSE("GPL");
677