mirror of
				https://github.com/libretro/Lakka-LibreELEC.git
				synced 2025-11-04 03:18:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 96d621169790cb45b524aaa8f60dafc2661b3b69 Mon Sep 17 00:00:00 2001
 | 
						|
From: Billy Laws <blaws05@gmail.com>
 | 
						|
Date: Wed, 10 Feb 2021 13:24:58 +0000
 | 
						|
Subject: [PATCH] Bluetooth: hci_bcm: Add mac address reading support
 | 
						|
 | 
						|
---
 | 
						|
 drivers/bluetooth/hci_bcm.c | 45 +++++++++++++++++++++++++++++++++++++
 | 
						|
 1 file changed, 45 insertions(+)
 | 
						|
 | 
						|
diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c
 | 
						|
index 4f1f5144f524..030816fff822 100644
 | 
						|
--- a/drivers/bluetooth/hci_bcm.c
 | 
						|
+++ b/drivers/bluetooth/hci_bcm.c
 | 
						|
@@ -511,12 +511,53 @@ static int bcm_flush(struct hci_uart *hu)
 | 
						|
 	return 0;
 | 
						|
 }
 | 
						|
 
 | 
						|
+// Based off NV cypress source patches
 | 
						|
+static int bcm_get_mac_address_dtb(const char *node_name,
 | 
						|
+					const char *property_name,
 | 
						|
+					bdaddr_t *mac_addr)
 | 
						|
+{
 | 
						|
+	struct device_node *np = of_find_node_by_path(node_name);
 | 
						|
+	const char *mac_str = NULL;
 | 
						|
+	int values[6] = {0};
 | 
						|
+	int i, ret = 0;
 | 
						|
+
 | 
						|
+	if (!np)
 | 
						|
+		return -EADDRNOTAVAIL;
 | 
						|
+
 | 
						|
+	/* If the property is present but contains an invalid value,
 | 
						|
+	 * then something is wrong. Log the error in that case.
 | 
						|
+	 */
 | 
						|
+	if (of_property_read_string(np, property_name, &mac_str)) {
 | 
						|
+		ret = -EADDRNOTAVAIL;
 | 
						|
+		goto err_out;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	/* The DTB property is a string of the form xx:xx:xx:xx:xx:xx
 | 
						|
+	 * Convert to an array of bytes.
 | 
						|
+	 */
 | 
						|
+	if (sscanf(mac_str, "%x:%x:%x:%x:%x:%x",
 | 
						|
+		&values[0], &values[1], &values[2],
 | 
						|
+		&values[3], &values[4], &values[5]) != 6) {
 | 
						|
+		ret = -EINVAL;
 | 
						|
+		goto err_out;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	for (i = 0; i < 6; ++i)
 | 
						|
+		mac_addr->b[5-i] = (unsigned char)values[i]; // Mac is LE here
 | 
						|
+
 | 
						|
+err_out:
 | 
						|
+	of_node_put(np);
 | 
						|
+
 | 
						|
+	return ret;
 | 
						|
+}
 | 
						|
+
 | 
						|
 static int bcm_setup(struct hci_uart *hu)
 | 
						|
 {
 | 
						|
 	struct bcm_data *bcm = hu->priv;
 | 
						|
 	char fw_name[64];
 | 
						|
 	const struct firmware *fw;
 | 
						|
 	unsigned int speed;
 | 
						|
+	bdaddr_t addr;
 | 
						|
 	int err;
 | 
						|
 
 | 
						|
 	bt_dev_dbg(hu->hdev, "hu %p", hu);
 | 
						|
@@ -567,6 +608,10 @@ static int bcm_setup(struct hci_uart *hu)
 | 
						|
 	if (err)
 | 
						|
 		return err;
 | 
						|
 
 | 
						|
+	err = bcm_get_mac_address_dtb("/chosen", "nvidia,bluetooth-mac", &addr);
 | 
						|
+	if (!err)
 | 
						|
+		btbcm_set_bdaddr(hu->hdev, &addr);
 | 
						|
+
 | 
						|
 	if (!bcm_request_irq(bcm))
 | 
						|
 		err = bcm_setup_sleep(hu);
 | 
						|
 
 | 
						|
-- 
 | 
						|
GitLab
 | 
						|
 |