Lines Matching refs:pctl

374 static bool sx150x_pin_is_oscio(struct sx150x_pinctrl *pctl, unsigned int pin)  in sx150x_pin_is_oscio()  argument
376 if (pin >= pctl->data->npins) in sx150x_pin_is_oscio()
380 if (pctl->data->model != SX150X_789) in sx150x_pin_is_oscio()
383 return !strcmp(pctl->data->pins[pin].name, "oscio"); in sx150x_pin_is_oscio()
389 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_get_direction() local
393 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_get_direction()
396 ret = regmap_read(pctl->regmap, pctl->data->reg_dir, &value); in sx150x_gpio_get_direction()
408 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_get() local
412 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_get()
415 ret = regmap_read(pctl->regmap, pctl->data->reg_data, &value); in sx150x_gpio_get()
422 static int __sx150x_gpio_set(struct sx150x_pinctrl *pctl, unsigned int offset, in __sx150x_gpio_set() argument
425 return regmap_write_bits(pctl->regmap, pctl->data->reg_data, in __sx150x_gpio_set()
429 static int sx150x_gpio_oscio_set(struct sx150x_pinctrl *pctl, in sx150x_gpio_oscio_set() argument
432 return regmap_write(pctl->regmap, in sx150x_gpio_oscio_set()
433 pctl->data->pri.x789.reg_clock, in sx150x_gpio_oscio_set()
440 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_set() local
442 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_set()
443 sx150x_gpio_oscio_set(pctl, value); in sx150x_gpio_set()
445 __sx150x_gpio_set(pctl, offset, value); in sx150x_gpio_set()
453 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_set_multiple() local
455 regmap_write_bits(pctl->regmap, pctl->data->reg_data, *mask, *bits); in sx150x_gpio_set_multiple()
461 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_direction_input() local
463 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_direction_input()
466 return regmap_write_bits(pctl->regmap, in sx150x_gpio_direction_input()
467 pctl->data->reg_dir, in sx150x_gpio_direction_input()
474 struct sx150x_pinctrl *pctl = gpiochip_get_data(chip); in sx150x_gpio_direction_output() local
477 if (sx150x_pin_is_oscio(pctl, offset)) in sx150x_gpio_direction_output()
478 return sx150x_gpio_oscio_set(pctl, value); in sx150x_gpio_direction_output()
480 ret = __sx150x_gpio_set(pctl, offset, value); in sx150x_gpio_direction_output()
484 return regmap_write_bits(pctl->regmap, in sx150x_gpio_direction_output()
485 pctl->data->reg_dir, in sx150x_gpio_direction_output()
491 struct sx150x_pinctrl *pctl = in sx150x_irq_mask() local
495 pctl->irq.masked |= BIT(n); in sx150x_irq_mask()
500 struct sx150x_pinctrl *pctl = in sx150x_irq_unmask() local
504 pctl->irq.masked &= ~BIT(n); in sx150x_irq_unmask()
507 static void sx150x_irq_set_sense(struct sx150x_pinctrl *pctl, in sx150x_irq_set_sense() argument
518 pctl->irq.sense &= mask; in sx150x_irq_set_sense()
519 pctl->irq.sense |= sense << n; in sx150x_irq_set_sense()
524 struct sx150x_pinctrl *pctl = in sx150x_irq_set_type() local
538 sx150x_irq_set_sense(pctl, n, val); in sx150x_irq_set_type()
544 struct sx150x_pinctrl *pctl = (struct sx150x_pinctrl *)dev_id; in sx150x_irq_thread_fn() local
549 err = regmap_read(pctl->regmap, pctl->data->reg_irq_src, &val); in sx150x_irq_thread_fn()
553 err = regmap_write(pctl->regmap, pctl->data->reg_irq_src, val); in sx150x_irq_thread_fn()
558 for_each_set_bit(n, &status, pctl->data->ngpios) in sx150x_irq_thread_fn()
559 handle_nested_irq(irq_find_mapping(pctl->gpio.irq.domain, n)); in sx150x_irq_thread_fn()
566 struct sx150x_pinctrl *pctl = in sx150x_irq_bus_lock() local
569 mutex_lock(&pctl->lock); in sx150x_irq_bus_lock()
574 struct sx150x_pinctrl *pctl = in sx150x_irq_bus_sync_unlock() local
577 regmap_write(pctl->regmap, pctl->data->reg_irq_mask, pctl->irq.masked); in sx150x_irq_bus_sync_unlock()
578 regmap_write(pctl->regmap, pctl->data->reg_sense, pctl->irq.sense); in sx150x_irq_bus_sync_unlock()
579 mutex_unlock(&pctl->lock); in sx150x_irq_bus_sync_unlock()
585 struct sx150x_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sx150x_pinconf_get() local
591 if (sx150x_pin_is_oscio(pctl, pin)) { in sx150x_pinconf_get()
595 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
596 pctl->data->pri.x789.reg_clock, in sx150x_pinconf_get()
622 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
623 pctl->data->reg_pulldn, in sx150x_pinconf_get()
637 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
638 pctl->data->reg_pullup, in sx150x_pinconf_get()
652 if (pctl->data->model != SX150X_789) in sx150x_pinconf_get()
655 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
656 pctl->data->pri.x789.reg_drain, in sx150x_pinconf_get()
670 if (pctl->data->model != SX150X_789) in sx150x_pinconf_get()
673 ret = regmap_read(pctl->regmap, in sx150x_pinconf_get()
674 pctl->data->pri.x789.reg_drain, in sx150x_pinconf_get()
689 ret = sx150x_gpio_get_direction(&pctl->gpio, pin); in sx150x_pinconf_get()
696 ret = sx150x_gpio_get(&pctl->gpio, pin); in sx150x_pinconf_get()
716 struct sx150x_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sx150x_pinconf_set() local
726 if (sx150x_pin_is_oscio(pctl, pin)) { in sx150x_pinconf_set()
728 ret = sx150x_gpio_direction_output(&pctl->gpio, in sx150x_pinconf_set()
741 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
742 pctl->data->reg_pulldn, in sx150x_pinconf_set()
747 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
748 pctl->data->reg_pullup, in sx150x_pinconf_set()
756 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
757 pctl->data->reg_pullup, in sx150x_pinconf_set()
765 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
766 pctl->data->reg_pulldn, in sx150x_pinconf_set()
774 if (pctl->data->model != SX150X_789 || in sx150x_pinconf_set()
775 sx150x_pin_is_oscio(pctl, pin)) in sx150x_pinconf_set()
778 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
779 pctl->data->pri.x789.reg_drain, in sx150x_pinconf_set()
787 if (pctl->data->model != SX150X_789 || in sx150x_pinconf_set()
788 sx150x_pin_is_oscio(pctl, pin)) in sx150x_pinconf_set()
791 ret = regmap_write_bits(pctl->regmap, in sx150x_pinconf_set()
792 pctl->data->pri.x789.reg_drain, in sx150x_pinconf_set()
800 ret = sx150x_gpio_direction_output(&pctl->gpio, in sx150x_pinconf_set()
847 static int sx150x_reset(struct sx150x_pinctrl *pctl) in sx150x_reset() argument
851 err = i2c_smbus_write_byte_data(pctl->client, in sx150x_reset()
852 pctl->data->pri.x789.reg_reset, in sx150x_reset()
857 err = i2c_smbus_write_byte_data(pctl->client, in sx150x_reset()
858 pctl->data->pri.x789.reg_reset, in sx150x_reset()
863 static int sx150x_init_misc(struct sx150x_pinctrl *pctl) in sx150x_init_misc() argument
867 switch (pctl->data->model) { in sx150x_init_misc()
869 reg = pctl->data->pri.x789.reg_misc; in sx150x_init_misc()
873 reg = pctl->data->pri.x456.reg_advanced; in sx150x_init_misc()
884 reg = pctl->data->pri.x123.reg_advanced; in sx150x_init_misc()
888 WARN(1, "Unknown chip model %d\n", pctl->data->model); in sx150x_init_misc()
892 return regmap_write(pctl->regmap, reg, value); in sx150x_init_misc()
895 static int sx150x_init_hw(struct sx150x_pinctrl *pctl) in sx150x_init_hw() argument
898 [SX150X_789] = pctl->data->pri.x789.reg_polarity, in sx150x_init_hw()
899 [SX150X_456] = pctl->data->pri.x456.reg_pld_mode, in sx150x_init_hw()
900 [SX150X_123] = pctl->data->pri.x123.reg_pld_mode, in sx150x_init_hw()
904 if (pctl->data->model == SX150X_789 && in sx150x_init_hw()
905 of_property_read_bool(pctl->dev->of_node, "semtech,probe-reset")) { in sx150x_init_hw()
906 err = sx150x_reset(pctl); in sx150x_init_hw()
911 err = sx150x_init_misc(pctl); in sx150x_init_hw()
916 return regmap_write(pctl->regmap, reg[pctl->data->model], 0); in sx150x_init_hw()
919 static int sx150x_regmap_reg_width(struct sx150x_pinctrl *pctl, in sx150x_regmap_reg_width() argument
922 const struct sx150x_device_data *data = pctl->data; in sx150x_regmap_reg_width()
948 static unsigned int sx150x_maybe_swizzle(struct sx150x_pinctrl *pctl, in sx150x_maybe_swizzle() argument
952 const struct sx150x_device_data *data = pctl->data; in sx150x_maybe_swizzle()
1004 struct sx150x_pinctrl *pctl = context; in sx150x_regmap_reg_read() local
1005 struct i2c_client *i2c = pctl->client; in sx150x_regmap_reg_read()
1006 const int width = sx150x_regmap_reg_width(pctl, reg); in sx150x_regmap_reg_read()
1048 *result = sx150x_maybe_swizzle(pctl, reg, val); in sx150x_regmap_reg_read()
1057 struct sx150x_pinctrl *pctl = context; in sx150x_regmap_reg_write() local
1058 struct i2c_client *i2c = pctl->client; in sx150x_regmap_reg_write()
1059 const int width = sx150x_regmap_reg_width(pctl, reg); in sx150x_regmap_reg_write()
1061 val = sx150x_maybe_swizzle(pctl, reg, val); in sx150x_regmap_reg_write()
1080 struct sx150x_pinctrl *pctl = i2c_get_clientdata(to_i2c_client(dev)); in sx150x_reg_volatile() local
1082 return reg == pctl->data->reg_irq_src || reg == pctl->data->reg_data; in sx150x_reg_volatile()
1104 struct sx150x_pinctrl *pctl; in sx150x_probe() local
1110 pctl = devm_kzalloc(dev, sizeof(*pctl), GFP_KERNEL); in sx150x_probe()
1111 if (!pctl) in sx150x_probe()
1114 i2c_set_clientdata(client, pctl); in sx150x_probe()
1116 pctl->dev = dev; in sx150x_probe()
1117 pctl->client = client; in sx150x_probe()
1120 pctl->data = of_device_get_match_data(dev); in sx150x_probe()
1122 pctl->data = (struct sx150x_device_data *)id->driver_data; in sx150x_probe()
1124 if (!pctl->data) in sx150x_probe()
1127 pctl->regmap = devm_regmap_init(dev, NULL, pctl, in sx150x_probe()
1129 if (IS_ERR(pctl->regmap)) { in sx150x_probe()
1130 ret = PTR_ERR(pctl->regmap); in sx150x_probe()
1136 mutex_init(&pctl->lock); in sx150x_probe()
1138 ret = sx150x_init_hw(pctl); in sx150x_probe()
1143 pctl->pinctrl_desc.name = "sx150x-pinctrl"; in sx150x_probe()
1144 pctl->pinctrl_desc.pctlops = &sx150x_pinctrl_ops; in sx150x_probe()
1145 pctl->pinctrl_desc.confops = &sx150x_pinconf_ops; in sx150x_probe()
1146 pctl->pinctrl_desc.pins = pctl->data->pins; in sx150x_probe()
1147 pctl->pinctrl_desc.npins = pctl->data->npins; in sx150x_probe()
1148 pctl->pinctrl_desc.owner = THIS_MODULE; in sx150x_probe()
1150 ret = devm_pinctrl_register_and_init(dev, &pctl->pinctrl_desc, in sx150x_probe()
1151 pctl, &pctl->pctldev); in sx150x_probe()
1158 pctl->gpio.base = -1; in sx150x_probe()
1159 pctl->gpio.ngpio = pctl->data->npins; in sx150x_probe()
1160 pctl->gpio.get_direction = sx150x_gpio_get_direction; in sx150x_probe()
1161 pctl->gpio.direction_input = sx150x_gpio_direction_input; in sx150x_probe()
1162 pctl->gpio.direction_output = sx150x_gpio_direction_output; in sx150x_probe()
1163 pctl->gpio.get = sx150x_gpio_get; in sx150x_probe()
1164 pctl->gpio.set = sx150x_gpio_set; in sx150x_probe()
1165 pctl->gpio.set_config = gpiochip_generic_config; in sx150x_probe()
1166 pctl->gpio.parent = dev; in sx150x_probe()
1168 pctl->gpio.of_node = dev->of_node; in sx150x_probe()
1170 pctl->gpio.can_sleep = true; in sx150x_probe()
1171 pctl->gpio.label = devm_kstrdup(dev, client->name, GFP_KERNEL); in sx150x_probe()
1172 if (!pctl->gpio.label) in sx150x_probe()
1181 if (pctl->data->model != SX150X_789) in sx150x_probe()
1182 pctl->gpio.set_multiple = sx150x_gpio_set_multiple; in sx150x_probe()
1188 pctl->irq_chip.irq_mask = sx150x_irq_mask; in sx150x_probe()
1189 pctl->irq_chip.irq_unmask = sx150x_irq_unmask; in sx150x_probe()
1190 pctl->irq_chip.irq_set_type = sx150x_irq_set_type; in sx150x_probe()
1191 pctl->irq_chip.irq_bus_lock = sx150x_irq_bus_lock; in sx150x_probe()
1192 pctl->irq_chip.irq_bus_sync_unlock = sx150x_irq_bus_sync_unlock; in sx150x_probe()
1193 pctl->irq_chip.name = devm_kstrdup(dev, client->name, in sx150x_probe()
1195 if (!pctl->irq_chip.name) in sx150x_probe()
1198 pctl->irq.masked = ~0; in sx150x_probe()
1199 pctl->irq.sense = 0; in sx150x_probe()
1212 girq = &pctl->gpio.irq; in sx150x_probe()
1213 girq->chip = &pctl->irq_chip; in sx150x_probe()
1226 pctl->irq_chip.name, pctl); in sx150x_probe()
1231 ret = devm_gpiochip_add_data(dev, &pctl->gpio, pctl); in sx150x_probe()
1240 ret = pinctrl_enable(pctl->pctldev); in sx150x_probe()
1246 ret = gpiochip_add_pin_range(&pctl->gpio, dev_name(dev), in sx150x_probe()
1247 0, 0, pctl->data->npins); in sx150x_probe()