• Home
  • Raw
  • Download

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

4  * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it>
5 * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it>
14 * single 8-bit register. The upstream "parent" bus fans out to two,
17 * mux can select only one sub-bus at a time; a switch can select any
29 * i2c-virtual_cb.c from Brian Kuschak <bkuschak@yahoo.com>
42 #include <linux/i2c-mux.h>
81 struct i2c_device_identity id; member
89 struct i2c_client *client; member
102 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
109 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
115 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
122 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
128 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
133 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
139 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
144 .id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
149 .id = {
158 .id = {
166 .id = {
175 .id = {
221 struct i2c_client *client, u8 val) in pca954x_reg_write() argument
225 return __i2c_smbus_xfer(adap, client->addr, client->flags, in pca954x_reg_write()
233 struct i2c_client *client = data->client; in pca954x_select_chan() local
234 const struct chip_desc *chip = data->chip; in pca954x_select_chan()
239 if (chip->muxtype == pca954x_ismux) in pca954x_select_chan()
240 regval = chan | chip->enable; in pca954x_select_chan()
245 if (data->last_chan != regval) { in pca954x_select_chan()
246 ret = pca954x_reg_write(muxc->parent, client, regval); in pca954x_select_chan()
247 data->last_chan = ret < 0 ? 0 : regval; in pca954x_select_chan()
256 struct i2c_client *client = data->client; in pca954x_deselect_mux() local
258 if (!(data->deselect & (1 << chan))) in pca954x_deselect_mux()
262 data->last_chan = 0; in pca954x_deselect_mux()
263 return pca954x_reg_write(muxc->parent, client, data->last_chan); in pca954x_deselect_mux()
272 ret = i2c_smbus_read_byte(data->client); in pca954x_irq_handler()
276 for (i = 0; i < data->chip->nchans; i++) { in pca954x_irq_handler()
278 child_irq = irq_linear_revmap(data->irq, i); in pca954x_irq_handler()
289 return -EINVAL; in pca954x_irq_set_type()
294 .name = "i2c-mux-pca954x",
301 struct i2c_client *client = data->client; in pca954x_irq_setup() local
304 if (!data->chip->has_irq || client->irq <= 0) in pca954x_irq_setup()
307 raw_spin_lock_init(&data->lock); in pca954x_irq_setup()
309 data->irq = irq_domain_add_linear(client->dev.of_node, in pca954x_irq_setup()
310 data->chip->nchans, in pca954x_irq_setup()
312 if (!data->irq) in pca954x_irq_setup()
313 return -ENODEV; in pca954x_irq_setup()
315 for (c = 0; c < data->chip->nchans; c++) { in pca954x_irq_setup()
316 irq = irq_create_mapping(data->irq, c); in pca954x_irq_setup()
318 dev_err(&client->dev, "failed irq create map\n"); in pca954x_irq_setup()
319 return -EINVAL; in pca954x_irq_setup()
334 if (data->irq) { in pca954x_cleanup()
335 for (c = 0; c < data->chip->nchans; c++) { in pca954x_cleanup()
336 irq = irq_find_mapping(data->irq, c); in pca954x_cleanup()
339 irq_domain_remove(data->irq); in pca954x_cleanup()
347 static int pca954x_probe(struct i2c_client *client, in pca954x_probe() argument
348 const struct i2c_device_id *id) in pca954x_probe() argument
350 struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); in pca954x_probe()
351 struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev); in pca954x_probe()
352 struct device *dev = &client->dev; in pca954x_probe()
353 struct device_node *np = dev->of_node; in pca954x_probe()
362 return -ENODEV; in pca954x_probe()
367 return -ENOMEM; in pca954x_probe()
370 i2c_set_clientdata(client, muxc); in pca954x_probe()
371 data->client = client; in pca954x_probe()
384 data->chip = of_device_get_match_data(dev); in pca954x_probe()
385 if (!data->chip) in pca954x_probe()
386 data->chip = &chips[id->driver_data]; in pca954x_probe()
388 if (data->chip->id.manufacturer_id != I2C_DEVICE_ID_NONE) { in pca954x_probe()
389 struct i2c_device_identity id; in pca954x_probe() local
391 ret = i2c_get_device_id(client, &id); in pca954x_probe()
392 if (ret && ret != -EOPNOTSUPP) in pca954x_probe()
396 (id.manufacturer_id != data->chip->id.manufacturer_id || in pca954x_probe()
397 id.part_id != data->chip->id.part_id)) { in pca954x_probe()
398 dev_warn(dev, "unexpected device id %03x-%03x-%x\n", in pca954x_probe()
399 id.manufacturer_id, id.part_id, in pca954x_probe()
400 id.die_revision); in pca954x_probe()
401 return -ENODEV; in pca954x_probe()
409 if (i2c_smbus_write_byte(client, 0) < 0) { in pca954x_probe()
411 return -ENODEV; in pca954x_probe()
414 data->last_chan = 0; /* force the first selection */ in pca954x_probe()
417 of_property_read_bool(np, "i2c-mux-idle-disconnect"); in pca954x_probe()
424 for (num = 0; num < data->chip->nchans; num++) { in pca954x_probe()
430 if (num < pdata->num_modes) { in pca954x_probe()
432 force = pdata->modes[num].adap_id; in pca954x_probe()
433 class = pdata->modes[num].class; in pca954x_probe()
437 idle_disconnect_pd = pdata->modes[num].deselect_on_exit; in pca954x_probe()
439 data->deselect |= (idle_disconnect_pd || in pca954x_probe()
447 if (data->irq) { in pca954x_probe()
448 ret = devm_request_threaded_irq(dev, data->client->irq, in pca954x_probe()
457 num, data->chip->muxtype == pca954x_ismux in pca954x_probe()
458 ? "mux" : "switch", client->name); in pca954x_probe()
467 static int pca954x_remove(struct i2c_client *client) in pca954x_remove() argument
469 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in pca954x_remove()
478 struct i2c_client *client = to_i2c_client(dev); in pca954x_resume() local
479 struct i2c_mux_core *muxc = i2c_get_clientdata(client); in pca954x_resume()
482 data->last_chan = 0; in pca954x_resume()
483 return i2c_smbus_write_byte(client, 0); in pca954x_resume()