hci_aml.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  1. // SPDX-License-Identifier: (GPL-2.0-only OR MIT)
  2. /*
  3. * Copyright (C) 2024 Amlogic, Inc. All rights reserved
  4. */
  5. #include <linux/kernel.h>
  6. #include <linux/delay.h>
  7. #include <linux/device.h>
  8. #include <linux/property.h>
  9. #include <linux/of.h>
  10. #include <linux/serdev.h>
  11. #include <linux/clk.h>
  12. #include <linux/firmware.h>
  13. #include <linux/gpio/consumer.h>
  14. #include <linux/regulator/consumer.h>
  15. #include <net/bluetooth/bluetooth.h>
  16. #include <net/bluetooth/hci_core.h>
  17. #include <net/bluetooth/hci.h>
  18. #include "hci_uart.h"
  19. #define AML_EVT_HEAD_SIZE 4
  20. #define AML_BDADDR_DEFAULT (&(bdaddr_t) {{ 0x00, 0xff, 0x00, 0x22, 0x2d, 0xae }})
  21. #define AML_FIRMWARE_OPERATION_SIZE (248)
  22. #define AML_FIRMWARE_MAX_SIZE (512 * 1024)
  23. /* TCI command */
  24. #define AML_TCI_CMD_READ 0xFEF0
  25. #define AML_TCI_CMD_WRITE 0xFEF1
  26. #define AML_TCI_CMD_UPDATE_BAUDRATE 0xFEF2
  27. #define AML_TCI_CMD_HARDWARE_RESET 0xFEF2
  28. #define AML_TCI_CMD_DOWNLOAD_BT_FW 0xFEF3
  29. /* Vendor command */
  30. #define AML_BT_HCI_VENDOR_CMD 0xFC1A
  31. /* TCI operation parameter in controller chip */
  32. #define AML_OP_UART_MODE 0x00A30128
  33. #define AML_OP_EVT_ENABLE 0x00A70014
  34. #define AML_OP_MEM_HARD_TRANS_EN 0x00A7000C
  35. #define AML_OP_RF_CFG 0x00F03040
  36. #define AML_OP_RAM_POWER_CTR 0x00F03050
  37. #define AML_OP_HARDWARE_RST 0x00F03058
  38. #define AML_OP_ICCM_RAM_BASE 0x00000000
  39. #define AML_OP_DCCM_RAM_BASE 0x00D00000
  40. /* UART configuration */
  41. #define AML_UART_XMIT_EN BIT(12)
  42. #define AML_UART_RECV_EN BIT(13)
  43. #define AML_UART_TIMEOUT_INT_EN BIT(14)
  44. #define AML_UART_CLK_SOURCE 40000000
  45. /* Controller event */
  46. #define AML_EVT_EN BIT(24)
  47. /* RAM power control */
  48. #define AML_RAM_POWER_ON (0)
  49. #define AML_RAM_POWER_OFF (1)
  50. /* RF configuration */
  51. #define AML_RF_ANT_SINGLE BIT(28)
  52. #define AML_RF_ANT_DOUBLE BIT(29)
  53. /* Memory transaction */
  54. #define AML_MM_CTR_HARD_TRAS_EN BIT(27)
  55. /* Controller reset */
  56. #define AML_CTR_CPU_RESET BIT(8)
  57. #define AML_CTR_MAC_RESET BIT(9)
  58. #define AML_CTR_PHY_RESET BIT(10)
  59. enum {
  60. FW_ICCM,
  61. FW_DCCM
  62. };
  63. struct aml_fw_len {
  64. u32 iccm_len;
  65. u32 dccm_len;
  66. };
  67. struct aml_tci_rsp {
  68. u8 num_cmd_packet;
  69. u16 opcode;
  70. u8 status;
  71. } __packed;
  72. struct aml_device_data {
  73. int iccm_offset;
  74. int dccm_offset;
  75. bool is_coex;
  76. };
  77. struct aml_serdev {
  78. struct hci_uart serdev_hu;
  79. struct device *dev;
  80. struct gpio_desc *bt_en_gpio;
  81. struct regulator *bt_supply;
  82. struct clk *lpo_clk;
  83. const struct aml_device_data *aml_dev_data;
  84. const char *firmware_name;
  85. };
  86. struct aml_data {
  87. struct sk_buff *rx_skb;
  88. struct sk_buff_head txq;
  89. };
  90. static const struct h4_recv_pkt aml_recv_pkts[] = {
  91. { H4_RECV_ACL, .recv = hci_recv_frame },
  92. { H4_RECV_SCO, .recv = hci_recv_frame },
  93. { H4_RECV_EVENT, .recv = hci_recv_frame },
  94. { H4_RECV_ISO, .recv = hci_recv_frame },
  95. };
  96. /* The TCI command is a private command, which is for setting baud rate,
  97. * downloading firmware, initiating RAM.
  98. *
  99. * op_code | op_len | op_addr | parameter |
  100. * --------|-----------------------|---------|-------------|
  101. * 2B | 1B len(addr+param) | 4B | len(param) |
  102. */
  103. static int aml_send_tci_cmd(struct hci_dev *hdev, u16 op_code, u32 op_addr,
  104. u32 *param, u32 param_len)
  105. {
  106. struct aml_tci_rsp *rsp = NULL;
  107. struct sk_buff *skb = NULL;
  108. size_t buf_len = 0;
  109. u8 *buf = NULL;
  110. int err = 0;
  111. buf_len = sizeof(op_addr) + param_len;
  112. buf = kmalloc(buf_len, GFP_KERNEL);
  113. if (!buf)
  114. return -ENOMEM;
  115. memcpy(buf, &op_addr, sizeof(op_addr));
  116. if (param && param_len > 0)
  117. memcpy(buf + sizeof(op_addr), param, param_len);
  118. skb = __hci_cmd_sync_ev(hdev, op_code, buf_len, buf,
  119. HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
  120. if (IS_ERR(skb)) {
  121. err = PTR_ERR(skb);
  122. bt_dev_err(hdev, "Failed to send TCI cmd (error: %d)", err);
  123. goto exit;
  124. }
  125. rsp = skb_pull_data(skb, sizeof(struct aml_tci_rsp));
  126. if (!rsp)
  127. goto skb_free;
  128. if (rsp->opcode != op_code || rsp->status != 0x00) {
  129. bt_dev_err(hdev, "send TCI cmd (0x%04X), response (0x%04X):(%d)",
  130. op_code, rsp->opcode, rsp->status);
  131. err = -EINVAL;
  132. goto skb_free;
  133. }
  134. skb_free:
  135. kfree_skb(skb);
  136. exit:
  137. kfree(buf);
  138. return err;
  139. }
  140. static int aml_update_chip_baudrate(struct hci_dev *hdev, u32 baud)
  141. {
  142. u32 value;
  143. value = ((AML_UART_CLK_SOURCE / baud) - 1) & 0x0FFF;
  144. value |= AML_UART_XMIT_EN | AML_UART_RECV_EN | AML_UART_TIMEOUT_INT_EN;
  145. return aml_send_tci_cmd(hdev, AML_TCI_CMD_UPDATE_BAUDRATE,
  146. AML_OP_UART_MODE, &value, sizeof(value));
  147. }
  148. static int aml_start_chip(struct hci_dev *hdev)
  149. {
  150. u32 value = 0;
  151. int ret;
  152. value = AML_MM_CTR_HARD_TRAS_EN;
  153. ret = aml_send_tci_cmd(hdev, AML_TCI_CMD_WRITE,
  154. AML_OP_MEM_HARD_TRANS_EN,
  155. &value, sizeof(value));
  156. if (ret)
  157. return ret;
  158. /* controller hardware reset */
  159. value = AML_CTR_CPU_RESET | AML_CTR_MAC_RESET | AML_CTR_PHY_RESET;
  160. ret = aml_send_tci_cmd(hdev, AML_TCI_CMD_HARDWARE_RESET,
  161. AML_OP_HARDWARE_RST,
  162. &value, sizeof(value));
  163. return ret;
  164. }
  165. static int aml_send_firmware_segment(struct hci_dev *hdev,
  166. u8 fw_type,
  167. u8 *seg,
  168. u32 seg_size,
  169. u32 offset)
  170. {
  171. u32 op_addr = 0;
  172. if (fw_type == FW_ICCM)
  173. op_addr = AML_OP_ICCM_RAM_BASE + offset;
  174. else if (fw_type == FW_DCCM)
  175. op_addr = AML_OP_DCCM_RAM_BASE + offset;
  176. return aml_send_tci_cmd(hdev, AML_TCI_CMD_DOWNLOAD_BT_FW,
  177. op_addr, (u32 *)seg, seg_size);
  178. }
  179. static int aml_send_firmware(struct hci_dev *hdev, u8 fw_type,
  180. u8 *fw, u32 fw_size, u32 offset)
  181. {
  182. u32 seg_size = 0;
  183. u32 seg_off = 0;
  184. if (fw_size > AML_FIRMWARE_MAX_SIZE) {
  185. bt_dev_err(hdev,
  186. "Firmware size %d kB is larger than the maximum of 512 kB. Aborting.",
  187. fw_size);
  188. return -EINVAL;
  189. }
  190. while (fw_size > 0) {
  191. seg_size = (fw_size > AML_FIRMWARE_OPERATION_SIZE) ?
  192. AML_FIRMWARE_OPERATION_SIZE : fw_size;
  193. if (aml_send_firmware_segment(hdev, fw_type, (fw + seg_off),
  194. seg_size, offset)) {
  195. bt_dev_err(hdev, "Failed send firmware, type: %d, offset: 0x%x",
  196. fw_type, offset);
  197. return -EINVAL;
  198. }
  199. seg_off += seg_size;
  200. fw_size -= seg_size;
  201. offset += seg_size;
  202. }
  203. return 0;
  204. }
  205. static int aml_download_firmware(struct hci_dev *hdev, const char *fw_name)
  206. {
  207. struct hci_uart *hu = hci_get_drvdata(hdev);
  208. struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev);
  209. const struct firmware *firmware = NULL;
  210. struct aml_fw_len *fw_len = NULL;
  211. u8 *iccm_start = NULL, *dccm_start = NULL;
  212. u32 iccm_len, dccm_len;
  213. u32 value = 0;
  214. int ret = 0;
  215. /* Enable firmware download event */
  216. value = AML_EVT_EN;
  217. ret = aml_send_tci_cmd(hdev, AML_TCI_CMD_WRITE,
  218. AML_OP_EVT_ENABLE,
  219. &value, sizeof(value));
  220. if (ret)
  221. goto exit;
  222. /* RAM power on */
  223. value = AML_RAM_POWER_ON;
  224. ret = aml_send_tci_cmd(hdev, AML_TCI_CMD_WRITE,
  225. AML_OP_RAM_POWER_CTR,
  226. &value, sizeof(value));
  227. if (ret)
  228. goto exit;
  229. /* Check RAM power status */
  230. ret = aml_send_tci_cmd(hdev, AML_TCI_CMD_READ,
  231. AML_OP_RAM_POWER_CTR, NULL, 0);
  232. if (ret)
  233. goto exit;
  234. ret = request_firmware(&firmware, fw_name, &hdev->dev);
  235. if (ret < 0) {
  236. bt_dev_err(hdev, "Failed to load <%s>:(%d)", fw_name, ret);
  237. goto exit;
  238. }
  239. fw_len = (struct aml_fw_len *)firmware->data;
  240. /* Download ICCM */
  241. iccm_start = (u8 *)(firmware->data) + sizeof(struct aml_fw_len)
  242. + amldev->aml_dev_data->iccm_offset;
  243. iccm_len = fw_len->iccm_len - amldev->aml_dev_data->iccm_offset;
  244. ret = aml_send_firmware(hdev, FW_ICCM, iccm_start, iccm_len,
  245. amldev->aml_dev_data->iccm_offset);
  246. if (ret) {
  247. bt_dev_err(hdev, "Failed to send FW_ICCM (%d)", ret);
  248. goto exit;
  249. }
  250. /* Download DCCM */
  251. dccm_start = (u8 *)(firmware->data) + sizeof(struct aml_fw_len) + fw_len->iccm_len;
  252. dccm_len = fw_len->dccm_len;
  253. ret = aml_send_firmware(hdev, FW_DCCM, dccm_start, dccm_len,
  254. amldev->aml_dev_data->dccm_offset);
  255. if (ret) {
  256. bt_dev_err(hdev, "Failed to send FW_DCCM (%d)", ret);
  257. goto exit;
  258. }
  259. /* Disable firmware download event */
  260. value = 0;
  261. ret = aml_send_tci_cmd(hdev, AML_TCI_CMD_WRITE,
  262. AML_OP_EVT_ENABLE,
  263. &value, sizeof(value));
  264. if (ret)
  265. goto exit;
  266. exit:
  267. release_firmware(firmware);
  268. return ret;
  269. }
  270. static int aml_send_reset(struct hci_dev *hdev)
  271. {
  272. struct sk_buff *skb;
  273. int err;
  274. skb = __hci_cmd_sync_ev(hdev, HCI_OP_RESET, 0, NULL,
  275. HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
  276. if (IS_ERR(skb)) {
  277. err = PTR_ERR(skb);
  278. bt_dev_err(hdev, "Failed to send hci reset cmd (%d)", err);
  279. return err;
  280. }
  281. kfree_skb(skb);
  282. return 0;
  283. }
  284. static int aml_dump_fw_version(struct hci_dev *hdev)
  285. {
  286. struct aml_tci_rsp *rsp = NULL;
  287. struct sk_buff *skb;
  288. u8 value[6] = {0};
  289. u8 *fw_ver = NULL;
  290. int err = 0;
  291. skb = __hci_cmd_sync_ev(hdev, AML_BT_HCI_VENDOR_CMD, sizeof(value), value,
  292. HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
  293. if (IS_ERR(skb)) {
  294. err = PTR_ERR(skb);
  295. bt_dev_err(hdev, "Failed to get fw version (error: %d)", err);
  296. return err;
  297. }
  298. rsp = skb_pull_data(skb, sizeof(struct aml_tci_rsp));
  299. if (!rsp)
  300. goto exit;
  301. if (rsp->opcode != AML_BT_HCI_VENDOR_CMD || rsp->status != 0x00) {
  302. bt_dev_err(hdev, "dump version, error response (0x%04X):(%d)",
  303. rsp->opcode, rsp->status);
  304. err = -EINVAL;
  305. goto exit;
  306. }
  307. fw_ver = (u8 *)rsp + AML_EVT_HEAD_SIZE;
  308. bt_dev_info(hdev, "fw_version: date = %02x.%02x, number = 0x%02x%02x",
  309. *(fw_ver + 1), *fw_ver, *(fw_ver + 3), *(fw_ver + 2));
  310. exit:
  311. kfree_skb(skb);
  312. return err;
  313. }
  314. static int aml_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
  315. {
  316. struct aml_tci_rsp *rsp = NULL;
  317. struct sk_buff *skb;
  318. int err = 0;
  319. bt_dev_info(hdev, "set bdaddr (%pM)", bdaddr);
  320. skb = __hci_cmd_sync_ev(hdev, AML_BT_HCI_VENDOR_CMD,
  321. sizeof(bdaddr_t), bdaddr,
  322. HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
  323. if (IS_ERR(skb)) {
  324. err = PTR_ERR(skb);
  325. bt_dev_err(hdev, "Failed to set bdaddr (error: %d)", err);
  326. return err;
  327. }
  328. rsp = skb_pull_data(skb, sizeof(struct aml_tci_rsp));
  329. if (!rsp)
  330. goto exit;
  331. if (rsp->opcode != AML_BT_HCI_VENDOR_CMD || rsp->status != 0x00) {
  332. bt_dev_err(hdev, "error response (0x%x):(%d)", rsp->opcode, rsp->status);
  333. err = -EINVAL;
  334. goto exit;
  335. }
  336. exit:
  337. kfree_skb(skb);
  338. return err;
  339. }
  340. static int aml_check_bdaddr(struct hci_dev *hdev)
  341. {
  342. struct hci_rp_read_bd_addr *paddr;
  343. struct sk_buff *skb;
  344. int err;
  345. if (bacmp(&hdev->public_addr, BDADDR_ANY))
  346. return 0;
  347. skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
  348. HCI_INIT_TIMEOUT);
  349. if (IS_ERR(skb)) {
  350. err = PTR_ERR(skb);
  351. bt_dev_err(hdev, "Failed to read bdaddr (error: %d)", err);
  352. return err;
  353. }
  354. paddr = skb_pull_data(skb, sizeof(struct hci_rp_read_bd_addr));
  355. if (!paddr)
  356. goto exit;
  357. if (!bacmp(&paddr->bdaddr, AML_BDADDR_DEFAULT)) {
  358. bt_dev_info(hdev, "amlbt using default bdaddr (%pM)", &paddr->bdaddr);
  359. hci_set_quirk(hdev, HCI_QUIRK_INVALID_BDADDR);
  360. }
  361. exit:
  362. kfree_skb(skb);
  363. return 0;
  364. }
  365. static int aml_config_rf(struct hci_dev *hdev, bool is_coex)
  366. {
  367. u32 value = AML_RF_ANT_DOUBLE;
  368. /* Use a single antenna when co-existing with wifi */
  369. if (is_coex)
  370. value = AML_RF_ANT_SINGLE;
  371. return aml_send_tci_cmd(hdev, AML_TCI_CMD_WRITE,
  372. AML_OP_RF_CFG,
  373. &value, sizeof(value));
  374. }
  375. static int aml_parse_dt(struct aml_serdev *amldev)
  376. {
  377. struct device *pdev = amldev->dev;
  378. amldev->bt_en_gpio = devm_gpiod_get(pdev, "enable",
  379. GPIOD_OUT_LOW);
  380. if (IS_ERR(amldev->bt_en_gpio)) {
  381. dev_err(pdev, "Failed to acquire enable gpios");
  382. return PTR_ERR(amldev->bt_en_gpio);
  383. }
  384. if (device_property_read_string(pdev, "firmware-name",
  385. &amldev->firmware_name)) {
  386. dev_err(pdev, "Failed to acquire firmware path");
  387. return -ENODEV;
  388. }
  389. amldev->bt_supply = devm_regulator_get(pdev, "vddio");
  390. if (IS_ERR(amldev->bt_supply)) {
  391. dev_err(pdev, "Failed to acquire regulator");
  392. return PTR_ERR(amldev->bt_supply);
  393. }
  394. amldev->lpo_clk = devm_clk_get(pdev, NULL);
  395. if (IS_ERR(amldev->lpo_clk)) {
  396. dev_err(pdev, "Failed to acquire clock source");
  397. return PTR_ERR(amldev->lpo_clk);
  398. }
  399. return 0;
  400. }
  401. static int aml_power_on(struct aml_serdev *amldev)
  402. {
  403. int err;
  404. err = regulator_enable(amldev->bt_supply);
  405. if (err) {
  406. dev_err(amldev->dev, "Failed to enable regulator: (%d)", err);
  407. return err;
  408. }
  409. err = clk_prepare_enable(amldev->lpo_clk);
  410. if (err) {
  411. dev_err(amldev->dev, "Failed to enable lpo clock: (%d)", err);
  412. return err;
  413. }
  414. gpiod_set_value_cansleep(amldev->bt_en_gpio, 1);
  415. /* Wait 20ms for bluetooth controller power on */
  416. msleep(20);
  417. return 0;
  418. }
  419. static int aml_power_off(struct aml_serdev *amldev)
  420. {
  421. gpiod_set_value_cansleep(amldev->bt_en_gpio, 0);
  422. clk_disable_unprepare(amldev->lpo_clk);
  423. regulator_disable(amldev->bt_supply);
  424. return 0;
  425. }
  426. static int aml_set_baudrate(struct hci_uart *hu, unsigned int speed)
  427. {
  428. /* update controller baudrate */
  429. if (aml_update_chip_baudrate(hu->hdev, speed) != 0) {
  430. bt_dev_err(hu->hdev, "Failed to update baud rate");
  431. return -EINVAL;
  432. }
  433. /* update local baudrate */
  434. serdev_device_set_baudrate(hu->serdev, speed);
  435. return 0;
  436. }
  437. /* Initialize protocol */
  438. static int aml_open(struct hci_uart *hu)
  439. {
  440. struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev);
  441. struct aml_data *aml_data;
  442. int err;
  443. err = aml_parse_dt(amldev);
  444. if (err)
  445. return err;
  446. if (!hci_uart_has_flow_control(hu)) {
  447. bt_dev_err(hu->hdev, "no flow control");
  448. return -EOPNOTSUPP;
  449. }
  450. aml_data = kzalloc_obj(*aml_data);
  451. if (!aml_data)
  452. return -ENOMEM;
  453. skb_queue_head_init(&aml_data->txq);
  454. hu->priv = aml_data;
  455. return 0;
  456. }
  457. static int aml_close(struct hci_uart *hu)
  458. {
  459. struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev);
  460. struct aml_data *aml_data = hu->priv;
  461. skb_queue_purge(&aml_data->txq);
  462. kfree_skb(aml_data->rx_skb);
  463. kfree(aml_data);
  464. hu->priv = NULL;
  465. return aml_power_off(amldev);
  466. }
  467. static int aml_flush(struct hci_uart *hu)
  468. {
  469. struct aml_data *aml_data = hu->priv;
  470. skb_queue_purge(&aml_data->txq);
  471. return 0;
  472. }
  473. static int aml_setup(struct hci_uart *hu)
  474. {
  475. struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev);
  476. struct hci_dev *hdev = amldev->serdev_hu.hdev;
  477. int err;
  478. /* Setup bdaddr */
  479. hdev->set_bdaddr = aml_set_bdaddr;
  480. err = aml_power_on(amldev);
  481. if (err)
  482. return err;
  483. err = aml_set_baudrate(hu, amldev->serdev_hu.proto->oper_speed);
  484. if (err)
  485. return err;
  486. err = aml_download_firmware(hdev, amldev->firmware_name);
  487. if (err)
  488. return err;
  489. err = aml_config_rf(hdev, amldev->aml_dev_data->is_coex);
  490. if (err)
  491. return err;
  492. err = aml_start_chip(hdev);
  493. if (err)
  494. return err;
  495. /* Wait 60ms for controller startup */
  496. msleep(60);
  497. err = aml_dump_fw_version(hdev);
  498. if (err)
  499. return err;
  500. err = aml_send_reset(hdev);
  501. if (err)
  502. return err;
  503. err = aml_check_bdaddr(hdev);
  504. if (err)
  505. return err;
  506. return 0;
  507. }
  508. static int aml_enqueue(struct hci_uart *hu, struct sk_buff *skb)
  509. {
  510. struct aml_data *aml_data = hu->priv;
  511. skb_queue_tail(&aml_data->txq, skb);
  512. return 0;
  513. }
  514. static struct sk_buff *aml_dequeue(struct hci_uart *hu)
  515. {
  516. struct aml_data *aml_data = hu->priv;
  517. struct sk_buff *skb;
  518. skb = skb_dequeue(&aml_data->txq);
  519. /* Prepend skb with frame type */
  520. if (skb)
  521. memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
  522. return skb;
  523. }
  524. static int aml_recv(struct hci_uart *hu, const void *data, int count)
  525. {
  526. struct aml_data *aml_data = hu->priv;
  527. int err;
  528. aml_data->rx_skb = h4_recv_buf(hu, aml_data->rx_skb, data, count,
  529. aml_recv_pkts,
  530. ARRAY_SIZE(aml_recv_pkts));
  531. if (IS_ERR(aml_data->rx_skb)) {
  532. err = PTR_ERR(aml_data->rx_skb);
  533. bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err);
  534. aml_data->rx_skb = NULL;
  535. return err;
  536. }
  537. return count;
  538. }
  539. static const struct hci_uart_proto aml_hci_proto = {
  540. .id = HCI_UART_AML,
  541. .name = "AML",
  542. .init_speed = 115200,
  543. .oper_speed = 4000000,
  544. .open = aml_open,
  545. .close = aml_close,
  546. .setup = aml_setup,
  547. .flush = aml_flush,
  548. .recv = aml_recv,
  549. .enqueue = aml_enqueue,
  550. .dequeue = aml_dequeue,
  551. };
  552. static int aml_serdev_probe(struct serdev_device *serdev)
  553. {
  554. struct aml_serdev *amldev;
  555. int err;
  556. amldev = devm_kzalloc(&serdev->dev, sizeof(*amldev), GFP_KERNEL);
  557. if (!amldev)
  558. return -ENOMEM;
  559. amldev->serdev_hu.serdev = serdev;
  560. amldev->dev = &serdev->dev;
  561. serdev_device_set_drvdata(serdev, amldev);
  562. err = hci_uart_register_device(&amldev->serdev_hu, &aml_hci_proto);
  563. if (err)
  564. return dev_err_probe(amldev->dev, err,
  565. "Failed to register hci uart device");
  566. amldev->aml_dev_data = device_get_match_data(&serdev->dev);
  567. return 0;
  568. }
  569. static void aml_serdev_remove(struct serdev_device *serdev)
  570. {
  571. struct aml_serdev *amldev = serdev_device_get_drvdata(serdev);
  572. hci_uart_unregister_device(&amldev->serdev_hu);
  573. }
  574. static void aml_serdev_shutdown(struct serdev_device *serdev)
  575. {
  576. struct aml_serdev *amldev = serdev_device_get_drvdata(serdev);
  577. aml_power_off(amldev);
  578. }
  579. static const struct aml_device_data data_w155s2 = {
  580. .iccm_offset = 256 * 1024,
  581. };
  582. static const struct aml_device_data data_w265s2 = {
  583. .iccm_offset = 384 * 1024,
  584. };
  585. static const struct of_device_id aml_bluetooth_of_match[] = {
  586. { .compatible = "amlogic,w155s2-bt", .data = &data_w155s2 },
  587. { .compatible = "amlogic,w265s2-bt", .data = &data_w265s2 },
  588. { /* sentinel */ },
  589. };
  590. MODULE_DEVICE_TABLE(of, aml_bluetooth_of_match);
  591. static struct serdev_device_driver aml_serdev_driver = {
  592. .probe = aml_serdev_probe,
  593. .remove = aml_serdev_remove,
  594. .shutdown = aml_serdev_shutdown,
  595. .driver = {
  596. .name = "hci_uart_aml",
  597. .of_match_table = aml_bluetooth_of_match,
  598. },
  599. };
  600. int __init aml_init(void)
  601. {
  602. serdev_device_driver_register(&aml_serdev_driver);
  603. return hci_uart_register_proto(&aml_hci_proto);
  604. }
  605. int __exit aml_deinit(void)
  606. {
  607. serdev_device_driver_unregister(&aml_serdev_driver);
  608. return hci_uart_unregister_proto(&aml_hci_proto);
  609. }