Lines Matching +full:preconnection +full:- +full:wiggle +full:- +full:test +full:- +full:enable

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>
98 u8 enable; /* used for muxes only */ member
163 .enable = 0x4,
170 .enable = 0x4,
176 .enable = 0x4,
189 .enable = 0x4,
207 .enable = 0x8,
226 .enable = 0x8,
243 .enable = 0x4,
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()
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()
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()
367 return sprintf(buf, "%d\n", READ_ONCE(data->idle_state)); in idle_state_show()
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()
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()
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()
512 "Cannot enable enhanced mode features\n"); 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()
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()
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()
587 "Failed to enable vdd supply\n"); 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()
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()
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()
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()
682 device_remove_file(&client->dev, &dev_attr_idle_state); in pca954x_remove()
696 dev_err(&client->dev, "failed to verify mux presence\n"); in pca954x_resume()