linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/2] Add API to retrieve the Bluetooth Device Address (BD_ADDR)
@ 2018-09-25 18:53 Matthias Kaehlcke
  2018-09-25 18:53 ` [PATCH v3 1/2] Compiler Attributes: naked can be shared Matthias Kaehlcke
  2018-09-25 18:53 ` [PATCH v3 2/2] device property: Add device_get_bd_address() and fwnode_get_bd_address() Matthias Kaehlcke
  0 siblings, 2 replies; 4+ messages in thread
From: Matthias Kaehlcke @ 2018-09-25 18:53 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rafael J . Wysocki, Sakari Ailus,
	Marcin Wojtas, Andy Shevchenko, Sinan Kaya, Marcel Holtmann,
	Johan Hedberg, Andrew Morton, Pekka Enberg, Masahiro Yamada,
	Alexey Dobriyan
  Cc: linux-kernel, linux-bluetooth, Balakrishna Godavarthi,
	Loic Poulain, Brian Norris, Matthias Kaehlcke

On some systems the Bluetooth Device Address (BD_ADDR) isn't stored
on the Bluetooth chip itself. One way to configure the BD address is
through the device tree. The btqcomsmd driver is an example, it can
read the BD address from the DT property 'local-bd-address'. It is
also planned to extend the hci_qca driver to support setting the BD
address through the DT.

To avoid redundant open-coded reading of 'local-bd-address' and error
handling this series adds an API to retrieve the BD address of a device
and adapts the btqcomsmd driver to use this API.

Matthias Kaehlcke (1):
  device property: Add device_get_bd_address() and
    fwnode_get_bd_address()

Miguel Ojeda (1):
  Compiler Attributes: naked can be shared

 drivers/base/property.c           | 46 +++++++++++++++++++++++++++++++
 include/linux/compiler-gcc.h      |  8 ------
 include/linux/compiler_types.h    |  8 ++++++
 include/linux/property.h          | 18 ++++++++++++
 include/linux/types.h             |  5 ++++
 include/net/bluetooth/bluetooth.h |  5 ----
 6 files changed, 77 insertions(+), 13 deletions(-)

-- 
2.19.0.605.g01d371f741-goog


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v3 1/2] Compiler Attributes: naked can be shared
  2018-09-25 18:53 [PATCH v3 0/2] Add API to retrieve the Bluetooth Device Address (BD_ADDR) Matthias Kaehlcke
@ 2018-09-25 18:53 ` Matthias Kaehlcke
  2018-09-25 19:03   ` Matthias Kaehlcke
  2018-09-25 18:53 ` [PATCH v3 2/2] device property: Add device_get_bd_address() and fwnode_get_bd_address() Matthias Kaehlcke
  1 sibling, 1 reply; 4+ messages in thread
From: Matthias Kaehlcke @ 2018-09-25 18:53 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rafael J . Wysocki, Sakari Ailus,
	Marcin Wojtas, Andy Shevchenko, Sinan Kaya, Marcel Holtmann,
	Johan Hedberg, Andrew Morton, Pekka Enberg, Masahiro Yamada,
	Alexey Dobriyan
  Cc: linux-kernel, linux-bluetooth, Balakrishna Godavarthi,
	Loic Poulain, Brian Norris, Miguel Ojeda, Rasmus Villemoes,
	Eli Friedman, Christopher Li, Kees Cook, Ingo Molnar,
	Geert Uytterhoeven, Joe Perches, Dominique Martinet,
	Linus Torvalds, linux-sparse

From: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>

The naked attribute is supported by at least gcc >= 4.6 (for ARM,
which is the only current user), gcc >= 8 (for x86), clang >= 3.1
and icc >= 13. See https://godbolt.org/z/350Dyc

Therefore, move it out of compiler-gcc.h so that the definition
is shared by all compilers.

This also fixes Clang support for ARM32 --- 815f0ddb346c
("include/linux/compiler*.h: make compiler-*.h mutually exclusive").

Fixes: 815f0ddb346c ("include/linux/compiler*.h: make compiler-*.h mutually exclusive")
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Eli Friedman <efriedma@codeaurora.org>
Cc: Christopher Li <sparse@chrisli.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Joe Perches <joe@perches.com>
Cc: Dominique Martinet <asmadeus@codewreck.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-sparse@vger.kernel.org
Suggested-by: Arnd Bergmann <arnd@arndb.de>
Tested-by: Stefan Agner <stefan@agner.ch>
Reviewed-by: Stefan Agner <stefan@agner.ch>
Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 include/linux/compiler-gcc.h   | 8 --------
 include/linux/compiler_types.h | 8 ++++++++
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 25d3dd6b2702..4d36b27214fd 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -79,14 +79,6 @@
 #define __noretpoline __attribute__((indirect_branch("keep")))
 #endif
 
-/*
- * it doesn't make sense on ARM (currently the only user of __naked)
- * to trace naked functions because then mcount is called without
- * stack and frame pointer being set up and there is no chance to
- * restore the lr register to the value before mcount was called.
- */
-#define __naked		__attribute__((naked)) notrace
-
 #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
 
 #define __optimize(level)	__attribute__((__optimize__(level)))
diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
index 3525c179698c..db192becfec4 100644
--- a/include/linux/compiler_types.h
+++ b/include/linux/compiler_types.h
@@ -226,6 +226,14 @@ struct ftrace_likely_data {
 #define notrace			__attribute__((no_instrument_function))
 #endif
 
+/*
+ * it doesn't make sense on ARM (currently the only user of __naked)
+ * to trace naked functions because then mcount is called without
+ * stack and frame pointer being set up and there is no chance to
+ * restore the lr register to the value before mcount was called.
+ */
+#define __naked			__attribute__((naked)) notrace
+
 #define __compiler_offsetof(a, b)	__builtin_offsetof(a, b)
 
 /*
-- 
2.19.0.605.g01d371f741-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 2/2] device property: Add device_get_bd_address() and fwnode_get_bd_address()
  2018-09-25 18:53 [PATCH v3 0/2] Add API to retrieve the Bluetooth Device Address (BD_ADDR) Matthias Kaehlcke
  2018-09-25 18:53 ` [PATCH v3 1/2] Compiler Attributes: naked can be shared Matthias Kaehlcke
@ 2018-09-25 18:53 ` Matthias Kaehlcke
  1 sibling, 0 replies; 4+ messages in thread
From: Matthias Kaehlcke @ 2018-09-25 18:53 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rafael J . Wysocki, Sakari Ailus,
	Marcin Wojtas, Andy Shevchenko, Sinan Kaya, Marcel Holtmann,
	Johan Hedberg, Andrew Morton, Pekka Enberg, Masahiro Yamada,
	Alexey Dobriyan
  Cc: linux-kernel, linux-bluetooth, Balakrishna Godavarthi,
	Loic Poulain, Brian Norris, Matthias Kaehlcke

Provide an API for Bluetooth drivers to retrieve the Bluetooth Device
address (BD_ADDR) for a device. If the device node has a property
'local-bd-address' the BD address is read from this property.

The definition of bdaddr_t is moved to types.h to make it visible in
property.h without having to include (the mostly unrelated) bluetooth.h

Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---
Changes in v3:
- move definition of bdaddr_t to types.h to avoid include of
  bluetooth.h from property.h
- add stubs for the new functions

Changes in v2:
- use bdaddr_t instead of byte pointer + len
- use EXPORT_SYMBOL_GPL for the new functions instead of EXPORT_SYMBOL
- put new functions inside #if IS_ENABLED(CONFIG_BT)
- some new line juggling in property.h
- added 'Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>' tag
---
 drivers/base/property.c           | 46 +++++++++++++++++++++++++++++++
 include/linux/property.h          | 18 ++++++++++++
 include/linux/types.h             |  5 ++++
 include/net/bluetooth/bluetooth.h |  5 ----
 4 files changed, 69 insertions(+), 5 deletions(-)

diff --git a/drivers/base/property.c b/drivers/base/property.c
index 240ab5230ff6..afe412133188 100644
--- a/drivers/base/property.c
+++ b/drivers/base/property.c
@@ -1315,6 +1315,52 @@ void *device_get_mac_address(struct device *dev, char *addr, int alen)
 }
 EXPORT_SYMBOL(device_get_mac_address);
 
+#if IS_ENABLED(CONFIG_BT)
+
+/**
+ * fwnode_get_bd_address - Get the Bluetooth Device Address (BD_ADDR) from the
+ *                         firmware node
+ * @fwnode:	Pointer to the firmware node
+ * @bd_addr:	Pointer to struct to store the BD address in
+ *
+ * Search the firmware node for 'local-bd-address'.
+ *
+ * All-zero BD addresses are rejected, because those could be properties
+ * that exist in the firmware tables, but were not updated by the firmware. For
+ * example, the DTS could define 'local-bd-address', with zero BD addresses.
+ */
+int fwnode_get_bd_address(struct fwnode_handle *fwnode, bdaddr_t *bd_addr)
+{
+	bdaddr_t ba;
+	int ret;
+
+	ret = fwnode_property_read_u8_array(fwnode, "local-bd-address",
+					    (u8 *)&ba, sizeof(bdaddr_t));
+	if (ret < 0)
+		return ret;
+	if (is_zero_ether_addr((u8 *)&ba))
+		return -ENODATA;
+
+	memcpy(bd_addr, &ba, sizeof(bdaddr_t));
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(fwnode_get_bd_address);
+
+/**
+ * device_get_bd_address - Get the Bluetooth Device Address (BD_ADDR) for a
+ *                         given device
+ * @dev:	Pointer to the device
+ * @bd_addr:	Pointer to struct to store the BD address in
+ */
+int device_get_bd_address(struct device *dev, bdaddr_t *bd_addr)
+{
+	return fwnode_get_bd_address(dev_fwnode(dev), bd_addr);
+}
+EXPORT_SYMBOL_GPL(device_get_bd_address);
+
+#endif
+
 /**
  * fwnode_irq_get - Get IRQ directly from a fwnode
  * @fwnode:	Pointer to the firmware node
diff --git a/include/linux/property.h b/include/linux/property.h
index ac8a1ebc4c1b..5df4e0bd8c83 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -286,10 +286,28 @@ const void *device_get_match_data(struct device *dev);
 int device_get_phy_mode(struct device *dev);
 
 void *device_get_mac_address(struct device *dev, char *addr, int alen);
+#if IS_ENABLED(CONFIG_BT)
+int device_get_bd_address(struct device *dev, bdaddr_t *bd_addr);
+#else
+static inline int device_get_bd_address(struct device *dev,
+					bdaddr_t *bd_addr)
+{
+	return -ENOTSUPP;
+}
+#endif
 
 int fwnode_get_phy_mode(struct fwnode_handle *fwnode);
 void *fwnode_get_mac_address(struct fwnode_handle *fwnode,
 			     char *addr, int alen);
+#if IS_ENABLED(CONFIG_BT)
+int fwnode_get_bd_address(struct fwnode_handle *fwnode, bdaddr_t *bd_addr);
+#else
+static inline int fwnode_get_bd_address(struct fwnode_handle *fwnode,
+					bdaddr_t *bd_addr)
+{
+	return -ENOTSUPP;
+}
+#endif
 struct fwnode_handle *fwnode_graph_get_next_endpoint(
 	const struct fwnode_handle *fwnode, struct fwnode_handle *prev);
 struct fwnode_handle *
diff --git a/include/linux/types.h b/include/linux/types.h
index 9834e90aa010..ff6984a00a3b 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -230,5 +230,10 @@ struct callback_head {
 typedef void (*rcu_callback_t)(struct rcu_head *head);
 typedef void (*call_rcu_func_t)(struct rcu_head *head, rcu_callback_t func);
 
+/* Bluetooth Device Address (BD_ADDR) */
+typedef struct {
+	__u8 b[6];
+} __packed bdaddr_t;
+
 #endif /*  __ASSEMBLY__ */
 #endif /* _LINUX_TYPES_H */
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
index ec9d6bc65855..9401c7431a8f 100644
--- a/include/net/bluetooth/bluetooth.h
+++ b/include/net/bluetooth/bluetooth.h
@@ -190,11 +190,6 @@ static inline const char *state_to_string(int state)
 	return "invalid state";
 }
 
-/* BD Address */
-typedef struct {
-	__u8 b[6];
-} __packed bdaddr_t;
-
 /* BD Address type */
 #define BDADDR_BREDR		0x00
 #define BDADDR_LE_PUBLIC	0x01
-- 
2.19.0.605.g01d371f741-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 1/2] Compiler Attributes: naked can be shared
  2018-09-25 18:53 ` [PATCH v3 1/2] Compiler Attributes: naked can be shared Matthias Kaehlcke
@ 2018-09-25 19:03   ` Matthias Kaehlcke
  0 siblings, 0 replies; 4+ messages in thread
From: Matthias Kaehlcke @ 2018-09-25 19:03 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rafael J . Wysocki, Sakari Ailus,
	Marcin Wojtas, Andy Shevchenko, Sinan Kaya, Marcel Holtmann,
	Johan Hedberg, Andrew Morton, Pekka Enberg, Masahiro Yamada,
	Alexey Dobriyan
  Cc: linux-kernel, linux-bluetooth, Balakrishna Godavarthi,
	Loic Poulain, Brian Norris, Miguel Ojeda, Rasmus Villemoes,
	Eli Friedman, Christopher Li, Kees Cook, Ingo Molnar,
	Geert Uytterhoeven, Joe Perches, Dominique Martinet,
	Linus Torvalds, linux-sparse

Sorry, this series got messed up. Apparently the branch was still
rebasing when I ran 'git send-email' :/

On Tue, Sep 25, 2018 at 11:53:38AM -0700, Matthias Kaehlcke wrote:
> From: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
> 
> The naked attribute is supported by at least gcc >= 4.6 (for ARM,
> which is the only current user), gcc >= 8 (for x86), clang >= 3.1
> and icc >= 13. See https://godbolt.org/z/350Dyc
> 
> Therefore, move it out of compiler-gcc.h so that the definition
> is shared by all compilers.
> 
> This also fixes Clang support for ARM32 --- 815f0ddb346c
> ("include/linux/compiler*.h: make compiler-*.h mutually exclusive").
> 
> Fixes: 815f0ddb346c ("include/linux/compiler*.h: make compiler-*.h mutually exclusive")
> Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
> Cc: Eli Friedman <efriedma@codeaurora.org>
> Cc: Christopher Li <sparse@chrisli.org>
> Cc: Kees Cook <keescook@chromium.org>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: Geert Uytterhoeven <geert@linux-m68k.org>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
> Cc: Joe Perches <joe@perches.com>
> Cc: Dominique Martinet <asmadeus@codewreck.org>
> Cc: Linus Torvalds <torvalds@linux-foundation.org>
> Cc: linux-sparse@vger.kernel.org
> Suggested-by: Arnd Bergmann <arnd@arndb.de>
> Tested-by: Stefan Agner <stefan@agner.ch>
> Reviewed-by: Stefan Agner <stefan@agner.ch>
> Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
> Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> ---
>  include/linux/compiler-gcc.h   | 8 --------
>  include/linux/compiler_types.h | 8 ++++++++
>  2 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
> index 25d3dd6b2702..4d36b27214fd 100644
> --- a/include/linux/compiler-gcc.h
> +++ b/include/linux/compiler-gcc.h
> @@ -79,14 +79,6 @@
>  #define __noretpoline __attribute__((indirect_branch("keep")))
>  #endif
>  
> -/*
> - * it doesn't make sense on ARM (currently the only user of __naked)
> - * to trace naked functions because then mcount is called without
> - * stack and frame pointer being set up and there is no chance to
> - * restore the lr register to the value before mcount was called.
> - */
> -#define __naked		__attribute__((naked)) notrace
> -
>  #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
>  
>  #define __optimize(level)	__attribute__((__optimize__(level)))
> diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
> index 3525c179698c..db192becfec4 100644
> --- a/include/linux/compiler_types.h
> +++ b/include/linux/compiler_types.h
> @@ -226,6 +226,14 @@ struct ftrace_likely_data {
>  #define notrace			__attribute__((no_instrument_function))
>  #endif
>  
> +/*
> + * it doesn't make sense on ARM (currently the only user of __naked)
> + * to trace naked functions because then mcount is called without
> + * stack and frame pointer being set up and there is no chance to
> + * restore the lr register to the value before mcount was called.
> + */
> +#define __naked			__attribute__((naked)) notrace
> +
>  #define __compiler_offsetof(a, b)	__builtin_offsetof(a, b)
>  
>  /*

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-09-25 19:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-25 18:53 [PATCH v3 0/2] Add API to retrieve the Bluetooth Device Address (BD_ADDR) Matthias Kaehlcke
2018-09-25 18:53 ` [PATCH v3 1/2] Compiler Attributes: naked can be shared Matthias Kaehlcke
2018-09-25 19:03   ` Matthias Kaehlcke
2018-09-25 18:53 ` [PATCH v3 2/2] device property: Add device_get_bd_address() and fwnode_get_bd_address() Matthias Kaehlcke

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).