Lines Matching +full:aw9523 +full:- +full:pinctrl

1 // SPDX-License-Identifier: GPL-2.0-only
22 #include <linux/pinctrl/pinconf-generic.h>
23 #include <linux/pinctrl/pinconf.h>
24 #include <linux/pinctrl/pinctrl.h>
25 #include <linux/pinctrl/pinmux.h>
32 * HW needs at least 20uS for reset and at least 1-2uS to recover from
40 /* Port 0: P0_0...P0_7 - Port 1: P1_0...P1_7 */
58 * struct aw9523_irq - Interrupt controller structure
68 * struct aw9523 - Main driver structure
74 * @pctl: pinctrl handle for current device
78 struct aw9523 { struct
141 "gpio0", "gpio1", "gpio2", "gpio3", /* 0-3 */
142 "gpio4", "gpio5", "gpio6", "gpio7", /* 4-7 */
143 "gpio8", "gpio9", "gpio10", "gpio11", /* 8-11 */
144 "gpio12", "gpio13", "gpio14", "gpio15", /* 11-15 */
176 struct aw9523 *awi = pinctrl_dev_get_drvdata(pctl); in aw9523_pmx_set_mux()
180 return -EINVAL; in aw9523_pmx_set_mux()
186 mutex_lock(&awi->i2c_lock); in aw9523_pmx_set_mux()
187 ret = regmap_update_bits(awi->regmap, AW9523_REG_PORT_MODE(pin), in aw9523_pmx_set_mux()
189 mutex_unlock(&awi->i2c_lock); in aw9523_pmx_set_mux()
222 return -ENOTSUPP; in aw9523_pcfg_param_to_reg()
232 struct aw9523 *awi = pinctrl_dev_get_drvdata(pctldev); in aw9523_pconf_get()
243 mutex_lock(&awi->i2c_lock); in aw9523_pconf_get()
244 rc = regmap_read(awi->regmap, reg, &val); in aw9523_pconf_get()
245 mutex_unlock(&awi->i2c_lock); in aw9523_pconf_get()
273 return -ENOTSUPP; in aw9523_pconf_get()
276 return -EINVAL; in aw9523_pconf_get()
286 struct aw9523 *awi = pinctrl_dev_get_drvdata(pctldev); in aw9523_pconf_set()
294 mutex_lock(&awi->i2c_lock); in aw9523_pconf_set()
306 rc = regmap_update_bits(awi->regmap, in aw9523_pconf_set()
325 /* Open-Drain is supported only on port 0 */ in aw9523_pconf_set()
327 rc = -ENOTSUPP; in aw9523_pconf_set()
334 /* Port 1 is always Push-Pull */ in aw9523_pconf_set()
344 rc = -ENOTSUPP; in aw9523_pconf_set()
348 rc = regmap_update_bits(awi->regmap, reg, mask, val); in aw9523_pconf_set()
353 mutex_unlock(&awi->i2c_lock); in aw9523_pconf_set()
364 * aw9523_get_pin_direction - Get pin direction
383 * aw9523_get_port_state - Get input or output state for entire port
416 return -EINVAL; in aw9523_gpio_irq_type()
421 * aw9523_irq_mask - Mask interrupt
429 struct aw9523 *awi = gpiochip_get_data(irq_data_get_irq_chip_data(d)); in aw9523_irq_mask()
433 regmap_update_bits(awi->regmap, AW9523_REG_INTR_DIS(hwirq), in aw9523_irq_mask()
435 gpiochip_disable_irq(&awi->gpio, hwirq); in aw9523_irq_mask()
439 * aw9523_irq_unmask - Unmask interrupt
447 struct aw9523 *awi = gpiochip_get_data(irq_data_get_irq_chip_data(d)); in aw9523_irq_unmask()
451 gpiochip_enable_irq(&awi->gpio, hwirq); in aw9523_irq_unmask()
452 regmap_update_bits(awi->regmap, AW9523_REG_INTR_DIS(hwirq), in aw9523_irq_unmask()
458 struct aw9523 *awi = (struct aw9523 *)dev_id; in aw9523_irq_thread_func()
465 ret = regmap_read(awi->regmap, in aw9523_irq_thread_func()
474 changed_gpio = awi->irq->cached_gpio ^ val; in aw9523_irq_thread_func()
475 awi->irq->cached_gpio = val; in aw9523_irq_thread_func()
483 for_each_set_bit(n, &changed_gpio, awi->gpio.ngpio) { in aw9523_irq_thread_func()
484 tmp = irq_find_mapping(awi->gpio.irq.domain, n); in aw9523_irq_thread_func()
494 * aw9523_irq_bus_lock - Grab lock for interrupt operation
499 struct aw9523 *awi = gpiochip_get_data(irq_data_get_irq_chip_data(d)); in aw9523_irq_bus_lock()
501 mutex_lock(&awi->irq->lock); in aw9523_irq_bus_lock()
502 regcache_cache_only(awi->regmap, true); in aw9523_irq_bus_lock()
506 * aw9523_irq_bus_sync_unlock - Synchronize state and unlock
514 struct aw9523 *awi = gpiochip_get_data(irq_data_get_irq_chip_data(d)); in aw9523_irq_bus_sync_unlock()
516 regcache_cache_only(awi->regmap, false); in aw9523_irq_bus_sync_unlock()
517 regcache_sync(awi->regmap); in aw9523_irq_bus_sync_unlock()
518 mutex_unlock(&awi->irq->lock); in aw9523_irq_bus_sync_unlock()
524 struct aw9523 *awi = gpiochip_get_data(chip); in aw9523_gpio_get_direction()
528 mutex_lock(&awi->i2c_lock); in aw9523_gpio_get_direction()
529 ret = aw9523_get_pin_direction(awi->regmap, offset, regbit); in aw9523_gpio_get_direction()
530 mutex_unlock(&awi->i2c_lock); in aw9523_gpio_get_direction()
537 struct aw9523 *awi = gpiochip_get_data(chip); in aw9523_gpio_get()
542 mutex_lock(&awi->i2c_lock); in aw9523_gpio_get()
543 ret = aw9523_get_port_state(awi->regmap, offset, regbit, &val); in aw9523_gpio_get()
544 mutex_unlock(&awi->i2c_lock); in aw9523_gpio_get()
552 * _aw9523_gpio_get_multiple - Get I/O state for an entire port
560 static int _aw9523_gpio_get_multiple(struct aw9523 *awi, u8 regbit, in _aw9523_gpio_get_multiple()
567 /* Registers are 8-bits wide */ in _aw9523_gpio_get_multiple()
568 ret = regmap_read(awi->regmap, AW9523_REG_CONF_STATE(regbit), &dir_in); in _aw9523_gpio_get_multiple()
575 ret = regmap_read(awi->regmap, AW9523_REG_IN_STATE(regbit), in _aw9523_gpio_get_multiple()
584 ret = regmap_read(awi->regmap, AW9523_REG_OUT_STATE(regbit), in _aw9523_gpio_get_multiple()
598 struct aw9523 *awi = gpiochip_get_data(chip); in aw9523_gpio_get_multiple()
602 mutex_lock(&awi->i2c_lock); in aw9523_gpio_get_multiple()
604 /* Port 0 (gpio 0-7) */ in aw9523_gpio_get_multiple()
613 /* Port 1 (gpio 8-15) */ in aw9523_gpio_get_multiple()
624 mutex_unlock(&awi->i2c_lock); in aw9523_gpio_get_multiple()
632 struct aw9523 *awi = gpiochip_get_data(chip); in aw9523_gpio_set_multiple()
642 mutex_lock(&awi->i2c_lock); in aw9523_gpio_set_multiple()
645 ret = regmap_write_bits(awi->regmap, reg, mask_hi, bits_hi); in aw9523_gpio_set_multiple()
651 ret = regmap_write_bits(awi->regmap, reg, mask_lo, bits_lo); in aw9523_gpio_set_multiple()
657 mutex_unlock(&awi->i2c_lock); in aw9523_gpio_set_multiple()
664 struct aw9523 *awi = gpiochip_get_data(chip); in aw9523_gpio_set()
668 mutex_lock(&awi->i2c_lock); in aw9523_gpio_set()
669 ret = regmap_update_bits(awi->regmap, AW9523_REG_OUT_STATE(offset), in aw9523_gpio_set()
671 mutex_unlock(&awi->i2c_lock); in aw9523_gpio_set()
679 struct aw9523 *awi = gpiochip_get_data(chip); in aw9523_direction_input()
683 mutex_lock(&awi->i2c_lock); in aw9523_direction_input()
684 ret = regmap_update_bits(awi->regmap, AW9523_REG_CONF_STATE(offset), in aw9523_direction_input()
686 mutex_unlock(&awi->i2c_lock); in aw9523_direction_input()
694 struct aw9523 *awi = gpiochip_get_data(chip); in aw9523_direction_output()
698 mutex_lock(&awi->i2c_lock); in aw9523_direction_output()
699 ret = regmap_update_bits(awi->regmap, AW9523_REG_OUT_STATE(offset), in aw9523_direction_output()
704 ret = regmap_update_bits(awi->regmap, AW9523_REG_CONF_STATE(offset), in aw9523_direction_output()
707 mutex_unlock(&awi->i2c_lock); in aw9523_direction_output()
711 static int aw9523_drive_reset_gpio(struct aw9523 *awi) in aw9523_drive_reset_gpio()
722 ret = regmap_write(awi->regmap, AW9523_REG_SOFT_RESET, 0); in aw9523_drive_reset_gpio()
726 dev_dbg(awi->dev, "Cannot execute soft reset: trying hard reset\n"); in aw9523_drive_reset_gpio()
727 ret = gpiod_direction_output(awi->reset_gpio, 0); in aw9523_drive_reset_gpio()
734 ret = gpiod_direction_output(awi->reset_gpio, 1); in aw9523_drive_reset_gpio()
743 ret = regmap_read(awi->regmap, AW9523_REG_CHIPID, &chip_id); in aw9523_drive_reset_gpio()
745 dev_err(awi->dev, "Cannot read Chip ID: %d\n", ret); in aw9523_drive_reset_gpio()
749 dev_err(awi->dev, "Bad ChipID; read 0x%x, expected 0x%x\n", in aw9523_drive_reset_gpio()
751 return -EINVAL; in aw9523_drive_reset_gpio()
757 static int aw9523_hw_reset(struct aw9523 *awi) in aw9523_hw_reset()
766 max_retries--; in aw9523_hw_reset()
772 static int aw9523_init_gpiochip(struct aw9523 *awi, unsigned int npins) in aw9523_init_gpiochip()
774 struct device *dev = awi->dev; in aw9523_init_gpiochip()
775 struct gpio_chip *gc = &awi->gpio; in aw9523_init_gpiochip()
777 gc->label = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL); in aw9523_init_gpiochip()
778 if (!gc->label) in aw9523_init_gpiochip()
779 return -ENOMEM; in aw9523_init_gpiochip()
781 gc->base = -1; in aw9523_init_gpiochip()
782 gc->ngpio = npins; in aw9523_init_gpiochip()
783 gc->get_direction = aw9523_gpio_get_direction; in aw9523_init_gpiochip()
784 gc->direction_input = aw9523_direction_input; in aw9523_init_gpiochip()
785 gc->direction_output = aw9523_direction_output; in aw9523_init_gpiochip()
786 gc->get = aw9523_gpio_get; in aw9523_init_gpiochip()
787 gc->get_multiple = aw9523_gpio_get_multiple; in aw9523_init_gpiochip()
788 gc->set = aw9523_gpio_set; in aw9523_init_gpiochip()
789 gc->set_multiple = aw9523_gpio_set_multiple; in aw9523_init_gpiochip()
790 gc->set_config = gpiochip_generic_config; in aw9523_init_gpiochip()
791 gc->parent = dev; in aw9523_init_gpiochip()
792 gc->owner = THIS_MODULE; in aw9523_init_gpiochip()
793 gc->can_sleep = true; in aw9523_init_gpiochip()
799 .name = "aw9523",
809 static int aw9523_init_irq(struct aw9523 *awi, int irq) in aw9523_init_irq()
811 struct device *dev = awi->dev; in aw9523_init_irq()
815 if (!device_property_read_bool(dev, "interrupt-controller")) in aw9523_init_irq()
818 awi->irq = devm_kzalloc(dev, sizeof(*awi->irq), GFP_KERNEL); in aw9523_init_irq()
819 if (!awi->irq) in aw9523_init_irq()
820 return -ENOMEM; in aw9523_init_irq()
822 mutex_init(&awi->irq->lock); in aw9523_init_irq()
829 girq = &awi->gpio.irq; in aw9523_init_irq()
831 girq->parent_handler = NULL; in aw9523_init_irq()
832 girq->num_parents = 0; in aw9523_init_irq()
833 girq->parents = NULL; in aw9523_init_irq()
834 girq->default_type = IRQ_TYPE_EDGE_BOTH; in aw9523_init_irq()
835 girq->handler = handle_simple_irq; in aw9523_init_irq()
836 girq->threaded = true; in aw9523_init_irq()
893 static int aw9523_hw_init(struct aw9523 *awi) in aw9523_hw_init()
900 regcache_cache_bypass(awi->regmap, true); in aw9523_hw_init()
905 dev_err(awi->dev, "HW Reset failed: %d\n", ret); in aw9523_hw_init()
917 ret = regmap_write(awi->regmap, AW9523_REG_PORT_MODE(0), U8_MAX); in aw9523_hw_init()
920 ret = regmap_write(awi->regmap, AW9523_REG_PORT_MODE(p1_pin), U8_MAX); in aw9523_hw_init()
924 /* Set Open-Drain mode on Port 0 (Port 1 is always P-P) */ in aw9523_hw_init()
925 ret = regmap_write(awi->regmap, AW9523_REG_GCR, 0); in aw9523_hw_init()
930 ret = regmap_write(awi->regmap, AW9523_REG_CONF_STATE(0), U8_MAX); in aw9523_hw_init()
933 ret = regmap_write(awi->regmap, AW9523_REG_CONF_STATE(p1_pin), U8_MAX); in aw9523_hw_init()
938 ret = regmap_write(awi->regmap, AW9523_REG_INTR_DIS(0), U8_MAX); in aw9523_hw_init()
941 ret = regmap_write(awi->regmap, AW9523_REG_INTR_DIS(p1_pin), U8_MAX); in aw9523_hw_init()
945 /* Clear setup-generated interrupts by performing a port state read */ in aw9523_hw_init()
946 ret = aw9523_get_port_state(awi->regmap, 0, 0, &val); in aw9523_hw_init()
949 ret = aw9523_get_port_state(awi->regmap, p1_pin, 0, &val); in aw9523_hw_init()
954 regcache_cache_bypass(awi->regmap, false); in aw9523_hw_init()
955 return regmap_reinit_cache(awi->regmap, &aw9523_regmap); in aw9523_hw_init()
960 struct device *dev = &client->dev; in aw9523_probe()
962 struct aw9523 *awi; in aw9523_probe()
967 return -ENOMEM; in aw9523_probe()
971 awi->dev = dev; in aw9523_probe()
972 awi->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); in aw9523_probe()
973 if (IS_ERR(awi->reset_gpio)) in aw9523_probe()
974 return PTR_ERR(awi->reset_gpio); in aw9523_probe()
975 gpiod_set_consumer_name(awi->reset_gpio, "aw9523 reset"); in aw9523_probe()
977 awi->regmap = devm_regmap_init_i2c(client, &aw9523_regmap); in aw9523_probe()
978 if (IS_ERR(awi->regmap)) in aw9523_probe()
979 return PTR_ERR(awi->regmap); in aw9523_probe()
981 awi->vio_vreg = devm_regulator_get_enable_optional(dev, "vio"); in aw9523_probe()
982 if (awi->vio_vreg && awi->vio_vreg != -ENODEV) in aw9523_probe()
983 return awi->vio_vreg; in aw9523_probe()
985 ret = devm_mutex_init(dev, &awi->i2c_lock); in aw9523_probe()
989 lockdep_set_subclass(&awi->i2c_lock, i2c_adapter_depth(client->adapter)); in aw9523_probe()
993 return -ENOMEM; in aw9523_probe()
999 pdesc->name = dev_name(dev); in aw9523_probe()
1000 pdesc->owner = THIS_MODULE; in aw9523_probe()
1001 pdesc->pctlops = &aw9523_pinctrl_ops; in aw9523_probe()
1002 pdesc->pmxops = &aw9523_pinmux_ops; in aw9523_probe()
1003 pdesc->confops = &aw9523_pinconf_ops; in aw9523_probe()
1004 pdesc->pins = aw9523_pins; in aw9523_probe()
1005 pdesc->npins = ARRAY_SIZE(aw9523_pins); in aw9523_probe()
1007 ret = aw9523_init_gpiochip(awi, pdesc->npins); in aw9523_probe()
1011 if (client->irq) { in aw9523_probe()
1012 ret = aw9523_init_irq(awi, client->irq); in aw9523_probe()
1017 awi->pctl = devm_pinctrl_register(dev, pdesc, awi); in aw9523_probe()
1018 if (IS_ERR(awi->pctl)) in aw9523_probe()
1019 return dev_err_probe(dev, PTR_ERR(awi->pctl), in aw9523_probe()
1020 "Cannot register pinctrl"); in aw9523_probe()
1022 return devm_gpiochip_add_data(dev, &awi->gpio, awi); in aw9523_probe()
1027 struct aw9523 *awi = i2c_get_clientdata(client); in aw9523_remove()
1035 if (awi->vio_vreg == -ENODEV) { in aw9523_remove()
1036 mutex_lock(&awi->i2c_lock); in aw9523_remove()
1038 mutex_unlock(&awi->i2c_lock); in aw9523_remove()
1049 { .compatible = "awinic,aw9523-pinctrl", },
1056 .name = "aw9523-pinctrl",
1065 MODULE_DESCRIPTION("Awinic AW9523 I2C GPIO Expander driver");