Lines Matching refs:adnp
23 struct adnp { struct
39 static int adnp_read(struct adnp *adnp, unsigned offset, uint8_t *value) in adnp_read() argument
43 err = i2c_smbus_read_byte_data(adnp->client, offset); in adnp_read()
45 dev_err(adnp->gpio.parent, "%s failed: %d\n", in adnp_read()
54 static int adnp_write(struct adnp *adnp, unsigned offset, uint8_t value) in adnp_write() argument
58 err = i2c_smbus_write_byte_data(adnp->client, offset, value); in adnp_write()
60 dev_err(adnp->gpio.parent, "%s failed: %d\n", in adnp_write()
70 struct adnp *adnp = gpiochip_get_data(chip); in adnp_gpio_get() local
71 unsigned int reg = offset >> adnp->reg_shift; in adnp_gpio_get()
76 err = adnp_read(adnp, GPIO_PLR(adnp) + reg, &value); in adnp_gpio_get()
83 static void __adnp_gpio_set(struct adnp *adnp, unsigned offset, int value) in __adnp_gpio_set() argument
85 unsigned int reg = offset >> adnp->reg_shift; in __adnp_gpio_set()
90 err = adnp_read(adnp, GPIO_PLR(adnp) + reg, &val); in __adnp_gpio_set()
99 adnp_write(adnp, GPIO_PLR(adnp) + reg, val); in __adnp_gpio_set()
104 struct adnp *adnp = gpiochip_get_data(chip); in adnp_gpio_set() local
106 mutex_lock(&adnp->i2c_lock); in adnp_gpio_set()
107 __adnp_gpio_set(adnp, offset, value); in adnp_gpio_set()
108 mutex_unlock(&adnp->i2c_lock); in adnp_gpio_set()
113 struct adnp *adnp = gpiochip_get_data(chip); in adnp_gpio_direction_input() local
114 unsigned int reg = offset >> adnp->reg_shift; in adnp_gpio_direction_input()
119 mutex_lock(&adnp->i2c_lock); in adnp_gpio_direction_input()
121 err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &value); in adnp_gpio_direction_input()
127 err = adnp_write(adnp, GPIO_DDR(adnp) + reg, value); in adnp_gpio_direction_input()
131 err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &value); in adnp_gpio_direction_input()
141 mutex_unlock(&adnp->i2c_lock); in adnp_gpio_direction_input()
148 struct adnp *adnp = gpiochip_get_data(chip); in adnp_gpio_direction_output() local
149 unsigned int reg = offset >> adnp->reg_shift; in adnp_gpio_direction_output()
154 mutex_lock(&adnp->i2c_lock); in adnp_gpio_direction_output()
156 err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &val); in adnp_gpio_direction_output()
162 err = adnp_write(adnp, GPIO_DDR(adnp) + reg, val); in adnp_gpio_direction_output()
166 err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &val); in adnp_gpio_direction_output()
175 __adnp_gpio_set(adnp, offset, value); in adnp_gpio_direction_output()
179 mutex_unlock(&adnp->i2c_lock); in adnp_gpio_direction_output()
185 struct adnp *adnp = gpiochip_get_data(chip); in adnp_gpio_dbg_show() local
186 unsigned int num_regs = 1 << adnp->reg_shift, i, j; in adnp_gpio_dbg_show()
192 mutex_lock(&adnp->i2c_lock); in adnp_gpio_dbg_show()
194 err = adnp_read(adnp, GPIO_DDR(adnp) + i, &ddr); in adnp_gpio_dbg_show()
198 err = adnp_read(adnp, GPIO_PLR(adnp) + i, &plr); in adnp_gpio_dbg_show()
202 err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier); in adnp_gpio_dbg_show()
206 err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr); in adnp_gpio_dbg_show()
210 mutex_unlock(&adnp->i2c_lock); in adnp_gpio_dbg_show()
213 unsigned int bit = (i << adnp->reg_shift) + j; in adnp_gpio_dbg_show()
239 mutex_unlock(&adnp->i2c_lock); in adnp_gpio_dbg_show()
242 static int adnp_gpio_setup(struct adnp *adnp, unsigned int num_gpios) in adnp_gpio_setup() argument
244 struct gpio_chip *chip = &adnp->gpio; in adnp_gpio_setup()
247 adnp->reg_shift = get_count_order(num_gpios) - 3; in adnp_gpio_setup()
260 chip->label = adnp->client->name; in adnp_gpio_setup()
261 chip->parent = &adnp->client->dev; in adnp_gpio_setup()
265 err = devm_gpiochip_add_data(&adnp->client->dev, chip, adnp); in adnp_gpio_setup()
274 struct adnp *adnp = data; in adnp_irq() local
277 num_regs = 1 << adnp->reg_shift; in adnp_irq()
280 unsigned int base = i << adnp->reg_shift, bit; in adnp_irq()
285 mutex_lock(&adnp->i2c_lock); in adnp_irq()
287 err = adnp_read(adnp, GPIO_PLR(adnp) + i, &level); in adnp_irq()
289 mutex_unlock(&adnp->i2c_lock); in adnp_irq()
293 err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr); in adnp_irq()
295 mutex_unlock(&adnp->i2c_lock); in adnp_irq()
299 err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier); in adnp_irq()
301 mutex_unlock(&adnp->i2c_lock); in adnp_irq()
305 mutex_unlock(&adnp->i2c_lock); in adnp_irq()
308 changed = level ^ adnp->irq_level[i]; in adnp_irq()
311 pending = changed & ((adnp->irq_fall[i] & ~level) | in adnp_irq()
312 (adnp->irq_rise[i] & level)); in adnp_irq()
315 pending |= (adnp->irq_high[i] & level) | in adnp_irq()
316 (adnp->irq_low[i] & ~level); in adnp_irq()
323 child_irq = irq_find_mapping(adnp->gpio.irq.domain, in adnp_irq()
335 struct adnp *adnp = gpiochip_get_data(gc); in adnp_irq_mask() local
336 unsigned int reg = d->hwirq >> adnp->reg_shift; in adnp_irq_mask()
339 adnp->irq_enable[reg] &= ~BIT(pos); in adnp_irq_mask()
345 struct adnp *adnp = gpiochip_get_data(gc); in adnp_irq_unmask() local
346 unsigned int reg = d->hwirq >> adnp->reg_shift; in adnp_irq_unmask()
349 adnp->irq_enable[reg] |= BIT(pos); in adnp_irq_unmask()
355 struct adnp *adnp = gpiochip_get_data(gc); in adnp_irq_set_type() local
356 unsigned int reg = d->hwirq >> adnp->reg_shift; in adnp_irq_set_type()
360 adnp->irq_rise[reg] |= BIT(pos); in adnp_irq_set_type()
362 adnp->irq_rise[reg] &= ~BIT(pos); in adnp_irq_set_type()
365 adnp->irq_fall[reg] |= BIT(pos); in adnp_irq_set_type()
367 adnp->irq_fall[reg] &= ~BIT(pos); in adnp_irq_set_type()
370 adnp->irq_high[reg] |= BIT(pos); in adnp_irq_set_type()
372 adnp->irq_high[reg] &= ~BIT(pos); in adnp_irq_set_type()
375 adnp->irq_low[reg] |= BIT(pos); in adnp_irq_set_type()
377 adnp->irq_low[reg] &= ~BIT(pos); in adnp_irq_set_type()
385 struct adnp *adnp = gpiochip_get_data(gc); in adnp_irq_bus_lock() local
387 mutex_lock(&adnp->irq_lock); in adnp_irq_bus_lock()
393 struct adnp *adnp = gpiochip_get_data(gc); in adnp_irq_bus_unlock() local
394 unsigned int num_regs = 1 << adnp->reg_shift, i; in adnp_irq_bus_unlock()
396 mutex_lock(&adnp->i2c_lock); in adnp_irq_bus_unlock()
399 adnp_write(adnp, GPIO_IER(adnp) + i, adnp->irq_enable[i]); in adnp_irq_bus_unlock()
401 mutex_unlock(&adnp->i2c_lock); in adnp_irq_bus_unlock()
402 mutex_unlock(&adnp->irq_lock); in adnp_irq_bus_unlock()
414 static int adnp_irq_setup(struct adnp *adnp) in adnp_irq_setup() argument
416 unsigned int num_regs = 1 << adnp->reg_shift, i; in adnp_irq_setup()
417 struct gpio_chip *chip = &adnp->gpio; in adnp_irq_setup()
420 mutex_init(&adnp->irq_lock); in adnp_irq_setup()
430 adnp->irq_enable = devm_kcalloc(chip->parent, num_regs, 6, in adnp_irq_setup()
432 if (!adnp->irq_enable) in adnp_irq_setup()
435 adnp->irq_level = adnp->irq_enable + (num_regs * 1); in adnp_irq_setup()
436 adnp->irq_rise = adnp->irq_enable + (num_regs * 2); in adnp_irq_setup()
437 adnp->irq_fall = adnp->irq_enable + (num_regs * 3); in adnp_irq_setup()
438 adnp->irq_high = adnp->irq_enable + (num_regs * 4); in adnp_irq_setup()
439 adnp->irq_low = adnp->irq_enable + (num_regs * 5); in adnp_irq_setup()
446 err = adnp_read(adnp, GPIO_PLR(adnp) + i, &adnp->irq_level[i]); in adnp_irq_setup()
451 err = adnp_write(adnp, GPIO_IER(adnp) + i, 0); in adnp_irq_setup()
455 adnp->irq_enable[i] = 0x00; in adnp_irq_setup()
458 err = devm_request_threaded_irq(chip->parent, adnp->client->irq, in adnp_irq_setup()
461 dev_name(chip->parent), adnp); in adnp_irq_setup()
464 adnp->client->irq, err); in adnp_irq_setup()
479 gpiochip_set_nested_irqchip(chip, &adnp_irq_chip, adnp->client->irq); in adnp_irq_setup()
488 struct adnp *adnp; in adnp_i2c_probe() local
500 adnp = devm_kzalloc(&client->dev, sizeof(*adnp), GFP_KERNEL); in adnp_i2c_probe()
501 if (!adnp) in adnp_i2c_probe()
504 mutex_init(&adnp->i2c_lock); in adnp_i2c_probe()
505 adnp->client = client; in adnp_i2c_probe()
507 err = adnp_gpio_setup(adnp, num_gpios); in adnp_i2c_probe()
512 err = adnp_irq_setup(adnp); in adnp_i2c_probe()
517 i2c_set_clientdata(client, adnp); in adnp_i2c_probe()