xref: /openbmc/linux/drivers/bluetooth/btrtl.h (revision 3011faa2)
1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2db33c77dSCarlo Caione /*
3db33c77dSCarlo Caione  *  Bluetooth support for Realtek devices
4db33c77dSCarlo Caione  *
5db33c77dSCarlo Caione  *  Copyright (C) 2015 Endless Mobile, Inc.
6db33c77dSCarlo Caione  */
7db33c77dSCarlo Caione 
8db33c77dSCarlo Caione #define RTL_FRAG_LEN 252
9db33c77dSCarlo Caione 
1026503ad2SMartin Blumenstingl #define rtl_dev_err(dev, fmt, ...) bt_dev_err(dev, "RTL: " fmt, ##__VA_ARGS__)
1126503ad2SMartin Blumenstingl #define rtl_dev_warn(dev, fmt, ...) bt_dev_warn(dev, "RTL: " fmt, ##__VA_ARGS__)
1226503ad2SMartin Blumenstingl #define rtl_dev_info(dev, fmt, ...) bt_dev_info(dev, "RTL: " fmt, ##__VA_ARGS__)
1326503ad2SMartin Blumenstingl #define rtl_dev_dbg(dev, fmt, ...) bt_dev_dbg(dev, "RTL: " fmt, ##__VA_ARGS__)
1426503ad2SMartin Blumenstingl 
1526503ad2SMartin Blumenstingl struct btrtl_device_info;
1626503ad2SMartin Blumenstingl 
17db33c77dSCarlo Caione struct rtl_download_cmd {
18db33c77dSCarlo Caione 	__u8 index;
19db33c77dSCarlo Caione 	__u8 data[RTL_FRAG_LEN];
20db33c77dSCarlo Caione } __packed;
21db33c77dSCarlo Caione 
22db33c77dSCarlo Caione struct rtl_download_response {
23db33c77dSCarlo Caione 	__u8 status;
24db33c77dSCarlo Caione 	__u8 index;
25db33c77dSCarlo Caione } __packed;
26db33c77dSCarlo Caione 
27db33c77dSCarlo Caione struct rtl_rom_version_evt {
28db33c77dSCarlo Caione 	__u8 status;
29db33c77dSCarlo Caione 	__u8 version;
30db33c77dSCarlo Caione } __packed;
31db33c77dSCarlo Caione 
32db33c77dSCarlo Caione struct rtl_epatch_header {
33db33c77dSCarlo Caione 	__u8 signature[8];
34db33c77dSCarlo Caione 	__le32 fw_version;
35db33c77dSCarlo Caione 	__le16 num_patches;
36db33c77dSCarlo Caione } __packed;
37db33c77dSCarlo Caione 
38b85b0ee1SMartin Blumenstingl struct rtl_vendor_config_entry {
39b85b0ee1SMartin Blumenstingl 	__le16 offset;
40b85b0ee1SMartin Blumenstingl 	__u8 len;
41a7e45454SGustavo A. R. Silva 	__u8 data[];
42b85b0ee1SMartin Blumenstingl } __packed;
43b85b0ee1SMartin Blumenstingl 
44b85b0ee1SMartin Blumenstingl struct rtl_vendor_config {
45b85b0ee1SMartin Blumenstingl 	__le32 signature;
46b85b0ee1SMartin Blumenstingl 	__le16 total_len;
47a7e45454SGustavo A. R. Silva 	struct rtl_vendor_config_entry entry[];
48b85b0ee1SMartin Blumenstingl } __packed;
49b85b0ee1SMartin Blumenstingl 
50db33c77dSCarlo Caione #if IS_ENABLED(CONFIG_BT_RTL)
51db33c77dSCarlo Caione 
521cc194caSHans de Goede struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
531cc194caSHans de Goede 					   const char *postfix);
5426503ad2SMartin Blumenstingl void btrtl_free(struct btrtl_device_info *btrtl_dev);
5526503ad2SMartin Blumenstingl int btrtl_download_firmware(struct hci_dev *hdev,
5626503ad2SMartin Blumenstingl 			    struct btrtl_device_info *btrtl_dev);
57*3011faa2SArchie Pusaka void btrtl_set_quirks(struct hci_dev *hdev,
58*3011faa2SArchie Pusaka 		      struct btrtl_device_info *btrtl_dev);
59db33c77dSCarlo Caione int btrtl_setup_realtek(struct hci_dev *hdev);
607af3f558SJian-Hong Pan int btrtl_shutdown_realtek(struct hci_dev *hdev);
61b85b0ee1SMartin Blumenstingl int btrtl_get_uart_settings(struct hci_dev *hdev,
62b85b0ee1SMartin Blumenstingl 			    struct btrtl_device_info *btrtl_dev,
63b85b0ee1SMartin Blumenstingl 			    unsigned int *controller_baudrate,
64b85b0ee1SMartin Blumenstingl 			    u32 *device_baudrate, bool *flow_control);
65db33c77dSCarlo Caione 
66db33c77dSCarlo Caione #else
67db33c77dSCarlo Caione 
681cc194caSHans de Goede static inline struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
691cc194caSHans de Goede 							 const char *postfix)
7026503ad2SMartin Blumenstingl {
7126503ad2SMartin Blumenstingl 	return ERR_PTR(-EOPNOTSUPP);
7226503ad2SMartin Blumenstingl }
7326503ad2SMartin Blumenstingl 
7426503ad2SMartin Blumenstingl static inline void btrtl_free(struct btrtl_device_info *btrtl_dev)
7526503ad2SMartin Blumenstingl {
7626503ad2SMartin Blumenstingl }
7726503ad2SMartin Blumenstingl 
7826503ad2SMartin Blumenstingl static inline int btrtl_download_firmware(struct hci_dev *hdev,
7926503ad2SMartin Blumenstingl 					  struct btrtl_device_info *btrtl_dev)
8026503ad2SMartin Blumenstingl {
8126503ad2SMartin Blumenstingl 	return -EOPNOTSUPP;
8226503ad2SMartin Blumenstingl }
8326503ad2SMartin Blumenstingl 
84*3011faa2SArchie Pusaka static inline void btrtl_set_quirks(struct hci_dev *hdev,
85*3011faa2SArchie Pusaka 				    struct btrtl_device_info *btrtl_dev)
86*3011faa2SArchie Pusaka {
87*3011faa2SArchie Pusaka }
88*3011faa2SArchie Pusaka 
89db33c77dSCarlo Caione static inline int btrtl_setup_realtek(struct hci_dev *hdev)
90db33c77dSCarlo Caione {
91db33c77dSCarlo Caione 	return -EOPNOTSUPP;
92db33c77dSCarlo Caione }
93db33c77dSCarlo Caione 
947af3f558SJian-Hong Pan static inline int btrtl_shutdown_realtek(struct hci_dev *hdev)
957af3f558SJian-Hong Pan {
967af3f558SJian-Hong Pan 	return -EOPNOTSUPP;
977af3f558SJian-Hong Pan }
987af3f558SJian-Hong Pan 
99b85b0ee1SMartin Blumenstingl static inline int btrtl_get_uart_settings(struct hci_dev *hdev,
100b85b0ee1SMartin Blumenstingl 					  struct btrtl_device_info *btrtl_dev,
101b85b0ee1SMartin Blumenstingl 					  unsigned int *controller_baudrate,
102b85b0ee1SMartin Blumenstingl 					  u32 *device_baudrate,
103b85b0ee1SMartin Blumenstingl 					  bool *flow_control)
104b85b0ee1SMartin Blumenstingl {
105b85b0ee1SMartin Blumenstingl 	return -ENOENT;
106b85b0ee1SMartin Blumenstingl }
107b85b0ee1SMartin Blumenstingl 
108db33c77dSCarlo Caione #endif
109