mcr20a.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Driver for NXP MCR20A 802.15.4 Wireless-PAN Networking controller
  4. *
  5. * Copyright (C) 2018 Xue Liu <[email protected]>
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/gpio/consumer.h>
  10. #include <linux/spi/spi.h>
  11. #include <linux/workqueue.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/irq.h>
  14. #include <linux/skbuff.h>
  15. #include <linux/of_gpio.h>
  16. #include <linux/regmap.h>
  17. #include <linux/ieee802154.h>
  18. #include <linux/debugfs.h>
  19. #include <net/mac802154.h>
  20. #include <net/cfg802154.h>
  21. #include <linux/device.h>
  22. #include "mcr20a.h"
  23. #define SPI_COMMAND_BUFFER 3
  24. #define REGISTER_READ BIT(7)
  25. #define REGISTER_WRITE (0 << 7)
  26. #define REGISTER_ACCESS (0 << 6)
  27. #define PACKET_BUFF_BURST_ACCESS BIT(6)
  28. #define PACKET_BUFF_BYTE_ACCESS BIT(5)
  29. #define MCR20A_WRITE_REG(x) (x)
  30. #define MCR20A_READ_REG(x) (REGISTER_READ | (x))
  31. #define MCR20A_BURST_READ_PACKET_BUF (0xC0)
  32. #define MCR20A_BURST_WRITE_PACKET_BUF (0x40)
  33. #define MCR20A_CMD_REG 0x80
  34. #define MCR20A_CMD_REG_MASK 0x3f
  35. #define MCR20A_CMD_WRITE 0x40
  36. #define MCR20A_CMD_FB 0x20
  37. /* Number of Interrupt Request Status Register */
  38. #define MCR20A_IRQSTS_NUM 2 /* only IRQ_STS1 and IRQ_STS2 */
  39. /* MCR20A CCA Type */
  40. enum {
  41. MCR20A_CCA_ED, // energy detect - CCA bit not active,
  42. // not to be used for T and CCCA sequences
  43. MCR20A_CCA_MODE1, // energy detect - CCA bit ACTIVE
  44. MCR20A_CCA_MODE2, // 802.15.4 compliant signal detect - CCA bit ACTIVE
  45. MCR20A_CCA_MODE3
  46. };
  47. enum {
  48. MCR20A_XCVSEQ_IDLE = 0x00,
  49. MCR20A_XCVSEQ_RX = 0x01,
  50. MCR20A_XCVSEQ_TX = 0x02,
  51. MCR20A_XCVSEQ_CCA = 0x03,
  52. MCR20A_XCVSEQ_TR = 0x04,
  53. MCR20A_XCVSEQ_CCCA = 0x05,
  54. };
  55. /* IEEE-802.15.4 defined constants (2.4 GHz logical channels) */
  56. #define MCR20A_MIN_CHANNEL (11)
  57. #define MCR20A_MAX_CHANNEL (26)
  58. #define MCR20A_CHANNEL_SPACING (5)
  59. /* MCR20A CCA Threshold constans */
  60. #define MCR20A_MIN_CCA_THRESHOLD (0x6EU)
  61. #define MCR20A_MAX_CCA_THRESHOLD (0x00U)
  62. /* version 0C */
  63. #define MCR20A_OVERWRITE_VERSION (0x0C)
  64. /* MCR20A PLL configurations */
  65. static const u8 PLL_INT[16] = {
  66. /* 2405 */ 0x0B, /* 2410 */ 0x0B, /* 2415 */ 0x0B,
  67. /* 2420 */ 0x0B, /* 2425 */ 0x0B, /* 2430 */ 0x0B,
  68. /* 2435 */ 0x0C, /* 2440 */ 0x0C, /* 2445 */ 0x0C,
  69. /* 2450 */ 0x0C, /* 2455 */ 0x0C, /* 2460 */ 0x0C,
  70. /* 2465 */ 0x0D, /* 2470 */ 0x0D, /* 2475 */ 0x0D,
  71. /* 2480 */ 0x0D
  72. };
  73. static const u8 PLL_FRAC[16] = {
  74. /* 2405 */ 0x28, /* 2410 */ 0x50, /* 2415 */ 0x78,
  75. /* 2420 */ 0xA0, /* 2425 */ 0xC8, /* 2430 */ 0xF0,
  76. /* 2435 */ 0x18, /* 2440 */ 0x40, /* 2445 */ 0x68,
  77. /* 2450 */ 0x90, /* 2455 */ 0xB8, /* 2460 */ 0xE0,
  78. /* 2465 */ 0x08, /* 2470 */ 0x30, /* 2475 */ 0x58,
  79. /* 2480 */ 0x80
  80. };
  81. static const struct reg_sequence mar20a_iar_overwrites[] = {
  82. { IAR_MISC_PAD_CTRL, 0x02 },
  83. { IAR_VCO_CTRL1, 0xB3 },
  84. { IAR_VCO_CTRL2, 0x07 },
  85. { IAR_PA_TUNING, 0x71 },
  86. { IAR_CHF_IBUF, 0x2F },
  87. { IAR_CHF_QBUF, 0x2F },
  88. { IAR_CHF_IRIN, 0x24 },
  89. { IAR_CHF_QRIN, 0x24 },
  90. { IAR_CHF_IL, 0x24 },
  91. { IAR_CHF_QL, 0x24 },
  92. { IAR_CHF_CC1, 0x32 },
  93. { IAR_CHF_CCL, 0x1D },
  94. { IAR_CHF_CC2, 0x2D },
  95. { IAR_CHF_IROUT, 0x24 },
  96. { IAR_CHF_QROUT, 0x24 },
  97. { IAR_PA_CAL, 0x28 },
  98. { IAR_AGC_THR1, 0x55 },
  99. { IAR_AGC_THR2, 0x2D },
  100. { IAR_ATT_RSSI1, 0x5F },
  101. { IAR_ATT_RSSI2, 0x8F },
  102. { IAR_RSSI_OFFSET, 0x61 },
  103. { IAR_CHF_PMA_GAIN, 0x03 },
  104. { IAR_CCA1_THRESH, 0x50 },
  105. { IAR_CORR_NVAL, 0x13 },
  106. { IAR_ACKDELAY, 0x3D },
  107. };
  108. #define MCR20A_VALID_CHANNELS (0x07FFF800)
  109. #define MCR20A_MAX_BUF (127)
  110. #define printdev(X) (&X->spi->dev)
  111. /* regmap information for Direct Access Register (DAR) access */
  112. #define MCR20A_DAR_WRITE 0x01
  113. #define MCR20A_DAR_READ 0x00
  114. #define MCR20A_DAR_NUMREGS 0x3F
  115. /* regmap information for Indirect Access Register (IAR) access */
  116. #define MCR20A_IAR_ACCESS 0x80
  117. #define MCR20A_IAR_NUMREGS 0xBEFF
  118. /* Read/Write SPI Commands for DAR and IAR registers. */
  119. #define MCR20A_READSHORT(reg) ((reg) << 1)
  120. #define MCR20A_WRITESHORT(reg) ((reg) << 1 | 1)
  121. #define MCR20A_READLONG(reg) (1 << 15 | (reg) << 5)
  122. #define MCR20A_WRITELONG(reg) (1 << 15 | (reg) << 5 | 1 << 4)
  123. /* Type definitions for link configuration of instantiable layers */
  124. #define MCR20A_PHY_INDIRECT_QUEUE_SIZE (12)
  125. static bool
  126. mcr20a_dar_writeable(struct device *dev, unsigned int reg)
  127. {
  128. switch (reg) {
  129. case DAR_IRQ_STS1:
  130. case DAR_IRQ_STS2:
  131. case DAR_IRQ_STS3:
  132. case DAR_PHY_CTRL1:
  133. case DAR_PHY_CTRL2:
  134. case DAR_PHY_CTRL3:
  135. case DAR_PHY_CTRL4:
  136. case DAR_SRC_CTRL:
  137. case DAR_SRC_ADDRS_SUM_LSB:
  138. case DAR_SRC_ADDRS_SUM_MSB:
  139. case DAR_T3CMP_LSB:
  140. case DAR_T3CMP_MSB:
  141. case DAR_T3CMP_USB:
  142. case DAR_T2PRIMECMP_LSB:
  143. case DAR_T2PRIMECMP_MSB:
  144. case DAR_T1CMP_LSB:
  145. case DAR_T1CMP_MSB:
  146. case DAR_T1CMP_USB:
  147. case DAR_T2CMP_LSB:
  148. case DAR_T2CMP_MSB:
  149. case DAR_T2CMP_USB:
  150. case DAR_T4CMP_LSB:
  151. case DAR_T4CMP_MSB:
  152. case DAR_T4CMP_USB:
  153. case DAR_PLL_INT0:
  154. case DAR_PLL_FRAC0_LSB:
  155. case DAR_PLL_FRAC0_MSB:
  156. case DAR_PA_PWR:
  157. /* no DAR_ACM */
  158. case DAR_OVERWRITE_VER:
  159. case DAR_CLK_OUT_CTRL:
  160. case DAR_PWR_MODES:
  161. return true;
  162. default:
  163. return false;
  164. }
  165. }
  166. static bool
  167. mcr20a_dar_readable(struct device *dev, unsigned int reg)
  168. {
  169. bool rc;
  170. /* all writeable are also readable */
  171. rc = mcr20a_dar_writeable(dev, reg);
  172. if (rc)
  173. return rc;
  174. /* readonly regs */
  175. switch (reg) {
  176. case DAR_RX_FRM_LEN:
  177. case DAR_CCA1_ED_FNL:
  178. case DAR_EVENT_TMR_LSB:
  179. case DAR_EVENT_TMR_MSB:
  180. case DAR_EVENT_TMR_USB:
  181. case DAR_TIMESTAMP_LSB:
  182. case DAR_TIMESTAMP_MSB:
  183. case DAR_TIMESTAMP_USB:
  184. case DAR_SEQ_STATE:
  185. case DAR_LQI_VALUE:
  186. case DAR_RSSI_CCA_CONT:
  187. return true;
  188. default:
  189. return false;
  190. }
  191. }
  192. static bool
  193. mcr20a_dar_volatile(struct device *dev, unsigned int reg)
  194. {
  195. /* can be changed during runtime */
  196. switch (reg) {
  197. case DAR_IRQ_STS1:
  198. case DAR_IRQ_STS2:
  199. case DAR_IRQ_STS3:
  200. /* use them in spi_async and regmap so it's volatile */
  201. return true;
  202. default:
  203. return false;
  204. }
  205. }
  206. static bool
  207. mcr20a_dar_precious(struct device *dev, unsigned int reg)
  208. {
  209. /* don't clear irq line on read */
  210. switch (reg) {
  211. case DAR_IRQ_STS1:
  212. case DAR_IRQ_STS2:
  213. case DAR_IRQ_STS3:
  214. return true;
  215. default:
  216. return false;
  217. }
  218. }
  219. static const struct regmap_config mcr20a_dar_regmap = {
  220. .name = "mcr20a_dar",
  221. .reg_bits = 8,
  222. .val_bits = 8,
  223. .write_flag_mask = REGISTER_ACCESS | REGISTER_WRITE,
  224. .read_flag_mask = REGISTER_ACCESS | REGISTER_READ,
  225. .cache_type = REGCACHE_RBTREE,
  226. .writeable_reg = mcr20a_dar_writeable,
  227. .readable_reg = mcr20a_dar_readable,
  228. .volatile_reg = mcr20a_dar_volatile,
  229. .precious_reg = mcr20a_dar_precious,
  230. .fast_io = true,
  231. .can_multi_write = true,
  232. };
  233. static bool
  234. mcr20a_iar_writeable(struct device *dev, unsigned int reg)
  235. {
  236. switch (reg) {
  237. case IAR_XTAL_TRIM:
  238. case IAR_PMC_LP_TRIM:
  239. case IAR_MACPANID0_LSB:
  240. case IAR_MACPANID0_MSB:
  241. case IAR_MACSHORTADDRS0_LSB:
  242. case IAR_MACSHORTADDRS0_MSB:
  243. case IAR_MACLONGADDRS0_0:
  244. case IAR_MACLONGADDRS0_8:
  245. case IAR_MACLONGADDRS0_16:
  246. case IAR_MACLONGADDRS0_24:
  247. case IAR_MACLONGADDRS0_32:
  248. case IAR_MACLONGADDRS0_40:
  249. case IAR_MACLONGADDRS0_48:
  250. case IAR_MACLONGADDRS0_56:
  251. case IAR_RX_FRAME_FILTER:
  252. case IAR_PLL_INT1:
  253. case IAR_PLL_FRAC1_LSB:
  254. case IAR_PLL_FRAC1_MSB:
  255. case IAR_MACPANID1_LSB:
  256. case IAR_MACPANID1_MSB:
  257. case IAR_MACSHORTADDRS1_LSB:
  258. case IAR_MACSHORTADDRS1_MSB:
  259. case IAR_MACLONGADDRS1_0:
  260. case IAR_MACLONGADDRS1_8:
  261. case IAR_MACLONGADDRS1_16:
  262. case IAR_MACLONGADDRS1_24:
  263. case IAR_MACLONGADDRS1_32:
  264. case IAR_MACLONGADDRS1_40:
  265. case IAR_MACLONGADDRS1_48:
  266. case IAR_MACLONGADDRS1_56:
  267. case IAR_DUAL_PAN_CTRL:
  268. case IAR_DUAL_PAN_DWELL:
  269. case IAR_CCA1_THRESH:
  270. case IAR_CCA1_ED_OFFSET_COMP:
  271. case IAR_LQI_OFFSET_COMP:
  272. case IAR_CCA_CTRL:
  273. case IAR_CCA2_CORR_PEAKS:
  274. case IAR_CCA2_CORR_THRESH:
  275. case IAR_TMR_PRESCALE:
  276. case IAR_ANT_PAD_CTRL:
  277. case IAR_MISC_PAD_CTRL:
  278. case IAR_BSM_CTRL:
  279. case IAR_RNG:
  280. case IAR_RX_WTR_MARK:
  281. case IAR_SOFT_RESET:
  282. case IAR_TXDELAY:
  283. case IAR_ACKDELAY:
  284. case IAR_CORR_NVAL:
  285. case IAR_ANT_AGC_CTRL:
  286. case IAR_AGC_THR1:
  287. case IAR_AGC_THR2:
  288. case IAR_PA_CAL:
  289. case IAR_ATT_RSSI1:
  290. case IAR_ATT_RSSI2:
  291. case IAR_RSSI_OFFSET:
  292. case IAR_XTAL_CTRL:
  293. case IAR_CHF_PMA_GAIN:
  294. case IAR_CHF_IBUF:
  295. case IAR_CHF_QBUF:
  296. case IAR_CHF_IRIN:
  297. case IAR_CHF_QRIN:
  298. case IAR_CHF_IL:
  299. case IAR_CHF_QL:
  300. case IAR_CHF_CC1:
  301. case IAR_CHF_CCL:
  302. case IAR_CHF_CC2:
  303. case IAR_CHF_IROUT:
  304. case IAR_CHF_QROUT:
  305. case IAR_PA_TUNING:
  306. case IAR_VCO_CTRL1:
  307. case IAR_VCO_CTRL2:
  308. return true;
  309. default:
  310. return false;
  311. }
  312. }
  313. static bool
  314. mcr20a_iar_readable(struct device *dev, unsigned int reg)
  315. {
  316. bool rc;
  317. /* all writeable are also readable */
  318. rc = mcr20a_iar_writeable(dev, reg);
  319. if (rc)
  320. return rc;
  321. /* readonly regs */
  322. switch (reg) {
  323. case IAR_PART_ID:
  324. case IAR_DUAL_PAN_STS:
  325. case IAR_RX_BYTE_COUNT:
  326. case IAR_FILTERFAIL_CODE1:
  327. case IAR_FILTERFAIL_CODE2:
  328. case IAR_RSSI:
  329. return true;
  330. default:
  331. return false;
  332. }
  333. }
  334. static bool
  335. mcr20a_iar_volatile(struct device *dev, unsigned int reg)
  336. {
  337. /* can be changed during runtime */
  338. switch (reg) {
  339. case IAR_DUAL_PAN_STS:
  340. case IAR_RX_BYTE_COUNT:
  341. case IAR_FILTERFAIL_CODE1:
  342. case IAR_FILTERFAIL_CODE2:
  343. case IAR_RSSI:
  344. return true;
  345. default:
  346. return false;
  347. }
  348. }
  349. static const struct regmap_config mcr20a_iar_regmap = {
  350. .name = "mcr20a_iar",
  351. .reg_bits = 16,
  352. .val_bits = 8,
  353. .write_flag_mask = REGISTER_ACCESS | REGISTER_WRITE | IAR_INDEX,
  354. .read_flag_mask = REGISTER_ACCESS | REGISTER_READ | IAR_INDEX,
  355. .cache_type = REGCACHE_RBTREE,
  356. .writeable_reg = mcr20a_iar_writeable,
  357. .readable_reg = mcr20a_iar_readable,
  358. .volatile_reg = mcr20a_iar_volatile,
  359. .fast_io = true,
  360. };
  361. struct mcr20a_local {
  362. struct spi_device *spi;
  363. struct ieee802154_hw *hw;
  364. struct regmap *regmap_dar;
  365. struct regmap *regmap_iar;
  366. u8 *buf;
  367. bool is_tx;
  368. /* for writing tx buffer */
  369. struct spi_message tx_buf_msg;
  370. u8 tx_header[1];
  371. /* burst buffer write command */
  372. struct spi_transfer tx_xfer_header;
  373. u8 tx_len[1];
  374. /* len of tx packet */
  375. struct spi_transfer tx_xfer_len;
  376. /* data of tx packet */
  377. struct spi_transfer tx_xfer_buf;
  378. struct sk_buff *tx_skb;
  379. /* for read length rxfifo */
  380. struct spi_message reg_msg;
  381. u8 reg_cmd[1];
  382. u8 reg_data[MCR20A_IRQSTS_NUM];
  383. struct spi_transfer reg_xfer_cmd;
  384. struct spi_transfer reg_xfer_data;
  385. /* receive handling */
  386. struct spi_message rx_buf_msg;
  387. u8 rx_header[1];
  388. struct spi_transfer rx_xfer_header;
  389. u8 rx_lqi[1];
  390. struct spi_transfer rx_xfer_lqi;
  391. u8 rx_buf[MCR20A_MAX_BUF];
  392. struct spi_transfer rx_xfer_buf;
  393. /* isr handling for reading intstat */
  394. struct spi_message irq_msg;
  395. u8 irq_header[1];
  396. u8 irq_data[MCR20A_IRQSTS_NUM];
  397. struct spi_transfer irq_xfer_data;
  398. struct spi_transfer irq_xfer_header;
  399. };
  400. static void
  401. mcr20a_write_tx_buf_complete(void *context)
  402. {
  403. struct mcr20a_local *lp = context;
  404. int ret;
  405. dev_dbg(printdev(lp), "%s\n", __func__);
  406. lp->reg_msg.complete = NULL;
  407. lp->reg_cmd[0] = MCR20A_WRITE_REG(DAR_PHY_CTRL1);
  408. lp->reg_data[0] = MCR20A_XCVSEQ_TX;
  409. lp->reg_xfer_data.len = 1;
  410. ret = spi_async(lp->spi, &lp->reg_msg);
  411. if (ret)
  412. dev_err(printdev(lp), "failed to set SEQ TX\n");
  413. }
  414. static int
  415. mcr20a_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
  416. {
  417. struct mcr20a_local *lp = hw->priv;
  418. dev_dbg(printdev(lp), "%s\n", __func__);
  419. lp->tx_skb = skb;
  420. print_hex_dump_debug("mcr20a tx: ", DUMP_PREFIX_OFFSET, 16, 1,
  421. skb->data, skb->len, 0);
  422. lp->is_tx = 1;
  423. lp->reg_msg.complete = NULL;
  424. lp->reg_cmd[0] = MCR20A_WRITE_REG(DAR_PHY_CTRL1);
  425. lp->reg_data[0] = MCR20A_XCVSEQ_IDLE;
  426. lp->reg_xfer_data.len = 1;
  427. return spi_async(lp->spi, &lp->reg_msg);
  428. }
  429. static int
  430. mcr20a_ed(struct ieee802154_hw *hw, u8 *level)
  431. {
  432. WARN_ON(!level);
  433. *level = 0xbe;
  434. return 0;
  435. }
  436. static int
  437. mcr20a_set_channel(struct ieee802154_hw *hw, u8 page, u8 channel)
  438. {
  439. struct mcr20a_local *lp = hw->priv;
  440. int ret;
  441. dev_dbg(printdev(lp), "%s\n", __func__);
  442. /* freqency = ((PLL_INT+64) + (PLL_FRAC/65536)) * 32 MHz */
  443. ret = regmap_write(lp->regmap_dar, DAR_PLL_INT0, PLL_INT[channel - 11]);
  444. if (ret)
  445. return ret;
  446. ret = regmap_write(lp->regmap_dar, DAR_PLL_FRAC0_LSB, 0x00);
  447. if (ret)
  448. return ret;
  449. ret = regmap_write(lp->regmap_dar, DAR_PLL_FRAC0_MSB,
  450. PLL_FRAC[channel - 11]);
  451. if (ret)
  452. return ret;
  453. return 0;
  454. }
  455. static int
  456. mcr20a_start(struct ieee802154_hw *hw)
  457. {
  458. struct mcr20a_local *lp = hw->priv;
  459. int ret;
  460. dev_dbg(printdev(lp), "%s\n", __func__);
  461. /* No slotted operation */
  462. dev_dbg(printdev(lp), "no slotted operation\n");
  463. ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL1,
  464. DAR_PHY_CTRL1_SLOTTED, 0x0);
  465. if (ret < 0)
  466. return ret;
  467. /* enable irq */
  468. enable_irq(lp->spi->irq);
  469. /* Unmask SEQ interrupt */
  470. ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL2,
  471. DAR_PHY_CTRL2_SEQMSK, 0x0);
  472. if (ret < 0)
  473. return ret;
  474. /* Start the RX sequence */
  475. dev_dbg(printdev(lp), "start the RX sequence\n");
  476. ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL1,
  477. DAR_PHY_CTRL1_XCVSEQ_MASK, MCR20A_XCVSEQ_RX);
  478. if (ret < 0)
  479. return ret;
  480. return 0;
  481. }
  482. static void
  483. mcr20a_stop(struct ieee802154_hw *hw)
  484. {
  485. struct mcr20a_local *lp = hw->priv;
  486. dev_dbg(printdev(lp), "%s\n", __func__);
  487. /* stop all running sequence */
  488. regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL1,
  489. DAR_PHY_CTRL1_XCVSEQ_MASK, MCR20A_XCVSEQ_IDLE);
  490. /* disable irq */
  491. disable_irq(lp->spi->irq);
  492. }
  493. static int
  494. mcr20a_set_hw_addr_filt(struct ieee802154_hw *hw,
  495. struct ieee802154_hw_addr_filt *filt,
  496. unsigned long changed)
  497. {
  498. struct mcr20a_local *lp = hw->priv;
  499. dev_dbg(printdev(lp), "%s\n", __func__);
  500. if (changed & IEEE802154_AFILT_SADDR_CHANGED) {
  501. u16 addr = le16_to_cpu(filt->short_addr);
  502. regmap_write(lp->regmap_iar, IAR_MACSHORTADDRS0_LSB, addr);
  503. regmap_write(lp->regmap_iar, IAR_MACSHORTADDRS0_MSB, addr >> 8);
  504. }
  505. if (changed & IEEE802154_AFILT_PANID_CHANGED) {
  506. u16 pan = le16_to_cpu(filt->pan_id);
  507. regmap_write(lp->regmap_iar, IAR_MACPANID0_LSB, pan);
  508. regmap_write(lp->regmap_iar, IAR_MACPANID0_MSB, pan >> 8);
  509. }
  510. if (changed & IEEE802154_AFILT_IEEEADDR_CHANGED) {
  511. u8 addr[8], i;
  512. memcpy(addr, &filt->ieee_addr, 8);
  513. for (i = 0; i < 8; i++)
  514. regmap_write(lp->regmap_iar,
  515. IAR_MACLONGADDRS0_0 + i, addr[i]);
  516. }
  517. if (changed & IEEE802154_AFILT_PANC_CHANGED) {
  518. if (filt->pan_coord) {
  519. regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL4,
  520. DAR_PHY_CTRL4_PANCORDNTR0, 0x10);
  521. } else {
  522. regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL4,
  523. DAR_PHY_CTRL4_PANCORDNTR0, 0x00);
  524. }
  525. }
  526. return 0;
  527. }
  528. /* -30 dBm to 10 dBm */
  529. #define MCR20A_MAX_TX_POWERS 0x14
  530. static const s32 mcr20a_powers[MCR20A_MAX_TX_POWERS + 1] = {
  531. -3000, -2800, -2600, -2400, -2200, -2000, -1800, -1600, -1400,
  532. -1200, -1000, -800, -600, -400, -200, 0, 200, 400, 600, 800, 1000
  533. };
  534. static int
  535. mcr20a_set_txpower(struct ieee802154_hw *hw, s32 mbm)
  536. {
  537. struct mcr20a_local *lp = hw->priv;
  538. u32 i;
  539. dev_dbg(printdev(lp), "%s(%d)\n", __func__, mbm);
  540. for (i = 0; i < lp->hw->phy->supported.tx_powers_size; i++) {
  541. if (lp->hw->phy->supported.tx_powers[i] == mbm)
  542. return regmap_write(lp->regmap_dar, DAR_PA_PWR,
  543. ((i + 8) & 0x1F));
  544. }
  545. return -EINVAL;
  546. }
  547. #define MCR20A_MAX_ED_LEVELS MCR20A_MIN_CCA_THRESHOLD
  548. static s32 mcr20a_ed_levels[MCR20A_MAX_ED_LEVELS + 1];
  549. static int
  550. mcr20a_set_cca_mode(struct ieee802154_hw *hw,
  551. const struct wpan_phy_cca *cca)
  552. {
  553. struct mcr20a_local *lp = hw->priv;
  554. unsigned int cca_mode = 0xff;
  555. bool cca_mode_and = false;
  556. int ret;
  557. dev_dbg(printdev(lp), "%s\n", __func__);
  558. /* mapping 802.15.4 to driver spec */
  559. switch (cca->mode) {
  560. case NL802154_CCA_ENERGY:
  561. cca_mode = MCR20A_CCA_MODE1;
  562. break;
  563. case NL802154_CCA_CARRIER:
  564. cca_mode = MCR20A_CCA_MODE2;
  565. break;
  566. case NL802154_CCA_ENERGY_CARRIER:
  567. switch (cca->opt) {
  568. case NL802154_CCA_OPT_ENERGY_CARRIER_AND:
  569. cca_mode = MCR20A_CCA_MODE3;
  570. cca_mode_and = true;
  571. break;
  572. case NL802154_CCA_OPT_ENERGY_CARRIER_OR:
  573. cca_mode = MCR20A_CCA_MODE3;
  574. cca_mode_and = false;
  575. break;
  576. default:
  577. return -EINVAL;
  578. }
  579. break;
  580. default:
  581. return -EINVAL;
  582. }
  583. ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL4,
  584. DAR_PHY_CTRL4_CCATYPE_MASK,
  585. cca_mode << DAR_PHY_CTRL4_CCATYPE_SHIFT);
  586. if (ret < 0)
  587. return ret;
  588. if (cca_mode == MCR20A_CCA_MODE3) {
  589. if (cca_mode_and) {
  590. ret = regmap_update_bits(lp->regmap_iar, IAR_CCA_CTRL,
  591. IAR_CCA_CTRL_CCA3_AND_NOT_OR,
  592. 0x08);
  593. } else {
  594. ret = regmap_update_bits(lp->regmap_iar,
  595. IAR_CCA_CTRL,
  596. IAR_CCA_CTRL_CCA3_AND_NOT_OR,
  597. 0x00);
  598. }
  599. if (ret < 0)
  600. return ret;
  601. }
  602. return ret;
  603. }
  604. static int
  605. mcr20a_set_cca_ed_level(struct ieee802154_hw *hw, s32 mbm)
  606. {
  607. struct mcr20a_local *lp = hw->priv;
  608. u32 i;
  609. dev_dbg(printdev(lp), "%s\n", __func__);
  610. for (i = 0; i < hw->phy->supported.cca_ed_levels_size; i++) {
  611. if (hw->phy->supported.cca_ed_levels[i] == mbm)
  612. return regmap_write(lp->regmap_iar, IAR_CCA1_THRESH, i);
  613. }
  614. return 0;
  615. }
  616. static int
  617. mcr20a_set_promiscuous_mode(struct ieee802154_hw *hw, const bool on)
  618. {
  619. struct mcr20a_local *lp = hw->priv;
  620. int ret;
  621. u8 rx_frame_filter_reg = 0x0;
  622. dev_dbg(printdev(lp), "%s(%d)\n", __func__, on);
  623. if (on) {
  624. /* All frame types accepted*/
  625. rx_frame_filter_reg &= ~(IAR_RX_FRAME_FLT_FRM_VER);
  626. rx_frame_filter_reg |= (IAR_RX_FRAME_FLT_ACK_FT |
  627. IAR_RX_FRAME_FLT_NS_FT);
  628. ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL4,
  629. DAR_PHY_CTRL4_PROMISCUOUS,
  630. DAR_PHY_CTRL4_PROMISCUOUS);
  631. if (ret < 0)
  632. return ret;
  633. ret = regmap_write(lp->regmap_iar, IAR_RX_FRAME_FILTER,
  634. rx_frame_filter_reg);
  635. if (ret < 0)
  636. return ret;
  637. } else {
  638. ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL4,
  639. DAR_PHY_CTRL4_PROMISCUOUS, 0x0);
  640. if (ret < 0)
  641. return ret;
  642. ret = regmap_write(lp->regmap_iar, IAR_RX_FRAME_FILTER,
  643. IAR_RX_FRAME_FLT_FRM_VER |
  644. IAR_RX_FRAME_FLT_BEACON_FT |
  645. IAR_RX_FRAME_FLT_DATA_FT |
  646. IAR_RX_FRAME_FLT_CMD_FT);
  647. if (ret < 0)
  648. return ret;
  649. }
  650. return 0;
  651. }
  652. static const struct ieee802154_ops mcr20a_hw_ops = {
  653. .owner = THIS_MODULE,
  654. .xmit_async = mcr20a_xmit,
  655. .ed = mcr20a_ed,
  656. .set_channel = mcr20a_set_channel,
  657. .start = mcr20a_start,
  658. .stop = mcr20a_stop,
  659. .set_hw_addr_filt = mcr20a_set_hw_addr_filt,
  660. .set_txpower = mcr20a_set_txpower,
  661. .set_cca_mode = mcr20a_set_cca_mode,
  662. .set_cca_ed_level = mcr20a_set_cca_ed_level,
  663. .set_promiscuous_mode = mcr20a_set_promiscuous_mode,
  664. };
  665. static int
  666. mcr20a_request_rx(struct mcr20a_local *lp)
  667. {
  668. dev_dbg(printdev(lp), "%s\n", __func__);
  669. /* Start the RX sequence */
  670. regmap_update_bits_async(lp->regmap_dar, DAR_PHY_CTRL1,
  671. DAR_PHY_CTRL1_XCVSEQ_MASK, MCR20A_XCVSEQ_RX);
  672. return 0;
  673. }
  674. static void
  675. mcr20a_handle_rx_read_buf_complete(void *context)
  676. {
  677. struct mcr20a_local *lp = context;
  678. u8 len = lp->reg_data[0] & DAR_RX_FRAME_LENGTH_MASK;
  679. struct sk_buff *skb;
  680. dev_dbg(printdev(lp), "%s\n", __func__);
  681. dev_dbg(printdev(lp), "RX is done\n");
  682. if (!ieee802154_is_valid_psdu_len(len)) {
  683. dev_vdbg(&lp->spi->dev, "corrupted frame received\n");
  684. len = IEEE802154_MTU;
  685. }
  686. len = len - 2; /* get rid of frame check field */
  687. skb = dev_alloc_skb(len);
  688. if (!skb)
  689. return;
  690. __skb_put_data(skb, lp->rx_buf, len);
  691. ieee802154_rx_irqsafe(lp->hw, skb, lp->rx_lqi[0]);
  692. print_hex_dump_debug("mcr20a rx: ", DUMP_PREFIX_OFFSET, 16, 1,
  693. lp->rx_buf, len, 0);
  694. pr_debug("mcr20a rx: lqi: %02hhx\n", lp->rx_lqi[0]);
  695. /* start RX sequence */
  696. mcr20a_request_rx(lp);
  697. }
  698. static void
  699. mcr20a_handle_rx_read_len_complete(void *context)
  700. {
  701. struct mcr20a_local *lp = context;
  702. u8 len;
  703. int ret;
  704. dev_dbg(printdev(lp), "%s\n", __func__);
  705. /* get the length of received frame */
  706. len = lp->reg_data[0] & DAR_RX_FRAME_LENGTH_MASK;
  707. dev_dbg(printdev(lp), "frame len : %d\n", len);
  708. /* prepare to read the rx buf */
  709. lp->rx_buf_msg.complete = mcr20a_handle_rx_read_buf_complete;
  710. lp->rx_header[0] = MCR20A_BURST_READ_PACKET_BUF;
  711. lp->rx_xfer_buf.len = len;
  712. ret = spi_async(lp->spi, &lp->rx_buf_msg);
  713. if (ret)
  714. dev_err(printdev(lp), "failed to read rx buffer length\n");
  715. }
  716. static int
  717. mcr20a_handle_rx(struct mcr20a_local *lp)
  718. {
  719. dev_dbg(printdev(lp), "%s\n", __func__);
  720. lp->reg_msg.complete = mcr20a_handle_rx_read_len_complete;
  721. lp->reg_cmd[0] = MCR20A_READ_REG(DAR_RX_FRM_LEN);
  722. lp->reg_xfer_data.len = 1;
  723. return spi_async(lp->spi, &lp->reg_msg);
  724. }
  725. static int
  726. mcr20a_handle_tx_complete(struct mcr20a_local *lp)
  727. {
  728. dev_dbg(printdev(lp), "%s\n", __func__);
  729. ieee802154_xmit_complete(lp->hw, lp->tx_skb, false);
  730. return mcr20a_request_rx(lp);
  731. }
  732. static int
  733. mcr20a_handle_tx(struct mcr20a_local *lp)
  734. {
  735. int ret;
  736. dev_dbg(printdev(lp), "%s\n", __func__);
  737. /* write tx buffer */
  738. lp->tx_header[0] = MCR20A_BURST_WRITE_PACKET_BUF;
  739. /* add 2 bytes of FCS */
  740. lp->tx_len[0] = lp->tx_skb->len + 2;
  741. lp->tx_xfer_buf.tx_buf = lp->tx_skb->data;
  742. /* add 1 byte psduLength */
  743. lp->tx_xfer_buf.len = lp->tx_skb->len + 1;
  744. ret = spi_async(lp->spi, &lp->tx_buf_msg);
  745. if (ret) {
  746. dev_err(printdev(lp), "SPI write Failed for TX buf\n");
  747. return ret;
  748. }
  749. return 0;
  750. }
  751. static void
  752. mcr20a_irq_clean_complete(void *context)
  753. {
  754. struct mcr20a_local *lp = context;
  755. u8 seq_state = lp->irq_data[DAR_IRQ_STS1] & DAR_PHY_CTRL1_XCVSEQ_MASK;
  756. dev_dbg(printdev(lp), "%s\n", __func__);
  757. enable_irq(lp->spi->irq);
  758. dev_dbg(printdev(lp), "IRQ STA1 (%02x) STA2 (%02x)\n",
  759. lp->irq_data[DAR_IRQ_STS1], lp->irq_data[DAR_IRQ_STS2]);
  760. switch (seq_state) {
  761. /* TX IRQ, RX IRQ and SEQ IRQ */
  762. case (DAR_IRQSTS1_TXIRQ | DAR_IRQSTS1_SEQIRQ):
  763. if (lp->is_tx) {
  764. lp->is_tx = 0;
  765. dev_dbg(printdev(lp), "TX is done. No ACK\n");
  766. mcr20a_handle_tx_complete(lp);
  767. }
  768. break;
  769. case (DAR_IRQSTS1_RXIRQ | DAR_IRQSTS1_SEQIRQ):
  770. /* rx is starting */
  771. dev_dbg(printdev(lp), "RX is starting\n");
  772. mcr20a_handle_rx(lp);
  773. break;
  774. case (DAR_IRQSTS1_RXIRQ | DAR_IRQSTS1_TXIRQ | DAR_IRQSTS1_SEQIRQ):
  775. if (lp->is_tx) {
  776. /* tx is done */
  777. lp->is_tx = 0;
  778. dev_dbg(printdev(lp), "TX is done. Get ACK\n");
  779. mcr20a_handle_tx_complete(lp);
  780. } else {
  781. /* rx is starting */
  782. dev_dbg(printdev(lp), "RX is starting\n");
  783. mcr20a_handle_rx(lp);
  784. }
  785. break;
  786. case (DAR_IRQSTS1_SEQIRQ):
  787. if (lp->is_tx) {
  788. dev_dbg(printdev(lp), "TX is starting\n");
  789. mcr20a_handle_tx(lp);
  790. } else {
  791. dev_dbg(printdev(lp), "MCR20A is stop\n");
  792. }
  793. break;
  794. }
  795. }
  796. static void mcr20a_irq_status_complete(void *context)
  797. {
  798. int ret;
  799. struct mcr20a_local *lp = context;
  800. dev_dbg(printdev(lp), "%s\n", __func__);
  801. regmap_update_bits_async(lp->regmap_dar, DAR_PHY_CTRL1,
  802. DAR_PHY_CTRL1_XCVSEQ_MASK, MCR20A_XCVSEQ_IDLE);
  803. lp->reg_msg.complete = mcr20a_irq_clean_complete;
  804. lp->reg_cmd[0] = MCR20A_WRITE_REG(DAR_IRQ_STS1);
  805. memcpy(lp->reg_data, lp->irq_data, MCR20A_IRQSTS_NUM);
  806. lp->reg_xfer_data.len = MCR20A_IRQSTS_NUM;
  807. ret = spi_async(lp->spi, &lp->reg_msg);
  808. if (ret)
  809. dev_err(printdev(lp), "failed to clean irq status\n");
  810. }
  811. static irqreturn_t mcr20a_irq_isr(int irq, void *data)
  812. {
  813. struct mcr20a_local *lp = data;
  814. int ret;
  815. disable_irq_nosync(irq);
  816. lp->irq_header[0] = MCR20A_READ_REG(DAR_IRQ_STS1);
  817. /* read IRQSTSx */
  818. ret = spi_async(lp->spi, &lp->irq_msg);
  819. if (ret) {
  820. enable_irq(irq);
  821. return IRQ_NONE;
  822. }
  823. return IRQ_HANDLED;
  824. }
  825. static void mcr20a_hw_setup(struct mcr20a_local *lp)
  826. {
  827. u8 i;
  828. struct ieee802154_hw *hw = lp->hw;
  829. struct wpan_phy *phy = lp->hw->phy;
  830. dev_dbg(printdev(lp), "%s\n", __func__);
  831. hw->flags = IEEE802154_HW_TX_OMIT_CKSUM |
  832. IEEE802154_HW_AFILT |
  833. IEEE802154_HW_PROMISCUOUS;
  834. phy->flags = WPAN_PHY_FLAG_TXPOWER | WPAN_PHY_FLAG_CCA_ED_LEVEL |
  835. WPAN_PHY_FLAG_CCA_MODE;
  836. phy->supported.cca_modes = BIT(NL802154_CCA_ENERGY) |
  837. BIT(NL802154_CCA_CARRIER) | BIT(NL802154_CCA_ENERGY_CARRIER);
  838. phy->supported.cca_opts = BIT(NL802154_CCA_OPT_ENERGY_CARRIER_AND) |
  839. BIT(NL802154_CCA_OPT_ENERGY_CARRIER_OR);
  840. /* initiating cca_ed_levels */
  841. for (i = MCR20A_MAX_CCA_THRESHOLD; i < MCR20A_MIN_CCA_THRESHOLD + 1;
  842. ++i) {
  843. mcr20a_ed_levels[i] = -i * 100;
  844. }
  845. phy->supported.cca_ed_levels = mcr20a_ed_levels;
  846. phy->supported.cca_ed_levels_size = ARRAY_SIZE(mcr20a_ed_levels);
  847. phy->cca.mode = NL802154_CCA_ENERGY;
  848. phy->supported.channels[0] = MCR20A_VALID_CHANNELS;
  849. phy->current_page = 0;
  850. /* MCR20A default reset value */
  851. phy->current_channel = 20;
  852. phy->supported.tx_powers = mcr20a_powers;
  853. phy->supported.tx_powers_size = ARRAY_SIZE(mcr20a_powers);
  854. phy->cca_ed_level = phy->supported.cca_ed_levels[75];
  855. phy->transmit_power = phy->supported.tx_powers[0x0F];
  856. }
  857. static void
  858. mcr20a_setup_tx_spi_messages(struct mcr20a_local *lp)
  859. {
  860. spi_message_init(&lp->tx_buf_msg);
  861. lp->tx_buf_msg.context = lp;
  862. lp->tx_buf_msg.complete = mcr20a_write_tx_buf_complete;
  863. lp->tx_xfer_header.len = 1;
  864. lp->tx_xfer_header.tx_buf = lp->tx_header;
  865. lp->tx_xfer_len.len = 1;
  866. lp->tx_xfer_len.tx_buf = lp->tx_len;
  867. spi_message_add_tail(&lp->tx_xfer_header, &lp->tx_buf_msg);
  868. spi_message_add_tail(&lp->tx_xfer_len, &lp->tx_buf_msg);
  869. spi_message_add_tail(&lp->tx_xfer_buf, &lp->tx_buf_msg);
  870. }
  871. static void
  872. mcr20a_setup_rx_spi_messages(struct mcr20a_local *lp)
  873. {
  874. spi_message_init(&lp->reg_msg);
  875. lp->reg_msg.context = lp;
  876. lp->reg_xfer_cmd.len = 1;
  877. lp->reg_xfer_cmd.tx_buf = lp->reg_cmd;
  878. lp->reg_xfer_cmd.rx_buf = lp->reg_cmd;
  879. lp->reg_xfer_data.rx_buf = lp->reg_data;
  880. lp->reg_xfer_data.tx_buf = lp->reg_data;
  881. spi_message_add_tail(&lp->reg_xfer_cmd, &lp->reg_msg);
  882. spi_message_add_tail(&lp->reg_xfer_data, &lp->reg_msg);
  883. spi_message_init(&lp->rx_buf_msg);
  884. lp->rx_buf_msg.context = lp;
  885. lp->rx_buf_msg.complete = mcr20a_handle_rx_read_buf_complete;
  886. lp->rx_xfer_header.len = 1;
  887. lp->rx_xfer_header.tx_buf = lp->rx_header;
  888. lp->rx_xfer_header.rx_buf = lp->rx_header;
  889. lp->rx_xfer_buf.rx_buf = lp->rx_buf;
  890. lp->rx_xfer_lqi.len = 1;
  891. lp->rx_xfer_lqi.rx_buf = lp->rx_lqi;
  892. spi_message_add_tail(&lp->rx_xfer_header, &lp->rx_buf_msg);
  893. spi_message_add_tail(&lp->rx_xfer_buf, &lp->rx_buf_msg);
  894. spi_message_add_tail(&lp->rx_xfer_lqi, &lp->rx_buf_msg);
  895. }
  896. static void
  897. mcr20a_setup_irq_spi_messages(struct mcr20a_local *lp)
  898. {
  899. spi_message_init(&lp->irq_msg);
  900. lp->irq_msg.context = lp;
  901. lp->irq_msg.complete = mcr20a_irq_status_complete;
  902. lp->irq_xfer_header.len = 1;
  903. lp->irq_xfer_header.tx_buf = lp->irq_header;
  904. lp->irq_xfer_header.rx_buf = lp->irq_header;
  905. lp->irq_xfer_data.len = MCR20A_IRQSTS_NUM;
  906. lp->irq_xfer_data.rx_buf = lp->irq_data;
  907. spi_message_add_tail(&lp->irq_xfer_header, &lp->irq_msg);
  908. spi_message_add_tail(&lp->irq_xfer_data, &lp->irq_msg);
  909. }
  910. static int
  911. mcr20a_phy_init(struct mcr20a_local *lp)
  912. {
  913. u8 index;
  914. unsigned int phy_reg = 0;
  915. int ret;
  916. dev_dbg(printdev(lp), "%s\n", __func__);
  917. /* Disable Tristate on COCO MISO for SPI reads */
  918. ret = regmap_write(lp->regmap_iar, IAR_MISC_PAD_CTRL, 0x02);
  919. if (ret)
  920. goto err_ret;
  921. /* Clear all PP IRQ bits in IRQSTS1 to avoid unexpected interrupts
  922. * immediately after init
  923. */
  924. ret = regmap_write(lp->regmap_dar, DAR_IRQ_STS1, 0xEF);
  925. if (ret)
  926. goto err_ret;
  927. /* Clear all PP IRQ bits in IRQSTS2 */
  928. ret = regmap_write(lp->regmap_dar, DAR_IRQ_STS2,
  929. DAR_IRQSTS2_ASM_IRQ | DAR_IRQSTS2_PB_ERR_IRQ |
  930. DAR_IRQSTS2_WAKE_IRQ);
  931. if (ret)
  932. goto err_ret;
  933. /* Disable all timer interrupts */
  934. ret = regmap_write(lp->regmap_dar, DAR_IRQ_STS3, 0xFF);
  935. if (ret)
  936. goto err_ret;
  937. /* PHY_CTRL1 : default HW settings + AUTOACK enabled */
  938. ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL1,
  939. DAR_PHY_CTRL1_AUTOACK, DAR_PHY_CTRL1_AUTOACK);
  940. /* PHY_CTRL2 : disable all interrupts */
  941. ret = regmap_write(lp->regmap_dar, DAR_PHY_CTRL2, 0xFF);
  942. if (ret)
  943. goto err_ret;
  944. /* PHY_CTRL3 : disable all timers and remaining interrupts */
  945. ret = regmap_write(lp->regmap_dar, DAR_PHY_CTRL3,
  946. DAR_PHY_CTRL3_ASM_MSK | DAR_PHY_CTRL3_PB_ERR_MSK |
  947. DAR_PHY_CTRL3_WAKE_MSK);
  948. if (ret)
  949. goto err_ret;
  950. /* SRC_CTRL : enable Acknowledge Frame Pending and
  951. * Source Address Matching Enable
  952. */
  953. ret = regmap_write(lp->regmap_dar, DAR_SRC_CTRL,
  954. DAR_SRC_CTRL_ACK_FRM_PND |
  955. (DAR_SRC_CTRL_INDEX << DAR_SRC_CTRL_INDEX_SHIFT));
  956. if (ret)
  957. goto err_ret;
  958. /* RX_FRAME_FILTER */
  959. /* FRM_VER[1:0] = b11. Accept FrameVersion 0 and 1 packets */
  960. ret = regmap_write(lp->regmap_iar, IAR_RX_FRAME_FILTER,
  961. IAR_RX_FRAME_FLT_FRM_VER |
  962. IAR_RX_FRAME_FLT_BEACON_FT |
  963. IAR_RX_FRAME_FLT_DATA_FT |
  964. IAR_RX_FRAME_FLT_CMD_FT);
  965. if (ret)
  966. goto err_ret;
  967. dev_info(printdev(lp), "MCR20A DAR overwrites version: 0x%02x\n",
  968. MCR20A_OVERWRITE_VERSION);
  969. /* Overwrites direct registers */
  970. ret = regmap_write(lp->regmap_dar, DAR_OVERWRITE_VER,
  971. MCR20A_OVERWRITE_VERSION);
  972. if (ret)
  973. goto err_ret;
  974. /* Overwrites indirect registers */
  975. ret = regmap_multi_reg_write(lp->regmap_iar, mar20a_iar_overwrites,
  976. ARRAY_SIZE(mar20a_iar_overwrites));
  977. if (ret)
  978. goto err_ret;
  979. /* Clear HW indirect queue */
  980. dev_dbg(printdev(lp), "clear HW indirect queue\n");
  981. for (index = 0; index < MCR20A_PHY_INDIRECT_QUEUE_SIZE; index++) {
  982. phy_reg = (u8)(((index & DAR_SRC_CTRL_INDEX) <<
  983. DAR_SRC_CTRL_INDEX_SHIFT)
  984. | (DAR_SRC_CTRL_SRCADDR_EN)
  985. | (DAR_SRC_CTRL_INDEX_DISABLE));
  986. ret = regmap_write(lp->regmap_dar, DAR_SRC_CTRL, phy_reg);
  987. if (ret)
  988. goto err_ret;
  989. phy_reg = 0;
  990. }
  991. /* Assign HW Indirect hash table to PAN0 */
  992. ret = regmap_read(lp->regmap_iar, IAR_DUAL_PAN_CTRL, &phy_reg);
  993. if (ret)
  994. goto err_ret;
  995. /* Clear current lvl */
  996. phy_reg &= ~IAR_DUAL_PAN_CTRL_DUAL_PAN_SAM_LVL_MSK;
  997. /* Set new lvl */
  998. phy_reg |= MCR20A_PHY_INDIRECT_QUEUE_SIZE <<
  999. IAR_DUAL_PAN_CTRL_DUAL_PAN_SAM_LVL_SHIFT;
  1000. ret = regmap_write(lp->regmap_iar, IAR_DUAL_PAN_CTRL, phy_reg);
  1001. if (ret)
  1002. goto err_ret;
  1003. /* Set CCA threshold to -75 dBm */
  1004. ret = regmap_write(lp->regmap_iar, IAR_CCA1_THRESH, 0x4B);
  1005. if (ret)
  1006. goto err_ret;
  1007. /* Set prescaller to obtain 1 symbol (16us) timebase */
  1008. ret = regmap_write(lp->regmap_iar, IAR_TMR_PRESCALE, 0x05);
  1009. if (ret)
  1010. goto err_ret;
  1011. /* Enable autodoze mode. */
  1012. ret = regmap_update_bits(lp->regmap_dar, DAR_PWR_MODES,
  1013. DAR_PWR_MODES_AUTODOZE,
  1014. DAR_PWR_MODES_AUTODOZE);
  1015. if (ret)
  1016. goto err_ret;
  1017. /* Disable clk_out */
  1018. ret = regmap_update_bits(lp->regmap_dar, DAR_CLK_OUT_CTRL,
  1019. DAR_CLK_OUT_CTRL_EN, 0x0);
  1020. if (ret)
  1021. goto err_ret;
  1022. return 0;
  1023. err_ret:
  1024. return ret;
  1025. }
  1026. static int
  1027. mcr20a_probe(struct spi_device *spi)
  1028. {
  1029. struct ieee802154_hw *hw;
  1030. struct mcr20a_local *lp;
  1031. struct gpio_desc *rst_b;
  1032. int irq_type;
  1033. int ret = -ENOMEM;
  1034. dev_dbg(&spi->dev, "%s\n", __func__);
  1035. if (!spi->irq) {
  1036. dev_err(&spi->dev, "no IRQ specified\n");
  1037. return -EINVAL;
  1038. }
  1039. rst_b = devm_gpiod_get(&spi->dev, "rst_b", GPIOD_OUT_HIGH);
  1040. if (IS_ERR(rst_b)) {
  1041. ret = PTR_ERR(rst_b);
  1042. if (ret != -EPROBE_DEFER)
  1043. dev_err(&spi->dev, "Failed to get 'rst_b' gpio: %d", ret);
  1044. return ret;
  1045. }
  1046. /* reset mcr20a */
  1047. usleep_range(10, 20);
  1048. gpiod_set_value_cansleep(rst_b, 1);
  1049. usleep_range(10, 20);
  1050. gpiod_set_value_cansleep(rst_b, 0);
  1051. usleep_range(120, 240);
  1052. /* allocate ieee802154_hw and private data */
  1053. hw = ieee802154_alloc_hw(sizeof(*lp), &mcr20a_hw_ops);
  1054. if (!hw) {
  1055. dev_crit(&spi->dev, "ieee802154_alloc_hw failed\n");
  1056. return ret;
  1057. }
  1058. /* init mcr20a local data */
  1059. lp = hw->priv;
  1060. lp->hw = hw;
  1061. lp->spi = spi;
  1062. /* init ieee802154_hw */
  1063. hw->parent = &spi->dev;
  1064. ieee802154_random_extended_addr(&hw->phy->perm_extended_addr);
  1065. /* init buf */
  1066. lp->buf = devm_kzalloc(&spi->dev, SPI_COMMAND_BUFFER, GFP_KERNEL);
  1067. if (!lp->buf) {
  1068. ret = -ENOMEM;
  1069. goto free_dev;
  1070. }
  1071. mcr20a_setup_tx_spi_messages(lp);
  1072. mcr20a_setup_rx_spi_messages(lp);
  1073. mcr20a_setup_irq_spi_messages(lp);
  1074. /* setup regmap */
  1075. lp->regmap_dar = devm_regmap_init_spi(spi, &mcr20a_dar_regmap);
  1076. if (IS_ERR(lp->regmap_dar)) {
  1077. ret = PTR_ERR(lp->regmap_dar);
  1078. dev_err(&spi->dev, "Failed to allocate dar map: %d\n",
  1079. ret);
  1080. goto free_dev;
  1081. }
  1082. lp->regmap_iar = devm_regmap_init_spi(spi, &mcr20a_iar_regmap);
  1083. if (IS_ERR(lp->regmap_iar)) {
  1084. ret = PTR_ERR(lp->regmap_iar);
  1085. dev_err(&spi->dev, "Failed to allocate iar map: %d\n", ret);
  1086. goto free_dev;
  1087. }
  1088. mcr20a_hw_setup(lp);
  1089. spi_set_drvdata(spi, lp);
  1090. ret = mcr20a_phy_init(lp);
  1091. if (ret < 0) {
  1092. dev_crit(&spi->dev, "mcr20a_phy_init failed\n");
  1093. goto free_dev;
  1094. }
  1095. irq_type = irq_get_trigger_type(spi->irq);
  1096. if (!irq_type)
  1097. irq_type = IRQF_TRIGGER_FALLING;
  1098. ret = devm_request_irq(&spi->dev, spi->irq, mcr20a_irq_isr,
  1099. irq_type, dev_name(&spi->dev), lp);
  1100. if (ret) {
  1101. dev_err(&spi->dev, "could not request_irq for mcr20a\n");
  1102. ret = -ENODEV;
  1103. goto free_dev;
  1104. }
  1105. /* disable_irq by default and wait for starting hardware */
  1106. disable_irq(spi->irq);
  1107. ret = ieee802154_register_hw(hw);
  1108. if (ret) {
  1109. dev_crit(&spi->dev, "ieee802154_register_hw failed\n");
  1110. goto free_dev;
  1111. }
  1112. return ret;
  1113. free_dev:
  1114. ieee802154_free_hw(lp->hw);
  1115. return ret;
  1116. }
  1117. static void mcr20a_remove(struct spi_device *spi)
  1118. {
  1119. struct mcr20a_local *lp = spi_get_drvdata(spi);
  1120. dev_dbg(&spi->dev, "%s\n", __func__);
  1121. ieee802154_unregister_hw(lp->hw);
  1122. ieee802154_free_hw(lp->hw);
  1123. }
  1124. static const struct of_device_id mcr20a_of_match[] = {
  1125. { .compatible = "nxp,mcr20a", },
  1126. { },
  1127. };
  1128. MODULE_DEVICE_TABLE(of, mcr20a_of_match);
  1129. static const struct spi_device_id mcr20a_device_id[] = {
  1130. { .name = "mcr20a", },
  1131. { },
  1132. };
  1133. MODULE_DEVICE_TABLE(spi, mcr20a_device_id);
  1134. static struct spi_driver mcr20a_driver = {
  1135. .id_table = mcr20a_device_id,
  1136. .driver = {
  1137. .of_match_table = of_match_ptr(mcr20a_of_match),
  1138. .name = "mcr20a",
  1139. },
  1140. .probe = mcr20a_probe,
  1141. .remove = mcr20a_remove,
  1142. };
  1143. module_spi_driver(mcr20a_driver);
  1144. MODULE_DESCRIPTION("MCR20A Transceiver Driver");
  1145. MODULE_LICENSE("GPL v2");
  1146. MODULE_AUTHOR("Xue Liu <liuxuenetmail@gmail>");