Lines Matching +full:first +full:- +full:data +full:- +full:gpios
1 // SPDX-License-Identifier: GPL-2.0
22 #include "gpiolib-acpi.h"
24 static int run_edge_events_on_boot = -1;
27 "Run edge _AEI event-handlers at boot: 0=no, 1=yes, -1=auto");
41 * struct acpi_gpio_event - ACPI GPIO event handler data
43 * @node: list-entry of the events list of the struct acpi_gpio_chip
73 * ACPICA requires that the first field of the context parameter
96 static int acpi_gpiochip_find(struct gpio_chip *gc, void *data) in acpi_gpiochip_find() argument
98 if (!gc->parent) in acpi_gpiochip_find()
101 return ACPI_HANDLE(gc->parent) == data; in acpi_gpiochip_find()
105 * acpi_get_gpiod() - Translate ACPI GPIO pin to GPIO descriptor usable with GPIO API
107 * @pin: ACPI GPIO pin number (0-based, controller-relative)
110 * error value. Specifically returns %-EPROBE_DEFER if the referenced GPIO
122 return ERR_PTR(-ENODEV); in acpi_get_gpiod()
126 return ERR_PTR(-EPROBE_DEFER); in acpi_get_gpiod()
131 static irqreturn_t acpi_gpio_irq_handler(int irq, void *data) in acpi_gpio_irq_handler() argument
133 struct acpi_gpio_event *event = data; in acpi_gpio_irq_handler()
135 acpi_evaluate_object(event->handle, NULL, NULL, NULL); in acpi_gpio_irq_handler()
140 static irqreturn_t acpi_gpio_irq_handler_evt(int irq, void *data) in acpi_gpio_irq_handler_evt() argument
142 struct acpi_gpio_event *event = data; in acpi_gpio_irq_handler_evt()
144 acpi_execute_simple_method(event->handle, NULL, event->pin); in acpi_gpio_irq_handler_evt()
149 static void acpi_gpio_chip_dh(acpi_handle handle, void *data) in acpi_gpio_chip_dh() argument
159 if (ares->type != ACPI_RESOURCE_TYPE_GPIO) in acpi_gpio_get_irq_resource()
162 gpio = &ares->data.gpio; in acpi_gpio_get_irq_resource()
163 if (gpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_INT) in acpi_gpio_get_irq_resource()
176 ret = request_threaded_irq(event->irq, NULL, event->handler, in acpi_gpiochip_request_irq()
177 event->irqflags | IRQF_ONESHOT, "ACPI:Event", event); in acpi_gpiochip_request_irq()
179 dev_err(acpi_gpio->chip->parent, in acpi_gpiochip_request_irq()
181 event->irq); in acpi_gpiochip_request_irq()
185 if (event->irq_is_wake) in acpi_gpiochip_request_irq()
186 enable_irq_wake(event->irq); in acpi_gpiochip_request_irq()
188 event->irq_requested = true; in acpi_gpiochip_request_irq()
190 /* Make sure we trigger the initial state of edge-triggered IRQs */ in acpi_gpiochip_request_irq()
192 (event->irqflags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))) { in acpi_gpiochip_request_irq()
193 value = gpiod_get_raw_value_cansleep(event->desc); in acpi_gpiochip_request_irq()
194 if (((event->irqflags & IRQF_TRIGGER_RISING) && value == 1) || in acpi_gpiochip_request_irq()
195 ((event->irqflags & IRQF_TRIGGER_FALLING) && value == 0)) in acpi_gpiochip_request_irq()
196 event->handler(event->irq, event); in acpi_gpiochip_request_irq()
204 list_for_each_entry(event, &acpi_gpio->events, node) in acpi_gpiochip_request_irqs()
220 len = pin_str - controller; in acpi_gpio_in_ignore_list()
246 int pin = agpio->pin_table[0]; in acpi_gpio_irq_is_wake()
248 if (agpio->wake_capable != ACPI_WAKE_CAPABLE) in acpi_gpio_irq_is_wake()
264 struct gpio_chip *chip = acpi_gpio->chip; in acpi_gpiochip_alloc_event()
275 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_alloc_event()
276 pin = agpio->pin_table[0]; in acpi_gpiochip_alloc_event()
281 agpio->triggering == ACPI_EDGE_SENSITIVE ? 'E' : 'L', in acpi_gpiochip_alloc_event()
296 dev_err(chip->parent, in acpi_gpiochip_alloc_event()
304 dev_err(chip->parent, in acpi_gpiochip_alloc_event()
312 dev_err(chip->parent, in acpi_gpiochip_alloc_event()
322 event->irqflags = IRQF_ONESHOT; in acpi_gpiochip_alloc_event()
323 if (agpio->triggering == ACPI_LEVEL_SENSITIVE) { in acpi_gpiochip_alloc_event()
324 if (agpio->polarity == ACPI_ACTIVE_HIGH) in acpi_gpiochip_alloc_event()
325 event->irqflags |= IRQF_TRIGGER_HIGH; in acpi_gpiochip_alloc_event()
327 event->irqflags |= IRQF_TRIGGER_LOW; in acpi_gpiochip_alloc_event()
329 switch (agpio->polarity) { in acpi_gpiochip_alloc_event()
331 event->irqflags |= IRQF_TRIGGER_RISING; in acpi_gpiochip_alloc_event()
334 event->irqflags |= IRQF_TRIGGER_FALLING; in acpi_gpiochip_alloc_event()
337 event->irqflags |= IRQF_TRIGGER_RISING | in acpi_gpiochip_alloc_event()
343 event->handle = evt_handle; in acpi_gpiochip_alloc_event()
344 event->handler = handler; in acpi_gpiochip_alloc_event()
345 event->irq = irq; in acpi_gpiochip_alloc_event()
346 event->irq_is_wake = acpi_gpio_irq_is_wake(chip->parent, agpio); in acpi_gpiochip_alloc_event()
347 event->pin = pin; in acpi_gpiochip_alloc_event()
348 event->desc = desc; in acpi_gpiochip_alloc_event()
350 list_add_tail(&event->node, &acpi_gpio->events); in acpi_gpiochip_alloc_event()
363 * acpi_gpiochip_request_interrupts() - Register isr for gpio chip ACPI events
379 if (!chip->parent || !chip->to_irq) in acpi_gpiochip_request_interrupts()
382 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_request_interrupts()
396 list_add(&acpi_gpio->deferred_req_irqs_list_entry, in acpi_gpiochip_request_interrupts()
408 * acpi_gpiochip_free_interrupts() - Free GPIO ACPI event interrupts.
421 if (!chip->parent || !chip->to_irq) in acpi_gpiochip_free_interrupts()
424 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_free_interrupts()
433 if (!list_empty(&acpi_gpio->deferred_req_irqs_list_entry)) in acpi_gpiochip_free_interrupts()
434 list_del_init(&acpi_gpio->deferred_req_irqs_list_entry); in acpi_gpiochip_free_interrupts()
437 list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) { in acpi_gpiochip_free_interrupts()
438 if (event->irq_requested) { in acpi_gpiochip_free_interrupts()
439 if (event->irq_is_wake) in acpi_gpiochip_free_interrupts()
440 disable_irq_wake(event->irq); in acpi_gpiochip_free_interrupts()
442 free_irq(event->irq, event); in acpi_gpiochip_free_interrupts()
445 gpiochip_unlock_as_irq(chip, event->pin); in acpi_gpiochip_free_interrupts()
446 gpiochip_free_own_desc(event->desc); in acpi_gpiochip_free_interrupts()
447 list_del(&event->node); in acpi_gpiochip_free_interrupts()
454 const struct acpi_gpio_mapping *gpios) in acpi_dev_add_driver_gpios() argument
456 if (adev && gpios) { in acpi_dev_add_driver_gpios()
457 adev->driver_gpios = gpios; in acpi_dev_add_driver_gpios()
460 return -EINVAL; in acpi_dev_add_driver_gpios()
467 adev->driver_gpios = NULL; in acpi_dev_remove_driver_gpios()
477 const struct acpi_gpio_mapping *gpios) in devm_acpi_dev_add_driver_gpios() argument
484 return -ENOMEM; in devm_acpi_dev_add_driver_gpios()
486 ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), gpios); in devm_acpi_dev_add_driver_gpios()
509 if (!adev->driver_gpios) in acpi_get_driver_gpio_data()
512 for (gm = adev->driver_gpios; gm->name; gm++) in acpi_get_driver_gpio_data()
513 if (!strcmp(name, gm->name) && gm->data && index < gm->size) { in acpi_get_driver_gpio_data()
514 const struct acpi_gpio_params *par = gm->data + index; in acpi_get_driver_gpio_data()
516 args->fwnode = acpi_fwnode_handle(adev); in acpi_get_driver_gpio_data()
517 args->args[0] = par->crs_entry_index; in acpi_get_driver_gpio_data()
518 args->args[1] = par->line_index; in acpi_get_driver_gpio_data()
519 args->args[2] = par->active_low; in acpi_get_driver_gpio_data()
520 args->nargs = 3; in acpi_get_driver_gpio_data()
522 *quirks = gm->quirks; in acpi_get_driver_gpio_data()
532 switch (agpio->io_restriction) { in acpi_gpio_to_gpiod_flags()
543 switch (agpio->pin_config) { in acpi_gpio_to_gpiod_flags()
582 * Return %-EINVAL to notify that firmware has different in __acpi_gpio_update_gpiod_flags()
587 ret = -EINVAL; in __acpi_gpio_update_gpiod_flags()
596 struct device *dev = &info->adev->dev; in acpi_gpio_update_gpiod_flags()
600 ret = __acpi_gpio_update_gpiod_flags(&old, info->flags); in acpi_gpio_update_gpiod_flags()
601 if (info->quirks & ACPI_GPIO_QUIRK_NO_IO_RESTRICTION) { in acpi_gpio_update_gpiod_flags()
616 switch (info->pin_config) { in acpi_gpio_update_gpiod_lookup_flags()
627 if (info->polarity == GPIO_ACTIVE_LOW) in acpi_gpio_update_gpiod_lookup_flags()
642 static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) in acpi_populate_gpio_lookup() argument
644 struct acpi_gpio_lookup *lookup = data; in acpi_populate_gpio_lookup()
646 if (ares->type != ACPI_RESOURCE_TYPE_GPIO) in acpi_populate_gpio_lookup()
649 if (!lookup->desc) { in acpi_populate_gpio_lookup()
650 const struct acpi_resource_gpio *agpio = &ares->data.gpio; in acpi_populate_gpio_lookup()
651 bool gpioint = agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT; in acpi_populate_gpio_lookup()
655 if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) in acpi_populate_gpio_lookup()
656 lookup->index++; in acpi_populate_gpio_lookup()
658 if (lookup->n++ != lookup->index) in acpi_populate_gpio_lookup()
661 pin_index = lookup->pin_index; in acpi_populate_gpio_lookup()
662 if (pin_index >= agpio->pin_table_length) in acpi_populate_gpio_lookup()
665 if (lookup->info.quirks & ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER) in acpi_populate_gpio_lookup()
666 desc = gpio_to_desc(agpio->pin_table[pin_index]); in acpi_populate_gpio_lookup()
668 desc = acpi_get_gpiod(agpio->resource_source.string_ptr, in acpi_populate_gpio_lookup()
669 agpio->pin_table[pin_index]); in acpi_populate_gpio_lookup()
670 lookup->desc = desc; in acpi_populate_gpio_lookup()
671 lookup->info.pin_config = agpio->pin_config; in acpi_populate_gpio_lookup()
672 lookup->info.gpioint = gpioint; in acpi_populate_gpio_lookup()
678 * - ACPI_ACTIVE_LOW == GPIO_ACTIVE_LOW in acpi_populate_gpio_lookup()
679 * - ACPI_ACTIVE_HIGH == GPIO_ACTIVE_HIGH in acpi_populate_gpio_lookup()
681 if (lookup->info.gpioint) { in acpi_populate_gpio_lookup()
682 lookup->info.flags = GPIOD_IN; in acpi_populate_gpio_lookup()
683 lookup->info.polarity = agpio->polarity; in acpi_populate_gpio_lookup()
684 lookup->info.triggering = agpio->triggering; in acpi_populate_gpio_lookup()
686 lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio); in acpi_populate_gpio_lookup()
687 lookup->info.polarity = lookup->active_low; in acpi_populate_gpio_lookup()
697 struct acpi_device *adev = lookup->info.adev; in acpi_gpio_resource_lookup()
711 if (!lookup->desc) in acpi_gpio_resource_lookup()
712 return -ENOENT; in acpi_gpio_resource_lookup()
715 *info = lookup->info; in acpi_gpio_resource_lookup()
745 return -EINVAL; in acpi_gpio_property_lookup()
747 return -EPROTO; in acpi_gpio_property_lookup()
749 lookup->index = args.args[0]; in acpi_gpio_property_lookup()
750 lookup->pin_index = args.args[1]; in acpi_gpio_property_lookup()
751 lookup->active_low = !!args.args[2]; in acpi_gpio_property_lookup()
753 lookup->info.adev = to_acpi_device_node(args.fwnode); in acpi_gpio_property_lookup()
754 lookup->info.quirks = quirks; in acpi_gpio_property_lookup()
760 * acpi_get_gpiod_by_index() - get a GPIO descriptor from device resources
779 * function only returns the first.
789 return ERR_PTR(-ENODEV); in acpi_get_gpiod_by_index()
795 dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname); in acpi_get_gpiod_by_index()
802 dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %d %u\n", in acpi_get_gpiod_by_index()
803 dev_name(&lookup.info.adev->dev), lookup.index, in acpi_get_gpiod_by_index()
806 dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index); in acpi_get_gpiod_by_index()
818 if (acpi_dev_has_props(adev) || adev->driver_gpios) in acpi_can_fallback_to_crs()
836 /* Try first from _DSD */ in acpi_find_gpio()
839 snprintf(propname, sizeof(propname), "%s-%s", in acpi_find_gpio()
849 if (PTR_ERR(desc) == -EPROBE_DEFER) in acpi_find_gpio()
853 /* Then from plain _CRS GPIOs */ in acpi_find_gpio()
856 return ERR_PTR(-ENOENT); in acpi_find_gpio()
866 return ERR_PTR(-ENOENT); in acpi_find_gpio()
875 * acpi_node_get_gpiod() - get a GPIO descriptor from ACPI resources
882 * Otherwise (i.e. it is a data-only non-device object), use the property-based
902 return ERR_PTR(-ENODEV); in acpi_node_get_gpiod()
905 return ERR_PTR(-EINVAL); in acpi_node_get_gpiod()
919 * acpi_dev_gpio_irq_get_by() - Find GpioInt and translate it to Linux IRQ number
948 /* Ignore -EPROBE_DEFER, it only matters if idx matches */ in acpi_dev_gpio_irq_get_by()
949 if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER) in acpi_dev_gpio_irq_get_by()
981 dev_dbg(&adev->dev, "IRQ %d already in use\n", irq); in acpi_dev_gpio_irq_get_by()
988 return -ENOENT; in acpi_dev_gpio_irq_get_by()
998 struct gpio_chip *chip = achip->chip; in acpi_gpio_adr_space_handler()
1006 status = acpi_buffer_to_resource(achip->conn_info.connection, in acpi_gpio_adr_space_handler()
1007 achip->conn_info.length, &ares); in acpi_gpio_adr_space_handler()
1011 if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) { in acpi_gpio_adr_space_handler()
1016 agpio = &ares->data.gpio; in acpi_gpio_adr_space_handler()
1018 if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT && in acpi_gpio_adr_space_handler()
1024 length = min(agpio->pin_table_length, (u16)(pin_index + bits)); in acpi_gpio_adr_space_handler()
1026 int pin = agpio->pin_table[i]; in acpi_gpio_adr_space_handler()
1031 mutex_lock(&achip->conn_lock); in acpi_gpio_adr_space_handler()
1034 list_for_each_entry(conn, &achip->conns, node) { in acpi_gpio_adr_space_handler()
1035 if (conn->pin == pin) { in acpi_gpio_adr_space_handler()
1037 desc = conn->desc; in acpi_gpio_adr_space_handler()
1047 if (!found && agpio->shareable == ACPI_SHARED && in acpi_gpio_adr_space_handler()
1051 list_for_each_entry(event, &achip->events, node) { in acpi_gpio_adr_space_handler()
1052 if (event->pin == pin) { in acpi_gpio_adr_space_handler()
1053 desc = event->desc; in acpi_gpio_adr_space_handler()
1069 mutex_unlock(&achip->conn_lock); in acpi_gpio_adr_space_handler()
1077 mutex_unlock(&achip->conn_lock); in acpi_gpio_adr_space_handler()
1081 conn->pin = pin; in acpi_gpio_adr_space_handler()
1082 conn->desc = desc; in acpi_gpio_adr_space_handler()
1083 list_add_tail(&conn->node, &achip->conns); in acpi_gpio_adr_space_handler()
1086 mutex_unlock(&achip->conn_lock); in acpi_gpio_adr_space_handler()
1102 struct gpio_chip *chip = achip->chip; in acpi_gpiochip_request_regions()
1103 acpi_handle handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_request_regions()
1106 INIT_LIST_HEAD(&achip->conns); in acpi_gpiochip_request_regions()
1107 mutex_init(&achip->conn_lock); in acpi_gpiochip_request_regions()
1112 dev_err(chip->parent, in acpi_gpiochip_request_regions()
1118 struct gpio_chip *chip = achip->chip; in acpi_gpiochip_free_regions()
1119 acpi_handle handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_free_regions()
1126 dev_err(chip->parent, in acpi_gpiochip_free_regions()
1131 list_for_each_entry_safe_reverse(conn, tmp, &achip->conns, node) { in acpi_gpiochip_free_regions()
1132 gpiochip_free_own_desc(conn->desc); in acpi_gpiochip_free_regions()
1133 list_del(&conn->node); in acpi_gpiochip_free_regions()
1145 struct gpio_chip *chip = achip->chip; in acpi_gpiochip_parse_own_gpio()
1147 u32 gpios[2]; in acpi_gpiochip_parse_own_gpio() local
1154 ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios, in acpi_gpiochip_parse_own_gpio()
1155 ARRAY_SIZE(gpios)); in acpi_gpiochip_parse_own_gpio()
1159 desc = gpiochip_get_desc(chip, gpios[0]); in acpi_gpiochip_parse_own_gpio()
1163 if (gpios[1]) in acpi_gpiochip_parse_own_gpio()
1168 else if (fwnode_property_present(fwnode, "output-low")) in acpi_gpiochip_parse_own_gpio()
1170 else if (fwnode_property_present(fwnode, "output-high")) in acpi_gpiochip_parse_own_gpio()
1173 return ERR_PTR(-EINVAL); in acpi_gpiochip_parse_own_gpio()
1175 fwnode_property_read_string(fwnode, "line-name", name); in acpi_gpiochip_parse_own_gpio()
1182 struct gpio_chip *chip = achip->chip; in acpi_gpiochip_scan_gpios()
1185 device_for_each_child_node(chip->parent, fwnode) { in acpi_gpiochip_scan_gpios()
1192 if (!fwnode_property_present(fwnode, "gpio-hog")) in acpi_gpiochip_scan_gpios()
1202 dev_err(chip->parent, "Failed to hog GPIO\n"); in acpi_gpiochip_scan_gpios()
1215 if (!chip || !chip->parent) in acpi_gpiochip_add()
1218 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_add()
1224 dev_err(chip->parent, in acpi_gpiochip_add()
1229 acpi_gpio->chip = chip; in acpi_gpiochip_add()
1230 INIT_LIST_HEAD(&acpi_gpio->events); in acpi_gpiochip_add()
1231 INIT_LIST_HEAD(&acpi_gpio->deferred_req_irqs_list_entry); in acpi_gpiochip_add()
1235 dev_err(chip->parent, "Failed to attach ACPI GPIO chip\n"); in acpi_gpiochip_add()
1251 if (!chip || !chip->parent) in acpi_gpiochip_remove()
1254 handle = ACPI_HANDLE(chip->parent); in acpi_gpiochip_remove()
1260 dev_warn(chip->parent, "Failed to retrieve ACPI GPIO chip\n"); in acpi_gpiochip_remove()
1272 const union acpi_object *element = obj->package.elements; in acpi_gpio_package_count()
1273 const union acpi_object *end = element + obj->package.count; in acpi_gpio_package_count()
1277 switch (element->type) { in acpi_gpio_package_count()
1287 return -EPROTO; in acpi_gpio_package_count()
1294 static int acpi_find_gpio_count(struct acpi_resource *ares, void *data) in acpi_find_gpio_count() argument
1296 unsigned int *count = data; in acpi_find_gpio_count()
1298 if (ares->type == ACPI_RESOURCE_TYPE_GPIO) in acpi_find_gpio_count()
1299 *count += ares->data.gpio.pin_table_length; in acpi_find_gpio_count()
1305 * acpi_gpio_count - count the GPIOs associated with a device / function
1306 * @dev: GPIO consumer, can be %NULL for system-global GPIOs
1310 * The number of GPIOs associated with a device / function or %-ENOENT,
1318 int count = -ENOENT; in acpi_gpio_count()
1323 /* Try first from _DSD */ in acpi_gpio_count()
1326 snprintf(propname, sizeof(propname), "%s-%s", in acpi_gpio_count()
1335 if (obj->type == ACPI_TYPE_LOCAL_REFERENCE) in acpi_gpio_count()
1337 else if (obj->type == ACPI_TYPE_PACKAGE) in acpi_gpio_count()
1339 } else if (adev->driver_gpios) { in acpi_gpio_count()
1340 for (gm = adev->driver_gpios; gm->name; gm++) in acpi_gpio_count()
1341 if (strcmp(propname, gm->name) == 0) { in acpi_gpio_count()
1342 count = gm->size; in acpi_gpio_count()
1350 /* Then from plain _CRS GPIOs */ in acpi_gpio_count()
1365 return count ? count : -ENOENT; in acpi_gpio_count()
1384 /* We must use _sync so that this runs after the first deferred_probe run */
1390 * The Minix Neo Z83-4 has a micro-USB-B id-pin handler for
1391 * a non existing micro-USB-B connector which puts the HDMI
1396 DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
1404 * The Terra Pad 1061 has a micro-USB-B id-pin handler, which
1405 * instead of controlling the actual micro-USB-B turns the 5V
1406 * boost for its USB-A connector off. The actual micro-USB-B
1420 * external embedded-controller connected via I2C + an ACPI GPIO
1434 * external embedded-controller connected via I2C + an ACPI GPIO
1441 * to press the power-button to wakeup the system. The
1446 DMI_MATCH(DMI_PRODUCT_NAME, "HP x2 Detachable 10-p0XX"),
1455 * external embedded-controller connected via I2C + an ACPI GPIO
1459 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1470 * external embedded-controller connected via I2C + an ACPI GPIO
1492 quirk = id->driver_data; in acpi_gpio_setup_params()
1495 if (quirk && quirk->no_edge_events_on_boot) in acpi_gpio_setup_params()
1501 if (ignore_wake == NULL && quirk && quirk->ignore_wake) in acpi_gpio_setup_params()
1502 ignore_wake = quirk->ignore_wake; in acpi_gpio_setup_params()