From: martin.blumenstingl@googlemail.com (Martin Blumenstingl)
To: linus-amlogic@lists.infradead.org
Subject: [RFC v2 7/9] bluetooth: btrtl: load the config blob from devicetree when available
Date: Mon, 1 Jan 2018 21:42:15 +0100 [thread overview]
Message-ID: <20180101204217.26165-8-martin.blumenstingl@googlemail.com> (raw)
In-Reply-To: <20180101204217.26165-1-martin.blumenstingl@googlemail.com>
Some Realtek bluetooth devices need a "config" blob. The btrtl driver
currently only allows loading this config blob via the request_firmware
mechanism.
The UART Bluetooth chips use this config blob to specify the baudrate,
whether flow control is used and some other unknown bits. This means
that the config blob is board-specific - thus loading it via
request_firmware means that the rootfs is tied to a specific board.
The UART Bluetooth chips are implemented through serdev. This means
there is also a devicetree node which describes the Bluetooth chip.
Thus we can also load the blob from the devicetree node to keep the
filesystem independent of any board configuration data. In the future
this could be extended to support ACPI as well (in case that's needed).
Parse the devicetree node if it exists and obtain the config blob from
there. Otherwise fall back to using the "old" request_firmware
mechanism.
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
---
drivers/bluetooth/btrtl.c | 43 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 41 insertions(+), 2 deletions(-)
diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c
index 25e9743643f5..1494269cf4d7 100644
--- a/drivers/bluetooth/btrtl.c
+++ b/drivers/bluetooth/btrtl.c
@@ -18,6 +18,7 @@
#include <linux/module.h>
#include <linux/firmware.h>
#include <asm/unaligned.h>
+#include <linux/of.h>
#include <linux/usb.h>
#include <net/bluetooth/bluetooth.h>
@@ -379,6 +380,41 @@ void btrtl_free(struct btrtl_device_info *btrtl_dev)
}
EXPORT_SYMBOL_GPL(btrtl_free);
+static int rtl_load_config_from_dt(struct hci_dev *hdev,
+ struct btrtl_device_info *btrtl_dev)
+{
+ struct device_node *np = hdev->dev.parent->of_node;
+ int ret, config_len;
+
+ if (!of_device_is_available(np))
+ return -ENOENT;
+
+ if (!of_find_property(np, "realtek,config-data", NULL))
+ return -ENOENT;
+
+ config_len = of_property_count_u8_elems(np, "realtek,config-data");
+ if (config_len <= 0)
+ return -ENOENT;
+
+ btrtl_dev->cfg_data = kzalloc(config_len, GFP_KERNEL);
+ if (!btrtl_dev->cfg_data)
+ return -ENOMEM;
+
+ ret = of_property_read_u8_array(np, "realtek,config-data",
+ btrtl_dev->cfg_data, config_len);
+ if (ret) {
+ kfree(btrtl_dev->cfg_data);
+ return ret;
+ }
+
+ btrtl_dev->cfg_len = config_len;
+
+ bt_dev_dbg(hdev, "rtl: using config data with len %d from DT",
+ config_len);
+
+ return 0;
+}
+
struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev)
{
struct btrtl_device_info *btrtl_dev;
@@ -480,12 +516,15 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev)
goto err_free;
}
- if (cfg_name) {
+ /* try loading the config blob from device-tree first: */
+ ret = rtl_load_config_from_dt(hdev, btrtl_dev);
+ /* fall back to loading the config via request_firmware: */
+ if (ret && cfg_name) {
btrtl_dev->cfg_len = rtl_load_file(hdev, cfg_name,
&btrtl_dev->cfg_data);
if (cfg_needed && btrtl_dev->cfg_len <= 0) {
bt_dev_err(hdev,
- "mandatory config file %s not found\n",
+ "mandatory config blob not found in %s or DT\n",
cfg_name);
ret = btrtl_dev->fw_len;
goto err_free;
--
2.15.1
next prev parent reply other threads:[~2018-01-01 20:42 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-01 20:42 [RFC v2 0/9] Realtek Bluetooth serdev support (H5 protocol) Martin Blumenstingl
2018-01-01 20:42 ` [RFC v2 1/9] serdev: implement parity configuration Martin Blumenstingl
2018-01-02 11:16 ` Marcel Holtmann
2018-01-02 21:16 ` Martin Blumenstingl
2018-01-02 21:34 ` Martin Blumenstingl
2018-01-03 9:06 ` Johan Hovold
2018-01-03 12:37 ` Marcel Holtmann
2018-01-01 20:42 ` [RFC v2 2/9] dt-bindings: net: bluetooth: add support for Realtek Bluetooth chips Martin Blumenstingl
2018-01-02 11:16 ` Marcel Holtmann
2018-01-02 21:10 ` Martin Blumenstingl
2018-01-03 19:07 ` Rob Herring
2018-01-01 20:42 ` [RFC v2 3/9] Bluetooth: btrtl: add MODULE_FIRMWARE declarations Martin Blumenstingl
2018-01-01 20:42 ` [RFC v2 4/9] Bluetooth: btrtl: split the device initialization into smaller parts Martin Blumenstingl
2018-01-01 20:42 ` [RFC v2 5/9] Bluetooth: btrtl: add support for retrieving the UART settings Martin Blumenstingl
2018-01-01 20:42 ` [RFC v2 6/9] Bluetooth: btrtl: add support for the RTL8723BS and RTL8723DS chips Martin Blumenstingl
2018-01-01 20:42 ` Martin Blumenstingl [this message]
2018-01-02 11:11 ` [RFC v2 7/9] bluetooth: btrtl: load the config blob from devicetree when available Marcel Holtmann
2018-01-02 11:15 ` Carlo Caione
2018-01-02 11:19 ` Marcel Holtmann
2018-01-02 11:31 ` Carlo Caione
2018-01-02 11:38 ` Marcel Holtmann
2018-01-02 21:43 ` Martin Blumenstingl
2018-01-02 21:46 ` Martin Blumenstingl
2018-01-02 23:06 ` Carlo Caione
2018-01-03 20:50 ` Martin Blumenstingl
2018-01-04 9:46 ` Carlo Caione
2018-01-05 14:57 ` Marcel Holtmann
2018-01-05 16:15 ` Marcel Holtmann
2018-01-05 20:44 ` Marcel Holtmann
2018-01-07 20:07 ` Martin Blumenstingl
2018-01-09 15:26 ` Marcel Holtmann
2018-01-01 20:42 ` [RFC v2 8/9] Bluetooth: drop HCI_UART_INIT_PENDING support Martin Blumenstingl
2018-01-02 11:04 ` Marcel Holtmann
2018-01-02 21:06 ` Martin Blumenstingl
2018-01-03 17:14 ` Loic Poulain
2018-01-03 20:30 ` Martin Blumenstingl
2018-01-03 18:38 ` Rob Herring
2018-01-03 20:38 ` Martin Blumenstingl
2018-01-01 20:42 ` [RFC v2 9/9] Bluetooth: hci_h5: add support for Realtek UART Bluetooth modules Martin Blumenstingl
2018-01-02 11:11 ` Marcel Holtmann
2018-01-02 21:27 ` Martin Blumenstingl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180101204217.26165-8-martin.blumenstingl@googlemail.com \
--to=martin.blumenstingl@googlemail.com \
--cc=linus-amlogic@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®