Lines Matching +full:client +full:- +full:id

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it>
6 * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it>
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 <bkuschak@yahoo.com>
45 #include <linux/i2c-mux.h>
54 #include <dt-bindings/mux/mux.h>
89 struct i2c_device_identity id; member
99 struct i2c_client *client; member
112 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
117 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
126 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
136 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
141 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
148 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
154 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
161 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
167 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
174 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
180 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
185 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
191 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
196 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
201 .id = {
210 .id = {
218 .id = {
227 .id = {
283 struct i2c_client *client, u8 val) in pca954x_reg_write() argument
287 return __i2c_smbus_xfer(adap, client->addr, client->flags, in pca954x_reg_write()
295 if (data->chip->muxtype == pca954x_ismux) in pca954x_regval()
296 return chan | data->chip->enable; in pca954x_regval()
304 struct i2c_client *client = data->client; in pca954x_select_chan() local
310 if (data->last_chan != regval) { in pca954x_select_chan()
311 ret = pca954x_reg_write(muxc->parent, client, regval); in pca954x_select_chan()
312 data->last_chan = ret < 0 ? 0 : regval; in pca954x_select_chan()
321 struct i2c_client *client = data->client; in pca954x_deselect_mux() local
324 idle_state = READ_ONCE(data->idle_state); in pca954x_deselect_mux()
331 data->last_chan = 0; in pca954x_deselect_mux()
332 return pca954x_reg_write(muxc->parent, client, in pca954x_deselect_mux()
333 data->last_chan); in pca954x_deselect_mux()
336 /* otherwise leave as-is */ in pca954x_deselect_mux()
345 struct i2c_client *client = to_i2c_client(dev); in idle_state_show() local
346 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in idle_state_show()
349 return sprintf(buf, "%d\n", READ_ONCE(data->idle_state)); in idle_state_show()
356 struct i2c_client *client = to_i2c_client(dev); in idle_state_store() local
357 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in idle_state_store()
367 (val < 0 || val >= data->chip->nchans)) in idle_state_store()
368 return -EINVAL; in idle_state_store()
370 i2c_lock_bus(muxc->parent, I2C_LOCK_SEGMENT); in idle_state_store()
372 WRITE_ONCE(data->idle_state, val); in idle_state_store()
377 if (data->last_chan || val != MUX_IDLE_DISCONNECT) in idle_state_store()
380 i2c_unlock_bus(muxc->parent, I2C_LOCK_SEGMENT); in idle_state_store()
393 ret = i2c_smbus_read_byte(data->client); in pca954x_irq_handler()
397 pending = (ret >> PCA954X_IRQ_OFFSET) & (BIT(data->chip->nchans) - 1); in pca954x_irq_handler()
398 for_each_set_bit(i, &pending, data->chip->nchans) in pca954x_irq_handler()
399 handle_nested_irq(irq_linear_revmap(data->irq, i)); in pca954x_irq_handler()
407 return -EINVAL; in pca954x_irq_set_type()
412 .name = "i2c-mux-pca954x",
419 struct i2c_client *client = data->client; in pca954x_irq_setup() local
422 if (!data->chip->has_irq || client->irq <= 0) in pca954x_irq_setup()
425 raw_spin_lock_init(&data->lock); in pca954x_irq_setup()
427 data->irq = irq_domain_add_linear(client->dev.of_node, in pca954x_irq_setup()
428 data->chip->nchans, in pca954x_irq_setup()
430 if (!data->irq) in pca954x_irq_setup()
431 return -ENODEV; in pca954x_irq_setup()
433 for (c = 0; c < data->chip->nchans; c++) { in pca954x_irq_setup()
434 irq = irq_create_mapping(data->irq, c); in pca954x_irq_setup()
436 dev_err(&client->dev, "failed irq create map\n"); in pca954x_irq_setup()
437 return -EINVAL; in pca954x_irq_setup()
452 regulator_disable(data->supply); in pca954x_cleanup()
454 if (data->irq) { in pca954x_cleanup()
455 for (c = 0; c < data->chip->nchans; c++) { in pca954x_cleanup()
456 irq = irq_find_mapping(data->irq, c); in pca954x_cleanup()
459 irq_domain_remove(data->irq); in pca954x_cleanup()
464 static int pca954x_init(struct i2c_client *client, struct pca954x *data) in pca954x_init() argument
468 if (data->idle_state >= 0) in pca954x_init()
469 data->last_chan = pca954x_regval(data, data->idle_state); in pca954x_init()
471 data->last_chan = 0; /* Disconnect multiplexer */ in pca954x_init()
473 ret = i2c_smbus_write_byte(client, data->last_chan); in pca954x_init()
475 data->last_chan = 0; in pca954x_init()
483 static int pca954x_probe(struct i2c_client *client) in pca954x_probe() argument
485 const struct i2c_device_id *id = i2c_client_get_device_id(client); in pca954x_probe() local
486 struct i2c_adapter *adap = client->adapter; in pca954x_probe()
487 struct device *dev = &client->dev; in pca954x_probe()
495 return -ENODEV; in pca954x_probe()
500 return -ENOMEM; in pca954x_probe()
503 i2c_set_clientdata(client, muxc); in pca954x_probe()
504 data->client = client; in pca954x_probe()
506 data->supply = devm_regulator_get(dev, "vdd"); in pca954x_probe()
507 if (IS_ERR(data->supply)) in pca954x_probe()
508 return dev_err_probe(dev, PTR_ERR(data->supply), in pca954x_probe()
511 ret = regulator_enable(data->supply); in pca954x_probe()
529 data->chip = device_get_match_data(dev); in pca954x_probe()
530 if (!data->chip) in pca954x_probe()
531 data->chip = &chips[id->driver_data]; in pca954x_probe()
533 if (data->chip->id.manufacturer_id != I2C_DEVICE_ID_NONE) { in pca954x_probe()
534 struct i2c_device_identity id; in pca954x_probe() local
536 ret = i2c_get_device_id(client, &id); in pca954x_probe()
537 if (ret && ret != -EOPNOTSUPP) in pca954x_probe()
541 (id.manufacturer_id != data->chip->id.manufacturer_id || in pca954x_probe()
542 id.part_id != data->chip->id.part_id)) { in pca954x_probe()
543 dev_warn(dev, "unexpected device id %03x-%03x-%x\n", in pca954x_probe()
544 id.manufacturer_id, id.part_id, in pca954x_probe()
545 id.die_revision); in pca954x_probe()
546 ret = -ENODEV; in pca954x_probe()
551 data->idle_state = MUX_IDLE_AS_IS; in pca954x_probe()
552 if (device_property_read_u32(dev, "idle-state", &data->idle_state)) { in pca954x_probe()
553 if (device_property_read_bool(dev, "i2c-mux-idle-disconnect")) in pca954x_probe()
554 data->idle_state = MUX_IDLE_DISCONNECT; in pca954x_probe()
563 ret = pca954x_init(client, data); in pca954x_probe()
566 ret = -ENODEV; in pca954x_probe()
575 for (num = 0; num < data->chip->nchans; num++) { in pca954x_probe()
581 if (data->irq) { in pca954x_probe()
582 ret = devm_request_threaded_irq(dev, data->client->irq, in pca954x_probe()
597 num, data->chip->muxtype == pca954x_ismux in pca954x_probe()
598 ? "mux" : "switch", client->name); in pca954x_probe()
607 static void pca954x_remove(struct i2c_client *client) in pca954x_remove() argument
609 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in pca954x_remove()
611 device_remove_file(&client->dev, &dev_attr_idle_state); in pca954x_remove()
618 struct i2c_client *client = to_i2c_client(dev); in pca954x_resume() local
619 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in pca954x_resume()
623 ret = pca954x_init(client, data); in pca954x_resume()
625 dev_err(&client->dev, "failed to verify mux presence\n"); in pca954x_resume()