Lines Matching +full:client +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2008-2009 Rodolfo Giometti <[email protected]>
6 * Copyright (c) 2008-2009 Eurotech S.p.A. <[email protected]>
21 * single 8-bit register. The upstream "parent" bus fans out to two,
24 * mux can select only one sub-bus at a time; a switch can select any
36 * i2c-virtual_cb.c from Brian Kuschak <[email protected]>
45 #include <linux/i2c-mux.h>
55 #include <dt-bindings/mux/mux.h>
104 struct i2c_device_identity id; member
114 struct i2c_client *client; member
130 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
135 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
144 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
154 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
159 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
166 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
172 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
179 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
185 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
192 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
198 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
203 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
209 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
214 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
219 .id = {
228 .id = {
236 .id = {
245 .id = {
301 struct i2c_client *client, u8 val) in pca954x_reg_write() argument
305 return __i2c_smbus_xfer(adap, client->addr, client->flags, in pca954x_reg_write()
313 if (data->chip->muxtype == pca954x_ismux) in pca954x_regval()
314 return chan | data->chip->enable; in pca954x_regval()
322 struct i2c_client *client = data->client; in pca954x_select_chan() local
328 if (data->last_chan != regval) { in pca954x_select_chan()
329 ret = pca954x_reg_write(muxc->parent, client, regval); in pca954x_select_chan()
330 data->last_chan = ret < 0 ? 0 : regval; in pca954x_select_chan()
339 struct i2c_client *client = data->client; in pca954x_deselect_mux() local
342 idle_state = READ_ONCE(data->idle_state); in pca954x_deselect_mux()
349 data->last_chan = 0; in pca954x_deselect_mux()
350 return pca954x_reg_write(muxc->parent, client, in pca954x_deselect_mux()
351 data->last_chan); in pca954x_deselect_mux()
354 /* otherwise leave as-is */ in pca954x_deselect_mux()
363 struct i2c_client *client = to_i2c_client(dev); in idle_state_show() local
364 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in idle_state_show()
367 return sprintf(buf, "%d\n", READ_ONCE(data->idle_state)); in idle_state_show()
374 struct i2c_client *client = to_i2c_client(dev); in idle_state_store() local
375 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in idle_state_store()
385 (val < 0 || val >= data->chip->nchans)) in idle_state_store()
386 return -EINVAL; in idle_state_store()
388 i2c_lock_bus(muxc->parent, I2C_LOCK_SEGMENT); in idle_state_store()
390 WRITE_ONCE(data->idle_state, val); in idle_state_store()
395 if (data->last_chan || val != MUX_IDLE_DISCONNECT) in idle_state_store()
398 i2c_unlock_bus(muxc->parent, I2C_LOCK_SEGMENT); in idle_state_store()
411 ret = i2c_smbus_read_byte(data->client); in pca954x_irq_handler()
415 pending = (ret >> PCA954X_IRQ_OFFSET) & (BIT(data->chip->nchans) - 1); in pca954x_irq_handler()
416 for_each_set_bit(i, &pending, data->chip->nchans) in pca954x_irq_handler()
417 handle_nested_irq(irq_linear_revmap(data->irq, i)); in pca954x_irq_handler()
425 return -EINVAL; in pca954x_irq_set_type()
430 .name = "i2c-mux-pca954x",
437 struct i2c_client *client = data->client; in pca954x_irq_setup() local
440 if (!data->chip->has_irq || client->irq <= 0) in pca954x_irq_setup()
443 raw_spin_lock_init(&data->lock); in pca954x_irq_setup()
445 data->irq = irq_domain_add_linear(client->dev.of_node, in pca954x_irq_setup()
446 data->chip->nchans, in pca954x_irq_setup()
448 if (!data->irq) in pca954x_irq_setup()
449 return -ENODEV; in pca954x_irq_setup()
451 for (c = 0; c < data->chip->nchans; c++) { in pca954x_irq_setup()
452 irq = irq_create_mapping(data->irq, c); in pca954x_irq_setup()
454 dev_err(&client->dev, "failed irq create map\n"); in pca954x_irq_setup()
455 return -EINVAL; in pca954x_irq_setup()
470 regulator_disable(data->supply); in pca954x_cleanup()
472 if (data->irq) { in pca954x_cleanup()
473 for (c = 0; c < data->chip->nchans; c++) { in pca954x_cleanup()
474 irq = irq_find_mapping(data->irq, c); in pca954x_cleanup()
477 irq_domain_remove(data->irq); in pca954x_cleanup()
482 static int pca954x_init(struct i2c_client *client, struct pca954x *data) in pca954x_init() argument
486 if (data->idle_state >= 0) in pca954x_init()
487 data->last_chan = pca954x_regval(data, data->idle_state); in pca954x_init()
489 data->last_chan = 0; /* Disconnect multiplexer */ in pca954x_init()
491 if (device_is_compatible(&client->dev, "maxim,max7357")) { in pca954x_init()
492 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { in pca954x_init()
500 if (device_property_read_bool(&client->dev, "maxim,isolate-stuck-channel")) in pca954x_init()
502 if (device_property_read_bool(&client->dev, in pca954x_init()
503 "maxim,send-flush-out-sequence")) in pca954x_init()
505 if (device_property_read_bool(&client->dev, in pca954x_init()
506 "maxim,preconnection-wiggle-test-enable")) in pca954x_init()
509 ret = i2c_smbus_write_byte_data(client, data->last_chan, conf); in pca954x_init()
511 dev_warn(&client->dev, "Write byte data not supported." in pca954x_init()
513 ret = i2c_smbus_write_byte(client, data->last_chan); in pca954x_init()
516 ret = i2c_smbus_write_byte(client, data->last_chan); in pca954x_init()
520 data->last_chan = 0; in pca954x_init()
527 data->reset_cont = devm_reset_control_get_optional_shared(dev, NULL); in pca954x_get_reset()
528 if (IS_ERR(data->reset_cont)) in pca954x_get_reset()
529 return dev_err_probe(dev, PTR_ERR(data->reset_cont), in pca954x_get_reset()
531 else if (data->reset_cont) in pca954x_get_reset()
535 * fallback to legacy reset-gpios in pca954x_get_reset()
537 data->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); in pca954x_get_reset()
538 if (IS_ERR(data->reset_gpio)) { in pca954x_get_reset()
539 return dev_err_probe(dev, PTR_ERR(data->reset_gpio), in pca954x_get_reset()
548 if (data->reset_cont) in pca954x_reset_deassert()
549 reset_control_deassert(data->reset_cont); in pca954x_reset_deassert()
551 gpiod_set_value_cansleep(data->reset_gpio, 0); in pca954x_reset_deassert()
557 static int pca954x_probe(struct i2c_client *client) in pca954x_probe() argument
559 const struct i2c_device_id *id = i2c_client_get_device_id(client); in pca954x_probe() local
560 struct i2c_adapter *adap = client->adapter; in pca954x_probe()
561 struct device *dev = &client->dev; in pca954x_probe()
568 return -ENODEV; in pca954x_probe()
573 return -ENOMEM; in pca954x_probe()
576 i2c_set_clientdata(client, muxc); in pca954x_probe()
577 data->client = client; in pca954x_probe()
579 data->supply = devm_regulator_get(dev, "vdd"); in pca954x_probe()
580 if (IS_ERR(data->supply)) in pca954x_probe()
581 return dev_err_probe(dev, PTR_ERR(data->supply), in pca954x_probe()
584 ret = regulator_enable(data->supply); in pca954x_probe()
593 if (data->reset_cont || data->reset_gpio) { in pca954x_probe()
600 data->chip = device_get_match_data(dev); in pca954x_probe()
601 if (!data->chip) in pca954x_probe()
602 data->chip = &chips[id->driver_data]; in pca954x_probe()
604 if (data->chip->id.manufacturer_id != I2C_DEVICE_ID_NONE) { in pca954x_probe()
605 struct i2c_device_identity id; in pca954x_probe() local
607 ret = i2c_get_device_id(client, &id); in pca954x_probe()
608 if (ret && ret != -EOPNOTSUPP) in pca954x_probe()
612 (id.manufacturer_id != data->chip->id.manufacturer_id || in pca954x_probe()
613 id.part_id != data->chip->id.part_id)) { in pca954x_probe()
614 dev_warn(dev, "unexpected device id %03x-%03x-%x\n", in pca954x_probe()
615 id.manufacturer_id, id.part_id, in pca954x_probe()
616 id.die_revision); in pca954x_probe()
617 ret = -ENODEV; in pca954x_probe()
622 data->idle_state = MUX_IDLE_AS_IS; in pca954x_probe()
623 if (device_property_read_u32(dev, "idle-state", &data->idle_state)) { in pca954x_probe()
624 if (device_property_read_bool(dev, "i2c-mux-idle-disconnect")) in pca954x_probe()
625 data->idle_state = MUX_IDLE_DISCONNECT; in pca954x_probe()
634 ret = pca954x_init(client, data); in pca954x_probe()
637 ret = -ENODEV; in pca954x_probe()
646 for (num = 0; num < data->chip->nchans; num++) { in pca954x_probe()
652 if (data->irq) { in pca954x_probe()
653 ret = devm_request_threaded_irq(dev, data->client->irq, in pca954x_probe()
668 num, data->chip->muxtype == pca954x_ismux in pca954x_probe()
669 ? "mux" : "switch", client->name); in pca954x_probe()
678 static void pca954x_remove(struct i2c_client *client) in pca954x_remove() argument
680 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in pca954x_remove()
682 device_remove_file(&client->dev, &dev_attr_idle_state); in pca954x_remove()
689 struct i2c_client *client = to_i2c_client(dev); in pca954x_resume() local
690 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in pca954x_resume()
694 ret = pca954x_init(client, data); in pca954x_resume()
696 dev_err(&client->dev, "failed to verify mux presence\n"); in pca954x_resume()