hci_aml.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  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. if (firmware)
  268. release_firmware(firmware);
  269. return ret;
  270. }
  271. static int aml_send_reset(struct hci_dev *hdev)
  272. {
  273. struct sk_buff *skb;
  274. int err;
  275. skb = __hci_cmd_sync_ev(hdev, HCI_OP_RESET, 0, NULL,
  276. HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
  277. if (IS_ERR(skb)) {
  278. err = PTR_ERR(skb);
  279. bt_dev_err(hdev, "Failed to send hci reset cmd (%d)", err);
  280. return err;
  281. }
  282. kfree_skb(skb);
  283. return 0;
  284. }
  285. static int aml_dump_fw_version(struct hci_dev *hdev)
  286. {
  287. struct aml_tci_rsp *rsp = NULL;
  288. struct sk_buff *skb;
  289. u8 value[6] = {0};
  290. u8 *fw_ver = NULL;
  291. int err = 0;
  292. skb = __hci_cmd_sync_ev(hdev, AML_BT_HCI_VENDOR_CMD, sizeof(value), value,
  293. HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
  294. if (IS_ERR(skb)) {
  295. err = PTR_ERR(skb);
  296. bt_dev_err(hdev, "Failed to get fw version (error: %d)", err);
  297. return err;
  298. }
  299. rsp = skb_pull_data(skb, sizeof(struct aml_tci_rsp));
  300. if (!rsp)
  301. goto exit;
  302. if (rsp->opcode != AML_BT_HCI_VENDOR_CMD || rsp->status != 0x00) {
  303. bt_dev_err(hdev, "dump version, error response (0x%04X):(%d)",
  304. rsp->opcode, rsp->status);
  305. err = -EINVAL;
  306. goto exit;
  307. }
  308. fw_ver = (u8 *)rsp + AML_EVT_HEAD_SIZE;
  309. bt_dev_info(hdev, "fw_version: date = %02x.%02x, number = 0x%02x%02x",
  310. *(fw_ver + 1), *fw_ver, *(fw_ver + 3), *(fw_ver + 2));
  311. exit:
  312. kfree_skb(skb);
  313. return err;
  314. }
  315. static int aml_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
  316. {
  317. struct aml_tci_rsp *rsp = NULL;
  318. struct sk_buff *skb;
  319. int err = 0;
  320. bt_dev_info(hdev, "set bdaddr (%pM)", bdaddr);
  321. skb = __hci_cmd_sync_ev(hdev, AML_BT_HCI_VENDOR_CMD,
  322. sizeof(bdaddr_t), bdaddr,
  323. HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
  324. if (IS_ERR(skb)) {
  325. err = PTR_ERR(skb);
  326. bt_dev_err(hdev, "Failed to set bdaddr (error: %d)", err);
  327. return err;
  328. }
  329. rsp = skb_pull_data(skb, sizeof(struct aml_tci_rsp));
  330. if (!rsp)
  331. goto exit;
  332. if (rsp->opcode != AML_BT_HCI_VENDOR_CMD || rsp->status != 0x00) {
  333. bt_dev_err(hdev, "error response (0x%x):(%d)", rsp->opcode, rsp->status);
  334. err = -EINVAL;
  335. goto exit;
  336. }
  337. exit:
  338. kfree_skb(skb);
  339. return err;
  340. }
  341. static int aml_check_bdaddr(struct hci_dev *hdev)
  342. {
  343. struct hci_rp_read_bd_addr *paddr;
  344. struct sk_buff *skb;
  345. int err;
  346. if (bacmp(&hdev->public_addr, BDADDR_ANY))
  347. return 0;
  348. skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
  349. HCI_INIT_TIMEOUT);
  350. if (IS_ERR(skb)) {
  351. err = PTR_ERR(skb);
  352. bt_dev_err(hdev, "Failed to read bdaddr (error: %d)", err);
  353. return err;
  354. }
  355. paddr = skb_pull_data(skb, sizeof(struct hci_rp_read_bd_addr));
  356. if (!paddr)
  357. goto exit;
  358. if (!bacmp(&paddr->bdaddr, AML_BDADDR_DEFAULT)) {
  359. bt_dev_info(hdev, "amlbt using default bdaddr (%pM)", &paddr->bdaddr);
  360. set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
  361. }
  362. exit:
  363. kfree_skb(skb);
  364. return 0;
  365. }
  366. static int aml_config_rf(struct hci_dev *hdev, bool is_coex)
  367. {
  368. u32 value = AML_RF_ANT_DOUBLE;
  369. /* Use a single antenna when co-existing with wifi */
  370. if (is_coex)
  371. value = AML_RF_ANT_SINGLE;
  372. return aml_send_tci_cmd(hdev, AML_TCI_CMD_WRITE,
  373. AML_OP_RF_CFG,
  374. &value, sizeof(value));
  375. }
  376. static int aml_parse_dt(struct aml_serdev *amldev)
  377. {
  378. struct device *pdev = amldev->dev;
  379. amldev->bt_en_gpio = devm_gpiod_get(pdev, "enable",
  380. GPIOD_OUT_LOW);
  381. if (IS_ERR(amldev->bt_en_gpio)) {
  382. dev_err(pdev, "Failed to acquire enable gpios");
  383. return PTR_ERR(amldev->bt_en_gpio);
  384. }
  385. if (device_property_read_string(pdev, "firmware-name",
  386. &amldev->firmware_name)) {
  387. dev_err(pdev, "Failed to acquire firmware path");
  388. return -ENODEV;
  389. }
  390. amldev->bt_supply = devm_regulator_get(pdev, "vddio");
  391. if (IS_ERR(amldev->bt_supply)) {
  392. dev_err(pdev, "Failed to acquire regulator");
  393. return PTR_ERR(amldev->bt_supply);
  394. }
  395. amldev->lpo_clk = devm_clk_get(pdev, NULL);
  396. if (IS_ERR(amldev->lpo_clk)) {
  397. dev_err(pdev, "Failed to acquire clock source");
  398. return PTR_ERR(amldev->lpo_clk);
  399. }
  400. return 0;
  401. }
  402. static int aml_power_on(struct aml_serdev *amldev)
  403. {
  404. int err;
  405. err = regulator_enable(amldev->bt_supply);
  406. if (err) {
  407. dev_err(amldev->dev, "Failed to enable regulator: (%d)", err);
  408. return err;
  409. }
  410. err = clk_prepare_enable(amldev->lpo_clk);
  411. if (err) {
  412. dev_err(amldev->dev, "Failed to enable lpo clock: (%d)", err);
  413. return err;
  414. }
  415. gpiod_set_value_cansleep(amldev->bt_en_gpio, 1);
  416. /* Wait 20ms for bluetooth controller power on */
  417. msleep(20);
  418. return 0;
  419. }
  420. static int aml_power_off(struct aml_serdev *amldev)
  421. {
  422. gpiod_set_value_cansleep(amldev->bt_en_gpio, 0);
  423. clk_disable_unprepare(amldev->lpo_clk);
  424. regulator_disable(amldev->bt_supply);
  425. return 0;
  426. }
  427. static int aml_set_baudrate(struct hci_uart *hu, unsigned int speed)
  428. {
  429. /* update controller baudrate */
  430. if (aml_update_chip_baudrate(hu->hdev, speed) != 0) {
  431. bt_dev_err(hu->hdev, "Failed to update baud rate");
  432. return -EINVAL;
  433. }
  434. /* update local baudrate */
  435. serdev_device_set_baudrate(hu->serdev, speed);
  436. return 0;
  437. }
  438. /* Initialize protocol */
  439. static int aml_open(struct hci_uart *hu)
  440. {
  441. struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev);
  442. struct aml_data *aml_data;
  443. int err;
  444. err = aml_parse_dt(amldev);
  445. if (err)
  446. return err;
  447. if (!hci_uart_has_flow_control(hu)) {
  448. bt_dev_err(hu->hdev, "no flow control");
  449. return -EOPNOTSUPP;
  450. }
  451. aml_data = kzalloc(sizeof(*aml_data), GFP_KERNEL);
  452. if (!aml_data)
  453. return -ENOMEM;
  454. skb_queue_head_init(&aml_data->txq);
  455. hu->priv = aml_data;
  456. return 0;
  457. }
  458. static int aml_close(struct hci_uart *hu)
  459. {
  460. struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev);
  461. struct aml_data *aml_data = hu->priv;
  462. skb_queue_purge(&aml_data->txq);
  463. kfree_skb(aml_data->rx_skb);
  464. kfree(aml_data);
  465. hu->priv = NULL;
  466. return aml_power_off(amldev);
  467. }
  468. static int aml_flush(struct hci_uart *hu)
  469. {
  470. struct aml_data *aml_data = hu->priv;
  471. skb_queue_purge(&aml_data->txq);
  472. return 0;
  473. }
  474. static int aml_setup(struct hci_uart *hu)
  475. {
  476. struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev);
  477. struct hci_dev *hdev = amldev->serdev_hu.hdev;
  478. int err;
  479. /* Setup bdaddr */
  480. hdev->set_bdaddr = aml_set_bdaddr;
  481. err = aml_power_on(amldev);
  482. if (err)
  483. return err;
  484. err = aml_set_baudrate(hu, amldev->serdev_hu.proto->oper_speed);
  485. if (err)
  486. return err;
  487. err = aml_download_firmware(hdev, amldev->firmware_name);
  488. if (err)
  489. return err;
  490. err = aml_config_rf(hdev, amldev->aml_dev_data->is_coex);
  491. if (err)
  492. return err;
  493. err = aml_start_chip(hdev);
  494. if (err)
  495. return err;
  496. /* Wait 60ms for controller startup */
  497. msleep(60);
  498. err = aml_dump_fw_version(hdev);
  499. if (err)
  500. return err;
  501. err = aml_send_reset(hdev);
  502. if (err)
  503. return err;
  504. err = aml_check_bdaddr(hdev);
  505. if (err)
  506. return err;
  507. return 0;
  508. }
  509. static int aml_enqueue(struct hci_uart *hu, struct sk_buff *skb)
  510. {
  511. struct aml_data *aml_data = hu->priv;
  512. skb_queue_tail(&aml_data->txq, skb);
  513. return 0;
  514. }
  515. static struct sk_buff *aml_dequeue(struct hci_uart *hu)
  516. {
  517. struct aml_data *aml_data = hu->priv;
  518. struct sk_buff *skb;
  519. skb = skb_dequeue(&aml_data->txq);
  520. /* Prepend skb with frame type */
  521. if (skb)
  522. memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
  523. return skb;
  524. }
  525. static int aml_recv(struct hci_uart *hu, const void *data, int count)
  526. {
  527. struct aml_data *aml_data = hu->priv;
  528. int err;
  529. aml_data->rx_skb = h4_recv_buf(hu->hdev, aml_data->rx_skb, data, count,
  530. aml_recv_pkts,
  531. ARRAY_SIZE(aml_recv_pkts));
  532. if (IS_ERR(aml_data->rx_skb)) {
  533. err = PTR_ERR(aml_data->rx_skb);
  534. bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err);
  535. aml_data->rx_skb = NULL;
  536. return err;
  537. }
  538. return count;
  539. }
  540. static const struct hci_uart_proto aml_hci_proto = {
  541. .id = HCI_UART_AML,
  542. .name = "AML",
  543. .init_speed = 115200,
  544. .oper_speed = 4000000,
  545. .open = aml_open,
  546. .close = aml_close,
  547. .setup = aml_setup,
  548. .flush = aml_flush,
  549. .recv = aml_recv,
  550. .enqueue = aml_enqueue,
  551. .dequeue = aml_dequeue,
  552. };
  553. static void aml_device_driver_shutdown(struct device *dev)
  554. {
  555. struct aml_serdev *amldev = dev_get_drvdata(dev);
  556. aml_power_off(amldev);
  557. }
  558. static int aml_serdev_probe(struct serdev_device *serdev)
  559. {
  560. struct aml_serdev *amldev;
  561. int err;
  562. amldev = devm_kzalloc(&serdev->dev, sizeof(*amldev), GFP_KERNEL);
  563. if (!amldev)
  564. return -ENOMEM;
  565. amldev->serdev_hu.serdev = serdev;
  566. amldev->dev = &serdev->dev;
  567. serdev_device_set_drvdata(serdev, amldev);
  568. err = hci_uart_register_device(&amldev->serdev_hu, &aml_hci_proto);
  569. if (err)
  570. return dev_err_probe(amldev->dev, err,
  571. "Failed to register hci uart device");
  572. amldev->aml_dev_data = device_get_match_data(&serdev->dev);
  573. return 0;
  574. }
  575. static void aml_serdev_remove(struct serdev_device *serdev)
  576. {
  577. struct aml_serdev *amldev = serdev_device_get_drvdata(serdev);
  578. hci_uart_unregister_device(&amldev->serdev_hu);
  579. }
  580. static const struct aml_device_data data_w155s2 = {
  581. .iccm_offset = 256 * 1024,
  582. };
  583. static const struct aml_device_data data_w265s2 = {
  584. .iccm_offset = 384 * 1024,
  585. };
  586. static const struct of_device_id aml_bluetooth_of_match[] = {
  587. { .compatible = "amlogic,w155s2-bt", .data = &data_w155s2 },
  588. { .compatible = "amlogic,w265s2-bt", .data = &data_w265s2 },
  589. { /* sentinel */ },
  590. };
  591. MODULE_DEVICE_TABLE(of, aml_bluetooth_of_match);
  592. static struct serdev_device_driver aml_serdev_driver = {
  593. .probe = aml_serdev_probe,
  594. .remove = aml_serdev_remove,
  595. .driver = {
  596. .name = "hci_uart_aml",
  597. .of_match_table = aml_bluetooth_of_match,
  598. .shutdown = aml_device_driver_shutdown,
  599. },
  600. };
  601. int __init aml_init(void)
  602. {
  603. serdev_device_driver_register(&aml_serdev_driver);
  604. return hci_uart_register_proto(&aml_hci_proto);
  605. }
  606. int __exit aml_deinit(void)
  607. {
  608. serdev_device_driver_unregister(&aml_serdev_driver);
  609. return hci_uart_unregister_proto(&aml_hci_proto);
  610. }