Re: [PATCH v2 10/10] Bluetooth: hci_bcm: Support Apple GPIO handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Lukas,

> Enable Bluetooth on the following Macs which provide custom ACPI methods
> to toggle the GPIOs for device wake and shutdown instead of accessing
> the pins directly:
> 
>    MacBook8,1     2015  12"
>    MacBook9,1     2016  12"
>    MacBook10,1    2017  12"
>    MacBookPro13,1 2016  13"
>    MacBookPro13,2 2016  13" with Touch Bar
>    MacBookPro13,3 2016  15" with Touch Bar
>    MacBookPro14,1 2017  13"
>    MacBookPro14,2 2017  13" with Touch Bar
>    MacBookPro14,3 2017  15" with Touch Bar
> 
> On the MacBook8,1 Bluetooth is muxed with a second device (a debug port
> on the SSD) under the control of PCH GPIO 36.  Because serdev cannot
> deal with multiple slaves yet, it is currently necessary to patch the
> DSDT and remove the SSDC device.
> 
> The custom ACPI methods are called:
> 
>    BTLP (Low Power) takes one argument, toggles device wake GPIO
>    BTPU (Power Up) tells SMC to drive shutdown GPIO high
>    BTPD (Power Down) tells SMC to drive shutdown GPIO low
>    BTRS (Reset) calls BTPD followed by BTPU
>    BTRB unknown, not present on all MacBooks
> 
> Search for the BTLP, BTPU and BTPD methods on ->probe and cache them in
> struct bcm_device if the machine is a Mac.
> 
> Additionally, set the init_speed based on a custom device property
> provided by Apple in lieu of _CRS resources.  The Broadcom UART's speed
> is fixed on Apple Macs:  Any attempt to change it results in Bluetooth
> status code 0x0c and bcm_set_baudrate() thus always returns -EBUSY.
> By setting only the init_speed and leaving oper_speed at zero, we can
> achieve that the host UART's speed is adjusted but the Broadcom UART's
> speed is left as is.
> 
> The host wake pin goes into the SMC which handles it independently
> of the OS, so there's no IRQ for it.
> 
> Thanks to Ronald Tschalär who did extensive debugging and testing of
> this patch and contributed fixes.
> 
> ACPI snippet containing the custom methods and device properties
> (taken from a MacBook8,1):
> 
>    Method (BTLP, 1, Serialized)
>    {
>        If (LEqual (Arg0, 0x00))
>        {
>            Store (0x01, GD54) /* set PCH GPIO 54 direction to input */
>        }
> 
>        If (LEqual (Arg0, 0x01))
>        {
>            Store (0x00, GD54) /* set PCH GPIO 54 direction to output */
>            Store (0x00, GP54) /* set PCH GPIO 54 value to low */
>        }
>    }
> 
>    Method (BTPU, 0, Serialized)
>    {
>        Store (0x01, \_SB.PCI0.LPCB.EC.BTPC)
>        Sleep (0x0A)
>    }
> 
>    Method (BTPD, 0, Serialized)
>    {
>        Store (0x00, \_SB.PCI0.LPCB.EC.BTPC)
>        Sleep (0x0A)
>    }
> 
>    Method (BTRS, 0, Serialized)
>    {
>        BTPD ()
>        BTPU ()
>    }
> 
>    Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
>    {
>        If (LEqual (Arg0, ToUUID ("a0b5b7c6-1318-441c-b0c9-fe695eaf949b")))
>        {
>            Store (Package (0x08)
>                {
>                    "baud",
>                    Buffer (0x08)
>                    { 0xC0, 0xC6, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00 },
> 
>                    "parity",
>                    Buffer (0x08)
>                    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
> 
>                    "dataBits",
>                    Buffer (0x08)
>                    { 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
> 
>                    "stopBits",
>                    Buffer (0x08)
>                    { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
>                }, Local0)
>            DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
>            Return (Local0)
>        }
>        Return (0x00)
>    }
> 
> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=110901
> Reported-by: Leif Liddy <leif.liddy@xxxxxxxxx>
> Cc: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
> Cc: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
> Cc: Frédéric Danis <frederic.danis.oss@xxxxxxxxx>
> Cc: Loic Poulain <loic.poulain@xxxxxxxxxx>
> Cc: Hans de Goede <hdegoede@xxxxxxxxxx>
> Tested-by: Max Shavrick <mxms@xxxxxx>                     [MacBook8,1]
> Tested-by: Leif Liddy <leif.liddy@xxxxxxxxx>              [MacBook9,1]
> Tested-by: Daniel Roschka <danielroschka@xxxxxxxxxxxxxxx> [MacBookPro13,2]
> Tested-by: Ronald Tschalär <ronald@xxxxxxxxxxxxx>         [MacBookPro13,3]
> Tested-by: Peter Y. Chuang <peteryuchuang@xxxxxxxxx>      [MacBookPro14,1]
> Signed-off-by: Ronald Tschalär <ronald@xxxxxxxxxxxxx>
> Signed-off-by: Lukas Wunner <lukas@xxxxxxxxx>
> ---
> Changes since v1:
>  add DSDT excerpt to the commit message,
>  drop ternary operators for readability,
>  return -EIO instead of -EFAULT if ACPI method calls fail,
>  return -EOPNOTSUPP in inline stubs,
>  use network subsystem comment style. (Marcel, Hans, Andy)
>  Also, to accommodate to mandatory presence of the two GPIOs as per
>  patch [2/10], rename bcm_apple_probe() to bcm_apple_get_resources()
>  and call it from bcm_get_resources() instead of bcm_acpi_probe().
> 
> drivers/bluetooth/hci_bcm.c | 76 +++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 74 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c
> index ad6b7c35eb8e..4e0ba38d39d2 100644
> --- a/drivers/bluetooth/hci_bcm.c
> +++ b/drivers/bluetooth/hci_bcm.c
> @@ -29,6 +29,7 @@
> #include <linux/acpi.h>
> #include <linux/of.h>
> #include <linux/property.h>
> +#include <linux/platform_data/x86/apple.h>
> #include <linux/platform_device.h>
> #include <linux/clk.h>
> #include <linux/gpio/consumer.h>
> @@ -75,6 +76,9 @@
>  * @hu: pointer to HCI UART controller struct,
>  *	used to enable flow control during runtime suspend and system sleep
>  * @is_suspended: whether flow control is currently enabled
> + * @btlp: Apple ACPI method to toggle BT_WAKE pin ("BlueTooth Low Power")
> + * @btpu: Apple ACPI method to drive BT_REG_ON pin high ("BlueTooth Power Up")
> + * @btpd: Apple ACPI method to drive BT_REG_ON pin low ("BlueTooth Power Down”)
>  */

unless the Apple ACPI table really use the string “BlueTooth”, I prefer that we use the proper “Bluetooth” string here.

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux