* [PATCH v3 0/4] TI Bluetooth serdev support @ 2017-04-13 15:03 Rob Herring 2017-04-13 15:03 ` [PATCH v3 1/4] dt-bindings: net: Add TI WiLink shared transport binding Rob Herring ` (3 more replies) 0 siblings, 4 replies; 12+ messages in thread From: Rob Herring @ 2017-04-13 15:03 UTC (permalink / raw) To: Marcel Holtmann, linux-bluetooth Cc: linux-arm-kernel, Gustavo Padovan, Johan Hedberg, Mark Rutland, Wei Xu, Eyal Reizer, Satish Patel, netdev, devicetree This series adds serdev support to the HCI LL protocol used on TI BT modules and enables support on HiKey board with with the WL1835 module. With this the custom TI UIM daemon and btattach are no longer needed. The series is available on this git branch[1]. This version is rebased on bluetooth-next tree containing its dependencies. Rob [1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git ti-bluetooth Rob Herring (4): dt-bindings: net: Add TI WiLink shared transport binding bluetooth: hci_uart: remove unused hci_uart_init_tty bluetooth: hci_uart: add LL protocol serdev driver support arm64: dts: hikey: add WL1835 Bluetooth device node .../devicetree/bindings/net/ti,wilink-st.txt | 35 +++ arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts | 5 + drivers/bluetooth/hci_ldisc.c | 19 -- drivers/bluetooth/hci_ll.c | 262 ++++++++++++++++++++- drivers/bluetooth/hci_uart.h | 1 - 5 files changed, 301 insertions(+), 21 deletions(-) create mode 100644 Documentation/devicetree/bindings/net/ti,wilink-st.txt -- 2.11.0 ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 1/4] dt-bindings: net: Add TI WiLink shared transport binding 2017-04-13 15:03 [PATCH v3 0/4] TI Bluetooth serdev support Rob Herring @ 2017-04-13 15:03 ` Rob Herring [not found] ` <20170413150353.7389-2-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> [not found] ` <CAHCN7x+HhwmXGxZn_31LuzdkEdoAnOSxukAdXULrGbSeKmrtRQ@mail.gmail.com> 2017-04-13 15:03 ` [PATCH v3 2/4] bluetooth: hci_uart: remove unused hci_uart_init_tty Rob Herring ` (2 subsequent siblings) 3 siblings, 2 replies; 12+ messages in thread From: Rob Herring @ 2017-04-13 15:03 UTC (permalink / raw) To: Marcel Holtmann, linux-bluetooth Cc: linux-arm-kernel, Gustavo Padovan, Johan Hedberg, Mark Rutland, Wei Xu, Eyal Reizer, Satish Patel, netdev, devicetree Add serial slave device binding for the TI WiLink series of Bluetooth/FM/GPS devices. Signed-off-by: Rob Herring <robh@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: netdev@vger.kernel.org Cc: devicetree@vger.kernel.org --- v3: - rebase on bluetooth-next .../devicetree/bindings/net/ti,wilink-st.txt | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Documentation/devicetree/bindings/net/ti,wilink-st.txt diff --git a/Documentation/devicetree/bindings/net/ti,wilink-st.txt b/Documentation/devicetree/bindings/net/ti,wilink-st.txt new file mode 100644 index 000000000000..cbad73a84ac4 --- /dev/null +++ b/Documentation/devicetree/bindings/net/ti,wilink-st.txt @@ -0,0 +1,35 @@ +TI WiLink 7/8 (wl12xx/wl18xx) Shared Transport BT/FM/GPS devices + +TI WiLink devices have a UART interface for providing Bluetooth, FM radio, +and GPS over what's called "shared transport". The shared transport is +standard BT HCI protocol with additional channels for the other functions. + +These devices also have a separate WiFi interface as described in +wireless/ti,wlcore.txt. + +This bindings follows the UART slave device binding in +../serial/slave-device.txt. + +Required properties: + - compatible: should be one of the following: + "ti,wl1271-st" + "ti,wl1273-st" + "ti,wl1831-st" + "ti,wl1835-st" + "ti,wl1837-st" + +Optional properties: + - enable-gpios : GPIO signal controlling enabling of BT. Active high. + - vio-supply : Vio input supply (1.8V) + - vbat-supply : Vbat input supply (2.9-4.8V) + +Example: + +&serial0 { + compatible = "ns16550a"; + ... + bluetooth { + compatible = "ti,wl1835-st"; + enable-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; + }; +}; -- 2.11.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
[parent not found: <20170413150353.7389-2-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v3 1/4] dt-bindings: net: Add TI WiLink shared transport binding [not found] ` <20170413150353.7389-2-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> @ 2017-04-15 19:38 ` Sebastian Reichel 0 siblings, 0 replies; 12+ messages in thread From: Sebastian Reichel @ 2017-04-15 19:38 UTC (permalink / raw) To: Rob Herring Cc: Marcel Holtmann, linux-bluetooth-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Gustavo Padovan, Johan Hedberg, Mark Rutland, Wei Xu, Eyal Reizer, Satish Patel, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 2148 bytes --] Hi, On Thu, Apr 13, 2017 at 10:03:50AM -0500, Rob Herring wrote: > Add serial slave device binding for the TI WiLink series of Bluetooth/FM/GPS > devices. > > Signed-off-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> > Cc: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org> > Cc: netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > --- > v3: > - rebase on bluetooth-next > > .../devicetree/bindings/net/ti,wilink-st.txt | 35 ++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > create mode 100644 Documentation/devicetree/bindings/net/ti,wilink-st.txt > > diff --git a/Documentation/devicetree/bindings/net/ti,wilink-st.txt b/Documentation/devicetree/bindings/net/ti,wilink-st.txt > new file mode 100644 > index 000000000000..cbad73a84ac4 > --- /dev/null > +++ b/Documentation/devicetree/bindings/net/ti,wilink-st.txt > @@ -0,0 +1,35 @@ > +TI WiLink 7/8 (wl12xx/wl18xx) Shared Transport BT/FM/GPS devices > + > +TI WiLink devices have a UART interface for providing Bluetooth, FM radio, > +and GPS over what's called "shared transport". The shared transport is > +standard BT HCI protocol with additional channels for the other functions. > + > +These devices also have a separate WiFi interface as described in > +wireless/ti,wlcore.txt. > + > +This bindings follows the UART slave device binding in > +../serial/slave-device.txt. > + > +Required properties: > + - compatible: should be one of the following: > + "ti,wl1271-st" > + "ti,wl1273-st" > + "ti,wl1831-st" > + "ti,wl1835-st" > + "ti,wl1837-st" > + > +Optional properties: > + - enable-gpios : GPIO signal controlling enabling of BT. Active high. > + - vio-supply : Vio input supply (1.8V) > + - vbat-supply : Vbat input supply (2.9-4.8V) > + > +Example: > + > +&serial0 { > + compatible = "ns16550a"; > + ... > + bluetooth { > + compatible = "ti,wl1835-st"; > + enable-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; > + }; > +}; Reviewed-by: Sebastian Reichel <sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> -- Sebastian [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <CAHCN7x+HhwmXGxZn_31LuzdkEdoAnOSxukAdXULrGbSeKmrtRQ@mail.gmail.com>]
[parent not found: <CAHCN7xLHZmS_3+JygQgRxi_tX0mXL22D1Nj9T8jkrMz3-8eQDg@mail.gmail.com>]
* Re: [PATCH v3 1/4] dt-bindings: net: Add TI WiLink shared transport binding [not found] ` <CAHCN7xLHZmS_3+JygQgRxi_tX0mXL22D1Nj9T8jkrMz3-8eQDg@mail.gmail.com> @ 2017-04-16 14:09 ` Adam Ford [not found] ` <CAHCN7x+G_jbQTDfyPBZ4Er8vz46tEojrWf29Eztq56c9zBnMeA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 12+ messages in thread From: Adam Ford @ 2017-04-16 14:09 UTC (permalink / raw) To: Rob Herring Cc: Mark Rutland, Johan Hedberg, Wei Xu, Eyal Reizer, devicetree, linux-bluetooth, Gustavo Padovan, Marcel Holtmann, Satish Patel, linux-arm-kernel, netdev [-- Attachment #1: Type: text/plain, Size: 2207 bytes --] On Apr 13, 2017 10:04 AM, "Rob Herring" <robh@kernel.org> wrote: Add serial slave device binding for the TI WiLink series of Bluetooth/FM/GPS devices. Signed-off-by: Rob Herring <robh@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: netdev@vger.kernel.org Cc: devicetree@vger.kernel.org --- v3: - rebase on bluetooth-next .../devicetree/bindings/net/ti,wilink-st.txt | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Documentation/devicetree/bindings/net/ti,wilink-st.txt diff --git a/Documentation/devicetree/bindings/net/ti,wilink-st.txt b/Documentation/devicetree/bindings/net/ti,wilink-st.txt new file mode 100644 index 000000000000..cbad73a84ac4 --- /dev/null +++ b/Documentation/devicetree/bindings/net/ti,wilink-st.txt @@ -0,0 +1,35 @@ +TI WiLink 7/8 (wl12xx/wl18xx) Shared Transport BT/FM/GPS devices + +TI WiLink devices have a UART interface for providing Bluetooth, FM radio, +and GPS over what's called "shared transport". The shared transport is +standard BT HCI protocol with additional channels for the other functions. + +These devices also have a separate WiFi interface as described in +wireless/ti,wlcore.txt. + +This bindings follows the UART slave device binding in +../serial/slave-device.txt. + +Required properties: + - compatible: should be one of the following: + "ti,wl1271-st" + "ti,wl1273-st" + "ti,wl1831-st" + "ti,wl1835-st" + "ti,wl1837-st" + Would you expect the wl1283 chipset too? I can help test this if you like after the holiday weekend. I have a board with WL1283 and currently using pdata-quirks to support it. Adam +Optional properties: + - enable-gpios : GPIO signal controlling enabling of BT. Active high. + - vio-supply : Vio input supply (1.8V) + - vbat-supply : Vbat input supply (2.9-4.8V) + +Example: + +&serial0 { + compatible = "ns16550a"; + ... + bluetooth { + compatible = "ti,wl1835-st"; + enable-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; + }; +}; -- 2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel [-- Attachment #2: Type: text/html, Size: 3744 bytes --] ^ permalink raw reply related [flat|nested] 12+ messages in thread
[parent not found: <CAHCN7x+G_jbQTDfyPBZ4Er8vz46tEojrWf29Eztq56c9zBnMeA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v3 1/4] dt-bindings: net: Add TI WiLink shared transport binding [not found] ` <CAHCN7x+G_jbQTDfyPBZ4Er8vz46tEojrWf29Eztq56c9zBnMeA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2017-04-19 20:49 ` Rob Herring 0 siblings, 0 replies; 12+ messages in thread From: Rob Herring @ 2017-04-19 20:49 UTC (permalink / raw) To: Adam Ford Cc: Mark Rutland, Johan Hedberg, Wei Xu, Eyal Reizer, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, open list:BLUETOOTH DRIVERS, Gustavo Padovan, Marcel Holtmann, Satish Patel, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, netdev On Sun, Apr 16, 2017 at 9:09 AM, Adam Ford <aford173-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > On Apr 13, 2017 10:04 AM, "Rob Herring" <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> wrote: > > Add serial slave device binding for the TI WiLink series of Bluetooth/FM/GPS > devices. > > Signed-off-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> > Cc: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org> > Cc: netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > --- > v3: > - rebase on bluetooth-next > > .../devicetree/bindings/net/ti,wilink-st.txt | 35 > ++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > create mode 100644 Documentation/devicetree/bindings/net/ti,wilink-st.txt > > diff --git a/Documentation/devicetree/bindings/net/ti,wilink-st.txt > b/Documentation/devicetree/bindings/net/ti,wilink-st.txt > new file mode 100644 > index 000000000000..cbad73a84ac4 > --- /dev/null > +++ b/Documentation/devicetree/bindings/net/ti,wilink-st.txt > @@ -0,0 +1,35 @@ > +TI WiLink 7/8 (wl12xx/wl18xx) Shared Transport BT/FM/GPS devices > + > +TI WiLink devices have a UART interface for providing Bluetooth, FM radio, > +and GPS over what's called "shared transport". The shared transport is > +standard BT HCI protocol with additional channels for the other functions. > + > +These devices also have a separate WiFi interface as described in > +wireless/ti,wlcore.txt. > + > +This bindings follows the UART slave device binding in > +../serial/slave-device.txt. > + > +Required properties: > + - compatible: should be one of the following: > + "ti,wl1271-st" > + "ti,wl1273-st" > + "ti,wl1831-st" > + "ti,wl1835-st" > + "ti,wl1837-st" > + > > > Would you expect the wl1283 chipset too? Probably, but I left it out as there's no public information. > I can help test this if you like after the holiday weekend. I have a board > with WL1283 and currently using pdata-quirks to support it. ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 2/4] bluetooth: hci_uart: remove unused hci_uart_init_tty 2017-04-13 15:03 [PATCH v3 0/4] TI Bluetooth serdev support Rob Herring 2017-04-13 15:03 ` [PATCH v3 1/4] dt-bindings: net: Add TI WiLink shared transport binding Rob Herring @ 2017-04-13 15:03 ` Rob Herring 2017-04-13 15:03 ` [PATCH v3 3/4] bluetooth: hci_uart: add LL protocol serdev driver support Rob Herring [not found] ` <20170413150353.7389-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 3 siblings, 0 replies; 12+ messages in thread From: Rob Herring @ 2017-04-13 15:03 UTC (permalink / raw) To: Marcel Holtmann, linux-bluetooth Cc: linux-arm-kernel, Gustavo Padovan, Johan Hedberg, Mark Rutland, Wei Xu, Eyal Reizer, Satish Patel, netdev, devicetree There are no users of hci_uart_init_tty, so remove it. Signed-off-by: Rob Herring <robh@kernel.org> Cc: Marcel Holtmann <marcel@holtmann.org> Cc: Gustavo Padovan <gustavo@padovan.org> Cc: Johan Hedberg <johan.hedberg@gmail.com> Cc: linux-bluetooth@vger.kernel.org --- v3: - rebase on bluetooth-next drivers/bluetooth/hci_ldisc.c | 19 ------------------- drivers/bluetooth/hci_uart.h | 1 - 2 files changed, 20 deletions(-) diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index 17bcbc13623f..cec4438ede01 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c @@ -319,25 +319,6 @@ void hci_uart_set_speeds(struct hci_uart *hu, unsigned int init_speed, hu->oper_speed = oper_speed; } -void hci_uart_init_tty(struct hci_uart *hu) -{ - struct tty_struct *tty = hu->tty; - struct ktermios ktermios; - - /* Bring the UART into a known 8 bits no parity hw fc state */ - ktermios = tty->termios; - ktermios.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | - INLCR | IGNCR | ICRNL | IXON); - ktermios.c_oflag &= ~OPOST; - ktermios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); - ktermios.c_cflag &= ~(CSIZE | PARENB); - ktermios.c_cflag |= CS8; - ktermios.c_cflag |= CRTSCTS; - - /* tty_set_termios() return not checked as it is always 0 */ - tty_set_termios(tty, &ktermios); -} - void hci_uart_set_baudrate(struct hci_uart *hu, unsigned int speed) { struct tty_struct *tty = hu->tty; diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h index 1b41c661bbb8..2b05e557fad0 100644 --- a/drivers/bluetooth/hci_uart.h +++ b/drivers/bluetooth/hci_uart.h @@ -114,7 +114,6 @@ int hci_uart_register_device(struct hci_uart *hu, const struct hci_uart_proto *p int hci_uart_tx_wakeup(struct hci_uart *hu); int hci_uart_init_ready(struct hci_uart *hu); -void hci_uart_init_tty(struct hci_uart *hu); void hci_uart_set_baudrate(struct hci_uart *hu, unsigned int speed); void hci_uart_set_flow_control(struct hci_uart *hu, bool enable); void hci_uart_set_speeds(struct hci_uart *hu, unsigned int init_speed, -- 2.11.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 3/4] bluetooth: hci_uart: add LL protocol serdev driver support 2017-04-13 15:03 [PATCH v3 0/4] TI Bluetooth serdev support Rob Herring 2017-04-13 15:03 ` [PATCH v3 1/4] dt-bindings: net: Add TI WiLink shared transport binding Rob Herring 2017-04-13 15:03 ` [PATCH v3 2/4] bluetooth: hci_uart: remove unused hci_uart_init_tty Rob Herring @ 2017-04-13 15:03 ` Rob Herring [not found] ` <20170413150353.7389-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> [not found] ` <20170413150353.7389-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 3 siblings, 1 reply; 12+ messages in thread From: Rob Herring @ 2017-04-13 15:03 UTC (permalink / raw) To: Marcel Holtmann, linux-bluetooth Cc: linux-arm-kernel, Gustavo Padovan, Johan Hedberg, Mark Rutland, Wei Xu, Eyal Reizer, Satish Patel, netdev, devicetree Turns out that the LL protocol and the TI-ST are the same thing AFAICT. The TI-ST adds firmware loading, GPIO control, and shared access for NFC, FM radio, etc. For now, we're only implementing what is needed for BT. This mirrors other drivers like BCM and Intel, but uses the new serdev bus. The firmware loading is greatly simplified by using existing infrastructure to send commands. It may be a bit slower than the original code using synchronous functions, but the real bottleneck is likely doing firmware load at 115.2kbps. Signed-off-by: Rob Herring <robh@kernel.org> Cc: Marcel Holtmann <marcel@holtmann.org> Cc: Gustavo Padovan <gustavo@padovan.org> Cc: Johan Hedberg <johan.hedberg@gmail.com> Cc: linux-bluetooth@vger.kernel.org --- v3: - rebase on bluetooth-next - Add explicit of.h include v2: - Use IS_ENABLED() to fix module build drivers/bluetooth/hci_ll.c | 262 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 261 insertions(+), 1 deletion(-) diff --git a/drivers/bluetooth/hci_ll.c b/drivers/bluetooth/hci_ll.c index 02692fe30279..485e8eb04542 100644 --- a/drivers/bluetooth/hci_ll.c +++ b/drivers/bluetooth/hci_ll.c @@ -34,20 +34,24 @@ #include <linux/sched.h> #include <linux/types.h> #include <linux/fcntl.h> +#include <linux/firmware.h> #include <linux/interrupt.h> #include <linux/ptrace.h> #include <linux/poll.h> #include <linux/slab.h> -#include <linux/tty.h> #include <linux/errno.h> #include <linux/string.h> #include <linux/signal.h> #include <linux/ioctl.h> +#include <linux/of.h> +#include <linux/serdev.h> #include <linux/skbuff.h> +#include <linux/ti_wilink_st.h> #include <net/bluetooth/bluetooth.h> #include <net/bluetooth/hci_core.h> +#include <linux/gpio/consumer.h> #include "hci_uart.h" @@ -76,6 +80,12 @@ struct hcill_cmd { u8 cmd; } __packed; +struct ll_device { + struct hci_uart hu; + struct serdev_device *serdev; + struct gpio_desc *enable_gpio; +}; + struct ll_struct { unsigned long rx_state; unsigned long rx_count; @@ -136,6 +146,9 @@ static int ll_open(struct hci_uart *hu) hu->priv = ll; + if (hu->serdev) + serdev_device_open(hu->serdev); + return 0; } @@ -164,6 +177,13 @@ static int ll_close(struct hci_uart *hu) kfree_skb(ll->rx_skb); + if (hu->serdev) { + struct ll_device *lldev = serdev_device_get_drvdata(hu->serdev); + gpiod_set_value_cansleep(lldev->enable_gpio, 0); + + serdev_device_close(hu->serdev); + } + hu->priv = NULL; kfree(ll); @@ -505,9 +525,245 @@ static struct sk_buff *ll_dequeue(struct hci_uart *hu) return skb_dequeue(&ll->txq); } +#if IS_ENABLED(CONFIG_SERIAL_DEV_BUS) +static int read_local_version(struct hci_dev *hdev) +{ + int err = 0; + unsigned short version = 0; + struct sk_buff *skb; + struct hci_rp_read_local_version *ver; + + skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL, HCI_INIT_TIMEOUT); + if (IS_ERR(skb)) { + bt_dev_err(hdev, "Reading TI version information failed (%ld)", + PTR_ERR(skb)); + err = PTR_ERR(skb); + goto out; + } + if (skb->len != sizeof(*ver)) { + err = -EILSEQ; + goto out; + } + + ver = (struct hci_rp_read_local_version *)skb->data; + if (le16_to_cpu(ver->manufacturer) != 13) { + err = -ENODEV; + goto out; + } + + version = le16_to_cpu(ver->lmp_subver); + +out: + if (err) bt_dev_err(hdev, "Failed to read TI version info: %d", err); + kfree_skb(skb); + return err ? err : version; +} + +/** + * download_firmware - + * internal function which parses through the .bts firmware + * script file intreprets SEND, DELAY actions only as of now + */ +static int download_firmware(struct ll_device *lldev) +{ + unsigned short chip, min_ver, maj_ver; + int version, err, len; + unsigned char *ptr, *action_ptr; + unsigned char bts_scr_name[40]; /* 40 char long bts scr name? */ + const struct firmware *fw; + struct sk_buff *skb; + struct hci_command *cmd; + + version = read_local_version(lldev->hu.hdev); + if (version < 0) + return version; + + chip = (version & 0x7C00) >> 10; + min_ver = (version & 0x007F); + maj_ver = (version & 0x0380) >> 7; + if (version & 0x8000) + maj_ver |= 0x0008; + + snprintf(bts_scr_name, sizeof(bts_scr_name), + "ti-connectivity/TIInit_%d.%d.%d.bts", + chip, maj_ver, min_ver); + + err = request_firmware(&fw, bts_scr_name, &lldev->serdev->dev); + if (err || !fw->data || !fw->size) { + bt_dev_err(lldev->hu.hdev, "request_firmware failed(errno %d) for %s", + err, bts_scr_name); + return -EINVAL; + } + ptr = (void *)fw->data; + len = fw->size; + /* bts_header to remove out magic number and + * version + */ + ptr += sizeof(struct bts_header); + len -= sizeof(struct bts_header); + + while (len > 0 && ptr) { + bt_dev_dbg(lldev->hu.hdev, " action size %d, type %d ", + ((struct bts_action *)ptr)->size, + ((struct bts_action *)ptr)->type); + + action_ptr = &(((struct bts_action *)ptr)->data[0]); + + switch (((struct bts_action *)ptr)->type) { + case ACTION_SEND_COMMAND: /* action send */ + bt_dev_dbg(lldev->hu.hdev, "S"); + cmd = (struct hci_command *)action_ptr; + if (cmd->opcode == 0xff36) { + /* ignore remote change + * baud rate HCI VS command */ + bt_dev_warn(lldev->hu.hdev, "change remote baud rate command in firmware"); + break; + } + if (cmd->prefix != 1) + bt_dev_dbg(lldev->hu.hdev, "command type %d\n", cmd->prefix); + + skb = __hci_cmd_sync(lldev->hu.hdev, cmd->opcode, cmd->plen, &cmd->speed, HCI_INIT_TIMEOUT); + if (IS_ERR(skb)) { + bt_dev_err(lldev->hu.hdev, "send command failed\n"); + goto out_rel_fw; + } + kfree_skb(skb); + break; + case ACTION_WAIT_EVENT: /* wait */ + /* no need to wait as command was synchronous */ + bt_dev_dbg(lldev->hu.hdev, "W"); + break; + case ACTION_DELAY: /* sleep */ + bt_dev_info(lldev->hu.hdev, "sleep command in scr"); + mdelay(((struct bts_action_delay *)action_ptr)->msec); + break; + } + len -= (sizeof(struct bts_action) + + ((struct bts_action *)ptr)->size); + ptr += sizeof(struct bts_action) + + ((struct bts_action *)ptr)->size; + } + +out_rel_fw: + /* fw download complete */ + release_firmware(fw); + return err; +} + +static int ll_setup(struct hci_uart *hu) +{ + int err, retry = 3; + struct ll_device *lldev; + struct serdev_device *serdev = hu->serdev; + u32 speed; + + if (!serdev) + return 0; + + lldev = serdev_device_get_drvdata(serdev); + + serdev_device_set_flow_control(serdev, true); + + do { + /* Configure BT_EN to HIGH state */ + gpiod_set_value_cansleep(lldev->enable_gpio, 0); + msleep(5); + gpiod_set_value_cansleep(lldev->enable_gpio, 1); + msleep(100); + + err = download_firmware(lldev); + if (!err) + break; + + /* Toggle BT_EN and retry */ + bt_dev_err(hu->hdev, "download firmware failed, retrying..."); + } while (retry--); + + if (err) + return err; + + /* Operational speed if any */ + if (hu->oper_speed) + speed = hu->oper_speed; + else if (hu->proto->oper_speed) + speed = hu->proto->oper_speed; + else + speed = 0; + + if (speed) { + struct sk_buff *skb = __hci_cmd_sync(hu->hdev, 0xff36, sizeof(speed), &speed, HCI_INIT_TIMEOUT); + if (!IS_ERR(skb)) { + kfree_skb(skb); + serdev_device_set_baudrate(serdev, speed); + } + } + + return 0; +} + +static const struct hci_uart_proto llp; + +static int hci_ti_probe(struct serdev_device *serdev) +{ + struct hci_uart *hu; + struct ll_device *lldev; + u32 max_speed = 3000000; + + lldev = devm_kzalloc(&serdev->dev, sizeof(struct ll_device), GFP_KERNEL); + if (!lldev) + return -ENOMEM; + hu = &lldev->hu; + + serdev_device_set_drvdata(serdev, lldev); + lldev->serdev = hu->serdev = serdev; + + lldev->enable_gpio = devm_gpiod_get_optional(&serdev->dev, "enable", GPIOD_OUT_LOW); + if (IS_ERR(lldev->enable_gpio)) + return PTR_ERR(lldev->enable_gpio); + + of_property_read_u32(serdev->dev.of_node, "max-speed", &max_speed); + hci_uart_set_speeds(hu, 115200, max_speed); + + return hci_uart_register_device(hu, &llp); +} + +static void hci_ti_remove(struct serdev_device *serdev) +{ + struct ll_device *lldev = serdev_device_get_drvdata(serdev); + struct hci_uart *hu = &lldev->hu; + struct hci_dev *hdev = hu->hdev; + + cancel_work_sync(&hu->write_work); + + hci_unregister_dev(hdev); + hci_free_dev(hdev); + hu->proto->close(hu); +} + +static const struct of_device_id hci_ti_of_match[] = { + { .compatible = "ti,wl1831-st" }, + { .compatible = "ti,wl1835-st" }, + { .compatible = "ti,wl1837-st" }, + {}, +}; +MODULE_DEVICE_TABLE(of, hci_ti_of_match); + +static struct serdev_device_driver hci_ti_drv = { + .driver = { + .name = "hci-ti", + .of_match_table = of_match_ptr(hci_ti_of_match), + }, + .probe = hci_ti_probe, + .remove = hci_ti_remove, +}; +#else +#define ll_setup NULL +#endif + static const struct hci_uart_proto llp = { .id = HCI_UART_LL, .name = "LL", + .setup = ll_setup, .open = ll_open, .close = ll_close, .recv = ll_recv, @@ -518,10 +774,14 @@ static const struct hci_uart_proto llp = { int __init ll_init(void) { + serdev_device_driver_register(&hci_ti_drv); + return hci_uart_register_proto(&llp); } int __exit ll_deinit(void) { + serdev_device_driver_unregister(&hci_ti_drv); + return hci_uart_unregister_proto(&llp); } -- 2.11.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
[parent not found: <20170413150353.7389-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v3 3/4] bluetooth: hci_uart: add LL protocol serdev driver support [not found] ` <20170413150353.7389-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> @ 2017-04-15 19:48 ` Sebastian Reichel 2017-04-17 20:11 ` Adam Ford 1 sibling, 0 replies; 12+ messages in thread From: Sebastian Reichel @ 2017-04-15 19:48 UTC (permalink / raw) To: Rob Herring Cc: Marcel Holtmann, linux-bluetooth-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Gustavo Padovan, Johan Hedberg, Mark Rutland, Wei Xu, Eyal Reizer, Satish Patel, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 1098 bytes --] Hi, On Thu, Apr 13, 2017 at 10:03:52AM -0500, Rob Herring wrote: > +static int read_local_version(struct hci_dev *hdev) > +{ > + int err = 0; > + unsigned short version = 0; > + struct sk_buff *skb; > + struct hci_rp_read_local_version *ver; > + > + skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL, HCI_INIT_TIMEOUT); > + if (IS_ERR(skb)) { > + bt_dev_err(hdev, "Reading TI version information failed (%ld)", > + PTR_ERR(skb)); > + err = PTR_ERR(skb); > + goto out; If __hci_cmd_sync() fails the code tries to kfree_skb() an error pointer resulting in NULL pointer dereference warning + strack trace. This can just return err instead. > + } > + if (skb->len != sizeof(*ver)) { > + err = -EILSEQ; > + goto out; > + } > + > + ver = (struct hci_rp_read_local_version *)skb->data; > + if (le16_to_cpu(ver->manufacturer) != 13) { > + err = -ENODEV; > + goto out; > + } > + > + version = le16_to_cpu(ver->lmp_subver); > + > +out: > + if (err) bt_dev_err(hdev, "Failed to read TI version info: %d", err); > + kfree_skb(skb); > + return err ? err : version; > +} -- Sebastian [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 3/4] bluetooth: hci_uart: add LL protocol serdev driver support [not found] ` <20170413150353.7389-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2017-04-15 19:48 ` Sebastian Reichel @ 2017-04-17 20:11 ` Adam Ford [not found] ` <CAHCN7xLNcD1rmifEOyPhG2rpB_C81hsyzV9W2q6kCQkKa69sZg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 1 sibling, 1 reply; 12+ messages in thread From: Adam Ford @ 2017-04-17 20:11 UTC (permalink / raw) To: Rob Herring Cc: Marcel Holtmann, linux-bluetooth-u79uwXL29TY76Z2rM5mHXA, Mark Rutland, devicetree-u79uwXL29TY76Z2rM5mHXA, Johan Hedberg, Gustavo Padovan, Satish Patel, Wei Xu, Eyal Reizer, netdev-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Thu, Apr 13, 2017 at 10:03 AM, Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> wrote: > Turns out that the LL protocol and the TI-ST are the same thing AFAICT. > The TI-ST adds firmware loading, GPIO control, and shared access for > NFC, FM radio, etc. For now, we're only implementing what is needed for > BT. This mirrors other drivers like BCM and Intel, but uses the new > serdev bus. > > The firmware loading is greatly simplified by using existing > infrastructure to send commands. It may be a bit slower than the > original code using synchronous functions, but the real bottleneck is > likely doing firmware load at 115.2kbps. I am using pdata-quirks to drive my wl1283 Bluetooth on a DM3730. I have the Bluetooth set to 3000000 baud in pdata quirks. Looking at the binding, I don't see an option to set the baudrate. Is there (or will there) be a way to set the baud rate of the Bluetooth? adam > > Signed-off-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> > Cc: Marcel Holtmann <marcel-kz+m5ild9QBg9hUCZPvPmw@public.gmane.org> > Cc: Gustavo Padovan <gustavo-THi1TnShQwVAfugRpC6u6w@public.gmane.org> > Cc: Johan Hedberg <johan.hedberg-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > Cc: linux-bluetooth-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > --- > v3: > - rebase on bluetooth-next > - Add explicit of.h include > v2: > - Use IS_ENABLED() to fix module build > > drivers/bluetooth/hci_ll.c | 262 ++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 261 insertions(+), 1 deletion(-) > > diff --git a/drivers/bluetooth/hci_ll.c b/drivers/bluetooth/hci_ll.c > index 02692fe30279..485e8eb04542 100644 > --- a/drivers/bluetooth/hci_ll.c > +++ b/drivers/bluetooth/hci_ll.c > @@ -34,20 +34,24 @@ > #include <linux/sched.h> > #include <linux/types.h> > #include <linux/fcntl.h> > +#include <linux/firmware.h> > #include <linux/interrupt.h> > #include <linux/ptrace.h> > #include <linux/poll.h> > > #include <linux/slab.h> > -#include <linux/tty.h> > #include <linux/errno.h> > #include <linux/string.h> > #include <linux/signal.h> > #include <linux/ioctl.h> > +#include <linux/of.h> > +#include <linux/serdev.h> > #include <linux/skbuff.h> > +#include <linux/ti_wilink_st.h> > > #include <net/bluetooth/bluetooth.h> > #include <net/bluetooth/hci_core.h> > +#include <linux/gpio/consumer.h> > > #include "hci_uart.h" > > @@ -76,6 +80,12 @@ struct hcill_cmd { > u8 cmd; > } __packed; > > +struct ll_device { > + struct hci_uart hu; > + struct serdev_device *serdev; > + struct gpio_desc *enable_gpio; > +}; > + > struct ll_struct { > unsigned long rx_state; > unsigned long rx_count; > @@ -136,6 +146,9 @@ static int ll_open(struct hci_uart *hu) > > hu->priv = ll; > > + if (hu->serdev) > + serdev_device_open(hu->serdev); > + > return 0; > } > > @@ -164,6 +177,13 @@ static int ll_close(struct hci_uart *hu) > > kfree_skb(ll->rx_skb); > > + if (hu->serdev) { > + struct ll_device *lldev = serdev_device_get_drvdata(hu->serdev); > + gpiod_set_value_cansleep(lldev->enable_gpio, 0); > + > + serdev_device_close(hu->serdev); > + } > + > hu->priv = NULL; > > kfree(ll); > @@ -505,9 +525,245 @@ static struct sk_buff *ll_dequeue(struct hci_uart *hu) > return skb_dequeue(&ll->txq); > } > > +#if IS_ENABLED(CONFIG_SERIAL_DEV_BUS) > +static int read_local_version(struct hci_dev *hdev) > +{ > + int err = 0; > + unsigned short version = 0; > + struct sk_buff *skb; > + struct hci_rp_read_local_version *ver; > + > + skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL, HCI_INIT_TIMEOUT); > + if (IS_ERR(skb)) { > + bt_dev_err(hdev, "Reading TI version information failed (%ld)", > + PTR_ERR(skb)); > + err = PTR_ERR(skb); > + goto out; > + } > + if (skb->len != sizeof(*ver)) { > + err = -EILSEQ; > + goto out; > + } > + > + ver = (struct hci_rp_read_local_version *)skb->data; > + if (le16_to_cpu(ver->manufacturer) != 13) { > + err = -ENODEV; > + goto out; > + } > + > + version = le16_to_cpu(ver->lmp_subver); > + > +out: > + if (err) bt_dev_err(hdev, "Failed to read TI version info: %d", err); > + kfree_skb(skb); > + return err ? err : version; > +} > + > +/** > + * download_firmware - > + * internal function which parses through the .bts firmware > + * script file intreprets SEND, DELAY actions only as of now > + */ > +static int download_firmware(struct ll_device *lldev) > +{ > + unsigned short chip, min_ver, maj_ver; > + int version, err, len; > + unsigned char *ptr, *action_ptr; > + unsigned char bts_scr_name[40]; /* 40 char long bts scr name? */ > + const struct firmware *fw; > + struct sk_buff *skb; > + struct hci_command *cmd; > + > + version = read_local_version(lldev->hu.hdev); > + if (version < 0) > + return version; > + > + chip = (version & 0x7C00) >> 10; > + min_ver = (version & 0x007F); > + maj_ver = (version & 0x0380) >> 7; > + if (version & 0x8000) > + maj_ver |= 0x0008; > + > + snprintf(bts_scr_name, sizeof(bts_scr_name), > + "ti-connectivity/TIInit_%d.%d.%d.bts", > + chip, maj_ver, min_ver); > + > + err = request_firmware(&fw, bts_scr_name, &lldev->serdev->dev); > + if (err || !fw->data || !fw->size) { > + bt_dev_err(lldev->hu.hdev, "request_firmware failed(errno %d) for %s", > + err, bts_scr_name); > + return -EINVAL; > + } > + ptr = (void *)fw->data; > + len = fw->size; > + /* bts_header to remove out magic number and > + * version > + */ > + ptr += sizeof(struct bts_header); > + len -= sizeof(struct bts_header); > + > + while (len > 0 && ptr) { > + bt_dev_dbg(lldev->hu.hdev, " action size %d, type %d ", > + ((struct bts_action *)ptr)->size, > + ((struct bts_action *)ptr)->type); > + > + action_ptr = &(((struct bts_action *)ptr)->data[0]); > + > + switch (((struct bts_action *)ptr)->type) { > + case ACTION_SEND_COMMAND: /* action send */ > + bt_dev_dbg(lldev->hu.hdev, "S"); > + cmd = (struct hci_command *)action_ptr; > + if (cmd->opcode == 0xff36) { > + /* ignore remote change > + * baud rate HCI VS command */ > + bt_dev_warn(lldev->hu.hdev, "change remote baud rate command in firmware"); > + break; > + } > + if (cmd->prefix != 1) > + bt_dev_dbg(lldev->hu.hdev, "command type %d\n", cmd->prefix); > + > + skb = __hci_cmd_sync(lldev->hu.hdev, cmd->opcode, cmd->plen, &cmd->speed, HCI_INIT_TIMEOUT); > + if (IS_ERR(skb)) { > + bt_dev_err(lldev->hu.hdev, "send command failed\n"); > + goto out_rel_fw; > + } > + kfree_skb(skb); > + break; > + case ACTION_WAIT_EVENT: /* wait */ > + /* no need to wait as command was synchronous */ > + bt_dev_dbg(lldev->hu.hdev, "W"); > + break; > + case ACTION_DELAY: /* sleep */ > + bt_dev_info(lldev->hu.hdev, "sleep command in scr"); > + mdelay(((struct bts_action_delay *)action_ptr)->msec); > + break; > + } > + len -= (sizeof(struct bts_action) + > + ((struct bts_action *)ptr)->size); > + ptr += sizeof(struct bts_action) + > + ((struct bts_action *)ptr)->size; > + } > + > +out_rel_fw: > + /* fw download complete */ > + release_firmware(fw); > + return err; > +} > + > +static int ll_setup(struct hci_uart *hu) > +{ > + int err, retry = 3; > + struct ll_device *lldev; > + struct serdev_device *serdev = hu->serdev; > + u32 speed; > + > + if (!serdev) > + return 0; > + > + lldev = serdev_device_get_drvdata(serdev); > + > + serdev_device_set_flow_control(serdev, true); > + > + do { > + /* Configure BT_EN to HIGH state */ > + gpiod_set_value_cansleep(lldev->enable_gpio, 0); > + msleep(5); > + gpiod_set_value_cansleep(lldev->enable_gpio, 1); > + msleep(100); > + > + err = download_firmware(lldev); > + if (!err) > + break; > + > + /* Toggle BT_EN and retry */ > + bt_dev_err(hu->hdev, "download firmware failed, retrying..."); > + } while (retry--); > + > + if (err) > + return err; > + > + /* Operational speed if any */ > + if (hu->oper_speed) > + speed = hu->oper_speed; > + else if (hu->proto->oper_speed) > + speed = hu->proto->oper_speed; > + else > + speed = 0; > + > + if (speed) { > + struct sk_buff *skb = __hci_cmd_sync(hu->hdev, 0xff36, sizeof(speed), &speed, HCI_INIT_TIMEOUT); > + if (!IS_ERR(skb)) { > + kfree_skb(skb); > + serdev_device_set_baudrate(serdev, speed); > + } > + } > + > + return 0; > +} > + > +static const struct hci_uart_proto llp; > + > +static int hci_ti_probe(struct serdev_device *serdev) > +{ > + struct hci_uart *hu; > + struct ll_device *lldev; > + u32 max_speed = 3000000; > + > + lldev = devm_kzalloc(&serdev->dev, sizeof(struct ll_device), GFP_KERNEL); > + if (!lldev) > + return -ENOMEM; > + hu = &lldev->hu; > + > + serdev_device_set_drvdata(serdev, lldev); > + lldev->serdev = hu->serdev = serdev; > + > + lldev->enable_gpio = devm_gpiod_get_optional(&serdev->dev, "enable", GPIOD_OUT_LOW); > + if (IS_ERR(lldev->enable_gpio)) > + return PTR_ERR(lldev->enable_gpio); > + > + of_property_read_u32(serdev->dev.of_node, "max-speed", &max_speed); > + hci_uart_set_speeds(hu, 115200, max_speed); > + > + return hci_uart_register_device(hu, &llp); > +} > + > +static void hci_ti_remove(struct serdev_device *serdev) > +{ > + struct ll_device *lldev = serdev_device_get_drvdata(serdev); > + struct hci_uart *hu = &lldev->hu; > + struct hci_dev *hdev = hu->hdev; > + > + cancel_work_sync(&hu->write_work); > + > + hci_unregister_dev(hdev); > + hci_free_dev(hdev); > + hu->proto->close(hu); > +} > + > +static const struct of_device_id hci_ti_of_match[] = { > + { .compatible = "ti,wl1831-st" }, > + { .compatible = "ti,wl1835-st" }, > + { .compatible = "ti,wl1837-st" }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, hci_ti_of_match); > + > +static struct serdev_device_driver hci_ti_drv = { > + .driver = { > + .name = "hci-ti", > + .of_match_table = of_match_ptr(hci_ti_of_match), > + }, > + .probe = hci_ti_probe, > + .remove = hci_ti_remove, > +}; > +#else > +#define ll_setup NULL > +#endif > + > static const struct hci_uart_proto llp = { > .id = HCI_UART_LL, > .name = "LL", > + .setup = ll_setup, > .open = ll_open, > .close = ll_close, > .recv = ll_recv, > @@ -518,10 +774,14 @@ static const struct hci_uart_proto llp = { > > int __init ll_init(void) > { > + serdev_device_driver_register(&hci_ti_drv); > + > return hci_uart_register_proto(&llp); > } > > int __exit ll_deinit(void) > { > + serdev_device_driver_unregister(&hci_ti_drv); > + > return hci_uart_unregister_proto(&llp); > } > -- > 2.11.0 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <CAHCN7xLNcD1rmifEOyPhG2rpB_C81hsyzV9W2q6kCQkKa69sZg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v3 3/4] bluetooth: hci_uart: add LL protocol serdev driver support [not found] ` <CAHCN7xLNcD1rmifEOyPhG2rpB_C81hsyzV9W2q6kCQkKa69sZg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2017-04-19 20:47 ` Rob Herring 0 siblings, 0 replies; 12+ messages in thread From: Rob Herring @ 2017-04-19 20:47 UTC (permalink / raw) To: Adam Ford Cc: Marcel Holtmann, open list:BLUETOOTH DRIVERS, Mark Rutland, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Johan Hedberg, Gustavo Padovan, Satish Patel, Wei Xu, Eyal Reizer, netdev, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org On Mon, Apr 17, 2017 at 3:11 PM, Adam Ford <aford173-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > On Thu, Apr 13, 2017 at 10:03 AM, Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> wrote: >> Turns out that the LL protocol and the TI-ST are the same thing AFAICT. >> The TI-ST adds firmware loading, GPIO control, and shared access for >> NFC, FM radio, etc. For now, we're only implementing what is needed for >> BT. This mirrors other drivers like BCM and Intel, but uses the new >> serdev bus. >> >> The firmware loading is greatly simplified by using existing >> infrastructure to send commands. It may be a bit slower than the >> original code using synchronous functions, but the real bottleneck is >> likely doing firmware load at 115.2kbps. > > I am using pdata-quirks to drive my wl1283 Bluetooth on a DM3730. I > have the Bluetooth set to 3000000 baud in pdata quirks. Looking at > the binding, I don't see an option to set the baudrate. Is there (or > will there) be a way to set the baud rate of the Bluetooth? If you read hci_ti_probe, you will see it is already there. The default is 3Mbps and the DT can override that with "max-speed". The intent is that 3Mbps is the max the device can do and max-speed is only for board or host limitations. Though I just checked the datasheet on the 1835 and it can go up to 4364kbps. No datasheets for wl1283, so I have no idea what the max is. >> +static int hci_ti_probe(struct serdev_device *serdev) >> +{ >> + struct hci_uart *hu; >> + struct ll_device *lldev; >> + u32 max_speed = 3000000; [...] >> + of_property_read_u32(serdev->dev.of_node, "max-speed", &max_speed); >> + hci_uart_set_speeds(hu, 115200, max_speed); ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <20170413150353.7389-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>]
* [PATCH v3 4/4] arm64: dts: hikey: add WL1835 Bluetooth device node [not found] ` <20170413150353.7389-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> @ 2017-04-13 15:03 ` Rob Herring 2017-04-13 17:24 ` [PATCH v3 0/4] TI Bluetooth serdev support Marcel Holtmann 1 sibling, 0 replies; 12+ messages in thread From: Rob Herring @ 2017-04-13 15:03 UTC (permalink / raw) To: Marcel Holtmann, linux-bluetooth-u79uwXL29TY76Z2rM5mHXA Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Gustavo Padovan, Johan Hedberg, Mark Rutland, Wei Xu, Eyal Reizer, Satish Patel, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA This adds the serial slave device for the WL1835 Bluetooth interface. Signed-off-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> Cc: Wei Xu <xuwei5-C8/M+/jPZTeaMJb+Lgu22Q@public.gmane.org> Cc: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org> --- v3: - rebase on bluetooth-next arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts b/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts index dba3c131c62c..9b4ba7169210 100644 --- a/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts +++ b/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts @@ -98,6 +98,11 @@ assigned-clocks = <&sys_ctrl HI6220_UART1_SRC>; assigned-clock-rates = <150000000>; status = "ok"; + + bluetooth { + compatible = "ti,wl1835-st"; + enable-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; + }; }; uart2: uart@f7112000 { -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/4] TI Bluetooth serdev support [not found] ` <20170413150353.7389-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2017-04-13 15:03 ` [PATCH v3 4/4] arm64: dts: hikey: add WL1835 Bluetooth device node Rob Herring @ 2017-04-13 17:24 ` Marcel Holtmann 1 sibling, 0 replies; 12+ messages in thread From: Marcel Holtmann @ 2017-04-13 17:24 UTC (permalink / raw) To: Rob Herring Cc: Linux Bluetooth, linux-arm-kernel, Gustavo F. Padovan, Johan Hedberg, Mark Rutland, Wei Xu, Eyal Reizer, Satish Patel, Network Development, devicetree-u79uwXL29TY76Z2rM5mHXA Hi Rob, > This series adds serdev support to the HCI LL protocol used on TI BT > modules and enables support on HiKey board with with the WL1835 module. > With this the custom TI UIM daemon and btattach are no longer needed. > > The series is available on this git branch[1]. This version is rebased on > bluetooth-next tree containing its dependencies. > > Rob > > [1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git ti-bluetooth > > Rob Herring (4): > dt-bindings: net: Add TI WiLink shared transport binding > bluetooth: hci_uart: remove unused hci_uart_init_tty > bluetooth: hci_uart: add LL protocol serdev driver support > arm64: dts: hikey: add WL1835 Bluetooth device node > > .../devicetree/bindings/net/ti,wilink-st.txt | 35 +++ > arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts | 5 + > drivers/bluetooth/hci_ldisc.c | 19 -- > drivers/bluetooth/hci_ll.c | 262 ++++++++++++++++++++- > drivers/bluetooth/hci_uart.h | 1 - > 5 files changed, 301 insertions(+), 21 deletions(-) > create mode 100644 Documentation/devicetree/bindings/net/ti,wilink-st.txt all 4 patches have been applied to bluetooth-next tree. Regards Marcel ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2017-04-19 20:49 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-04-13 15:03 [PATCH v3 0/4] TI Bluetooth serdev support Rob Herring 2017-04-13 15:03 ` [PATCH v3 1/4] dt-bindings: net: Add TI WiLink shared transport binding Rob Herring [not found] ` <20170413150353.7389-2-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2017-04-15 19:38 ` Sebastian Reichel [not found] ` <CAHCN7x+HhwmXGxZn_31LuzdkEdoAnOSxukAdXULrGbSeKmrtRQ@mail.gmail.com> [not found] ` <CAHCN7xLHZmS_3+JygQgRxi_tX0mXL22D1Nj9T8jkrMz3-8eQDg@mail.gmail.com> 2017-04-16 14:09 ` Adam Ford [not found] ` <CAHCN7x+G_jbQTDfyPBZ4Er8vz46tEojrWf29Eztq56c9zBnMeA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2017-04-19 20:49 ` Rob Herring 2017-04-13 15:03 ` [PATCH v3 2/4] bluetooth: hci_uart: remove unused hci_uart_init_tty Rob Herring 2017-04-13 15:03 ` [PATCH v3 3/4] bluetooth: hci_uart: add LL protocol serdev driver support Rob Herring [not found] ` <20170413150353.7389-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2017-04-15 19:48 ` Sebastian Reichel 2017-04-17 20:11 ` Adam Ford [not found] ` <CAHCN7xLNcD1rmifEOyPhG2rpB_C81hsyzV9W2q6kCQkKa69sZg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2017-04-19 20:47 ` Rob Herring [not found] ` <20170413150353.7389-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2017-04-13 15:03 ` [PATCH v3 4/4] arm64: dts: hikey: add WL1835 Bluetooth device node Rob Herring 2017-04-13 17:24 ` [PATCH v3 0/4] TI Bluetooth serdev support Marcel Holtmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).