Lines Matching +full:nxp +full:- +full:i
55 { .compatible = "nxp,pcf8574" },
56 { .compatible = "nxp,pcf8574a" },
57 { .compatible = "nxp,pca8574" },
58 { .compatible = "nxp,pca9670" },
59 { .compatible = "nxp,pca9672" },
60 { .compatible = "nxp,pca9674" },
61 { .compatible = "nxp,pcf8575" },
62 { .compatible = "nxp,pca8575" },
63 { .compatible = "nxp,pca9671" },
64 { .compatible = "nxp,pca9673" },
65 { .compatible = "nxp,pca9675" },
76 * that pin be used as an input; it's not an open-drain model, but acts
77 * a bit like one. This is described as "quasi-bidirectional"; read the
99 /*-------------------------------------------------------------------------*/
101 /* Talk to 8-bit I/O expander */
113 /* Talk to 16-bit I/O expander */
135 /*-------------------------------------------------------------------------*/
142 mutex_lock(&gpio->lock); in pcf857x_input()
143 gpio->out |= (1 << offset); in pcf857x_input()
144 status = gpio->write(gpio->client, gpio->out); in pcf857x_input()
145 mutex_unlock(&gpio->lock); in pcf857x_input()
155 value = gpio->read(gpio->client); in pcf857x_get()
165 mutex_lock(&gpio->lock); in pcf857x_output()
167 gpio->out |= bit; in pcf857x_output()
169 gpio->out &= ~bit; in pcf857x_output()
170 status = gpio->write(gpio->client, gpio->out); in pcf857x_output()
171 mutex_unlock(&gpio->lock); in pcf857x_output()
181 /*-------------------------------------------------------------------------*/
186 unsigned long change, i, status; in pcf857x_irq() local
188 status = gpio->read(gpio->client); in pcf857x_irq()
194 mutex_lock(&gpio->lock); in pcf857x_irq()
195 change = (gpio->status ^ status) & gpio->irq_enabled; in pcf857x_irq()
196 gpio->status = status; in pcf857x_irq()
197 mutex_unlock(&gpio->lock); in pcf857x_irq()
199 for_each_set_bit(i, &change, gpio->chip.ngpio) in pcf857x_irq()
200 handle_nested_irq(irq_find_mapping(gpio->chip.irq.domain, i)); in pcf857x_irq()
216 if (gpio->irq_parent) { in pcf857x_irq_set_wake()
217 error = irq_set_irq_wake(gpio->irq_parent, on); in pcf857x_irq_set_wake()
219 dev_dbg(&gpio->client->dev, in pcf857x_irq_set_wake()
221 gpio->irq_parent); in pcf857x_irq_set_wake()
222 gpio->irq_parent = 0; in pcf857x_irq_set_wake()
232 gpio->irq_enabled |= (1 << data->hwirq); in pcf857x_irq_enable()
239 gpio->irq_enabled &= ~(1 << data->hwirq); in pcf857x_irq_disable()
246 mutex_lock(&gpio->lock); in pcf857x_irq_bus_lock()
253 mutex_unlock(&gpio->lock); in pcf857x_irq_bus_sync_unlock()
256 /*-------------------------------------------------------------------------*/
261 struct pcf857x_platform_data *pdata = dev_get_platdata(&client->dev); in pcf857x_probe()
262 struct device_node *np = client->dev.of_node; in pcf857x_probe()
268 of_property_read_u32(np, "lines-initial-states", &n_latch); in pcf857x_probe()
270 n_latch = pdata->n_latch; in pcf857x_probe()
272 dev_dbg(&client->dev, "no platform data\n"); in pcf857x_probe()
275 gpio = devm_kzalloc(&client->dev, sizeof(*gpio), GFP_KERNEL); in pcf857x_probe()
277 return -ENOMEM; in pcf857x_probe()
279 mutex_init(&gpio->lock); in pcf857x_probe()
281 gpio->chip.base = pdata ? pdata->gpio_base : -1; in pcf857x_probe()
282 gpio->chip.can_sleep = true; in pcf857x_probe()
283 gpio->chip.parent = &client->dev; in pcf857x_probe()
284 gpio->chip.owner = THIS_MODULE; in pcf857x_probe()
285 gpio->chip.get = pcf857x_get; in pcf857x_probe()
286 gpio->chip.set = pcf857x_set; in pcf857x_probe()
287 gpio->chip.direction_input = pcf857x_input; in pcf857x_probe()
288 gpio->chip.direction_output = pcf857x_output; in pcf857x_probe()
289 gpio->chip.ngpio = id->driver_data; in pcf857x_probe()
292 * these parts, notably for output. It has a low-resolution in pcf857x_probe()
302 if (gpio->chip.ngpio == 8) { in pcf857x_probe()
303 gpio->write = i2c_write_le8; in pcf857x_probe()
304 gpio->read = i2c_read_le8; in pcf857x_probe()
306 if (!i2c_check_functionality(client->adapter, in pcf857x_probe()
308 status = -EIO; in pcf857x_probe()
320 } else if (gpio->chip.ngpio == 16) { in pcf857x_probe()
321 gpio->write = i2c_write_le16; in pcf857x_probe()
322 gpio->read = i2c_read_le16; in pcf857x_probe()
324 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in pcf857x_probe()
325 status = -EIO; in pcf857x_probe()
332 dev_dbg(&client->dev, "unsupported number of gpios\n"); in pcf857x_probe()
333 status = -EINVAL; in pcf857x_probe()
339 gpio->chip.label = client->name; in pcf857x_probe()
341 gpio->client = client; in pcf857x_probe()
344 /* NOTE: these chips have strange "quasi-bidirectional" I/O pins. in pcf857x_probe()
356 * our software copy of the "latch" then matches the chip's all-ones in pcf857x_probe()
359 gpio->out = ~n_latch; in pcf857x_probe()
360 gpio->status = gpio->out; in pcf857x_probe()
362 status = devm_gpiochip_add_data(&client->dev, &gpio->chip, gpio); in pcf857x_probe()
367 if (client->irq) { in pcf857x_probe()
368 gpio->irqchip.name = "pcf857x", in pcf857x_probe()
369 gpio->irqchip.irq_enable = pcf857x_irq_enable, in pcf857x_probe()
370 gpio->irqchip.irq_disable = pcf857x_irq_disable, in pcf857x_probe()
371 gpio->irqchip.irq_ack = noop, in pcf857x_probe()
372 gpio->irqchip.irq_mask = noop, in pcf857x_probe()
373 gpio->irqchip.irq_unmask = noop, in pcf857x_probe()
374 gpio->irqchip.irq_set_wake = pcf857x_irq_set_wake, in pcf857x_probe()
375 gpio->irqchip.irq_bus_lock = pcf857x_irq_bus_lock, in pcf857x_probe()
376 gpio->irqchip.irq_bus_sync_unlock = pcf857x_irq_bus_sync_unlock, in pcf857x_probe()
377 status = gpiochip_irqchip_add_nested(&gpio->chip, in pcf857x_probe()
378 &gpio->irqchip, in pcf857x_probe()
382 dev_err(&client->dev, "cannot add irqchip\n"); in pcf857x_probe()
386 status = devm_request_threaded_irq(&client->dev, client->irq, in pcf857x_probe()
389 dev_name(&client->dev), gpio); in pcf857x_probe()
393 gpiochip_set_nested_irqchip(&gpio->chip, &gpio->irqchip, in pcf857x_probe()
394 client->irq); in pcf857x_probe()
395 gpio->irq_parent = client->irq; in pcf857x_probe()
401 if (pdata && pdata->setup) { in pcf857x_probe()
402 status = pdata->setup(client, in pcf857x_probe()
403 gpio->chip.base, gpio->chip.ngpio, in pcf857x_probe()
404 pdata->context); in pcf857x_probe()
406 dev_warn(&client->dev, "setup --> %d\n", status); in pcf857x_probe()
409 dev_info(&client->dev, "probed\n"); in pcf857x_probe()
414 dev_dbg(&client->dev, "probe error %d for '%s'\n", status, in pcf857x_probe()
415 client->name); in pcf857x_probe()
422 struct pcf857x_platform_data *pdata = dev_get_platdata(&client->dev); in pcf857x_remove()
426 if (pdata && pdata->teardown) { in pcf857x_remove()
427 status = pdata->teardown(client, in pcf857x_remove()
428 gpio->chip.base, gpio->chip.ngpio, in pcf857x_remove()
429 pdata->context); in pcf857x_remove()
431 dev_err(&client->dev, "%s --> %d\n", in pcf857x_remove()
444 /* Drive all the I/O lines high */ in pcf857x_shutdown()
445 gpio->write(gpio->client, BIT(gpio->chip.ngpio) - 1); in pcf857x_shutdown()