Skip to content

Commit

Permalink
serdev: Fix detection of UART devices on Apple machines.
Browse files Browse the repository at this point in the history
On Apple devices the _CRS method returns an empty resource template, and
the resource settings are instead provided by the _DSM method. But
commit 33364d6 (serdev: Add ACPI
devices by ResourceSource field) changed the search for serdev devices
to require valid, non-empty resource template, thereby breaking Apple
devices and causing bluetooth devices to not be found.

This expands the check so that if we don't find a valid template, and
we're on an Apple machine, then just check for the device being an
immediate child of the controller and having a "baud" property.

Cc: <stable@vger.kernel.org> # 5.5
Fixes: 33364d6 ("serdev: Add ACPI devices by ResourceSource field")
Signed-off-by: Ronald Tschalär <ronald@innovation.ch>
Link: https://lore.kernel.org/r/20200211194723.486217-1-ronald@innovation.ch
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Ronald Tschalär authored and Greg Kroah-Hartman committed Mar 6, 2020
1 parent b85c821 commit 35d4670
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions drivers/tty/serdev/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <linux/sched.h>
#include <linux/serdev.h>
#include <linux/slab.h>
#include <linux/platform_data/x86/apple.h>

static bool is_registered;
static DEFINE_IDA(ctrl_ida);
Expand Down Expand Up @@ -631,6 +632,15 @@ static int acpi_serdev_check_resources(struct serdev_controller *ctrl,
if (ret)
return ret;

/*
* Apple machines provide an empty resource template, so on those
* machines just look for immediate children with a "baud" property
* (from the _DSM method) instead.
*/
if (!lookup.controller_handle && x86_apple_machine &&
!acpi_dev_get_property(adev, "baud", ACPI_TYPE_BUFFER, NULL))
acpi_get_parent(adev->handle, &lookup.controller_handle);

/* Make sure controller and ResourceSource handle match */
if (ACPI_HANDLE(ctrl->dev.parent) != lookup.controller_handle)
return -ENODEV;
Expand Down

0 comments on commit 35d4670

Please sign in to comment.