1 /*
2  * ACPI helpers for GPIO API
3  *
4  * Copyright (C) 2012, Intel Corporation
5  * Authors: Mathias Nyman <mathias.nyman@linux.intel.com>
6  *          Mika Westerberg <mika.westerberg@linux.intel.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #include <linux/errno.h>
14 #include <linux/gpio.h>
15 #include <linux/gpio/consumer.h>
16 #include <linux/gpio/driver.h>
17 #include <linux/gpio/machine.h>
18 #include <linux/export.h>
19 #include <linux/acpi.h>
20 #include <linux/interrupt.h>
21 #include <linux/mutex.h>
22 #include <linux/pinctrl/pinctrl.h>
23 
24 #include "gpiolib.h"
25 
26 struct acpi_gpio_event {
27 	struct list_head node;
28 	acpi_handle handle;
29 	unsigned int pin;
30 	unsigned int irq;
31 	struct gpio_desc *desc;
32 };
33 
34 struct acpi_gpio_connection {
35 	struct list_head node;
36 	unsigned int pin;
37 	struct gpio_desc *desc;
38 };
39 
40 struct acpi_gpio_chip {
41 	/*
42 	 * ACPICA requires that the first field of the context parameter
43 	 * passed to acpi_install_address_space_handler() is large enough
44 	 * to hold struct acpi_connection_info.
45 	 */
46 	struct acpi_connection_info conn_info;
47 	struct list_head conns;
48 	struct mutex conn_lock;
49 	struct gpio_chip *chip;
50 	struct list_head events;
51 	struct list_head deferred_req_irqs_list_entry;
52 };
53 
54 /*
55  * For gpiochips which call acpi_gpiochip_request_interrupts() before late_init
56  * (so builtin drivers) we register the ACPI GpioInt event handlers from a
57  * late_initcall_sync handler, so that other builtin drivers can register their
58  * OpRegions before the event handlers can run.  This list contains gpiochips
59  * for which the acpi_gpiochip_request_interrupts() has been deferred.
60  */
61 static DEFINE_MUTEX(acpi_gpio_deferred_req_irqs_lock);
62 static LIST_HEAD(acpi_gpio_deferred_req_irqs_list);
63 static bool acpi_gpio_deferred_req_irqs_done;
64 
acpi_gpiochip_find(struct gpio_chip * gc,void * data)65 static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
66 {
67 	if (!gc->parent)
68 		return false;
69 
70 	return ACPI_HANDLE(gc->parent) == data;
71 }
72 
73 /**
74  * acpi_get_gpiod() - Translate ACPI GPIO pin to GPIO descriptor usable with GPIO API
75  * @path:	ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1")
76  * @pin:	ACPI GPIO pin number (0-based, controller-relative)
77  *
78  * Return: GPIO descriptor to use with Linux generic GPIO API, or ERR_PTR
79  * error value. Specifically returns %-EPROBE_DEFER if the referenced GPIO
80  * controller does not have gpiochip registered at the moment. This is to
81  * support probe deferral.
82  */
acpi_get_gpiod(char * path,int pin)83 static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
84 {
85 	struct gpio_chip *chip;
86 	acpi_handle handle;
87 	acpi_status status;
88 
89 	status = acpi_get_handle(NULL, path, &handle);
90 	if (ACPI_FAILURE(status))
91 		return ERR_PTR(-ENODEV);
92 
93 	chip = gpiochip_find(handle, acpi_gpiochip_find);
94 	if (!chip)
95 		return ERR_PTR(-EPROBE_DEFER);
96 
97 	return gpiochip_get_desc(chip, pin);
98 }
99 
acpi_gpio_irq_handler(int irq,void * data)100 static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
101 {
102 	struct acpi_gpio_event *event = data;
103 
104 	acpi_evaluate_object(event->handle, NULL, NULL, NULL);
105 
106 	return IRQ_HANDLED;
107 }
108 
acpi_gpio_irq_handler_evt(int irq,void * data)109 static irqreturn_t acpi_gpio_irq_handler_evt(int irq, void *data)
110 {
111 	struct acpi_gpio_event *event = data;
112 
113 	acpi_execute_simple_method(event->handle, NULL, event->pin);
114 
115 	return IRQ_HANDLED;
116 }
117 
acpi_gpio_chip_dh(acpi_handle handle,void * data)118 static void acpi_gpio_chip_dh(acpi_handle handle, void *data)
119 {
120 	/* The address of this function is used as a key. */
121 }
122 
acpi_gpio_get_irq_resource(struct acpi_resource * ares,struct acpi_resource_gpio ** agpio)123 bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
124 				struct acpi_resource_gpio **agpio)
125 {
126 	struct acpi_resource_gpio *gpio;
127 
128 	if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
129 		return false;
130 
131 	gpio = &ares->data.gpio;
132 	if (gpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_INT)
133 		return false;
134 
135 	*agpio = gpio;
136 	return true;
137 }
138 EXPORT_SYMBOL_GPL(acpi_gpio_get_irq_resource);
139 
acpi_gpiochip_request_interrupt(struct acpi_resource * ares,void * context)140 static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
141 						   void *context)
142 {
143 	struct acpi_gpio_chip *acpi_gpio = context;
144 	struct gpio_chip *chip = acpi_gpio->chip;
145 	struct acpi_resource_gpio *agpio;
146 	acpi_handle handle, evt_handle;
147 	struct acpi_gpio_event *event;
148 	irq_handler_t handler = NULL;
149 	struct gpio_desc *desc;
150 	unsigned long irqflags;
151 	int ret, pin, irq, value;
152 
153 	if (!acpi_gpio_get_irq_resource(ares, &agpio))
154 		return AE_OK;
155 
156 	handle = ACPI_HANDLE(chip->parent);
157 	pin = agpio->pin_table[0];
158 
159 	if (pin <= 255) {
160 		char ev_name[5];
161 		sprintf(ev_name, "_%c%02hhX",
162 			agpio->triggering == ACPI_EDGE_SENSITIVE ? 'E' : 'L',
163 			pin);
164 		if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
165 			handler = acpi_gpio_irq_handler;
166 	}
167 	if (!handler) {
168 		if (ACPI_SUCCESS(acpi_get_handle(handle, "_EVT", &evt_handle)))
169 			handler = acpi_gpio_irq_handler_evt;
170 	}
171 	if (!handler)
172 		return AE_OK;
173 
174 	desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
175 	if (IS_ERR(desc)) {
176 		dev_err(chip->parent, "Failed to request GPIO\n");
177 		return AE_ERROR;
178 	}
179 
180 	gpiod_direction_input(desc);
181 
182 	value = gpiod_get_value_cansleep(desc);
183 
184 	ret = gpiochip_lock_as_irq(chip, pin);
185 	if (ret) {
186 		dev_err(chip->parent, "Failed to lock GPIO as interrupt\n");
187 		goto fail_free_desc;
188 	}
189 
190 	irq = gpiod_to_irq(desc);
191 	if (irq < 0) {
192 		dev_err(chip->parent, "Failed to translate GPIO to IRQ\n");
193 		goto fail_unlock_irq;
194 	}
195 
196 	irqflags = IRQF_ONESHOT;
197 	if (agpio->triggering == ACPI_LEVEL_SENSITIVE) {
198 		if (agpio->polarity == ACPI_ACTIVE_HIGH)
199 			irqflags |= IRQF_TRIGGER_HIGH;
200 		else
201 			irqflags |= IRQF_TRIGGER_LOW;
202 	} else {
203 		switch (agpio->polarity) {
204 		case ACPI_ACTIVE_HIGH:
205 			irqflags |= IRQF_TRIGGER_RISING;
206 			break;
207 		case ACPI_ACTIVE_LOW:
208 			irqflags |= IRQF_TRIGGER_FALLING;
209 			break;
210 		default:
211 			irqflags |= IRQF_TRIGGER_RISING |
212 				    IRQF_TRIGGER_FALLING;
213 			break;
214 		}
215 	}
216 
217 	event = kzalloc(sizeof(*event), GFP_KERNEL);
218 	if (!event)
219 		goto fail_unlock_irq;
220 
221 	event->handle = evt_handle;
222 	event->irq = irq;
223 	event->pin = pin;
224 	event->desc = desc;
225 
226 	ret = request_threaded_irq(event->irq, NULL, handler, irqflags,
227 				   "ACPI:Event", event);
228 	if (ret) {
229 		dev_err(chip->parent,
230 			"Failed to setup interrupt handler for %d\n",
231 			event->irq);
232 		goto fail_free_event;
233 	}
234 
235 	if (agpio->wake_capable == ACPI_WAKE_CAPABLE)
236 		enable_irq_wake(irq);
237 
238 	list_add_tail(&event->node, &acpi_gpio->events);
239 
240 	/*
241 	 * Make sure we trigger the initial state of the IRQ when using RISING
242 	 * or FALLING.  Note we run the handlers on late_init, the AML code
243 	 * may refer to OperationRegions from other (builtin) drivers which
244 	 * may be probed after us.
245 	 */
246 	if (((irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
247 	    ((irqflags & IRQF_TRIGGER_FALLING) && value == 0))
248 		handler(event->irq, event);
249 
250 	return AE_OK;
251 
252 fail_free_event:
253 	kfree(event);
254 fail_unlock_irq:
255 	gpiochip_unlock_as_irq(chip, pin);
256 fail_free_desc:
257 	gpiochip_free_own_desc(desc);
258 
259 	return AE_ERROR;
260 }
261 
262 /**
263  * acpi_gpiochip_request_interrupts() - Register isr for gpio chip ACPI events
264  * @chip:      GPIO chip
265  *
266  * ACPI5 platforms can use GPIO signaled ACPI events. These GPIO interrupts are
267  * handled by ACPI event methods which need to be called from the GPIO
268  * chip's interrupt handler. acpi_gpiochip_request_interrupts finds out which
269  * gpio pins have acpi event methods and assigns interrupt handlers that calls
270  * the acpi event methods for those pins.
271  */
acpi_gpiochip_request_interrupts(struct gpio_chip * chip)272 void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
273 {
274 	struct acpi_gpio_chip *acpi_gpio;
275 	acpi_handle handle;
276 	acpi_status status;
277 	bool defer;
278 
279 	if (!chip->parent || !chip->to_irq)
280 		return;
281 
282 	handle = ACPI_HANDLE(chip->parent);
283 	if (!handle)
284 		return;
285 
286 	status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
287 	if (ACPI_FAILURE(status))
288 		return;
289 
290 	mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
291 	defer = !acpi_gpio_deferred_req_irqs_done;
292 	if (defer)
293 		list_add(&acpi_gpio->deferred_req_irqs_list_entry,
294 			 &acpi_gpio_deferred_req_irqs_list);
295 	mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
296 
297 	if (defer)
298 		return;
299 
300 	acpi_walk_resources(handle, "_AEI",
301 			    acpi_gpiochip_request_interrupt, acpi_gpio);
302 }
303 EXPORT_SYMBOL_GPL(acpi_gpiochip_request_interrupts);
304 
305 /**
306  * acpi_gpiochip_free_interrupts() - Free GPIO ACPI event interrupts.
307  * @chip:      GPIO chip
308  *
309  * Free interrupts associated with GPIO ACPI event method for the given
310  * GPIO chip.
311  */
acpi_gpiochip_free_interrupts(struct gpio_chip * chip)312 void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
313 {
314 	struct acpi_gpio_chip *acpi_gpio;
315 	struct acpi_gpio_event *event, *ep;
316 	acpi_handle handle;
317 	acpi_status status;
318 
319 	if (!chip->parent || !chip->to_irq)
320 		return;
321 
322 	handle = ACPI_HANDLE(chip->parent);
323 	if (!handle)
324 		return;
325 
326 	status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
327 	if (ACPI_FAILURE(status))
328 		return;
329 
330 	mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
331 	if (!list_empty(&acpi_gpio->deferred_req_irqs_list_entry))
332 		list_del_init(&acpi_gpio->deferred_req_irqs_list_entry);
333 	mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
334 
335 	list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {
336 		struct gpio_desc *desc;
337 
338 		if (irqd_is_wakeup_set(irq_get_irq_data(event->irq)))
339 			disable_irq_wake(event->irq);
340 
341 		free_irq(event->irq, event);
342 		desc = event->desc;
343 		if (WARN_ON(IS_ERR(desc)))
344 			continue;
345 		gpiochip_unlock_as_irq(chip, event->pin);
346 		gpiochip_free_own_desc(desc);
347 		list_del(&event->node);
348 		kfree(event);
349 	}
350 }
351 EXPORT_SYMBOL_GPL(acpi_gpiochip_free_interrupts);
352 
acpi_dev_add_driver_gpios(struct acpi_device * adev,const struct acpi_gpio_mapping * gpios)353 int acpi_dev_add_driver_gpios(struct acpi_device *adev,
354 			      const struct acpi_gpio_mapping *gpios)
355 {
356 	if (adev && gpios) {
357 		adev->driver_gpios = gpios;
358 		return 0;
359 	}
360 	return -EINVAL;
361 }
362 EXPORT_SYMBOL_GPL(acpi_dev_add_driver_gpios);
363 
devm_acpi_dev_release_driver_gpios(struct device * dev,void * res)364 static void devm_acpi_dev_release_driver_gpios(struct device *dev, void *res)
365 {
366 	acpi_dev_remove_driver_gpios(ACPI_COMPANION(dev));
367 }
368 
devm_acpi_dev_add_driver_gpios(struct device * dev,const struct acpi_gpio_mapping * gpios)369 int devm_acpi_dev_add_driver_gpios(struct device *dev,
370 				   const struct acpi_gpio_mapping *gpios)
371 {
372 	void *res;
373 	int ret;
374 
375 	res = devres_alloc(devm_acpi_dev_release_driver_gpios, 0, GFP_KERNEL);
376 	if (!res)
377 		return -ENOMEM;
378 
379 	ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), gpios);
380 	if (ret) {
381 		devres_free(res);
382 		return ret;
383 	}
384 	devres_add(dev, res);
385 	return 0;
386 }
387 EXPORT_SYMBOL_GPL(devm_acpi_dev_add_driver_gpios);
388 
devm_acpi_dev_remove_driver_gpios(struct device * dev)389 void devm_acpi_dev_remove_driver_gpios(struct device *dev)
390 {
391 	WARN_ON(devres_release(dev, devm_acpi_dev_release_driver_gpios, NULL, NULL));
392 }
393 EXPORT_SYMBOL_GPL(devm_acpi_dev_remove_driver_gpios);
394 
acpi_get_driver_gpio_data(struct acpi_device * adev,const char * name,int index,struct fwnode_reference_args * args,unsigned int * quirks)395 static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
396 				      const char *name, int index,
397 				      struct fwnode_reference_args *args,
398 				      unsigned int *quirks)
399 {
400 	const struct acpi_gpio_mapping *gm;
401 
402 	if (!adev->driver_gpios)
403 		return false;
404 
405 	for (gm = adev->driver_gpios; gm->name; gm++)
406 		if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
407 			const struct acpi_gpio_params *par = gm->data + index;
408 
409 			args->fwnode = acpi_fwnode_handle(adev);
410 			args->args[0] = par->crs_entry_index;
411 			args->args[1] = par->line_index;
412 			args->args[2] = par->active_low;
413 			args->nargs = 3;
414 
415 			*quirks = gm->quirks;
416 			return true;
417 		}
418 
419 	return false;
420 }
421 
422 static enum gpiod_flags
acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio * agpio)423 acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio)
424 {
425 	bool pull_up = agpio->pin_config == ACPI_PIN_CONFIG_PULLUP;
426 
427 	switch (agpio->io_restriction) {
428 	case ACPI_IO_RESTRICT_INPUT:
429 		return GPIOD_IN;
430 	case ACPI_IO_RESTRICT_OUTPUT:
431 		/*
432 		 * ACPI GPIO resources don't contain an initial value for the
433 		 * GPIO. Therefore we deduce that value from the pull field
434 		 * instead. If the pin is pulled up we assume default to be
435 		 * high, otherwise low.
436 		 */
437 		return pull_up ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
438 	default:
439 		/*
440 		 * Assume that the BIOS has configured the direction and pull
441 		 * accordingly.
442 		 */
443 		return GPIOD_ASIS;
444 	}
445 }
446 
447 static int
__acpi_gpio_update_gpiod_flags(enum gpiod_flags * flags,enum gpiod_flags update)448 __acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, enum gpiod_flags update)
449 {
450 	int ret = 0;
451 
452 	/*
453 	 * Check if the BIOS has IoRestriction with explicitly set direction
454 	 * and update @flags accordingly. Otherwise use whatever caller asked
455 	 * for.
456 	 */
457 	if (update & GPIOD_FLAGS_BIT_DIR_SET) {
458 		enum gpiod_flags diff = *flags ^ update;
459 
460 		/*
461 		 * Check if caller supplied incompatible GPIO initialization
462 		 * flags.
463 		 *
464 		 * Return %-EINVAL to notify that firmware has different
465 		 * settings and we are going to use them.
466 		 */
467 		if (((*flags & GPIOD_FLAGS_BIT_DIR_SET) && (diff & GPIOD_FLAGS_BIT_DIR_OUT)) ||
468 		    ((*flags & GPIOD_FLAGS_BIT_DIR_OUT) && (diff & GPIOD_FLAGS_BIT_DIR_VAL)))
469 			ret = -EINVAL;
470 		*flags = update;
471 	}
472 	return ret;
473 }
474 
475 int
acpi_gpio_update_gpiod_flags(enum gpiod_flags * flags,struct acpi_gpio_info * info)476 acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info)
477 {
478 	struct device *dev = &info->adev->dev;
479 	enum gpiod_flags old = *flags;
480 	int ret;
481 
482 	ret = __acpi_gpio_update_gpiod_flags(&old, info->flags);
483 	if (info->quirks & ACPI_GPIO_QUIRK_NO_IO_RESTRICTION) {
484 		if (ret)
485 			dev_warn(dev, FW_BUG "GPIO not in correct mode, fixing\n");
486 	} else {
487 		if (ret)
488 			dev_dbg(dev, "Override GPIO initialization flags\n");
489 		*flags = old;
490 	}
491 
492 	return ret;
493 }
494 
495 struct acpi_gpio_lookup {
496 	struct acpi_gpio_info info;
497 	int index;
498 	int pin_index;
499 	bool active_low;
500 	struct gpio_desc *desc;
501 	int n;
502 };
503 
acpi_populate_gpio_lookup(struct acpi_resource * ares,void * data)504 static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data)
505 {
506 	struct acpi_gpio_lookup *lookup = data;
507 
508 	if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
509 		return 1;
510 
511 	if (lookup->n++ == lookup->index && !lookup->desc) {
512 		const struct acpi_resource_gpio *agpio = &ares->data.gpio;
513 		int pin_index = lookup->pin_index;
514 
515 		if (pin_index >= agpio->pin_table_length)
516 			return 1;
517 
518 		lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr,
519 					      agpio->pin_table[pin_index]);
520 		lookup->info.gpioint =
521 			agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT;
522 
523 		/*
524 		 * Polarity and triggering are only specified for GpioInt
525 		 * resource.
526 		 * Note: we expect here:
527 		 * - ACPI_ACTIVE_LOW == GPIO_ACTIVE_LOW
528 		 * - ACPI_ACTIVE_HIGH == GPIO_ACTIVE_HIGH
529 		 */
530 		if (lookup->info.gpioint) {
531 			lookup->info.flags = GPIOD_IN;
532 			lookup->info.polarity = agpio->polarity;
533 			lookup->info.triggering = agpio->triggering;
534 		} else {
535 			lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio);
536 			lookup->info.polarity = lookup->active_low;
537 		}
538 	}
539 
540 	return 1;
541 }
542 
acpi_gpio_resource_lookup(struct acpi_gpio_lookup * lookup,struct acpi_gpio_info * info)543 static int acpi_gpio_resource_lookup(struct acpi_gpio_lookup *lookup,
544 				     struct acpi_gpio_info *info)
545 {
546 	struct acpi_device *adev = lookup->info.adev;
547 	struct list_head res_list;
548 	int ret;
549 
550 	INIT_LIST_HEAD(&res_list);
551 
552 	ret = acpi_dev_get_resources(adev, &res_list,
553 				     acpi_populate_gpio_lookup,
554 				     lookup);
555 	if (ret < 0)
556 		return ret;
557 
558 	acpi_dev_free_resource_list(&res_list);
559 
560 	if (!lookup->desc)
561 		return -ENOENT;
562 
563 	if (info)
564 		*info = lookup->info;
565 	return 0;
566 }
567 
acpi_gpio_property_lookup(struct fwnode_handle * fwnode,const char * propname,int index,struct acpi_gpio_lookup * lookup)568 static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode,
569 				     const char *propname, int index,
570 				     struct acpi_gpio_lookup *lookup)
571 {
572 	struct fwnode_reference_args args;
573 	unsigned int quirks = 0;
574 	int ret;
575 
576 	memset(&args, 0, sizeof(args));
577 	ret = __acpi_node_get_property_reference(fwnode, propname, index, 3,
578 						 &args);
579 	if (ret) {
580 		struct acpi_device *adev = to_acpi_device_node(fwnode);
581 
582 		if (!adev)
583 			return ret;
584 
585 		if (!acpi_get_driver_gpio_data(adev, propname, index, &args,
586 					       &quirks))
587 			return ret;
588 	}
589 	/*
590 	 * The property was found and resolved, so need to lookup the GPIO based
591 	 * on returned args.
592 	 */
593 	if (!to_acpi_device_node(args.fwnode))
594 		return -EINVAL;
595 	if (args.nargs != 3)
596 		return -EPROTO;
597 
598 	lookup->index = args.args[0];
599 	lookup->pin_index = args.args[1];
600 	lookup->active_low = !!args.args[2];
601 
602 	lookup->info.adev = to_acpi_device_node(args.fwnode);
603 	lookup->info.quirks = quirks;
604 
605 	return 0;
606 }
607 
608 /**
609  * acpi_get_gpiod_by_index() - get a GPIO descriptor from device resources
610  * @adev: pointer to a ACPI device to get GPIO from
611  * @propname: Property name of the GPIO (optional)
612  * @index: index of GpioIo/GpioInt resource (starting from %0)
613  * @info: info pointer to fill in (optional)
614  *
615  * Function goes through ACPI resources for @adev and based on @index looks
616  * up a GpioIo/GpioInt resource, translates it to the Linux GPIO descriptor,
617  * and returns it. @index matches GpioIo/GpioInt resources only so if there
618  * are total %3 GPIO resources, the index goes from %0 to %2.
619  *
620  * If @propname is specified the GPIO is looked using device property. In
621  * that case @index is used to select the GPIO entry in the property value
622  * (in case of multiple).
623  *
624  * If the GPIO cannot be translated or there is an error an ERR_PTR is
625  * returned.
626  *
627  * Note: if the GPIO resource has multiple entries in the pin list, this
628  * function only returns the first.
629  */
acpi_get_gpiod_by_index(struct acpi_device * adev,const char * propname,int index,struct acpi_gpio_info * info)630 static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
631 					  const char *propname, int index,
632 					  struct acpi_gpio_info *info)
633 {
634 	struct acpi_gpio_lookup lookup;
635 	int ret;
636 
637 	if (!adev)
638 		return ERR_PTR(-ENODEV);
639 
640 	memset(&lookup, 0, sizeof(lookup));
641 	lookup.index = index;
642 
643 	if (propname) {
644 		dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname);
645 
646 		ret = acpi_gpio_property_lookup(acpi_fwnode_handle(adev),
647 						propname, index, &lookup);
648 		if (ret)
649 			return ERR_PTR(ret);
650 
651 		dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %d %u\n",
652 			dev_name(&lookup.info.adev->dev), lookup.index,
653 			lookup.pin_index, lookup.active_low);
654 	} else {
655 		dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index);
656 		lookup.info.adev = adev;
657 	}
658 
659 	ret = acpi_gpio_resource_lookup(&lookup, info);
660 	return ret ? ERR_PTR(ret) : lookup.desc;
661 }
662 
acpi_find_gpio(struct device * dev,const char * con_id,unsigned int idx,enum gpiod_flags * dflags,enum gpio_lookup_flags * lookupflags)663 struct gpio_desc *acpi_find_gpio(struct device *dev,
664 				 const char *con_id,
665 				 unsigned int idx,
666 				 enum gpiod_flags *dflags,
667 				 enum gpio_lookup_flags *lookupflags)
668 {
669 	struct acpi_device *adev = ACPI_COMPANION(dev);
670 	struct acpi_gpio_info info;
671 	struct gpio_desc *desc;
672 	char propname[32];
673 	int i;
674 
675 	/* Try first from _DSD */
676 	for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
677 		if (con_id) {
678 			snprintf(propname, sizeof(propname), "%s-%s",
679 				 con_id, gpio_suffixes[i]);
680 		} else {
681 			snprintf(propname, sizeof(propname), "%s",
682 				 gpio_suffixes[i]);
683 		}
684 
685 		desc = acpi_get_gpiod_by_index(adev, propname, idx, &info);
686 		if (!IS_ERR(desc))
687 			break;
688 		if (PTR_ERR(desc) == -EPROBE_DEFER)
689 			return ERR_CAST(desc);
690 	}
691 
692 	/* Then from plain _CRS GPIOs */
693 	if (IS_ERR(desc)) {
694 		if (!acpi_can_fallback_to_crs(adev, con_id))
695 			return ERR_PTR(-ENOENT);
696 
697 		desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info);
698 		if (IS_ERR(desc))
699 			return desc;
700 	}
701 
702 	if (info.gpioint &&
703 	    (*dflags == GPIOD_OUT_LOW || *dflags == GPIOD_OUT_HIGH)) {
704 		dev_dbg(dev, "refusing GpioInt() entry when doing GPIOD_OUT_* lookup\n");
705 		return ERR_PTR(-ENOENT);
706 	}
707 
708 	if (info.polarity == GPIO_ACTIVE_LOW)
709 		*lookupflags |= GPIO_ACTIVE_LOW;
710 
711 	acpi_gpio_update_gpiod_flags(dflags, &info);
712 	return desc;
713 }
714 
715 /**
716  * acpi_node_get_gpiod() - get a GPIO descriptor from ACPI resources
717  * @fwnode: pointer to an ACPI firmware node to get the GPIO information from
718  * @propname: Property name of the GPIO
719  * @index: index of GpioIo/GpioInt resource (starting from %0)
720  * @info: info pointer to fill in (optional)
721  *
722  * If @fwnode is an ACPI device object, call %acpi_get_gpiod_by_index() for it.
723  * Otherwise (ie. it is a data-only non-device object), use the property-based
724  * GPIO lookup to get to the GPIO resource with the relevant information and use
725  * that to obtain the GPIO descriptor to return.
726  */
acpi_node_get_gpiod(struct fwnode_handle * fwnode,const char * propname,int index,struct acpi_gpio_info * info)727 struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode,
728 				      const char *propname, int index,
729 				      struct acpi_gpio_info *info)
730 {
731 	struct acpi_gpio_lookup lookup;
732 	struct acpi_device *adev;
733 	int ret;
734 
735 	adev = to_acpi_device_node(fwnode);
736 	if (adev)
737 		return acpi_get_gpiod_by_index(adev, propname, index, info);
738 
739 	if (!is_acpi_data_node(fwnode))
740 		return ERR_PTR(-ENODEV);
741 
742 	if (!propname)
743 		return ERR_PTR(-EINVAL);
744 
745 	memset(&lookup, 0, sizeof(lookup));
746 	lookup.index = index;
747 
748 	ret = acpi_gpio_property_lookup(fwnode, propname, index, &lookup);
749 	if (ret)
750 		return ERR_PTR(ret);
751 
752 	ret = acpi_gpio_resource_lookup(&lookup, info);
753 	return ret ? ERR_PTR(ret) : lookup.desc;
754 }
755 
756 /**
757  * acpi_dev_gpio_irq_get() - Find GpioInt and translate it to Linux IRQ number
758  * @adev: pointer to a ACPI device to get IRQ from
759  * @index: index of GpioInt resource (starting from %0)
760  *
761  * If the device has one or more GpioInt resources, this function can be
762  * used to translate from the GPIO offset in the resource to the Linux IRQ
763  * number.
764  *
765  * The function is idempotent, though each time it runs it will configure GPIO
766  * pin direction according to the flags in GpioInt resource.
767  *
768  * Return: Linux IRQ number (> %0) on success, negative errno on failure.
769  */
acpi_dev_gpio_irq_get(struct acpi_device * adev,int index)770 int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)
771 {
772 	int idx, i;
773 	unsigned int irq_flags;
774 	int ret;
775 
776 	for (i = 0, idx = 0; idx <= index; i++) {
777 		struct acpi_gpio_info info;
778 		struct gpio_desc *desc;
779 
780 		desc = acpi_get_gpiod_by_index(adev, NULL, i, &info);
781 
782 		/* Ignore -EPROBE_DEFER, it only matters if idx matches */
783 		if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER)
784 			return PTR_ERR(desc);
785 
786 		if (info.gpioint && idx++ == index) {
787 			char label[32];
788 			int irq;
789 
790 			if (IS_ERR(desc))
791 				return PTR_ERR(desc);
792 
793 			irq = gpiod_to_irq(desc);
794 			if (irq < 0)
795 				return irq;
796 
797 			snprintf(label, sizeof(label), "GpioInt() %d", index);
798 			ret = gpiod_configure_flags(desc, label, 0, info.flags);
799 			if (ret < 0)
800 				return ret;
801 
802 			irq_flags = acpi_dev_get_irq_type(info.triggering,
803 							  info.polarity);
804 
805 			/* Set type if specified and different than the current one */
806 			if (irq_flags != IRQ_TYPE_NONE &&
807 			    irq_flags != irq_get_trigger_type(irq))
808 				irq_set_irq_type(irq, irq_flags);
809 
810 			return irq;
811 		}
812 
813 	}
814 	return -ENOENT;
815 }
816 EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get);
817 
818 static acpi_status
acpi_gpio_adr_space_handler(u32 function,acpi_physical_address address,u32 bits,u64 * value,void * handler_context,void * region_context)819 acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
820 			    u32 bits, u64 *value, void *handler_context,
821 			    void *region_context)
822 {
823 	struct acpi_gpio_chip *achip = region_context;
824 	struct gpio_chip *chip = achip->chip;
825 	struct acpi_resource_gpio *agpio;
826 	struct acpi_resource *ares;
827 	int pin_index = (int)address;
828 	acpi_status status;
829 	int length;
830 	int i;
831 
832 	status = acpi_buffer_to_resource(achip->conn_info.connection,
833 					 achip->conn_info.length, &ares);
834 	if (ACPI_FAILURE(status))
835 		return status;
836 
837 	if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) {
838 		ACPI_FREE(ares);
839 		return AE_BAD_PARAMETER;
840 	}
841 
842 	agpio = &ares->data.gpio;
843 
844 	if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT &&
845 	    function == ACPI_WRITE)) {
846 		ACPI_FREE(ares);
847 		return AE_BAD_PARAMETER;
848 	}
849 
850 	length = min(agpio->pin_table_length, (u16)(pin_index + bits));
851 	for (i = pin_index; i < length; ++i) {
852 		int pin = agpio->pin_table[i];
853 		struct acpi_gpio_connection *conn;
854 		struct gpio_desc *desc;
855 		bool found;
856 
857 		mutex_lock(&achip->conn_lock);
858 
859 		found = false;
860 		list_for_each_entry(conn, &achip->conns, node) {
861 			if (conn->pin == pin) {
862 				found = true;
863 				desc = conn->desc;
864 				break;
865 			}
866 		}
867 
868 		/*
869 		 * The same GPIO can be shared between operation region and
870 		 * event but only if the access here is ACPI_READ. In that
871 		 * case we "borrow" the event GPIO instead.
872 		 */
873 		if (!found && agpio->sharable == ACPI_SHARED &&
874 		     function == ACPI_READ) {
875 			struct acpi_gpio_event *event;
876 
877 			list_for_each_entry(event, &achip->events, node) {
878 				if (event->pin == pin) {
879 					desc = event->desc;
880 					found = true;
881 					break;
882 				}
883 			}
884 		}
885 
886 		if (!found) {
887 			enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio);
888 			const char *label = "ACPI:OpRegion";
889 			int err;
890 
891 			desc = gpiochip_request_own_desc(chip, pin, label);
892 			if (IS_ERR(desc)) {
893 				status = AE_ERROR;
894 				mutex_unlock(&achip->conn_lock);
895 				goto out;
896 			}
897 
898 			err = gpiod_configure_flags(desc, label, 0, flags);
899 			if (err < 0) {
900 				status = AE_NOT_CONFIGURED;
901 				gpiochip_free_own_desc(desc);
902 				mutex_unlock(&achip->conn_lock);
903 				goto out;
904 			}
905 
906 			conn = kzalloc(sizeof(*conn), GFP_KERNEL);
907 			if (!conn) {
908 				status = AE_NO_MEMORY;
909 				gpiochip_free_own_desc(desc);
910 				mutex_unlock(&achip->conn_lock);
911 				goto out;
912 			}
913 
914 			conn->pin = pin;
915 			conn->desc = desc;
916 			list_add_tail(&conn->node, &achip->conns);
917 		}
918 
919 		mutex_unlock(&achip->conn_lock);
920 
921 		if (function == ACPI_WRITE)
922 			gpiod_set_raw_value_cansleep(desc,
923 						     !!((1 << i) & *value));
924 		else
925 			*value |= (u64)gpiod_get_raw_value_cansleep(desc) << i;
926 	}
927 
928 out:
929 	ACPI_FREE(ares);
930 	return status;
931 }
932 
acpi_gpiochip_request_regions(struct acpi_gpio_chip * achip)933 static void acpi_gpiochip_request_regions(struct acpi_gpio_chip *achip)
934 {
935 	struct gpio_chip *chip = achip->chip;
936 	acpi_handle handle = ACPI_HANDLE(chip->parent);
937 	acpi_status status;
938 
939 	INIT_LIST_HEAD(&achip->conns);
940 	mutex_init(&achip->conn_lock);
941 	status = acpi_install_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
942 						    acpi_gpio_adr_space_handler,
943 						    NULL, achip);
944 	if (ACPI_FAILURE(status))
945 		dev_err(chip->parent,
946 		        "Failed to install GPIO OpRegion handler\n");
947 }
948 
acpi_gpiochip_free_regions(struct acpi_gpio_chip * achip)949 static void acpi_gpiochip_free_regions(struct acpi_gpio_chip *achip)
950 {
951 	struct gpio_chip *chip = achip->chip;
952 	acpi_handle handle = ACPI_HANDLE(chip->parent);
953 	struct acpi_gpio_connection *conn, *tmp;
954 	acpi_status status;
955 
956 	status = acpi_remove_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
957 						   acpi_gpio_adr_space_handler);
958 	if (ACPI_FAILURE(status)) {
959 		dev_err(chip->parent,
960 			"Failed to remove GPIO OpRegion handler\n");
961 		return;
962 	}
963 
964 	list_for_each_entry_safe_reverse(conn, tmp, &achip->conns, node) {
965 		gpiochip_free_own_desc(conn->desc);
966 		list_del(&conn->node);
967 		kfree(conn);
968 	}
969 }
970 
acpi_gpiochip_parse_own_gpio(struct acpi_gpio_chip * achip,struct fwnode_handle * fwnode,const char ** name,unsigned int * lflags,unsigned int * dflags)971 static struct gpio_desc *acpi_gpiochip_parse_own_gpio(
972 	struct acpi_gpio_chip *achip, struct fwnode_handle *fwnode,
973 	const char **name, unsigned int *lflags, unsigned int *dflags)
974 {
975 	struct gpio_chip *chip = achip->chip;
976 	struct gpio_desc *desc;
977 	u32 gpios[2];
978 	int ret;
979 
980 	*lflags = 0;
981 	*dflags = 0;
982 	*name = NULL;
983 
984 	ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios,
985 					     ARRAY_SIZE(gpios));
986 	if (ret < 0)
987 		return ERR_PTR(ret);
988 
989 	desc = gpiochip_get_desc(chip, gpios[0]);
990 	if (IS_ERR(desc))
991 		return desc;
992 
993 	if (gpios[1])
994 		*lflags |= GPIO_ACTIVE_LOW;
995 
996 	if (fwnode_property_present(fwnode, "input"))
997 		*dflags |= GPIOD_IN;
998 	else if (fwnode_property_present(fwnode, "output-low"))
999 		*dflags |= GPIOD_OUT_LOW;
1000 	else if (fwnode_property_present(fwnode, "output-high"))
1001 		*dflags |= GPIOD_OUT_HIGH;
1002 	else
1003 		return ERR_PTR(-EINVAL);
1004 
1005 	fwnode_property_read_string(fwnode, "line-name", name);
1006 
1007 	return desc;
1008 }
1009 
acpi_gpiochip_scan_gpios(struct acpi_gpio_chip * achip)1010 static void acpi_gpiochip_scan_gpios(struct acpi_gpio_chip *achip)
1011 {
1012 	struct gpio_chip *chip = achip->chip;
1013 	struct fwnode_handle *fwnode;
1014 
1015 	device_for_each_child_node(chip->parent, fwnode) {
1016 		unsigned int lflags, dflags;
1017 		struct gpio_desc *desc;
1018 		const char *name;
1019 		int ret;
1020 
1021 		if (!fwnode_property_present(fwnode, "gpio-hog"))
1022 			continue;
1023 
1024 		desc = acpi_gpiochip_parse_own_gpio(achip, fwnode, &name,
1025 						    &lflags, &dflags);
1026 		if (IS_ERR(desc))
1027 			continue;
1028 
1029 		ret = gpiod_hog(desc, name, lflags, dflags);
1030 		if (ret) {
1031 			dev_err(chip->parent, "Failed to hog GPIO\n");
1032 			fwnode_handle_put(fwnode);
1033 			return;
1034 		}
1035 	}
1036 }
1037 
acpi_gpiochip_add(struct gpio_chip * chip)1038 void acpi_gpiochip_add(struct gpio_chip *chip)
1039 {
1040 	struct acpi_gpio_chip *acpi_gpio;
1041 	acpi_handle handle;
1042 	acpi_status status;
1043 
1044 	if (!chip || !chip->parent)
1045 		return;
1046 
1047 	handle = ACPI_HANDLE(chip->parent);
1048 	if (!handle)
1049 		return;
1050 
1051 	acpi_gpio = kzalloc(sizeof(*acpi_gpio), GFP_KERNEL);
1052 	if (!acpi_gpio) {
1053 		dev_err(chip->parent,
1054 			"Failed to allocate memory for ACPI GPIO chip\n");
1055 		return;
1056 	}
1057 
1058 	acpi_gpio->chip = chip;
1059 	INIT_LIST_HEAD(&acpi_gpio->events);
1060 	INIT_LIST_HEAD(&acpi_gpio->deferred_req_irqs_list_entry);
1061 
1062 	status = acpi_attach_data(handle, acpi_gpio_chip_dh, acpi_gpio);
1063 	if (ACPI_FAILURE(status)) {
1064 		dev_err(chip->parent, "Failed to attach ACPI GPIO chip\n");
1065 		kfree(acpi_gpio);
1066 		return;
1067 	}
1068 
1069 	if (!chip->names)
1070 		devprop_gpiochip_set_names(chip, dev_fwnode(chip->parent));
1071 
1072 	acpi_gpiochip_request_regions(acpi_gpio);
1073 	acpi_gpiochip_scan_gpios(acpi_gpio);
1074 	acpi_walk_dep_device_list(handle);
1075 }
1076 
acpi_gpiochip_remove(struct gpio_chip * chip)1077 void acpi_gpiochip_remove(struct gpio_chip *chip)
1078 {
1079 	struct acpi_gpio_chip *acpi_gpio;
1080 	acpi_handle handle;
1081 	acpi_status status;
1082 
1083 	if (!chip || !chip->parent)
1084 		return;
1085 
1086 	handle = ACPI_HANDLE(chip->parent);
1087 	if (!handle)
1088 		return;
1089 
1090 	status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
1091 	if (ACPI_FAILURE(status)) {
1092 		dev_warn(chip->parent, "Failed to retrieve ACPI GPIO chip\n");
1093 		return;
1094 	}
1095 
1096 	acpi_gpiochip_free_regions(acpi_gpio);
1097 
1098 	acpi_detach_data(handle, acpi_gpio_chip_dh);
1099 	kfree(acpi_gpio);
1100 }
1101 
acpi_gpio_package_count(const union acpi_object * obj)1102 static int acpi_gpio_package_count(const union acpi_object *obj)
1103 {
1104 	const union acpi_object *element = obj->package.elements;
1105 	const union acpi_object *end = element + obj->package.count;
1106 	unsigned int count = 0;
1107 
1108 	while (element < end) {
1109 		switch (element->type) {
1110 		case ACPI_TYPE_LOCAL_REFERENCE:
1111 			element += 3;
1112 			/* Fallthrough */
1113 		case ACPI_TYPE_INTEGER:
1114 			element++;
1115 			count++;
1116 			break;
1117 
1118 		default:
1119 			return -EPROTO;
1120 		}
1121 	}
1122 
1123 	return count;
1124 }
1125 
acpi_find_gpio_count(struct acpi_resource * ares,void * data)1126 static int acpi_find_gpio_count(struct acpi_resource *ares, void *data)
1127 {
1128 	unsigned int *count = data;
1129 
1130 	if (ares->type == ACPI_RESOURCE_TYPE_GPIO)
1131 		*count += ares->data.gpio.pin_table_length;
1132 
1133 	return 1;
1134 }
1135 
1136 /**
1137  * acpi_gpio_count - return the number of GPIOs associated with a
1138  *		device / function or -ENOENT if no GPIO has been
1139  *		assigned to the requested function.
1140  * @dev:	GPIO consumer, can be NULL for system-global GPIOs
1141  * @con_id:	function within the GPIO consumer
1142  */
acpi_gpio_count(struct device * dev,const char * con_id)1143 int acpi_gpio_count(struct device *dev, const char *con_id)
1144 {
1145 	struct acpi_device *adev = ACPI_COMPANION(dev);
1146 	const union acpi_object *obj;
1147 	const struct acpi_gpio_mapping *gm;
1148 	int count = -ENOENT;
1149 	int ret;
1150 	char propname[32];
1151 	unsigned int i;
1152 
1153 	/* Try first from _DSD */
1154 	for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
1155 		if (con_id)
1156 			snprintf(propname, sizeof(propname), "%s-%s",
1157 				 con_id, gpio_suffixes[i]);
1158 		else
1159 			snprintf(propname, sizeof(propname), "%s",
1160 				 gpio_suffixes[i]);
1161 
1162 		ret = acpi_dev_get_property(adev, propname, ACPI_TYPE_ANY,
1163 					    &obj);
1164 		if (ret == 0) {
1165 			if (obj->type == ACPI_TYPE_LOCAL_REFERENCE)
1166 				count = 1;
1167 			else if (obj->type == ACPI_TYPE_PACKAGE)
1168 				count = acpi_gpio_package_count(obj);
1169 		} else if (adev->driver_gpios) {
1170 			for (gm = adev->driver_gpios; gm->name; gm++)
1171 				if (strcmp(propname, gm->name) == 0) {
1172 					count = gm->size;
1173 					break;
1174 				}
1175 		}
1176 		if (count > 0)
1177 			break;
1178 	}
1179 
1180 	/* Then from plain _CRS GPIOs */
1181 	if (count < 0) {
1182 		struct list_head resource_list;
1183 		unsigned int crs_count = 0;
1184 
1185 		if (!acpi_can_fallback_to_crs(adev, con_id))
1186 			return count;
1187 
1188 		INIT_LIST_HEAD(&resource_list);
1189 		acpi_dev_get_resources(adev, &resource_list,
1190 				       acpi_find_gpio_count, &crs_count);
1191 		acpi_dev_free_resource_list(&resource_list);
1192 		if (crs_count > 0)
1193 			count = crs_count;
1194 	}
1195 	return count ? count : -ENOENT;
1196 }
1197 
acpi_can_fallback_to_crs(struct acpi_device * adev,const char * con_id)1198 bool acpi_can_fallback_to_crs(struct acpi_device *adev, const char *con_id)
1199 {
1200 	/* Never allow fallback if the device has properties */
1201 	if (adev->data.properties || adev->driver_gpios)
1202 		return false;
1203 
1204 	return con_id == NULL;
1205 }
1206 
1207 /* Run deferred acpi_gpiochip_request_interrupts() */
acpi_gpio_handle_deferred_request_interrupts(void)1208 static int acpi_gpio_handle_deferred_request_interrupts(void)
1209 {
1210 	struct acpi_gpio_chip *acpi_gpio, *tmp;
1211 
1212 	mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
1213 	list_for_each_entry_safe(acpi_gpio, tmp,
1214 				 &acpi_gpio_deferred_req_irqs_list,
1215 				 deferred_req_irqs_list_entry) {
1216 		acpi_handle handle;
1217 
1218 		handle = ACPI_HANDLE(acpi_gpio->chip->parent);
1219 		acpi_walk_resources(handle, "_AEI",
1220 				    acpi_gpiochip_request_interrupt, acpi_gpio);
1221 
1222 		list_del_init(&acpi_gpio->deferred_req_irqs_list_entry);
1223 	}
1224 
1225 	acpi_gpio_deferred_req_irqs_done = true;
1226 	mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
1227 
1228 	return 0;
1229 }
1230 /* We must use _sync so that this runs after the first deferred_probe run */
1231 late_initcall_sync(acpi_gpio_handle_deferred_request_interrupts);
1232