xref: /linux/drivers/misc/ti_fpc202.c (revision cb4eb6771c0f8fd1c52a8f6fdec7762fb087380a)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * ti_fpc202.c - FPC202 Dual Port Controller driver
4  *
5  * Copyright (C) 2024 Bootlin
6  *
7  */
8 
9 #include <linux/cleanup.h>
10 #include <linux/device/devres.h>
11 #include <linux/err.h>
12 #include <linux/i2c.h>
13 #include <linux/i2c-atr.h>
14 #include <linux/gpio/consumer.h>
15 #include <linux/gpio/driver.h>
16 #include <linux/gpio/machine.h>
17 #include <linux/leds.h>
18 #include <linux/module.h>
19 #include <linux/math.h>
20 #include <linux/types.h>
21 
22 #define FPC202_NUM_PORTS 2
23 #define FPC202_ALIASES_PER_PORT 2
24 
25 /*
26  * GPIO: port mapping
27  *
28  * 0: P0_S0_IN_A
29  * 1: P0_S1_IN_A
30  * 2: P1_S0_IN_A
31  * 3: P1_S1_IN_A
32  * 4: P0_S0_IN_B
33  * ...
34  * 8: P0_S0_IN_C
35  * ...
36  * 12: P0_S0_OUT_A
37  * ...
38  * 16: P0_S0_OUT_B
39  * ...
40  * 19: P1_S1_OUT_B
41  *
42  * Ports with optional LED control:
43  *
44  * 20: P0_S0_OUT_C (P0_S0_LED1)
45  * ...
46  * 23: P1_S1_OUT_C (P1_S1_LED1)
47  * 24: P0_S0_OUT_D (P0_S0_LED2
48  * ...
49  * 27: P1_S1_OUT_D (P1_S1_LED2)
50  *
51  */
52 
53 #define FPC202_GPIO_COUNT 28
54 #define FPC202_GPIO_P0_S0_IN_B  4
55 #define FPC202_GPIO_P0_S0_OUT_A 12
56 #define FPC202_GPIO_P0_S0_OUT_C 20
57 #define FPC202_GPIO_P0_S0_OUT_D 24
58 
59 #define FPC202_REG_IN_A_INT    0x6
60 #define FPC202_REG_IN_C_IN_B   0x7
61 #define FPC202_REG_OUT_A_OUT_B 0x8
62 #define FPC202_REG_OUT_C_OUT_D 0x9
63 
64 #define FPC202_REG_OUT_A_OUT_B_VAL 0xa
65 
66 #define FPC202_LED_COUNT 8
67 
68 /* There are four LED GPIO mode registers which manage two GPIOs each. */
69 #define FPC202_REG_LED_MODE(offset) (0x1a + 0x20 * ((offset) % 4))
70 
71 /* LED1 GPIOs (*_OUT_C) are configured in bits 1:0, LED2 GPIOs (*_OUT_D) in bits 3:2. */
72 #define FPC202_LED_MODE_SHIFT(offset) ((offset) < FPC202_GPIO_P0_S0_OUT_D ? 0 : 2)
73 #define FPC202_LED_MODE_MASK(offset) (GENMASK(1, 0) << FPC202_LED_MODE_SHIFT(offset))
74 
75 /* There is one PWM control register for each GPIO LED */
76 #define FPC202_REG_LED_PWM(offset) \
77 	(((offset) < FPC202_GPIO_P0_S0_OUT_D ? 0x14 : 0x15) + 0x20 * ((offset) % 4))
78 
79 /* There are two blink delay registers (on/off time) for each GPIO LED */
80 #define FPC202_REG_LED_BLINK_ON(offset) \
81 	(((offset) < FPC202_GPIO_P0_S0_OUT_D ? 0x16 : 0x18) + 0x20 * ((offset) % 4))
82 #define FPC202_REG_LED_BLINK_OFF(offset) (FPC202_REG_LED_BLINK_ON(offset) + 1)
83 
84 /* The actual hardware precision is 2.5ms but since the LED API doesn't handle sub-millisecond
85  * timesteps this is rounded up to 5ms
86  */
87 #define FPC202_LED_BLINK_PRECISION 5UL
88 
89 #define FPC202_LED_MAX_BRIGHTNESS 255
90 
91 #define FPC202_REG_MOD_DEV(port, dev) (0xb4 + ((port) * 4) + (dev))
92 #define FPC202_REG_AUX_DEV(port, dev) (0xb6 + ((port) * 4) + (dev))
93 
94 /*
95  * The FPC202 doesn't support turning off address translation on a single port.
96  * So just set an invalid I2C address as the translation target when no client
97  * address is attached.
98  */
99 #define FPC202_REG_DEV_INVALID 0
100 
101 /* Even aliases are assigned to device 0 and odd aliases to device 1 */
102 #define fpc202_dev_num_from_alias(alias) ((alias) % 2)
103 
104 enum fpc202_led_mode {
105 	FPC202_LED_MODE_OFF = 0,
106 	FPC202_LED_MODE_ON = 1,
107 	FPC202_LED_MODE_PWM = 2,
108 	FPC202_LED_MODE_BLINK = 3,
109 };
110 
111 struct fpc202_led {
112 	int offset;
113 	struct led_classdev led_cdev;
114 	struct fpc202_priv *priv;
115 	struct gpio_desc *gpio;
116 	enum fpc202_led_mode mode;
117 };
118 
119 struct fpc202_priv {
120 	struct i2c_client *client;
121 	struct i2c_atr *atr;
122 	struct gpio_desc *en_gpio;
123 	struct gpio_chip gpio;
124 	struct fpc202_led leds[FPC202_LED_COUNT];
125 
126 	/* Lock REG_MOD/AUX_DEV and addr_caches during attach/detach */
127 	struct mutex reg_dev_lock;
128 
129 	/* Lock LED mode select register during accesses */
130 	struct mutex led_mode_lock;
131 
132 	/* Cached device addresses for both ports and their devices */
133 	u8 addr_caches[2][2];
134 
135 	/* Keep track of which ports were probed */
136 	DECLARE_BITMAP(probed_ports, FPC202_NUM_PORTS);
137 };
138 
fpc202_fill_alias_table(struct i2c_client * client,u16 * aliases,int port_id)139 static void fpc202_fill_alias_table(struct i2c_client *client, u16 *aliases, int port_id)
140 {
141 	u16 first_alias;
142 	int i;
143 
144 	/*
145 	 * There is a predefined list of aliases for each FPC202 I2C
146 	 * self-address.  This allows daisy-chained FPC202 units to
147 	 * automatically take on different sets of aliases.
148 	 * Each port of an FPC202 unit is assigned two aliases from this list.
149 	 */
150 	first_alias = 0x10 + 4 * port_id + 8 * ((u16)client->addr - 2);
151 
152 	for (i = 0; i < FPC202_ALIASES_PER_PORT; i++)
153 		aliases[i] = first_alias + i;
154 }
155 
fpc202_gpio_get_dir(int offset)156 static int fpc202_gpio_get_dir(int offset)
157 {
158 	return offset < FPC202_GPIO_P0_S0_OUT_A ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
159 }
160 
fpc202_gpio_has_led_caps(int offset)161 static int fpc202_gpio_has_led_caps(int offset)
162 {
163 	return offset >= FPC202_GPIO_P0_S0_OUT_C;
164 }
165 
fpc202_read(struct fpc202_priv * priv,u8 reg)166 static int fpc202_read(struct fpc202_priv *priv, u8 reg)
167 {
168 	int val;
169 
170 	val = i2c_smbus_read_byte_data(priv->client, reg);
171 	return val;
172 }
173 
fpc202_write(struct fpc202_priv * priv,u8 reg,u8 value)174 static int fpc202_write(struct fpc202_priv *priv, u8 reg, u8 value)
175 {
176 	return i2c_smbus_write_byte_data(priv->client, reg, value);
177 }
178 
fpc202_set_enable(struct fpc202_priv * priv,int enable)179 static void fpc202_set_enable(struct fpc202_priv *priv, int enable)
180 {
181 	if (!priv->en_gpio)
182 		return;
183 
184 	gpiod_set_value(priv->en_gpio, enable);
185 }
186 
fpc202_led_mode_write(struct fpc202_priv * priv,int offset,enum fpc202_led_mode mode)187 static int fpc202_led_mode_write(struct fpc202_priv *priv,
188 				 int offset,
189 				 enum fpc202_led_mode mode)
190 {
191 	u8 val, reg = FPC202_REG_LED_MODE(offset);
192 	int ret;
193 
194 	guard(mutex)(&priv->led_mode_lock);
195 
196 	ret = fpc202_read(priv, reg);
197 	if (ret < 0) {
198 		dev_err(&priv->client->dev, "failed to read LED mode %d! err %d\n",
199 			offset, ret);
200 		return ret;
201 	}
202 
203 	val = (u8)ret & ~FPC202_LED_MODE_MASK(offset);
204 	val |= mode << FPC202_LED_MODE_SHIFT(offset);
205 
206 	return fpc202_write(priv, reg, val);
207 }
208 
fpc202_led_mode_set(struct fpc202_led * led,enum fpc202_led_mode mode)209 static int fpc202_led_mode_set(struct fpc202_led *led, enum fpc202_led_mode mode)
210 {
211 	struct fpc202_priv *priv = led->priv;
212 
213 	led->mode = mode;
214 
215 	return fpc202_led_mode_write(priv, led->offset, mode);
216 }
217 
fpc202_gpio_set(struct gpio_chip * chip,unsigned int offset,int value)218 static int fpc202_gpio_set(struct gpio_chip *chip, unsigned int offset,
219 			   int value)
220 {
221 	struct fpc202_priv *priv = gpiochip_get_data(chip);
222 	int ret;
223 	u8 val;
224 
225 	if (fpc202_gpio_has_led_caps(offset)) {
226 		ret = fpc202_led_mode_write(priv, offset,
227 					    value ? FPC202_LED_MODE_ON : FPC202_LED_MODE_OFF);
228 		if (ret < 0)
229 			dev_err(&priv->client->dev, "Failed to set GPIO %d LED mode! err %d\n",
230 				offset, ret);
231 
232 		return ret;
233 	}
234 
235 	ret = fpc202_read(priv, FPC202_REG_OUT_A_OUT_B_VAL);
236 	if (ret < 0) {
237 		dev_err(&priv->client->dev, "Failed to set GPIO %d value! err %d\n", offset, ret);
238 		return ret;
239 	}
240 
241 	val = (u8)ret;
242 
243 	if (value)
244 		val |= BIT(offset - FPC202_GPIO_P0_S0_OUT_A);
245 	else
246 		val &= ~BIT(offset - FPC202_GPIO_P0_S0_OUT_A);
247 
248 	return fpc202_write(priv, FPC202_REG_OUT_A_OUT_B_VAL, val);
249 }
250 
fpc202_gpio_get(struct gpio_chip * chip,unsigned int offset)251 static int fpc202_gpio_get(struct gpio_chip *chip, unsigned int offset)
252 {
253 	struct fpc202_priv *priv = gpiochip_get_data(chip);
254 	u8 reg, bit;
255 	int ret;
256 
257 	if (offset < FPC202_GPIO_P0_S0_IN_B) {
258 		reg = FPC202_REG_IN_A_INT;
259 		bit = BIT(4 + offset);
260 	} else if (offset < FPC202_GPIO_P0_S0_OUT_A) {
261 		reg = FPC202_REG_IN_C_IN_B;
262 		bit = BIT(offset - FPC202_GPIO_P0_S0_IN_B);
263 	} else if (!fpc202_gpio_has_led_caps(offset)) {
264 		reg = FPC202_REG_OUT_A_OUT_B_VAL;
265 		bit = BIT(offset - FPC202_GPIO_P0_S0_OUT_A);
266 	} else {
267 		return -EOPNOTSUPP;
268 	}
269 
270 	ret = fpc202_read(priv, reg);
271 	if (ret < 0)
272 		return ret;
273 
274 	return !!(((u8)ret) & bit);
275 }
276 
fpc202_gpio_direction_input(struct gpio_chip * chip,unsigned int offset)277 static int fpc202_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
278 {
279 	if (fpc202_gpio_get_dir(offset) == GPIO_LINE_DIRECTION_OUT)
280 		return -EINVAL;
281 
282 	return 0;
283 }
284 
fpc202_gpio_direction_output(struct gpio_chip * chip,unsigned int offset,int value)285 static int fpc202_gpio_direction_output(struct gpio_chip *chip, unsigned int offset,
286 					int value)
287 {
288 	struct fpc202_priv *priv = gpiochip_get_data(chip);
289 	u8 reg, val, bit;
290 	int ret;
291 
292 	if (fpc202_gpio_get_dir(offset) == GPIO_LINE_DIRECTION_IN)
293 		return -EINVAL;
294 
295 	fpc202_gpio_set(chip, offset, value);
296 
297 	if (fpc202_gpio_has_led_caps(offset)) {
298 		reg = FPC202_REG_OUT_C_OUT_D;
299 		bit = BIT(offset - FPC202_GPIO_P0_S0_OUT_C);
300 	} else {
301 		reg = FPC202_REG_OUT_A_OUT_B;
302 		bit = BIT(offset - FPC202_GPIO_P0_S0_OUT_A);
303 	}
304 
305 	ret = fpc202_read(priv, reg);
306 	if (ret < 0)
307 		return ret;
308 
309 	val = (u8)ret | bit;
310 
311 	return fpc202_write(priv, reg, val);
312 }
313 
314 /*
315  * Set the translation table entry associated with a port and device number.
316  *
317  * Each downstream port of the FPC202 has two fixed aliases corresponding to
318  * device numbers 0 and 1. If one of these aliases is found in an incoming I2C
319  * transfer, it will be translated to the address given by the corresponding
320  * translation table entry.
321  */
fpc202_write_dev_addr(struct fpc202_priv * priv,u32 port_id,int dev_num,u16 addr)322 static int fpc202_write_dev_addr(struct fpc202_priv *priv, u32 port_id, int dev_num, u16 addr)
323 {
324 	int ret, reg_mod, reg_aux;
325 	u8 val;
326 
327 	guard(mutex)(&priv->reg_dev_lock);
328 
329 	reg_mod = FPC202_REG_MOD_DEV(port_id, dev_num);
330 	reg_aux = FPC202_REG_AUX_DEV(port_id, dev_num);
331 	val = addr & 0x7f;
332 
333 	ret = fpc202_write(priv, reg_mod, val);
334 	if (ret)
335 		return ret;
336 
337 	/*
338 	 * The FPC202 datasheet is unclear about the role of the AUX registers.
339 	 * Empirically, writing to them as well seems to be necessary for
340 	 * address translation to function properly.
341 	 */
342 	ret = fpc202_write(priv, reg_aux, val);
343 
344 	priv->addr_caches[port_id][dev_num] = val;
345 
346 	return ret;
347 }
348 
fpc202_attach_addr(struct i2c_atr * atr,u32 chan_id,u16 addr,u16 alias)349 static int fpc202_attach_addr(struct i2c_atr *atr, u32 chan_id,
350 			      u16 addr, u16 alias)
351 {
352 	struct fpc202_priv *priv = i2c_atr_get_driver_data(atr);
353 
354 	dev_dbg(&priv->client->dev, "attaching address 0x%02x to alias 0x%02x\n", addr, alias);
355 
356 	return fpc202_write_dev_addr(priv, chan_id, fpc202_dev_num_from_alias(alias), addr);
357 }
358 
fpc202_detach_addr(struct i2c_atr * atr,u32 chan_id,u16 addr)359 static void fpc202_detach_addr(struct i2c_atr *atr, u32 chan_id,
360 			       u16 addr)
361 {
362 	struct fpc202_priv *priv = i2c_atr_get_driver_data(atr);
363 	int dev_num, val;
364 
365 	for (dev_num = 0; dev_num < 2; dev_num++) {
366 		mutex_lock(&priv->reg_dev_lock);
367 
368 		val = priv->addr_caches[chan_id][dev_num];
369 
370 		mutex_unlock(&priv->reg_dev_lock);
371 
372 		if (val == (addr & 0x7f)) {
373 			fpc202_write_dev_addr(priv, chan_id, dev_num, FPC202_REG_DEV_INVALID);
374 			return;
375 		}
376 	}
377 }
378 
379 static const struct i2c_atr_ops fpc202_atr_ops = {
380 	.attach_addr = fpc202_attach_addr,
381 	.detach_addr = fpc202_detach_addr,
382 };
383 
fpc202_cdev_to_led(struct led_classdev * cdev)384 static struct fpc202_led *fpc202_cdev_to_led(struct led_classdev *cdev)
385 {
386 	return container_of(cdev, struct fpc202_led, led_cdev);
387 }
388 
fpc202_led_get(struct fpc202_priv * priv,int offset)389 static struct fpc202_led *fpc202_led_get(struct fpc202_priv *priv, int offset)
390 {
391 	return &priv->leds[offset - FPC202_GPIO_P0_S0_OUT_C];
392 }
393 
fpc202_led_blink_set(struct led_classdev * cdev,unsigned long * delay_on,unsigned long * delay_off)394 static int fpc202_led_blink_set(struct led_classdev *cdev,
395 				unsigned long *delay_on,
396 				unsigned long *delay_off)
397 {
398 	struct fpc202_led *led = fpc202_cdev_to_led(cdev);
399 	struct fpc202_priv *priv = led->priv;
400 	unsigned long val;
401 	int ret;
402 
403 	if (*delay_on == 0 && *delay_off == 0) {
404 		*delay_on = 250;
405 		*delay_off = 250;
406 	} else {
407 		if (*delay_on % FPC202_LED_BLINK_PRECISION)
408 			*delay_on = roundup(*delay_on, FPC202_LED_BLINK_PRECISION);
409 
410 		if (*delay_off % FPC202_LED_BLINK_PRECISION)
411 			*delay_off = roundup(*delay_off, FPC202_LED_BLINK_PRECISION);
412 	}
413 
414 	/* Multiply the duration by two, since the actual precision is 2.5ms not 5ms*/
415 	val = 2 * (*delay_on / FPC202_LED_BLINK_PRECISION);
416 	if (val > 255) {
417 		val = 255;
418 		*delay_on = (val / 2) * FPC202_LED_BLINK_PRECISION;
419 	}
420 
421 	ret = fpc202_write(priv, FPC202_REG_LED_BLINK_ON(led->offset), val);
422 	if (ret) {
423 		dev_err(&priv->client->dev,
424 			"Failed to set blink on duration for LED %d, err %d\n",
425 			led->offset, ret);
426 		return ret;
427 	}
428 
429 	val = 2 * (*delay_off / FPC202_LED_BLINK_PRECISION);
430 	if (val > 255) {
431 		val = 255;
432 		*delay_off = (val / 2) * FPC202_LED_BLINK_PRECISION;
433 	}
434 
435 	ret = fpc202_write(priv, FPC202_REG_LED_BLINK_OFF(led->offset), val);
436 	if (ret) {
437 		dev_err(&priv->client->dev,
438 			"Failed to set blink off duration for LED %d, err %d\n",
439 			led->offset, ret);
440 		return ret;
441 	}
442 
443 	return fpc202_led_mode_set(led, FPC202_LED_MODE_BLINK);
444 }
445 
fpc202_led_brightness_get(struct led_classdev * cdev)446 static enum led_brightness fpc202_led_brightness_get(struct led_classdev *cdev)
447 {
448 	struct fpc202_led *led = fpc202_cdev_to_led(cdev);
449 
450 	if (led->mode == FPC202_LED_MODE_OFF)
451 		return LED_OFF;
452 
453 	return LED_ON;
454 }
455 
fpc202_led_brightness_set(struct led_classdev * cdev,enum led_brightness brightness)456 static int fpc202_led_brightness_set(struct led_classdev *cdev,
457 				     enum led_brightness brightness)
458 {
459 	struct fpc202_led *led = fpc202_cdev_to_led(cdev);
460 	struct fpc202_priv *priv = led->priv;
461 	int ret;
462 
463 	if (!brightness)
464 		return fpc202_led_mode_set(led, FPC202_LED_MODE_OFF);
465 
466 	if (led->mode != FPC202_LED_MODE_BLINK) {
467 		if (brightness == FPC202_LED_MAX_BRIGHTNESS)
468 			return fpc202_led_mode_set(led, FPC202_LED_MODE_ON);
469 
470 		ret = fpc202_led_mode_set(led, FPC202_LED_MODE_PWM);
471 		if (ret) {
472 			dev_err(&priv->client->dev, "Failed to set LED %d mode, err %d\n",
473 				led->offset, ret);
474 			return ret;
475 		}
476 	}
477 
478 	return fpc202_write(priv, FPC202_REG_LED_PWM(led->offset), brightness);
479 }
480 
fpc202_register_led(struct fpc202_priv * priv,int offset,struct device_node * led_handle)481 static int fpc202_register_led(struct fpc202_priv *priv, int offset,
482 			       struct device_node *led_handle)
483 {
484 	struct fpc202_led *led = fpc202_led_get(priv, offset);
485 	struct device *dev = &priv->client->dev;
486 	struct led_init_data init_data = { };
487 	int ret = 0;
488 
489 	led->priv = priv;
490 	led->offset = offset;
491 	led->led_cdev.max_brightness = FPC202_LED_MAX_BRIGHTNESS;
492 	led->led_cdev.brightness_set_blocking = fpc202_led_brightness_set;
493 	led->led_cdev.brightness_get = fpc202_led_brightness_get;
494 	led->led_cdev.blink_set = fpc202_led_blink_set;
495 
496 	init_data.fwnode = of_fwnode_handle(led_handle);
497 	init_data.default_label = NULL;
498 	init_data.devicename = NULL;
499 	init_data.devname_mandatory = false;
500 
501 	ret = fpc202_led_mode_set(led, FPC202_LED_MODE_OFF);
502 	if (ret) {
503 		dev_err(dev, "Failed to set LED %d mode, err %d\n", offset, ret);
504 		return ret;
505 	}
506 
507 	ret = devm_led_classdev_register_ext(dev, &led->led_cdev, &init_data);
508 	if (ret) {
509 		dev_err(dev, "Failed to register LED %d cdev, err %d\n", offset, ret);
510 		return ret;
511 	}
512 
513 	/* Claim corresponding GPIO line so that it cannot be interfered with */
514 	led->gpio = gpiochip_request_own_desc(&priv->gpio, offset, led->led_cdev.name,
515 					      GPIO_ACTIVE_HIGH, GPIOD_ASIS);
516 	if (IS_ERR(led->gpio)) {
517 		ret = PTR_ERR(led->gpio);
518 		dev_err(dev, "Failed to register LED %d cdev, err %d\n", offset, ret);
519 	}
520 
521 	return ret;
522 }
523 
fpc202_register_leds(struct fpc202_priv * priv)524 static int fpc202_register_leds(struct fpc202_priv *priv)
525 {
526 	struct device *dev = &priv->client->dev;
527 	int offset, ret = 0;
528 
529 	if (!devres_open_group(dev, fpc202_register_leds, GFP_KERNEL))
530 		return -ENOMEM;
531 
532 	for_each_child_of_node_scoped(dev->of_node, led_handle) {
533 		ret = of_property_read_u32(led_handle, "reg", &offset);
534 		if (ret) {
535 			dev_err(dev, "Failed to read 'reg' property of child node, err %d\n", ret);
536 			return ret;
537 		}
538 
539 		if (offset < FPC202_GPIO_P0_S0_OUT_C || offset > FPC202_GPIO_COUNT)
540 			continue;
541 
542 		ret = fpc202_register_led(priv, offset, led_handle);
543 		if (ret) {
544 			dev_err(dev, "Failed to register LED %d, err %d\n", offset,
545 				ret);
546 			goto free_own_gpios;
547 		}
548 	}
549 
550 	devres_close_group(dev, fpc202_register_leds);
551 
552 	return 0;
553 
554 free_own_gpios:
555 	for (offset = 0; offset < FPC202_LED_COUNT; offset++)
556 		if (priv->leds[offset].gpio)
557 			gpiochip_free_own_desc(priv->leds[offset].gpio);
558 	return ret;
559 }
560 
fpc202_probe_port(struct fpc202_priv * priv,struct device_node * i2c_handle,int port_id)561 static int fpc202_probe_port(struct fpc202_priv *priv, struct device_node *i2c_handle, int port_id)
562 {
563 	u16 aliases[FPC202_ALIASES_PER_PORT] = { };
564 	struct device *dev = &priv->client->dev;
565 	struct i2c_atr_adap_desc desc = { };
566 	int ret = 0;
567 
568 	desc.chan_id = port_id;
569 	desc.parent = dev;
570 	desc.bus_handle = of_fwnode_handle(i2c_handle);
571 	desc.num_aliases = FPC202_ALIASES_PER_PORT;
572 
573 	fpc202_fill_alias_table(priv->client, aliases, port_id);
574 	desc.aliases = aliases;
575 
576 	ret = i2c_atr_add_adapter(priv->atr, &desc);
577 	if (ret)
578 		return ret;
579 
580 	set_bit(port_id, priv->probed_ports);
581 
582 	ret = fpc202_write_dev_addr(priv, port_id, 0, FPC202_REG_DEV_INVALID);
583 	if (ret)
584 		return ret;
585 
586 	return fpc202_write_dev_addr(priv, port_id, 1, FPC202_REG_DEV_INVALID);
587 }
588 
fpc202_remove_port(struct fpc202_priv * priv,int port_id)589 static void fpc202_remove_port(struct fpc202_priv *priv, int port_id)
590 {
591 	i2c_atr_del_adapter(priv->atr, port_id);
592 	clear_bit(port_id, priv->probed_ports);
593 }
594 
fpc202_probe(struct i2c_client * client)595 static int fpc202_probe(struct i2c_client *client)
596 {
597 	struct device *dev = &client->dev;
598 	struct fpc202_priv *priv;
599 	int ret, port_id, led_id;
600 
601 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
602 	if (!priv)
603 		return -ENOMEM;
604 
605 	mutex_init(&priv->reg_dev_lock);
606 	mutex_init(&priv->led_mode_lock);
607 
608 	priv->client = client;
609 	i2c_set_clientdata(client, priv);
610 
611 	priv->en_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_HIGH);
612 	if (IS_ERR(priv->en_gpio)) {
613 		ret = PTR_ERR(priv->en_gpio);
614 		dev_err(dev, "failed to fetch enable GPIO! err %d\n", ret);
615 		goto destroy_mutex;
616 	}
617 
618 	priv->gpio.label = "gpio-fpc202";
619 	priv->gpio.base = -1;
620 	priv->gpio.direction_input = fpc202_gpio_direction_input;
621 	priv->gpio.direction_output = fpc202_gpio_direction_output;
622 	priv->gpio.set = fpc202_gpio_set;
623 	priv->gpio.get = fpc202_gpio_get;
624 	priv->gpio.ngpio = FPC202_GPIO_COUNT;
625 	priv->gpio.parent = dev;
626 	priv->gpio.owner = THIS_MODULE;
627 
628 	ret = gpiochip_add_data(&priv->gpio, priv);
629 	if (ret) {
630 		priv->gpio.parent = NULL;
631 		dev_err(dev, "failed to add gpiochip err %d\n", ret);
632 		goto disable_gpio;
633 	}
634 
635 	priv->atr = i2c_atr_new(client->adapter, dev, &fpc202_atr_ops, 2, 0);
636 	if (IS_ERR(priv->atr)) {
637 		ret = PTR_ERR(priv->atr);
638 		dev_err(dev, "failed to create i2c atr err %d\n", ret);
639 		goto disable_gpio;
640 	}
641 
642 	i2c_atr_set_driver_data(priv->atr, priv);
643 
644 	ret = fpc202_register_leds(priv);
645 	if (ret) {
646 		dev_err(dev, "Failed to register LEDs, err %d\n", ret);
647 		goto delete_atr;
648 	}
649 
650 	bitmap_zero(priv->probed_ports, FPC202_NUM_PORTS);
651 
652 	for_each_child_of_node_scoped(dev->of_node, i2c_handle) {
653 		ret = of_property_read_u32(i2c_handle, "reg", &port_id);
654 		if (ret) {
655 			if (ret == -EINVAL)
656 				continue;
657 
658 			dev_err(dev, "failed to read 'reg' property of child node, err %d\n", ret);
659 			goto unregister_chans;
660 		}
661 
662 		if (port_id >= FPC202_NUM_PORTS)
663 			continue;
664 
665 		ret = fpc202_probe_port(priv, i2c_handle, port_id);
666 		if (ret) {
667 			dev_err(dev, "Failed to probe port %d, err %d\n", port_id, ret);
668 			goto unregister_chans;
669 		}
670 	}
671 
672 	goto out;
673 
674 unregister_chans:
675 	for_each_set_bit(port_id, priv->probed_ports, FPC202_NUM_PORTS)
676 		fpc202_remove_port(priv, port_id);
677 
678 	for (led_id = 0; led_id < FPC202_LED_COUNT; led_id++)
679 		if (priv->leds[led_id].gpio)
680 			gpiochip_free_own_desc(priv->leds[led_id].gpio);
681 
682 	devres_release_group(&client->dev, fpc202_register_leds);
683 delete_atr:
684 	i2c_atr_delete(priv->atr);
685 disable_gpio:
686 	fpc202_set_enable(priv, 0);
687 	gpiochip_remove(&priv->gpio);
688 destroy_mutex:
689 	mutex_destroy(&priv->led_mode_lock);
690 	mutex_destroy(&priv->reg_dev_lock);
691 out:
692 	return ret;
693 }
694 
fpc202_remove(struct i2c_client * client)695 static void fpc202_remove(struct i2c_client *client)
696 {
697 	struct fpc202_priv *priv = i2c_get_clientdata(client);
698 	int port_id, led_id;
699 
700 	for_each_set_bit(port_id, priv->probed_ports, FPC202_NUM_PORTS)
701 		fpc202_remove_port(priv, port_id);
702 
703 	for (led_id = 0; led_id < FPC202_LED_COUNT; led_id++)
704 		if (priv->leds[led_id].gpio)
705 			gpiochip_free_own_desc(priv->leds[led_id].gpio);
706 
707 	/* Release led devices early so that blink handlers don't trigger. */
708 	devres_release_group(&client->dev, fpc202_register_leds);
709 
710 	mutex_destroy(&priv->led_mode_lock);
711 	mutex_destroy(&priv->reg_dev_lock);
712 
713 	i2c_atr_delete(priv->atr);
714 
715 	fpc202_set_enable(priv, 0);
716 	gpiochip_remove(&priv->gpio);
717 }
718 
719 static const struct of_device_id fpc202_of_match[] = {
720 	{ .compatible = "ti,fpc202" },
721 	{}
722 };
723 MODULE_DEVICE_TABLE(of, fpc202_of_match);
724 
725 static struct i2c_driver fpc202_driver = {
726 	.driver = {
727 		.name = "fpc202",
728 		.of_match_table = fpc202_of_match,
729 	},
730 	.probe = fpc202_probe,
731 	.remove = fpc202_remove,
732 };
733 
734 module_i2c_driver(fpc202_driver);
735 
736 MODULE_AUTHOR("Romain Gantois <romain.gantois@bootlin.com>");
737 MODULE_DESCRIPTION("TI FPC202 Dual Port Controller driver");
738 MODULE_LICENSE("GPL");
739 MODULE_IMPORT_NS("I2C_ATR");
740