Lines Matching +full:s3c64xx +full:- +full:pinctrl

1 // SPDX-License-Identifier: GPL-2.0+
3 // pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
12 // This driver implements the Samsung pinctrl driver. It supports setting up of
31 #include "pinctrl-samsung.h"
41 { "samsung,pin-pud", PINCFG_TYPE_PUD },
42 { "samsung,pin-drv", PINCFG_TYPE_DRV },
43 { "samsung,pin-con-pdn", PINCFG_TYPE_CON_PDN },
44 { "samsung,pin-pud-pdn", PINCFG_TYPE_PUD_PDN },
45 { "samsung,pin-val", PINCFG_TYPE_DAT },
54 return pmx->nr_groups; in samsung_get_group_count()
62 return pmx->pin_groups[group].name; in samsung_get_group_name()
72 *pins = pmx->pin_groups[group].pins; in samsung_get_group_pins()
73 *num_pins = pmx->pin_groups[group].num_pins; in samsung_get_group_pins()
91 return -ENOMEM; in reserve_map()
93 memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map)); in reserve_map()
106 return -ENOSPC; in add_map_mux()
124 return -ENOSPC; in add_map_configs()
129 return -ENOMEM; in add_map_configs()
150 return -ENOMEM; in add_config()
190 ret = of_property_read_u32(np, "samsung,pin-function", &val); in samsung_dt_subnode_to_map()
202 } else if (ret != -EINVAL) { in samsung_dt_subnode_to_map()
227 num_maps, group, np->full_name); in samsung_dt_subnode_to_map()
265 return samsung_dt_subnode_to_map(drvdata, pctldev->dev, in samsung_dt_node_to_map()
271 ret = samsung_dt_subnode_to_map(drvdata, pctldev->dev, np, map, in samsung_dt_node_to_map()
309 /* list of pinctrl callbacks for the pinctrl core */
327 return drvdata->nr_functions; in samsung_get_functions_count()
337 return drvdata->pmx_functions[selector].name; in samsung_pinmux_get_fname()
348 *groups = drvdata->pmx_functions[selector].groups; in samsung_pinmux_get_groups()
349 *num_groups = drvdata->pmx_functions[selector].num_groups; in samsung_pinmux_get_groups()
363 b = drvdata->pin_banks; in pin_to_reg_bank()
365 while ((pin >= b->pin_base) && in pin_to_reg_bank()
366 ((b->pin_base + b->nr_pins - 1) < pin)) in pin_to_reg_bank()
369 *reg = b->pctl_base + b->pctl_offset; in pin_to_reg_bank()
370 *offset = pin - b->pin_base; in pin_to_reg_bank()
389 func = &drvdata->pmx_functions[selector]; in samsung_pinmux_setup()
390 grp = &drvdata->pin_groups[group]; in samsung_pinmux_setup()
392 pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->pin_base, in samsung_pinmux_setup()
394 type = bank->type; in samsung_pinmux_setup()
395 mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1; in samsung_pinmux_setup()
396 shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC]; in samsung_pinmux_setup()
399 shift -= 32; in samsung_pinmux_setup()
403 raw_spin_lock_irqsave(&bank->slock, flags); in samsung_pinmux_setup()
405 data = readl(reg + type->reg_offset[PINCFG_TYPE_FUNC]); in samsung_pinmux_setup()
407 data |= func->val << shift; in samsung_pinmux_setup()
408 writel(data, reg + type->reg_offset[PINCFG_TYPE_FUNC]); in samsung_pinmux_setup()
410 raw_spin_unlock_irqrestore(&bank->slock, flags); in samsung_pinmux_setup()
422 /* list of pinmux callbacks for the pinmux vertical in pinctrl core */
444 pin_to_reg_bank(drvdata, pin - drvdata->pin_base, &reg_base, in samsung_pinconf_rw()
446 type = bank->type; in samsung_pinconf_rw()
448 if (cfg_type >= PINCFG_TYPE_NUM || !type->fld_width[cfg_type]) in samsung_pinconf_rw()
449 return -EINVAL; in samsung_pinconf_rw()
451 width = type->fld_width[cfg_type]; in samsung_pinconf_rw()
452 cfg_reg = type->reg_offset[cfg_type]; in samsung_pinconf_rw()
454 raw_spin_lock_irqsave(&bank->slock, flags); in samsung_pinconf_rw()
456 mask = (1 << width) - 1; in samsung_pinconf_rw()
471 raw_spin_unlock_irqrestore(&bank->slock, flags); in samsung_pinconf_rw()
508 pins = drvdata->pin_groups[group].pins; in samsung_pinconf_group_set()
510 for (cnt = 0; cnt < drvdata->pin_groups[group].num_pins; cnt++) in samsung_pinconf_group_set()
524 pins = drvdata->pin_groups[group].pins; in samsung_pinconf_group_get()
529 /* list of pinconfig callbacks for pinconfig vertical in the pinctrl code */
538 * The samsung_gpio_set_vlaue() should be called with "bank->slock" held
545 const struct samsung_pin_bank_type *type = bank->type; in samsung_gpio_set_value()
549 reg = bank->pctl_base + bank->pctl_offset; in samsung_gpio_set_value()
551 data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]); in samsung_gpio_set_value()
555 writel(data, reg + type->reg_offset[PINCFG_TYPE_DAT]); in samsung_gpio_set_value()
564 raw_spin_lock_irqsave(&bank->slock, flags); in samsung_gpio_set()
566 raw_spin_unlock_irqrestore(&bank->slock, flags); in samsung_gpio_set()
575 const struct samsung_pin_bank_type *type = bank->type; in samsung_gpio_get()
577 reg = bank->pctl_base + bank->pctl_offset; in samsung_gpio_get()
579 data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]); in samsung_gpio_get()
586 * The samsung_gpio_set_direction() should be called with "bank->slock" held
600 type = bank->type; in samsung_gpio_set_direction()
602 reg = bank->pctl_base + bank->pctl_offset in samsung_gpio_set_direction()
603 + type->reg_offset[PINCFG_TYPE_FUNC]; in samsung_gpio_set_direction()
605 mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1; in samsung_gpio_set_direction()
606 shift = offset * type->fld_width[PINCFG_TYPE_FUNC]; in samsung_gpio_set_direction()
609 shift -= 32; in samsung_gpio_set_direction()
629 raw_spin_lock_irqsave(&bank->slock, flags); in samsung_gpio_direction_input()
631 raw_spin_unlock_irqrestore(&bank->slock, flags); in samsung_gpio_direction_input()
643 raw_spin_lock_irqsave(&bank->slock, flags); in samsung_gpio_direction_output()
646 raw_spin_unlock_irqrestore(&bank->slock, flags); in samsung_gpio_direction_output()
660 if (!bank->irq_domain) in samsung_gpio_to_irq()
661 return -ENXIO; in samsung_gpio_to_irq()
663 virq = irq_create_mapping(bank->irq_domain, offset); in samsung_gpio_to_irq()
665 return (virq) ? : -ENXIO; in samsung_gpio_to_irq()
673 struct pinctrl_desc *ctrldesc = &drvdata->pctl; in samsung_pinctrl_create_groups()
678 groups = devm_kcalloc(dev, ctrldesc->npins, sizeof(*groups), in samsung_pinctrl_create_groups()
681 return ERR_PTR(-EINVAL); in samsung_pinctrl_create_groups()
684 pdesc = ctrldesc->pins; in samsung_pinctrl_create_groups()
685 for (i = 0; i < ctrldesc->npins; ++i, ++pdesc, ++grp) { in samsung_pinctrl_create_groups()
686 grp->name = pdesc->name; in samsung_pinctrl_create_groups()
687 grp->pins = &pdesc->number; in samsung_pinctrl_create_groups()
688 grp->num_pins = 1; in samsung_pinctrl_create_groups()
691 *cnt = ctrldesc->npins; in samsung_pinctrl_create_groups()
704 if (of_property_read_u32(func_np, "samsung,pin-function", &func->val)) in samsung_pinctrl_create_function()
710 return -EINVAL; in samsung_pinctrl_create_function()
713 func->name = func_np->full_name; in samsung_pinctrl_create_function()
715 func->groups = devm_kcalloc(dev, npins, sizeof(char *), GFP_KERNEL); in samsung_pinctrl_create_function()
716 if (!func->groups) in samsung_pinctrl_create_function()
717 return -ENOMEM; in samsung_pinctrl_create_function()
731 func->groups[i] = gname; in samsung_pinctrl_create_function()
734 func->num_groups = npins; in samsung_pinctrl_create_function()
744 struct device_node *dev_np = dev->of_node; in samsung_pinctrl_create_functions()
758 "samsung,pin-function", NULL)) in samsung_pinctrl_create_functions()
766 "samsung,pin-function", NULL)) in samsung_pinctrl_create_functions()
775 return ERR_PTR(-ENOMEM); in samsung_pinctrl_create_functions()
821 * from device node of the pin-controller. A pin group is formed with all
828 struct device *dev = &pdev->dev; in samsung_pinctrl_parse_dt()
845 drvdata->pin_groups = groups; in samsung_pinctrl_parse_dt()
846 drvdata->nr_groups = grp_cnt; in samsung_pinctrl_parse_dt()
847 drvdata->pmx_functions = functions; in samsung_pinctrl_parse_dt()
848 drvdata->nr_functions = func_cnt; in samsung_pinctrl_parse_dt()
853 /* register the pinctrl interface with the pinctrl subsystem */
857 struct pinctrl_desc *ctrldesc = &drvdata->pctl; in samsung_pinctrl_register()
863 ctrldesc->name = "samsung-pinctrl"; in samsung_pinctrl_register()
864 ctrldesc->owner = THIS_MODULE; in samsung_pinctrl_register()
865 ctrldesc->pctlops = &samsung_pctrl_ops; in samsung_pinctrl_register()
866 ctrldesc->pmxops = &samsung_pinmux_ops; in samsung_pinctrl_register()
867 ctrldesc->confops = &samsung_pinconf_ops; in samsung_pinctrl_register()
869 pindesc = devm_kcalloc(&pdev->dev, in samsung_pinctrl_register()
870 drvdata->nr_pins, sizeof(*pindesc), in samsung_pinctrl_register()
873 return -ENOMEM; in samsung_pinctrl_register()
874 ctrldesc->pins = pindesc; in samsung_pinctrl_register()
875 ctrldesc->npins = drvdata->nr_pins; in samsung_pinctrl_register()
878 for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++) in samsung_pinctrl_register()
879 pdesc->number = pin + drvdata->pin_base; in samsung_pinctrl_register()
883 * the pins which belong to this pin-controller. in samsung_pinctrl_register()
885 pin_names = devm_kzalloc(&pdev->dev, in samsung_pinctrl_register()
887 drvdata->nr_pins), in samsung_pinctrl_register()
890 return -ENOMEM; in samsung_pinctrl_register()
892 /* for each pin, the name of the pin is pin-bank name + pin number */ in samsung_pinctrl_register()
893 for (bank = 0; bank < drvdata->nr_banks; bank++) { in samsung_pinctrl_register()
894 pin_bank = &drvdata->pin_banks[bank]; in samsung_pinctrl_register()
895 for (pin = 0; pin < pin_bank->nr_pins; pin++) { in samsung_pinctrl_register()
896 sprintf(pin_names, "%s-%d", pin_bank->name, pin); in samsung_pinctrl_register()
897 pdesc = pindesc + pin_bank->pin_base + pin; in samsung_pinctrl_register()
898 pdesc->name = pin_names; in samsung_pinctrl_register()
907 drvdata->pctl_dev = devm_pinctrl_register(&pdev->dev, ctrldesc, in samsung_pinctrl_register()
909 if (IS_ERR(drvdata->pctl_dev)) { in samsung_pinctrl_register()
910 dev_err(&pdev->dev, "could not register pinctrl driver\n"); in samsung_pinctrl_register()
911 return PTR_ERR(drvdata->pctl_dev); in samsung_pinctrl_register()
914 for (bank = 0; bank < drvdata->nr_banks; ++bank) { in samsung_pinctrl_register()
915 pin_bank = &drvdata->pin_banks[bank]; in samsung_pinctrl_register()
916 pin_bank->grange.name = pin_bank->name; in samsung_pinctrl_register()
917 pin_bank->grange.id = bank; in samsung_pinctrl_register()
918 pin_bank->grange.pin_base = drvdata->pin_base in samsung_pinctrl_register()
919 + pin_bank->pin_base; in samsung_pinctrl_register()
920 pin_bank->grange.base = pin_bank->grange.pin_base; in samsung_pinctrl_register()
921 pin_bank->grange.npins = pin_bank->nr_pins; in samsung_pinctrl_register()
922 pin_bank->grange.gc = &pin_bank->gpio_chip; in samsung_pinctrl_register()
923 pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange); in samsung_pinctrl_register()
929 /* unregister the pinctrl interface with the pinctrl subsystem */
933 struct samsung_pin_bank *bank = drvdata->pin_banks; in samsung_pinctrl_unregister()
936 for (i = 0; i < drvdata->nr_banks; ++i, ++bank) in samsung_pinctrl_unregister()
937 pinctrl_remove_gpio_range(drvdata->pctl_dev, &bank->grange); in samsung_pinctrl_unregister()
957 struct samsung_pin_bank *bank = drvdata->pin_banks; in samsung_gpiolib_register()
962 for (i = 0; i < drvdata->nr_banks; ++i, ++bank) { in samsung_gpiolib_register()
963 bank->gpio_chip = samsung_gpiolib_chip; in samsung_gpiolib_register()
965 gc = &bank->gpio_chip; in samsung_gpiolib_register()
966 gc->base = bank->grange.base; in samsung_gpiolib_register()
967 gc->ngpio = bank->nr_pins; in samsung_gpiolib_register()
968 gc->parent = &pdev->dev; in samsung_gpiolib_register()
969 gc->fwnode = bank->fwnode; in samsung_gpiolib_register()
970 gc->label = bank->name; in samsung_gpiolib_register()
972 ret = devm_gpiochip_add_data(&pdev->dev, gc, bank); in samsung_gpiolib_register()
974 dev_err(&pdev->dev, "failed to register gpio_chip %s, error code: %d\n", in samsung_gpiolib_register()
975 gc->label, ret); in samsung_gpiolib_register()
986 struct device_node *node = pdev->dev.of_node; in samsung_pinctrl_get_soc_data_for_of_alias()
990 id = of_alias_get_id(node, "pinctrl"); in samsung_pinctrl_get_soc_data_for_of_alias()
992 dev_err(&pdev->dev, "failed to get alias id\n"); in samsung_pinctrl_get_soc_data_for_of_alias()
996 of_data = of_device_get_match_data(&pdev->dev); in samsung_pinctrl_get_soc_data_for_of_alias()
997 if (id >= of_data->num_ctrl) { in samsung_pinctrl_get_soc_data_for_of_alias()
998 dev_err(&pdev->dev, "invalid alias id %d\n", id); in samsung_pinctrl_get_soc_data_for_of_alias()
1002 return &(of_data->ctrl[id]); in samsung_pinctrl_get_soc_data_for_of_alias()
1010 bank = d->pin_banks; in samsung_banks_node_put()
1011 for (i = 0; i < d->nr_banks; ++i, ++bank) in samsung_banks_node_put()
1012 fwnode_handle_put(bank->fwnode); in samsung_banks_node_put()
1017 * skipping optional "-gpio" node suffix. When found, assign node to the bank.
1021 const char *suffix = "-gpio-bank"; in samsung_banks_node_get()
1029 bank = d->pin_banks; in samsung_banks_node_get()
1030 for (i = 0; i < d->nr_banks; ++i, ++bank) { in samsung_banks_node_get()
1031 strscpy(node_name, bank->name, sizeof(node_name)); in samsung_banks_node_get()
1035 bank->name); in samsung_banks_node_get()
1044 if (of_node_name_eq(np, bank->name)) in samsung_banks_node_get()
1049 bank->fwnode = child; in samsung_banks_node_get()
1051 dev_warn(dev, "Missing node for bank %s - invalid DTB\n", in samsung_banks_node_get()
1052 bank->name); in samsung_banks_node_get()
1071 return ERR_PTR(-ENOENT); in samsung_pinctrl_get_soc_data()
1073 d->suspend = ctrl->suspend; in samsung_pinctrl_get_soc_data()
1074 d->resume = ctrl->resume; in samsung_pinctrl_get_soc_data()
1075 d->nr_banks = ctrl->nr_banks; in samsung_pinctrl_get_soc_data()
1076 d->pin_banks = devm_kcalloc(&pdev->dev, d->nr_banks, in samsung_pinctrl_get_soc_data()
1077 sizeof(*d->pin_banks), GFP_KERNEL); in samsung_pinctrl_get_soc_data()
1078 if (!d->pin_banks) in samsung_pinctrl_get_soc_data()
1079 return ERR_PTR(-ENOMEM); in samsung_pinctrl_get_soc_data()
1081 if (ctrl->nr_ext_resources + 1 > SAMSUNG_PINCTRL_NUM_RESOURCES) in samsung_pinctrl_get_soc_data()
1082 return ERR_PTR(-EINVAL); in samsung_pinctrl_get_soc_data()
1084 for (i = 0; i < ctrl->nr_ext_resources + 1; i++) { in samsung_pinctrl_get_soc_data()
1087 dev_err(&pdev->dev, "failed to get mem%d resource\n", i); in samsung_pinctrl_get_soc_data()
1088 return ERR_PTR(-EINVAL); in samsung_pinctrl_get_soc_data()
1090 virt_base[i] = devm_ioremap(&pdev->dev, res->start, in samsung_pinctrl_get_soc_data()
1093 dev_err(&pdev->dev, "failed to ioremap %pR\n", res); in samsung_pinctrl_get_soc_data()
1094 return ERR_PTR(-EIO); in samsung_pinctrl_get_soc_data()
1098 bank = d->pin_banks; in samsung_pinctrl_get_soc_data()
1099 bdata = ctrl->pin_banks; in samsung_pinctrl_get_soc_data()
1100 for (i = 0; i < ctrl->nr_banks; ++i, ++bdata, ++bank) { in samsung_pinctrl_get_soc_data()
1101 bank->type = bdata->type; in samsung_pinctrl_get_soc_data()
1102 bank->pctl_offset = bdata->pctl_offset; in samsung_pinctrl_get_soc_data()
1103 bank->nr_pins = bdata->nr_pins; in samsung_pinctrl_get_soc_data()
1104 bank->eint_func = bdata->eint_func; in samsung_pinctrl_get_soc_data()
1105 bank->eint_type = bdata->eint_type; in samsung_pinctrl_get_soc_data()
1106 bank->eint_mask = bdata->eint_mask; in samsung_pinctrl_get_soc_data()
1107 bank->eint_offset = bdata->eint_offset; in samsung_pinctrl_get_soc_data()
1108 bank->name = bdata->name; in samsung_pinctrl_get_soc_data()
1110 raw_spin_lock_init(&bank->slock); in samsung_pinctrl_get_soc_data()
1111 bank->drvdata = d; in samsung_pinctrl_get_soc_data()
1112 bank->pin_base = d->nr_pins; in samsung_pinctrl_get_soc_data()
1113 d->nr_pins += bank->nr_pins; in samsung_pinctrl_get_soc_data()
1115 bank->eint_base = virt_base[0]; in samsung_pinctrl_get_soc_data()
1116 bank->pctl_base = virt_base[bdata->pctl_res_idx]; in samsung_pinctrl_get_soc_data()
1123 d->virt_base = virt_base[0]; in samsung_pinctrl_get_soc_data()
1125 samsung_banks_node_get(&pdev->dev, d); in samsung_pinctrl_get_soc_data()
1127 d->pin_base = pin_base; in samsung_pinctrl_get_soc_data()
1128 pin_base += d->nr_pins; in samsung_pinctrl_get_soc_data()
1137 struct device *dev = &pdev->dev; in samsung_pinctrl_probe()
1142 return -ENOMEM; in samsung_pinctrl_probe()
1146 dev_err(&pdev->dev, "driver data not available\n"); in samsung_pinctrl_probe()
1149 drvdata->dev = dev; in samsung_pinctrl_probe()
1152 if (ret < 0 && ret != -ENXIO) in samsung_pinctrl_probe()
1155 drvdata->irq = ret; in samsung_pinctrl_probe()
1157 if (ctrl->retention_data) { in samsung_pinctrl_probe()
1158 drvdata->retention_ctrl = ctrl->retention_data->init(drvdata, in samsung_pinctrl_probe()
1159 ctrl->retention_data); in samsung_pinctrl_probe()
1160 if (IS_ERR(drvdata->retention_ctrl)) { in samsung_pinctrl_probe()
1161 ret = PTR_ERR(drvdata->retention_ctrl); in samsung_pinctrl_probe()
1170 if (ctrl->eint_gpio_init) in samsung_pinctrl_probe()
1171 ctrl->eint_gpio_init(drvdata); in samsung_pinctrl_probe()
1172 if (ctrl->eint_wkup_init) in samsung_pinctrl_probe()
1173 ctrl->eint_wkup_init(drvdata); in samsung_pinctrl_probe()
1191 * samsung_pinctrl_suspend - save pinctrl state for suspend
1200 for (i = 0; i < drvdata->nr_banks; i++) { in samsung_pinctrl_suspend()
1201 struct samsung_pin_bank *bank = &drvdata->pin_banks[i]; in samsung_pinctrl_suspend()
1202 void __iomem *reg = bank->pctl_base + bank->pctl_offset; in samsung_pinctrl_suspend()
1203 const u8 *offs = bank->type->reg_offset; in samsung_pinctrl_suspend()
1204 const u8 *widths = bank->type->fld_width; in samsung_pinctrl_suspend()
1213 bank->pm_save[type] = readl(reg + offs[type]); in samsung_pinctrl_suspend()
1215 if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) { in samsung_pinctrl_suspend()
1217 bank->pm_save[PINCFG_TYPE_NUM] = in samsung_pinctrl_suspend()
1220 bank->name, reg, in samsung_pinctrl_suspend()
1221 bank->pm_save[PINCFG_TYPE_FUNC], in samsung_pinctrl_suspend()
1222 bank->pm_save[PINCFG_TYPE_NUM]); in samsung_pinctrl_suspend()
1224 pr_debug("Save %s @ %p (con %#010x)\n", bank->name, in samsung_pinctrl_suspend()
1225 reg, bank->pm_save[PINCFG_TYPE_FUNC]); in samsung_pinctrl_suspend()
1229 if (drvdata->suspend) in samsung_pinctrl_suspend()
1230 drvdata->suspend(drvdata); in samsung_pinctrl_suspend()
1231 if (drvdata->retention_ctrl && drvdata->retention_ctrl->enable) in samsung_pinctrl_suspend()
1232 drvdata->retention_ctrl->enable(drvdata); in samsung_pinctrl_suspend()
1238 * samsung_pinctrl_resume - restore pinctrl state from suspend
1250 if (drvdata->resume) in samsung_pinctrl_resume()
1251 drvdata->resume(drvdata); in samsung_pinctrl_resume()
1253 for (i = 0; i < drvdata->nr_banks; i++) { in samsung_pinctrl_resume()
1254 struct samsung_pin_bank *bank = &drvdata->pin_banks[i]; in samsung_pinctrl_resume()
1255 void __iomem *reg = bank->pctl_base + bank->pctl_offset; in samsung_pinctrl_resume()
1256 const u8 *offs = bank->type->reg_offset; in samsung_pinctrl_resume()
1257 const u8 *widths = bank->type->fld_width; in samsung_pinctrl_resume()
1264 if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) { in samsung_pinctrl_resume()
1267 bank->name, reg, in samsung_pinctrl_resume()
1270 bank->pm_save[PINCFG_TYPE_FUNC], in samsung_pinctrl_resume()
1271 bank->pm_save[PINCFG_TYPE_NUM]); in samsung_pinctrl_resume()
1272 writel(bank->pm_save[PINCFG_TYPE_NUM], in samsung_pinctrl_resume()
1275 pr_debug("%s @ %p (con %#010x => %#010x)\n", bank->name, in samsung_pinctrl_resume()
1277 bank->pm_save[PINCFG_TYPE_FUNC]); in samsung_pinctrl_resume()
1281 writel(bank->pm_save[type], reg + offs[type]); in samsung_pinctrl_resume()
1284 if (drvdata->retention_ctrl && drvdata->retention_ctrl->disable) in samsung_pinctrl_resume()
1285 drvdata->retention_ctrl->disable(drvdata); in samsung_pinctrl_resume()
1292 { .compatible = "samsung,exynos3250-pinctrl",
1294 { .compatible = "samsung,exynos4210-pinctrl",
1296 { .compatible = "samsung,exynos4x12-pinctrl",
1298 { .compatible = "samsung,exynos5250-pinctrl",
1300 { .compatible = "samsung,exynos5260-pinctrl",
1302 { .compatible = "samsung,exynos5410-pinctrl",
1304 { .compatible = "samsung,exynos5420-pinctrl",
1306 { .compatible = "samsung,s5pv210-pinctrl",
1310 { .compatible = "samsung,exynos5433-pinctrl",
1312 { .compatible = "samsung,exynos7-pinctrl",
1314 { .compatible = "samsung,exynos7885-pinctrl",
1316 { .compatible = "samsung,exynos850-pinctrl",
1318 { .compatible = "samsung,exynosautov9-pinctrl",
1320 { .compatible = "tesla,fsd-pinctrl",
1324 { .compatible = "samsung,s3c64xx-pinctrl",
1338 .name = "samsung-pinctrl",