Lines Matching refs:pctl
382 static bool sx150x_pin_is_oscio(struct sx150x_pinctrl *pctl, unsigned int pin) in sx150x_pin_is_oscio() argument
384 if (pin >= pctl->data->npins) in sx150x_pin_is_oscio()
388 if (pctl->data->model != SX150X_789) in sx150x_pin_is_oscio()
391 return !strcmp(pctl->data->pins[pin].name, "oscio"); in sx150x_pin_is_oscio()
397 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_get_direction() local
401 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_get_direction()
404 ret = regmap_read(pctl->regmap, pctl->data->reg_dir, &value); in sx150x_gpio_get_direction()
413 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_get() local
417 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_get()
420 ret = regmap_read(pctl->regmap, pctl->data->reg_data, &value); in sx150x_gpio_get()
427 static int __sx150x_gpio_set(struct sx150x_pinctrl *pctl, unsigned int offset, in __sx150x_gpio_set() argument
430 return regmap_write_bits(pctl->regmap, pctl->data->reg_data, in __sx150x_gpio_set()
434 static int sx150x_gpio_oscio_set(struct sx150x_pinctrl *pctl, in sx150x_gpio_oscio_set() argument
437 return regmap_write(pctl->regmap, in sx150x_gpio_oscio_set()
438 pctl->data->pri.x789.reg_clock, in sx150x_gpio_oscio_set()
445 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_set() local
447 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_set()
448 sx150x_gpio_oscio_set(pctl, value); in sx150x_gpio_set()
450 __sx150x_gpio_set(pctl, offset, value); in sx150x_gpio_set()
458 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_set_multiple() local
460 regmap_write_bits(pctl->regmap, pctl->data->reg_data, *mask, *bits); in sx150x_gpio_set_multiple()
466 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_direction_input() local
468 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_direction_input()
471 return regmap_write_bits(pctl->regmap, in sx150x_gpio_direction_input()
472 pctl->data->reg_dir, in sx150x_gpio_direction_input()
479 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_direction_output() local
482 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_direction_output()
483 return sx150x_gpio_oscio_set(pctl, value); in sx150x_gpio_direction_output()
485 ret = __sx150x_gpio_set(pctl, offset, value); in sx150x_gpio_direction_output()
489 return regmap_write_bits(pctl->regmap, in sx150x_gpio_direction_output()
490 pctl->data->reg_dir, in sx150x_gpio_direction_output()
496 struct sx150x_pinctrl *pctl = in sx150x_irq_mask() local
500 pctl->irq.masked |= BIT(n); in sx150x_irq_mask()
505 struct sx150x_pinctrl *pctl = in sx150x_irq_unmask() local
509 pctl->irq.masked &= ~BIT(n); in sx150x_irq_unmask()
512 static void sx150x_irq_set_sense(struct sx150x_pinctrl *pctl, in sx150x_irq_set_sense() argument
523 pctl->irq.sense &= mask; in sx150x_irq_set_sense()
524 pctl->irq.sense |= sense << n; in sx150x_irq_set_sense()
529 struct sx150x_pinctrl *pctl = in sx150x_irq_set_type() local
543 sx150x_irq_set_sense(pctl, n, val); in sx150x_irq_set_type()
549 struct sx150x_pinctrl *pctl = (struct sx150x_pinctrl *)dev_id; in sx150x_irq_thread_fn() local
554 err = regmap_read(pctl->regmap, pctl->data->reg_irq_src, &val); in sx150x_irq_thread_fn()
558 err = regmap_write(pctl->regmap, pctl->data->reg_irq_src, val); in sx150x_irq_thread_fn()
563 for_each_set_bit(n, &status, pctl->data->ngpios) in sx150x_irq_thread_fn()
564 handle_nested_irq(irq_find_mapping(pctl->gpio.irq.domain, n)); in sx150x_irq_thread_fn()
571 struct sx150x_pinctrl *pctl = in sx150x_irq_bus_lock() local
574 mutex_lock(&pctl->lock); in sx150x_irq_bus_lock()
579 struct sx150x_pinctrl *pctl = in sx150x_irq_bus_sync_unlock() local
582 regmap_write(pctl->regmap, pctl->data->reg_irq_mask, pctl->irq.masked); in sx150x_irq_bus_sync_unlock()
583 regmap_write(pctl->regmap, pctl->data->reg_sense, pctl->irq.sense); in sx150x_irq_bus_sync_unlock()
584 mutex_unlock(&pctl->lock); in sx150x_irq_bus_sync_unlock()
590 struct sx150x_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sx150x_pinconf_get() local
596 if (sx150x_pin_is_oscio(pctl, pin)) { in sx150x_pinconf_get()
600 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
601 pctl->data->pri.x789.reg_clock, in sx150x_pinconf_get()
627 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
628 pctl->data->reg_pulldn, in sx150x_pinconf_get()
642 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
643 pctl->data->reg_pullup, in sx150x_pinconf_get()
657 if (pctl->data->model != SX150X_789) in sx150x_pinconf_get()
660 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
661 pctl->data->pri.x789.reg_drain, in sx150x_pinconf_get()
675 if (pctl->data->model != SX150X_789) in sx150x_pinconf_get()
678 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
679 pctl->data->pri.x789.reg_drain, in sx150x_pinconf_get()
694 ret = sx150x_gpio_get_direction(&pctl->gpio, pin); in sx150x_pinconf_get()
701 ret = sx150x_gpio_get(&pctl->gpio, pin); in sx150x_pinconf_get()
721 struct sx150x_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sx150x_pinconf_set() local
731 if (sx150x_pin_is_oscio(pctl, pin)) { in sx150x_pinconf_set()
733 ret = sx150x_gpio_direction_output(&pctl->gpio, in sx150x_pinconf_set()
746 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
747 pctl->data->reg_pulldn, in sx150x_pinconf_set()
752 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
753 pctl->data->reg_pullup, in sx150x_pinconf_set()
761 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
762 pctl->data->reg_pullup, in sx150x_pinconf_set()
770 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
771 pctl->data->reg_pulldn, in sx150x_pinconf_set()
779 if (pctl->data->model != SX150X_789 || in sx150x_pinconf_set()
780 sx150x_pin_is_oscio(pctl, pin)) in sx150x_pinconf_set()
783 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
784 pctl->data->pri.x789.reg_drain, in sx150x_pinconf_set()
792 if (pctl->data->model != SX150X_789 || in sx150x_pinconf_set()
793 sx150x_pin_is_oscio(pctl, pin)) in sx150x_pinconf_set()
796 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
797 pctl->data->pri.x789.reg_drain, in sx150x_pinconf_set()
805 ret = sx150x_gpio_direction_output(&pctl->gpio, in sx150x_pinconf_set()
852 static int sx150x_reset(struct sx150x_pinctrl *pctl) in sx150x_reset() argument
856 err = i2c_smbus_write_byte_data(pctl->client, in sx150x_reset()
857 pctl->data->pri.x789.reg_reset, in sx150x_reset()
862 err = i2c_smbus_write_byte_data(pctl->client, in sx150x_reset()
863 pctl->data->pri.x789.reg_reset, in sx150x_reset()
868 static int sx150x_init_misc(struct sx150x_pinctrl *pctl) in sx150x_init_misc() argument
872 switch (pctl->data->model) { in sx150x_init_misc()
874 reg = pctl->data->pri.x789.reg_misc; in sx150x_init_misc()
878 reg = pctl->data->pri.x456.reg_advanced; in sx150x_init_misc()
889 reg = pctl->data->pri.x123.reg_advanced; in sx150x_init_misc()
893 WARN(1, "Unknown chip model %d\n", pctl->data->model); in sx150x_init_misc()
897 return regmap_write(pctl->regmap, reg, value); in sx150x_init_misc()
900 static int sx150x_init_hw(struct sx150x_pinctrl *pctl) in sx150x_init_hw() argument
903 [SX150X_789] = pctl->data->pri.x789.reg_polarity, in sx150x_init_hw()
904 [SX150X_456] = pctl->data->pri.x456.reg_pld_mode, in sx150x_init_hw()
905 [SX150X_123] = pctl->data->pri.x123.reg_pld_mode, in sx150x_init_hw()
909 if (pctl->data->model == SX150X_789 && in sx150x_init_hw()
910 of_property_read_bool(pctl->dev->of_node, "semtech,probe-reset")) { in sx150x_init_hw()
911 err = sx150x_reset(pctl); in sx150x_init_hw()
916 err = sx150x_init_misc(pctl); in sx150x_init_hw()
921 return regmap_write(pctl->regmap, reg[pctl->data->model], 0); in sx150x_init_hw()
924 static int sx150x_regmap_reg_width(struct sx150x_pinctrl *pctl, in sx150x_regmap_reg_width() argument
927 const struct sx150x_device_data *data = pctl->data; in sx150x_regmap_reg_width()
953 static unsigned int sx150x_maybe_swizzle(struct sx150x_pinctrl *pctl, in sx150x_maybe_swizzle() argument
957 const struct sx150x_device_data *data = pctl->data; in sx150x_maybe_swizzle()
1009 struct sx150x_pinctrl *pctl = context; in sx150x_regmap_reg_read() local
1010 struct i2c_client *i2c = pctl->client; in sx150x_regmap_reg_read()
1011 const int width = sx150x_regmap_reg_width(pctl, reg); in sx150x_regmap_reg_read()
1053 *result = sx150x_maybe_swizzle(pctl, reg, val); in sx150x_regmap_reg_read()
1062 struct sx150x_pinctrl *pctl = context; in sx150x_regmap_reg_write() local
1063 struct i2c_client *i2c = pctl->client; in sx150x_regmap_reg_write()
1064 const int width = sx150x_regmap_reg_width(pctl, reg); in sx150x_regmap_reg_write()
1066 val = sx150x_maybe_swizzle(pctl, reg, val); in sx150x_regmap_reg_write()
1085 struct sx150x_pinctrl *pctl = i2c_get_clientdata(to_i2c_client(dev)); in sx150x_reg_volatile() local
1087 return reg == pctl->data->reg_irq_src || reg == pctl->data->reg_data; in sx150x_reg_volatile()
1109 struct sx150x_pinctrl *pctl; in sx150x_probe() local
1115 pctl = devm_kzalloc(dev, sizeof(*pctl), GFP_KERNEL); in sx150x_probe()
1116 if (!pctl) in sx150x_probe()
1119 i2c_set_clientdata(client, pctl); in sx150x_probe()
1121 pctl->dev = dev; in sx150x_probe()
1122 pctl->client = client; in sx150x_probe()
1125 pctl->data = of_device_get_match_data(dev); in sx150x_probe()
1127 pctl->data = (struct sx150x_device_data *)id->driver_data; in sx150x_probe()
1129 if (!pctl->data) in sx150x_probe()
1132 pctl->regmap = devm_regmap_init(dev, NULL, pctl, in sx150x_probe()
1134 if (IS_ERR(pctl->regmap)) { in sx150x_probe()
1135 ret = PTR_ERR(pctl->regmap); in sx150x_probe()
1141 mutex_init(&pctl->lock); in sx150x_probe()
1143 ret = sx150x_init_hw(pctl); in sx150x_probe()
1148 pctl->pinctrl_desc.name = "sx150x-pinctrl"; in sx150x_probe()
1149 pctl->pinctrl_desc.pctlops = &sx150x_pinctrl_ops; in sx150x_probe()
1150 pctl->pinctrl_desc.confops = &sx150x_pinconf_ops; in sx150x_probe()
1151 pctl->pinctrl_desc.pins = pctl->data->pins; in sx150x_probe()
1152 pctl->pinctrl_desc.npins = pctl->data->npins; in sx150x_probe()
1153 pctl->pinctrl_desc.owner = THIS_MODULE; in sx150x_probe()
1155 ret = devm_pinctrl_register_and_init(dev, &pctl->pinctrl_desc, in sx150x_probe()
1156 pctl, &pctl->pctldev); in sx150x_probe()
1162 ret = pinctrl_enable(pctl->pctldev); in sx150x_probe()
1169 pctl->gpio.label = devm_kstrdup(dev, client->name, GFP_KERNEL); in sx150x_probe()
1170 pctl->gpio.base = -1; in sx150x_probe()
1171 pctl->gpio.ngpio = pctl->data->npins; in sx150x_probe()
1172 pctl->gpio.get_direction = sx150x_gpio_get_direction; in sx150x_probe()
1173 pctl->gpio.direction_input = sx150x_gpio_direction_input; in sx150x_probe()
1174 pctl->gpio.direction_output = sx150x_gpio_direction_output; in sx150x_probe()
1175 pctl->gpio.get = sx150x_gpio_get; in sx150x_probe()
1176 pctl->gpio.set = sx150x_gpio_set; in sx150x_probe()
1177 pctl->gpio.set_config = gpiochip_generic_config; in sx150x_probe()
1178 pctl->gpio.parent = dev; in sx150x_probe()
1180 pctl->gpio.of_node = dev->of_node; in sx150x_probe()
1182 pctl->gpio.can_sleep = true; in sx150x_probe()
1189 if (pctl->data->model != SX150X_789) in sx150x_probe()
1190 pctl->gpio.set_multiple = sx150x_gpio_set_multiple; in sx150x_probe()
1192 ret = devm_gpiochip_add_data(dev, &pctl->gpio, pctl); in sx150x_probe()
1196 ret = gpiochip_add_pin_range(&pctl->gpio, dev_name(dev), in sx150x_probe()
1197 0, 0, pctl->data->npins); in sx150x_probe()
1203 pctl->irq_chip.name = devm_kstrdup(dev, client->name, in sx150x_probe()
1205 pctl->irq_chip.irq_mask = sx150x_irq_mask; in sx150x_probe()
1206 pctl->irq_chip.irq_unmask = sx150x_irq_unmask; in sx150x_probe()
1207 pctl->irq_chip.irq_set_type = sx150x_irq_set_type; in sx150x_probe()
1208 pctl->irq_chip.irq_bus_lock = sx150x_irq_bus_lock; in sx150x_probe()
1209 pctl->irq_chip.irq_bus_sync_unlock = sx150x_irq_bus_sync_unlock; in sx150x_probe()
1211 pctl->irq.masked = ~0; in sx150x_probe()
1212 pctl->irq.sense = 0; in sx150x_probe()
1225 ret = gpiochip_irqchip_add_nested(&pctl->gpio, in sx150x_probe()
1226 &pctl->irq_chip, 0, in sx150x_probe()
1237 pctl->irq_chip.name, pctl); in sx150x_probe()
1241 gpiochip_set_nested_irqchip(&pctl->gpio, in sx150x_probe()
1242 &pctl->irq_chip, in sx150x_probe()