• Home
  • Raw
  • Download

Lines Matching +full:nxp +full:- +full:i

4  * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it>
5 * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it>
8 * chips made by NXP Semiconductors.
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>
201 { .compatible = "nxp,pca9540", .data = &chips[pca_9540] },
202 { .compatible = "nxp,pca9542", .data = &chips[pca_9542] },
203 { .compatible = "nxp,pca9543", .data = &chips[pca_9543] },
204 { .compatible = "nxp,pca9544", .data = &chips[pca_9544] },
205 { .compatible = "nxp,pca9545", .data = &chips[pca_9545] },
206 { .compatible = "nxp,pca9546", .data = &chips[pca_9546] },
207 { .compatible = "nxp,pca9547", .data = &chips[pca_9547] },
208 { .compatible = "nxp,pca9548", .data = &chips[pca_9548] },
209 { .compatible = "nxp,pca9846", .data = &chips[pca_9846] },
210 { .compatible = "nxp,pca9847", .data = &chips[pca_9847] },
211 { .compatible = "nxp,pca9848", .data = &chips[pca_9848] },
212 { .compatible = "nxp,pca9849", .data = &chips[pca_9849] },
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()
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()
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()
270 int ret, i, handled = 0; in pca954x_irq_handler() local
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()
277 if (ret & BIT(PCA954X_IRQ_OFFSET + 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()
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()
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()
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()
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()
401 return -ENODEV; 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()
482 data->last_chan = 0; in pca954x_resume()