Lines Matching +full:irq +full:- +full:push +full:- +full:pull
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 #include <linux/irq.h>
103 mutex_lock(&gpio->lock); in aw9110_get()
106 value = gpio->read(gpio->client, REG_INPUT_P1); in aw9110_get()
107 mutex_unlock(&gpio->lock); in aw9110_get()
111 value = gpio->read(gpio->client, REG_INPUT_P0); in aw9110_get()
112 mutex_unlock(&gpio->lock); in aw9110_get()
125 reg_val = gpio->direct; in aw9110_get_direction()
127 dev_dbg(gpio->dev, "direct get: %04X, pin:%d\n", reg_val, offset); in aw9110_get_direction()
139 mutex_lock(&gpio->lock); in aw9110_direction_input()
142 gpio->direct |= (1<<offset); in aw9110_direction_input()
145 gpio->write(gpio->client, REG_CONFIG_P1, gpio->direct&0x0F); in aw9110_direction_input()
147 gpio->write(gpio->client, REG_CONFIG_P0, (gpio->direct >> 4)&0x3F); in aw9110_direction_input()
149 mutex_unlock(&gpio->lock); in aw9110_direction_input()
151 dev_dbg(gpio->dev, "direct in: %04X, pin:%d\n", gpio->direct, offset); in aw9110_direction_input()
161 chip->set(chip, offset, value); in aw9110_direction_output()
163 mutex_lock(&gpio->lock); in aw9110_direction_output()
166 gpio->direct &= ~(1<<offset); in aw9110_direction_output()
169 gpio->write(gpio->client, REG_CONFIG_P1, gpio->direct&0x0F); in aw9110_direction_output()
171 gpio->write(gpio->client, REG_CONFIG_P0, (gpio->direct >> 4)&0x3F); in aw9110_direction_output()
173 mutex_unlock(&gpio->lock); in aw9110_direction_output()
175 dev_dbg(gpio->dev, "direct out: %04X, pin:%d\n", gpio->direct, offset); in aw9110_direction_output()
184 mutex_lock(&gpio->lock); in aw9110_set()
187 gpio->out |= bit; in aw9110_set()
189 gpio->out &= ~bit; in aw9110_set()
192 gpio->write(gpio->client, REG_OUTPUT_P1, gpio->out >> 0); in aw9110_set()
194 gpio->write(gpio->client, REG_OUTPUT_P0, gpio->out >> 4); in aw9110_set()
196 mutex_unlock(&gpio->lock); in aw9110_set()
199 /*-------------------------------------------------------------------------*/
201 static irqreturn_t aw9110_irq(int irq, void *data) in aw9110_irq() argument
209 value = gpio->read(gpio->client, REG_INPUT_P1); in aw9110_irq()
212 value = gpio->read(gpio->client, REG_INPUT_P0); in aw9110_irq()
220 mutex_lock(&gpio->lock); in aw9110_irq()
221 change = (gpio->status ^ status) & gpio->irq_enabled; in aw9110_irq()
222 gpio->status = status; in aw9110_irq()
223 mutex_unlock(&gpio->lock); in aw9110_irq()
225 for_each_set_bit(i, &change, gpio->chip.ngpio) { in aw9110_irq()
226 nirq = irq_find_mapping(gpio->chip.irq.domain, i); in aw9110_irq()
228 dev_dbg(gpio->dev, "status:%04lx,change:%04lx,index:%ld,nirq:%d\n", in aw9110_irq()
246 return irq_set_irq_wake(gpio->client->irq, on); in aw9110_irq_set_wake()
253 gpio->irq_enabled |= (1 << data->hwirq); in aw9110_irq_enable()
260 gpio->irq_enabled &= ~(1 << data->hwirq); in aw9110_irq_disable()
267 mutex_lock(&gpio->lock); in aw9110_irq_bus_lock()
274 mutex_unlock(&gpio->lock); in aw9110_irq_bus_sync_unlock()
279 /* out4-9 push-pull */ in aw9110_state_init()
280 gpio->write(gpio->client, REG_CTRL, (1<<4)); in aw9110_state_init()
283 gpio->write(gpio->client, REG_WORK_MODE_P1, 0x0F); in aw9110_state_init()
284 gpio->write(gpio->client, REG_WORK_MODE_P0, 0x3F); in aw9110_state_init()
287 gpio->direct = 0x03FF; /* 0: output, 1:input */ in aw9110_state_init()
288 gpio->write(gpio->client, REG_CONFIG_P1, gpio->direct & 0x0F); in aw9110_state_init()
289 gpio->write(gpio->client, REG_CONFIG_P0, (gpio->direct>>4) & 0x3F); in aw9110_state_init()
292 gpio->irq_enabled = 0x03FF; /* 0: disable 1:enable, chip: 0:enable, 1: disable */ in aw9110_state_init()
293 gpio->write(gpio->client, REG_INT_P1, ((~gpio->irq_enabled) >> 0)&0x0F); in aw9110_state_init()
294 gpio->write(gpio->client, REG_INT_P0, ((~gpio->irq_enabled) >> 4)&0x3F); in aw9110_state_init()
297 gpio->read(gpio->client, REG_INPUT_P1); in aw9110_state_init()
298 gpio->read(gpio->client, REG_INPUT_P1); in aw9110_state_init()
303 struct device_node *np = client->dev.of_node; in aw9110_parse_dt()
309 dev_err(chip->dev, "of get shdn_en failed\n"); in aw9110_parse_dt()
310 chip->shdn_en = -1; in aw9110_parse_dt()
312 chip->shdn_en = ret; in aw9110_parse_dt()
314 ret = devm_gpio_request_one(chip->dev, chip->shdn_en, in aw9110_parse_dt()
317 dev_err(chip->dev, in aw9110_parse_dt()
323 gpio_set_value(chip->shdn_en, 1); in aw9110_parse_dt()
336 dev_err(&client->dev, "fail to read dev id(%d)\n", ret); in aw9110_check_dev_id()
340 dev_info(&client->dev, "dev id : 0x%02x\n", ret); in aw9110_check_dev_id()
345 /*-------------------------------------------------------------------------*/
353 dev_info(&client->dev, "===aw9110 probe===\n"); in aw9110_probe()
356 gpio = devm_kzalloc(&client->dev, sizeof(*gpio), GFP_KERNEL); in aw9110_probe()
358 return -ENOMEM; in aw9110_probe()
360 gpio->dev = &client->dev; in aw9110_probe()
364 mutex_init(&gpio->lock); in aw9110_probe()
366 gpio->chip.base = -1; in aw9110_probe()
367 gpio->chip.can_sleep = true; in aw9110_probe()
368 gpio->chip.parent = &client->dev; in aw9110_probe()
369 gpio->chip.owner = THIS_MODULE; in aw9110_probe()
370 gpio->chip.get = aw9110_get; in aw9110_probe()
371 gpio->chip.set = aw9110_set; in aw9110_probe()
372 gpio->chip.get_direction = aw9110_get_direction; in aw9110_probe()
373 gpio->chip.direction_input = aw9110_direction_input; in aw9110_probe()
374 gpio->chip.direction_output = aw9110_direction_output; in aw9110_probe()
375 gpio->chip.ngpio = id->driver_data; in aw9110_probe()
377 gpio->write = aw9110_i2c_write_le8; in aw9110_probe()
378 gpio->read = aw9110_i2c_read_le8; in aw9110_probe()
380 gpio->chip.label = client->name; in aw9110_probe()
382 gpio->client = client; in aw9110_probe()
387 dev_err(&client->dev, "check device id fail(%d)\n", status); in aw9110_probe()
394 if (client->irq) { in aw9110_probe()
397 gpio->irqchip.name = "aw9110"; in aw9110_probe()
398 gpio->irqchip.irq_enable = aw9110_irq_enable; in aw9110_probe()
399 gpio->irqchip.irq_disable = aw9110_irq_disable; in aw9110_probe()
400 gpio->irqchip.irq_ack = aw9110_noop; in aw9110_probe()
401 gpio->irqchip.irq_mask = aw9110_noop; in aw9110_probe()
402 gpio->irqchip.irq_unmask = aw9110_noop; in aw9110_probe()
403 gpio->irqchip.irq_set_wake = aw9110_irq_set_wake; in aw9110_probe()
404 gpio->irqchip.irq_bus_lock = aw9110_irq_bus_lock; in aw9110_probe()
405 gpio->irqchip.irq_bus_sync_unlock = aw9110_irq_bus_sync_unlock; in aw9110_probe()
407 status = devm_request_threaded_irq(&client->dev, client->irq, in aw9110_probe()
410 dev_name(&client->dev), gpio); in aw9110_probe()
414 girq = &gpio->chip.irq; in aw9110_probe()
415 girq->chip = &gpio->irqchip; in aw9110_probe()
416 /* This will let us handle the parent IRQ in the driver */ in aw9110_probe()
417 girq->parent_handler = NULL; in aw9110_probe()
418 girq->num_parents = 0; in aw9110_probe()
419 girq->parents = NULL; in aw9110_probe()
420 girq->default_type = IRQ_TYPE_NONE; in aw9110_probe()
421 girq->handler = handle_level_irq; in aw9110_probe()
422 girq->threaded = true; in aw9110_probe()
425 status = devm_gpiochip_add_data(&client->dev, &gpio->chip, gpio); in aw9110_probe()
429 dev_info(&client->dev, "probed\n"); in aw9110_probe()
434 dev_err(&client->dev, "probe error %d for '%s'\n", status, in aw9110_probe()
435 client->name); in aw9110_probe()
442 struct aw9110 *gpio = dev->driver_data; in aw9110_pm_resume()
444 /* out4-9 push-pull */ in aw9110_pm_resume()
445 gpio->write(gpio->client, REG_CTRL, (1<<4)); in aw9110_pm_resume()
448 gpio->write(gpio->client, REG_WORK_MODE_P1, 0x0F); in aw9110_pm_resume()
449 gpio->write(gpio->client, REG_WORK_MODE_P0, 0x3F); in aw9110_pm_resume()
452 //gpio->direct = 0x03FF; /* 0: output, 1:input */ in aw9110_pm_resume()
453 gpio->write(gpio->client, REG_CONFIG_P1, gpio->direct & 0x0F); in aw9110_pm_resume()
454 gpio->write(gpio->client, REG_CONFIG_P0, (gpio->direct>>4) & 0x3F); in aw9110_pm_resume()
457 gpio->write(gpio->client, REG_OUTPUT_P1, gpio->out >> 0); in aw9110_pm_resume()
458 gpio->write(gpio->client, REG_OUTPUT_P0, gpio->out >> 4); in aw9110_pm_resume()
461 //gpio->irq_enabled = 0x03FF; /* 0: disable 1:enable, chip: 0:enable, 1: disable */ in aw9110_pm_resume()
462 gpio->write(gpio->client, REG_INT_P1, ((~gpio->irq_enabled) >> 0)&0x0F); in aw9110_pm_resume()
463 gpio->write(gpio->client, REG_INT_P0, ((~gpio->irq_enabled) >> 4)&0x3F); in aw9110_pm_resume()
498 MODULE_AUTHOR("Jake Wu <jake.wu@rock-chips.com>");