Lines Matching refs:pctl
41 sunxi_pinctrl_find_group_by_name(struct sunxi_pinctrl *pctl, const char *group) in sunxi_pinctrl_find_group_by_name() argument
45 for (i = 0; i < pctl->ngroups; i++) { in sunxi_pinctrl_find_group_by_name()
46 struct sunxi_pinctrl_group *grp = pctl->groups + i; in sunxi_pinctrl_find_group_by_name()
56 sunxi_pinctrl_find_function_by_name(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_find_function_by_name() argument
59 struct sunxi_pinctrl_function *func = pctl->functions; in sunxi_pinctrl_find_function_by_name()
62 for (i = 0; i < pctl->nfunctions; i++) { in sunxi_pinctrl_find_function_by_name()
74 sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_desc_find_function_by_name() argument
80 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_desc_find_function_by_name()
81 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_desc_find_function_by_name()
89 func->variant & pctl->variant)) in sunxi_pinctrl_desc_find_function_by_name()
101 sunxi_pinctrl_desc_find_function_by_pin(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_desc_find_function_by_pin() argument
107 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_desc_find_function_by_pin()
108 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_desc_find_function_by_pin()
127 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pctrl_get_groups_count() local
129 return pctl->ngroups; in sunxi_pctrl_get_groups_count()
135 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pctrl_get_group_name() local
137 return pctl->groups[group].name; in sunxi_pctrl_get_group_name()
145 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pctrl_get_group_pins() local
147 *pins = (unsigned *)&pctl->groups[group].pin; in sunxi_pctrl_get_group_pins()
323 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pctrl_dt_node_to_map() local
335 dev_err(pctl->dev, "missing function property in node %s\n", in sunxi_pctrl_dt_node_to_map()
342 dev_err(pctl->dev, "missing pins property in node %s\n", in sunxi_pctrl_dt_node_to_map()
367 sunxi_pinctrl_find_group_by_name(pctl, group); in sunxi_pctrl_dt_node_to_map()
370 dev_err(pctl->dev, "unknown pin %s", group); in sunxi_pctrl_dt_node_to_map()
374 if (!sunxi_pinctrl_desc_find_function_by_name(pctl, in sunxi_pctrl_dt_node_to_map()
377 dev_err(pctl->dev, "unsupported function %s on pin %s", in sunxi_pctrl_dt_node_to_map()
473 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pconf_get() local
479 pin -= pctl->desc->pin_base; in sunxi_pconf_get()
485 val = (readl(pctl->membase + offset) >> shift) & mask; in sunxi_pconf_get()
525 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pconf_group_get() local
526 struct sunxi_pinctrl_group *g = &pctl->groups[group]; in sunxi_pconf_group_get()
537 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pconf_group_set() local
538 struct sunxi_pinctrl_group *g = &pctl->groups[group]; in sunxi_pconf_group_set()
539 unsigned pin = g->pin - pctl->desc->pin_base; in sunxi_pconf_group_set()
588 raw_spin_lock_irqsave(&pctl->lock, flags); in sunxi_pconf_group_set()
589 reg = readl(pctl->membase + offset); in sunxi_pconf_group_set()
591 writel(reg | val << shift, pctl->membase + offset); in sunxi_pconf_group_set()
592 raw_spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pconf_group_set()
607 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_get_funcs_cnt() local
609 return pctl->nfunctions; in sunxi_pmx_get_funcs_cnt()
615 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_get_func_name() local
617 return pctl->functions[function].name; in sunxi_pmx_get_func_name()
625 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_get_func_groups() local
627 *groups = pctl->functions[function].groups; in sunxi_pmx_get_func_groups()
628 *num_groups = pctl->functions[function].ngroups; in sunxi_pmx_get_func_groups()
637 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_set() local
641 raw_spin_lock_irqsave(&pctl->lock, flags); in sunxi_pmx_set()
643 pin -= pctl->desc->pin_base; in sunxi_pmx_set()
644 val = readl(pctl->membase + sunxi_mux_reg(pin)); in sunxi_pmx_set()
647 pctl->membase + sunxi_mux_reg(pin)); in sunxi_pmx_set()
649 raw_spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pmx_set()
656 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_set_mux() local
657 struct sunxi_pinctrl_group *g = pctl->groups + group; in sunxi_pmx_set_mux()
658 struct sunxi_pinctrl_function *func = pctl->functions + function; in sunxi_pmx_set_mux()
660 sunxi_pinctrl_desc_find_function_by_name(pctl, in sunxi_pmx_set_mux()
678 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in sunxi_pmx_gpio_set_direction() local
687 desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, offset, func); in sunxi_pmx_gpio_set_direction()
713 struct sunxi_pinctrl *pctl = gpiochip_get_data(chip); in sunxi_pinctrl_gpio_get() local
716 bool set_mux = pctl->desc->irq_read_needs_mux && in sunxi_pinctrl_gpio_get()
722 sunxi_pmx_set(pctl->pctl_dev, pin, SUN4I_FUNC_INPUT); in sunxi_pinctrl_gpio_get()
724 val = (readl(pctl->membase + reg) >> index) & DATA_PINS_MASK; in sunxi_pinctrl_gpio_get()
727 sunxi_pmx_set(pctl->pctl_dev, pin, SUN4I_FUNC_IRQ); in sunxi_pinctrl_gpio_get()
735 struct sunxi_pinctrl *pctl = gpiochip_get_data(chip); in sunxi_pinctrl_gpio_set() local
741 raw_spin_lock_irqsave(&pctl->lock, flags); in sunxi_pinctrl_gpio_set()
743 regval = readl(pctl->membase + reg); in sunxi_pinctrl_gpio_set()
750 writel(regval, pctl->membase + reg); in sunxi_pinctrl_gpio_set()
752 raw_spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pinctrl_gpio_set()
782 struct sunxi_pinctrl *pctl = gpiochip_get_data(chip); in sunxi_pinctrl_gpio_to_irq() local
784 unsigned pinnum = pctl->desc->pin_base + offset; in sunxi_pinctrl_gpio_to_irq()
790 desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, pinnum, "irq"); in sunxi_pinctrl_gpio_to_irq()
799 return irq_find_mapping(pctl->domain, irqnum); in sunxi_pinctrl_gpio_to_irq()
804 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_request_resources() local
808 func = sunxi_pinctrl_desc_find_function_by_pin(pctl, in sunxi_pinctrl_irq_request_resources()
809 pctl->irq_array[d->hwirq], "irq"); in sunxi_pinctrl_irq_request_resources()
813 ret = gpiochip_lock_as_irq(pctl->chip, in sunxi_pinctrl_irq_request_resources()
814 pctl->irq_array[d->hwirq] - pctl->desc->pin_base); in sunxi_pinctrl_irq_request_resources()
816 dev_err(pctl->dev, "unable to lock HW IRQ %lu for IRQ\n", in sunxi_pinctrl_irq_request_resources()
822 sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval); in sunxi_pinctrl_irq_request_resources()
829 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_release_resources() local
831 gpiochip_unlock_as_irq(pctl->chip, in sunxi_pinctrl_irq_release_resources()
832 pctl->irq_array[d->hwirq] - pctl->desc->pin_base); in sunxi_pinctrl_irq_release_resources()
837 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_set_type() local
838 u32 reg = sunxi_irq_cfg_reg(pctl->desc, d->hwirq); in sunxi_pinctrl_irq_set_type()
864 raw_spin_lock_irqsave(&pctl->lock, flags); in sunxi_pinctrl_irq_set_type()
873 regval = readl(pctl->membase + reg); in sunxi_pinctrl_irq_set_type()
875 writel(regval | (mode << index), pctl->membase + reg); in sunxi_pinctrl_irq_set_type()
877 raw_spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pinctrl_irq_set_type()
884 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_ack() local
885 u32 status_reg = sunxi_irq_status_reg(pctl->desc, d->hwirq); in sunxi_pinctrl_irq_ack()
889 writel(1 << status_idx, pctl->membase + status_reg); in sunxi_pinctrl_irq_ack()
894 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_mask() local
895 u32 reg = sunxi_irq_ctrl_reg(pctl->desc, d->hwirq); in sunxi_pinctrl_irq_mask()
900 raw_spin_lock_irqsave(&pctl->lock, flags); in sunxi_pinctrl_irq_mask()
903 val = readl(pctl->membase + reg); in sunxi_pinctrl_irq_mask()
904 writel(val & ~(1 << idx), pctl->membase + reg); in sunxi_pinctrl_irq_mask()
906 raw_spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pinctrl_irq_mask()
911 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); in sunxi_pinctrl_irq_unmask() local
912 u32 reg = sunxi_irq_ctrl_reg(pctl->desc, d->hwirq); in sunxi_pinctrl_irq_unmask()
917 raw_spin_lock_irqsave(&pctl->lock, flags); in sunxi_pinctrl_irq_unmask()
920 val = readl(pctl->membase + reg); in sunxi_pinctrl_irq_unmask()
921 writel(val | (1 << idx), pctl->membase + reg); in sunxi_pinctrl_irq_unmask()
923 raw_spin_unlock_irqrestore(&pctl->lock, flags); in sunxi_pinctrl_irq_unmask()
966 struct sunxi_pinctrl *pctl = d->host_data; in sunxi_pinctrl_irq_of_xlate() local
974 pin = pctl->desc->pin_base + base + intspec[1]; in sunxi_pinctrl_irq_of_xlate()
976 desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, pin, "irq"); in sunxi_pinctrl_irq_of_xlate()
994 struct sunxi_pinctrl *pctl = irq_desc_get_handler_data(desc); in sunxi_pinctrl_irq_handler() local
997 for (bank = 0; bank < pctl->desc->irq_banks; bank++) in sunxi_pinctrl_irq_handler()
998 if (irq == pctl->irq[bank]) in sunxi_pinctrl_irq_handler()
1001 if (bank == pctl->desc->irq_banks) in sunxi_pinctrl_irq_handler()
1004 reg = sunxi_irq_status_reg_from_bank(pctl->desc, bank); in sunxi_pinctrl_irq_handler()
1005 val = readl(pctl->membase + reg); in sunxi_pinctrl_irq_handler()
1012 int pin_irq = irq_find_mapping(pctl->domain, in sunxi_pinctrl_irq_handler()
1020 static int sunxi_pinctrl_add_function(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_add_function() argument
1023 struct sunxi_pinctrl_function *func = pctl->functions; in sunxi_pinctrl_add_function()
1037 pctl->nfunctions++; in sunxi_pinctrl_add_function()
1044 struct sunxi_pinctrl *pctl = platform_get_drvdata(pdev); in sunxi_pinctrl_build_state() local
1058 pctl->groups = devm_kcalloc(&pdev->dev, in sunxi_pinctrl_build_state()
1059 pctl->desc->npins, sizeof(*pctl->groups), in sunxi_pinctrl_build_state()
1061 if (!pctl->groups) in sunxi_pinctrl_build_state()
1064 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_build_state()
1065 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_build_state()
1066 struct sunxi_pinctrl_group *group = pctl->groups + pctl->ngroups; in sunxi_pinctrl_build_state()
1068 if (pin->variant && !(pctl->variant & pin->variant)) in sunxi_pinctrl_build_state()
1075 pctl->ngroups++; in sunxi_pinctrl_build_state()
1082 pctl->functions = devm_kcalloc(&pdev->dev, in sunxi_pinctrl_build_state()
1083 pctl->ngroups, in sunxi_pinctrl_build_state()
1084 sizeof(*pctl->functions), in sunxi_pinctrl_build_state()
1086 if (!pctl->functions) in sunxi_pinctrl_build_state()
1090 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_build_state()
1091 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_build_state()
1094 if (pin->variant && !(pctl->variant & pin->variant)) in sunxi_pinctrl_build_state()
1098 if (func->variant && !(pctl->variant & func->variant)) in sunxi_pinctrl_build_state()
1104 pctl->irq_array[irqnum] = pin->pin.number; in sunxi_pinctrl_build_state()
1107 sunxi_pinctrl_add_function(pctl, func->name); in sunxi_pinctrl_build_state()
1112 pctl->functions = krealloc(pctl->functions, in sunxi_pinctrl_build_state()
1113 pctl->nfunctions * sizeof(*pctl->functions), in sunxi_pinctrl_build_state()
1115 if (!pctl->functions) { in sunxi_pinctrl_build_state()
1116 kfree(pctl->functions); in sunxi_pinctrl_build_state()
1120 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_build_state()
1121 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_build_state()
1124 if (pin->variant && !(pctl->variant & pin->variant)) in sunxi_pinctrl_build_state()
1131 if (func->variant && !(pctl->variant & func->variant)) in sunxi_pinctrl_build_state()
1134 func_item = sunxi_pinctrl_find_function_by_name(pctl, in sunxi_pinctrl_build_state()
1182 static int sunxi_pinctrl_setup_debounce(struct sunxi_pinctrl *pctl, in sunxi_pinctrl_setup_debounce() argument
1199 losc = devm_clk_get(pctl->dev, "losc"); in sunxi_pinctrl_setup_debounce()
1203 hosc = devm_clk_get(pctl->dev, "hosc"); in sunxi_pinctrl_setup_debounce()
1207 for (i = 0; i < pctl->desc->irq_banks; i++) { in sunxi_pinctrl_setup_debounce()
1237 pctl->membase + in sunxi_pinctrl_setup_debounce()
1238 sunxi_irq_debounce_reg_from_bank(pctl->desc, i)); in sunxi_pinctrl_setup_debounce()
1251 struct sunxi_pinctrl *pctl; in sunxi_pinctrl_init_with_variant() local
1257 pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL); in sunxi_pinctrl_init_with_variant()
1258 if (!pctl) in sunxi_pinctrl_init_with_variant()
1260 platform_set_drvdata(pdev, pctl); in sunxi_pinctrl_init_with_variant()
1262 raw_spin_lock_init(&pctl->lock); in sunxi_pinctrl_init_with_variant()
1265 pctl->membase = devm_ioremap_resource(&pdev->dev, res); in sunxi_pinctrl_init_with_variant()
1266 if (IS_ERR(pctl->membase)) in sunxi_pinctrl_init_with_variant()
1267 return PTR_ERR(pctl->membase); in sunxi_pinctrl_init_with_variant()
1269 pctl->dev = &pdev->dev; in sunxi_pinctrl_init_with_variant()
1270 pctl->desc = desc; in sunxi_pinctrl_init_with_variant()
1271 pctl->variant = variant; in sunxi_pinctrl_init_with_variant()
1273 pctl->irq_array = devm_kcalloc(&pdev->dev, in sunxi_pinctrl_init_with_variant()
1274 IRQ_PER_BANK * pctl->desc->irq_banks, in sunxi_pinctrl_init_with_variant()
1275 sizeof(*pctl->irq_array), in sunxi_pinctrl_init_with_variant()
1277 if (!pctl->irq_array) in sunxi_pinctrl_init_with_variant()
1287 pctl->desc->npins, sizeof(*pins), in sunxi_pinctrl_init_with_variant()
1292 for (i = 0, pin_idx = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_init_with_variant()
1293 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_init_with_variant()
1295 if (pin->variant && !(pctl->variant & pin->variant)) in sunxi_pinctrl_init_with_variant()
1310 pctrl_desc->npins = pctl->ngroups; in sunxi_pinctrl_init_with_variant()
1324 pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, pctrl_desc, pctl); in sunxi_pinctrl_init_with_variant()
1325 if (IS_ERR(pctl->pctl_dev)) { in sunxi_pinctrl_init_with_variant()
1327 return PTR_ERR(pctl->pctl_dev); in sunxi_pinctrl_init_with_variant()
1330 pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL); in sunxi_pinctrl_init_with_variant()
1331 if (!pctl->chip) in sunxi_pinctrl_init_with_variant()
1334 last_pin = pctl->desc->pins[pctl->desc->npins - 1].pin.number; in sunxi_pinctrl_init_with_variant()
1335 pctl->chip->owner = THIS_MODULE; in sunxi_pinctrl_init_with_variant()
1336 pctl->chip->request = gpiochip_generic_request, in sunxi_pinctrl_init_with_variant()
1337 pctl->chip->free = gpiochip_generic_free, in sunxi_pinctrl_init_with_variant()
1338 pctl->chip->direction_input = sunxi_pinctrl_gpio_direction_input, in sunxi_pinctrl_init_with_variant()
1339 pctl->chip->direction_output = sunxi_pinctrl_gpio_direction_output, in sunxi_pinctrl_init_with_variant()
1340 pctl->chip->get = sunxi_pinctrl_gpio_get, in sunxi_pinctrl_init_with_variant()
1341 pctl->chip->set = sunxi_pinctrl_gpio_set, in sunxi_pinctrl_init_with_variant()
1342 pctl->chip->of_xlate = sunxi_pinctrl_gpio_of_xlate, in sunxi_pinctrl_init_with_variant()
1343 pctl->chip->to_irq = sunxi_pinctrl_gpio_to_irq, in sunxi_pinctrl_init_with_variant()
1344 pctl->chip->of_gpio_n_cells = 3, in sunxi_pinctrl_init_with_variant()
1345 pctl->chip->can_sleep = false, in sunxi_pinctrl_init_with_variant()
1346 pctl->chip->ngpio = round_up(last_pin, PINS_PER_BANK) - in sunxi_pinctrl_init_with_variant()
1347 pctl->desc->pin_base; in sunxi_pinctrl_init_with_variant()
1348 pctl->chip->label = dev_name(&pdev->dev); in sunxi_pinctrl_init_with_variant()
1349 pctl->chip->parent = &pdev->dev; in sunxi_pinctrl_init_with_variant()
1350 pctl->chip->base = pctl->desc->pin_base; in sunxi_pinctrl_init_with_variant()
1352 ret = gpiochip_add_data(pctl->chip, pctl); in sunxi_pinctrl_init_with_variant()
1356 for (i = 0; i < pctl->desc->npins; i++) { in sunxi_pinctrl_init_with_variant()
1357 const struct sunxi_desc_pin *pin = pctl->desc->pins + i; in sunxi_pinctrl_init_with_variant()
1359 ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev), in sunxi_pinctrl_init_with_variant()
1360 pin->pin.number - pctl->desc->pin_base, in sunxi_pinctrl_init_with_variant()
1377 pctl->irq = devm_kcalloc(&pdev->dev, in sunxi_pinctrl_init_with_variant()
1378 pctl->desc->irq_banks, in sunxi_pinctrl_init_with_variant()
1379 sizeof(*pctl->irq), in sunxi_pinctrl_init_with_variant()
1381 if (!pctl->irq) { in sunxi_pinctrl_init_with_variant()
1386 for (i = 0; i < pctl->desc->irq_banks; i++) { in sunxi_pinctrl_init_with_variant()
1387 pctl->irq[i] = platform_get_irq(pdev, i); in sunxi_pinctrl_init_with_variant()
1388 if (pctl->irq[i] < 0) { in sunxi_pinctrl_init_with_variant()
1389 ret = pctl->irq[i]; in sunxi_pinctrl_init_with_variant()
1394 pctl->domain = irq_domain_add_linear(node, in sunxi_pinctrl_init_with_variant()
1395 pctl->desc->irq_banks * IRQ_PER_BANK, in sunxi_pinctrl_init_with_variant()
1397 pctl); in sunxi_pinctrl_init_with_variant()
1398 if (!pctl->domain) { in sunxi_pinctrl_init_with_variant()
1404 for (i = 0; i < (pctl->desc->irq_banks * IRQ_PER_BANK); i++) { in sunxi_pinctrl_init_with_variant()
1405 int irqno = irq_create_mapping(pctl->domain, i); in sunxi_pinctrl_init_with_variant()
1409 irq_set_chip_data(irqno, pctl); in sunxi_pinctrl_init_with_variant()
1412 for (i = 0; i < pctl->desc->irq_banks; i++) { in sunxi_pinctrl_init_with_variant()
1414 writel(0, pctl->membase + in sunxi_pinctrl_init_with_variant()
1415 sunxi_irq_ctrl_reg_from_bank(pctl->desc, i)); in sunxi_pinctrl_init_with_variant()
1417 pctl->membase + in sunxi_pinctrl_init_with_variant()
1418 sunxi_irq_status_reg_from_bank(pctl->desc, i)); in sunxi_pinctrl_init_with_variant()
1420 irq_set_chained_handler_and_data(pctl->irq[i], in sunxi_pinctrl_init_with_variant()
1422 pctl); in sunxi_pinctrl_init_with_variant()
1425 sunxi_pinctrl_setup_debounce(pctl, node); in sunxi_pinctrl_init_with_variant()
1434 gpiochip_remove(pctl->chip); in sunxi_pinctrl_init_with_variant()