Lines Matching +full:wakeup +full:- +full:method

1 // SPDX-License-Identifier: GPL-2.0-only
27 bool wakeup; member
48 * Some 2-in-1s which use the soc_button_array driver have this ugly issue in
49 * their DSDT where the _LID method modifies the irq-type settings of the GPIOs
53 * problematic because when re-enabling the irq, which happens whenever _LID
55 * irq-type to IRQ_TYPE_LEVEL_LOW. Where as the gpio-keys driver programs the
57 * To work around this we don't set gpio_keys_button.gpio on these 2-in-1s,
65 * Acer Switch 10 SW5-012. _LID method messes with home- and
66 * power-button GPIO IRQ settings. When (re-)enabling the irq
68 * ones, leading to an irq-type of IRQ_TYPE_LEVEL_LOW |
73 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
78 * Acer One S1003. _LID method messes with power-button GPIO
79 * IRQ settings, leading to a non working power-button.
88 * Lenovo Yoga Tab2 1051L, something messes with the home-button
89 * IRQ settings, leading to a non working home-button.
132 for (info = button_info; info->name; info++) in soc_button_device_create()
133 if (info->autorepeat == autorepeat) in soc_button_device_create()
136 gpio_keys_pdata = devm_kzalloc(&pdev->dev, in soc_button_device_create()
141 return ERR_PTR(-ENOMEM); in soc_button_device_create()
146 for (info = button_info; info->name; info++) { in soc_button_device_create()
147 if (info->autorepeat != autorepeat) in soc_button_device_create()
150 error = soc_button_lookup_gpio(&pdev->dev, info->acpi_index, &gpio, &irq); in soc_button_device_create()
154 * ignore -EPROBE_DEFER errors here. On some devices in soc_button_device_create()
161 * show up, therefore we ignore -EPROBE_DEFER. in soc_button_device_create()
170 gpio_keys[n_buttons].gpio = -ENOENT; in soc_button_device_create()
175 gpio_keys[n_buttons].type = info->event_type; in soc_button_device_create()
176 gpio_keys[n_buttons].code = info->event_code; in soc_button_device_create()
177 gpio_keys[n_buttons].active_low = info->active_low; in soc_button_device_create()
178 gpio_keys[n_buttons].desc = info->name; in soc_button_device_create()
179 gpio_keys[n_buttons].wakeup = info->wakeup; in soc_button_device_create()
186 error = -ENODEV; in soc_button_device_create()
190 gpio_keys_pdata->buttons = gpio_keys; in soc_button_device_create()
191 gpio_keys_pdata->nbuttons = n_buttons; in soc_button_device_create()
192 gpio_keys_pdata->rep = autorepeat; in soc_button_device_create()
194 pd = platform_device_register_resndata(&pdev->dev, "gpio-keys", in soc_button_device_create()
200 dev_err(&pdev->dev, in soc_button_device_create()
201 "failed registering gpio-keys: %d\n", error); in soc_button_device_create()
208 devm_kfree(&pdev->dev, gpio_keys_pdata); in soc_button_device_create()
214 if (obj->type != ACPI_TYPE_INTEGER) in soc_button_get_acpi_object_int()
215 return -1; in soc_button_get_acpi_object_int()
217 return obj->integer.value; in soc_button_get_acpi_object_int()
228 if (desc->type != ACPI_TYPE_PACKAGE || in soc_button_parse_btn_desc()
229 desc->package.count != 5 || in soc_button_parse_btn_desc()
231 soc_button_get_acpi_object_int(&desc->package.elements[0]) != 1 || in soc_button_parse_btn_desc()
233 soc_button_get_acpi_object_int(&desc->package.elements[2]) != in soc_button_parse_btn_desc()
236 return -ENODEV; in soc_button_parse_btn_desc()
239 info->event_type = EV_KEY; in soc_button_parse_btn_desc()
240 info->active_low = true; in soc_button_parse_btn_desc()
241 info->acpi_index = in soc_button_parse_btn_desc()
242 soc_button_get_acpi_object_int(&desc->package.elements[1]); in soc_button_parse_btn_desc()
243 upage = soc_button_get_acpi_object_int(&desc->package.elements[3]); in soc_button_parse_btn_desc()
244 usage = soc_button_get_acpi_object_int(&desc->package.elements[4]); in soc_button_parse_btn_desc()
247 * The UUID: fa6bd625-9ce8-470d-a2c7-b3ca36c4282e descriptors use HID in soc_button_parse_btn_desc()
257 info->name = "power"; in soc_button_parse_btn_desc()
258 info->event_code = KEY_POWER; in soc_button_parse_btn_desc()
259 info->wakeup = true; in soc_button_parse_btn_desc()
261 info->name = "rotation lock switch"; in soc_button_parse_btn_desc()
262 info->event_type = EV_SW; in soc_button_parse_btn_desc()
263 info->event_code = SW_ROTATE_LOCK; in soc_button_parse_btn_desc()
265 info->name = "home"; in soc_button_parse_btn_desc()
266 info->event_code = KEY_LEFTMETA; in soc_button_parse_btn_desc()
267 info->wakeup = true; in soc_button_parse_btn_desc()
269 info->name = "volume_up"; in soc_button_parse_btn_desc()
270 info->event_code = KEY_VOLUMEUP; in soc_button_parse_btn_desc()
271 info->autorepeat = true; in soc_button_parse_btn_desc()
273 info->name = "volume_down"; in soc_button_parse_btn_desc()
274 info->event_code = KEY_VOLUMEDOWN; in soc_button_parse_btn_desc()
275 info->autorepeat = true; in soc_button_parse_btn_desc()
278 info->acpi_index, upage, usage); in soc_button_parse_btn_desc()
279 info->name = "unknown"; in soc_button_parse_btn_desc()
280 info->event_code = KEY_RESERVED; in soc_button_parse_btn_desc()
286 /* ACPI0011 _DSD btns descriptors UUID: fa6bd625-9ce8-470d-a2c7-b3ca36c4282e */
299 int i, btn, collection_uid = -1; in soc_button_get_button_info()
305 return ERR_PTR(-ENODEV); in soc_button_get_button_info()
310 for (i = 0; (i + 1) < desc->package.count; i += 2) { in soc_button_get_button_info()
311 uuid = &desc->package.elements[i]; in soc_button_get_button_info()
313 if (uuid->type != ACPI_TYPE_BUFFER || in soc_button_get_button_info()
314 uuid->buffer.length != 16 || in soc_button_get_button_info()
315 desc->package.elements[i + 1].type != ACPI_TYPE_PACKAGE) { in soc_button_get_button_info()
319 if (memcmp(uuid->buffer.pointer, btns_desc_uuid, 16) == 0) { in soc_button_get_button_info()
320 btns_desc = &desc->package.elements[i + 1]; in soc_button_get_button_info()
327 button_info = ERR_PTR(-ENODEV); in soc_button_get_button_info()
332 el0 = &btns_desc->package.elements[0]; in soc_button_get_button_info()
333 if (el0->type == ACPI_TYPE_PACKAGE && in soc_button_get_button_info()
334 el0->package.count == 5 && in soc_button_get_button_info()
336 soc_button_get_acpi_object_int(&el0->package.elements[0]) == 0 && in soc_button_get_button_info()
338 soc_button_get_acpi_object_int(&el0->package.elements[2]) == 0) { in soc_button_get_button_info()
340 &el0->package.elements[1]); in soc_button_get_button_info()
342 if (collection_uid == -1) { in soc_button_get_button_info()
344 button_info = ERR_PTR(-ENODEV); in soc_button_get_button_info()
348 /* There are package.count - 1 buttons + 1 terminating empty entry */ in soc_button_get_button_info()
349 button_info = devm_kcalloc(dev, btns_desc->package.count, in soc_button_get_button_info()
352 button_info = ERR_PTR(-ENOMEM); in soc_button_get_button_info()
357 for (i = 1, btn = 0; i < btns_desc->package.count; i++, btn++) { in soc_button_get_button_info()
359 &btns_desc->package.elements[i], in soc_button_get_button_info()
362 button_info = ERR_PTR(-ENODEV); in soc_button_get_button_info()
379 if (priv->children[i]) in soc_button_remove()
380 platform_device_unregister(priv->children[i]); in soc_button_remove()
387 struct device *dev = &pdev->dev; in soc_button_probe()
396 if (device_data && device_data->check) { in soc_button_probe()
397 error = device_data->check(dev); in soc_button_probe()
402 if (device_data && device_data->button_info) { in soc_button_probe()
403 button_info = device_data->button_info; in soc_button_probe()
413 return -ENODEV; in soc_button_probe()
418 return -ENOMEM; in soc_button_probe()
426 if (error != -ENODEV) { in soc_button_probe()
433 priv->children[i] = pd; in soc_button_probe()
436 if (!priv->children[0] && !priv->children[1]) in soc_button_probe()
437 return -ENODEV; in soc_button_probe()
439 if (!device_data || !device_data->button_info) in soc_button_probe()
478 * the _DSM method.
499 oem_platform_rev = result->integer.value; in soc_device_check_MSHW0040()
509 return -ENODEV; in soc_device_check_MSHW0040()