adrf6780.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * ADRF6780 driver
  4. *
  5. * Copyright 2021 Analog Devices Inc.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/bits.h>
  9. #include <linux/clk.h>
  10. #include <linux/clkdev.h>
  11. #include <linux/clk-provider.h>
  12. #include <linux/delay.h>
  13. #include <linux/device.h>
  14. #include <linux/iio/iio.h>
  15. #include <linux/module.h>
  16. #include <linux/mod_devicetable.h>
  17. #include <linux/spi/spi.h>
  18. #include <asm/unaligned.h>
  19. /* ADRF6780 Register Map */
  20. #define ADRF6780_REG_CONTROL 0x00
  21. #define ADRF6780_REG_ALARM_READBACK 0x01
  22. #define ADRF6780_REG_ALARM_MASKS 0x02
  23. #define ADRF6780_REG_ENABLE 0x03
  24. #define ADRF6780_REG_LINEARIZE 0x04
  25. #define ADRF6780_REG_LO_PATH 0x05
  26. #define ADRF6780_REG_ADC_CONTROL 0x06
  27. #define ADRF6780_REG_ADC_OUTPUT 0x0C
  28. /* ADRF6780_REG_CONTROL Map */
  29. #define ADRF6780_PARITY_EN_MSK BIT(15)
  30. #define ADRF6780_SOFT_RESET_MSK BIT(14)
  31. #define ADRF6780_CHIP_ID_MSK GENMASK(11, 4)
  32. #define ADRF6780_CHIP_ID 0xA
  33. #define ADRF6780_CHIP_REVISION_MSK GENMASK(3, 0)
  34. /* ADRF6780_REG_ALARM_READBACK Map */
  35. #define ADRF6780_PARITY_ERROR_MSK BIT(15)
  36. #define ADRF6780_TOO_FEW_ERRORS_MSK BIT(14)
  37. #define ADRF6780_TOO_MANY_ERRORS_MSK BIT(13)
  38. #define ADRF6780_ADDRESS_RANGE_ERROR_MSK BIT(12)
  39. /* ADRF6780_REG_ENABLE Map */
  40. #define ADRF6780_VGA_BUFFER_EN_MSK BIT(8)
  41. #define ADRF6780_DETECTOR_EN_MSK BIT(7)
  42. #define ADRF6780_LO_BUFFER_EN_MSK BIT(6)
  43. #define ADRF6780_IF_MODE_EN_MSK BIT(5)
  44. #define ADRF6780_IQ_MODE_EN_MSK BIT(4)
  45. #define ADRF6780_LO_X2_EN_MSK BIT(3)
  46. #define ADRF6780_LO_PPF_EN_MSK BIT(2)
  47. #define ADRF6780_LO_EN_MSK BIT(1)
  48. #define ADRF6780_UC_BIAS_EN_MSK BIT(0)
  49. /* ADRF6780_REG_LINEARIZE Map */
  50. #define ADRF6780_RDAC_LINEARIZE_MSK GENMASK(7, 0)
  51. /* ADRF6780_REG_LO_PATH Map */
  52. #define ADRF6780_LO_SIDEBAND_MSK BIT(10)
  53. #define ADRF6780_Q_PATH_PHASE_ACCURACY_MSK GENMASK(7, 4)
  54. #define ADRF6780_I_PATH_PHASE_ACCURACY_MSK GENMASK(3, 0)
  55. /* ADRF6780_REG_ADC_CONTROL Map */
  56. #define ADRF6780_VDET_OUTPUT_SELECT_MSK BIT(3)
  57. #define ADRF6780_ADC_START_MSK BIT(2)
  58. #define ADRF6780_ADC_EN_MSK BIT(1)
  59. #define ADRF6780_ADC_CLOCK_EN_MSK BIT(0)
  60. /* ADRF6780_REG_ADC_OUTPUT Map */
  61. #define ADRF6780_ADC_STATUS_MSK BIT(8)
  62. #define ADRF6780_ADC_VALUE_MSK GENMASK(7, 0)
  63. struct adrf6780_state {
  64. struct spi_device *spi;
  65. struct clk *clkin;
  66. /* Protect against concurrent accesses to the device */
  67. struct mutex lock;
  68. bool vga_buff_en;
  69. bool lo_buff_en;
  70. bool if_mode_en;
  71. bool iq_mode_en;
  72. bool lo_x2_en;
  73. bool lo_ppf_en;
  74. bool lo_en;
  75. bool uc_bias_en;
  76. bool lo_sideband;
  77. bool vdet_out_en;
  78. u8 data[3] __aligned(IIO_DMA_MINALIGN);
  79. };
  80. static int __adrf6780_spi_read(struct adrf6780_state *st, unsigned int reg,
  81. unsigned int *val)
  82. {
  83. int ret;
  84. struct spi_transfer t = {0};
  85. st->data[0] = 0x80 | (reg << 1);
  86. st->data[1] = 0x0;
  87. st->data[2] = 0x0;
  88. t.rx_buf = &st->data[0];
  89. t.tx_buf = &st->data[0];
  90. t.len = 3;
  91. ret = spi_sync_transfer(st->spi, &t, 1);
  92. if (ret)
  93. return ret;
  94. *val = (get_unaligned_be24(&st->data[0]) >> 1) & GENMASK(15, 0);
  95. return ret;
  96. }
  97. static int adrf6780_spi_read(struct adrf6780_state *st, unsigned int reg,
  98. unsigned int *val)
  99. {
  100. int ret;
  101. mutex_lock(&st->lock);
  102. ret = __adrf6780_spi_read(st, reg, val);
  103. mutex_unlock(&st->lock);
  104. return ret;
  105. }
  106. static int __adrf6780_spi_write(struct adrf6780_state *st,
  107. unsigned int reg,
  108. unsigned int val)
  109. {
  110. put_unaligned_be24((val << 1) | (reg << 17), &st->data[0]);
  111. return spi_write(st->spi, &st->data[0], 3);
  112. }
  113. static int adrf6780_spi_write(struct adrf6780_state *st, unsigned int reg,
  114. unsigned int val)
  115. {
  116. int ret;
  117. mutex_lock(&st->lock);
  118. ret = __adrf6780_spi_write(st, reg, val);
  119. mutex_unlock(&st->lock);
  120. return ret;
  121. }
  122. static int __adrf6780_spi_update_bits(struct adrf6780_state *st,
  123. unsigned int reg, unsigned int mask,
  124. unsigned int val)
  125. {
  126. int ret;
  127. unsigned int data, temp;
  128. ret = __adrf6780_spi_read(st, reg, &data);
  129. if (ret)
  130. return ret;
  131. temp = (data & ~mask) | (val & mask);
  132. return __adrf6780_spi_write(st, reg, temp);
  133. }
  134. static int adrf6780_spi_update_bits(struct adrf6780_state *st, unsigned int reg,
  135. unsigned int mask, unsigned int val)
  136. {
  137. int ret;
  138. mutex_lock(&st->lock);
  139. ret = __adrf6780_spi_update_bits(st, reg, mask, val);
  140. mutex_unlock(&st->lock);
  141. return ret;
  142. }
  143. static int adrf6780_read_adc_raw(struct adrf6780_state *st, unsigned int *read_val)
  144. {
  145. int ret;
  146. mutex_lock(&st->lock);
  147. ret = __adrf6780_spi_update_bits(st, ADRF6780_REG_ADC_CONTROL,
  148. ADRF6780_ADC_EN_MSK |
  149. ADRF6780_ADC_CLOCK_EN_MSK |
  150. ADRF6780_ADC_START_MSK,
  151. FIELD_PREP(ADRF6780_ADC_EN_MSK, 1) |
  152. FIELD_PREP(ADRF6780_ADC_CLOCK_EN_MSK, 1) |
  153. FIELD_PREP(ADRF6780_ADC_START_MSK, 1));
  154. if (ret)
  155. goto exit;
  156. /* Recommended delay for the ADC to be ready*/
  157. usleep_range(200, 250);
  158. ret = __adrf6780_spi_read(st, ADRF6780_REG_ADC_OUTPUT, read_val);
  159. if (ret)
  160. goto exit;
  161. if (!(*read_val & ADRF6780_ADC_STATUS_MSK)) {
  162. ret = -EINVAL;
  163. goto exit;
  164. }
  165. ret = __adrf6780_spi_update_bits(st, ADRF6780_REG_ADC_CONTROL,
  166. ADRF6780_ADC_START_MSK,
  167. FIELD_PREP(ADRF6780_ADC_START_MSK, 0));
  168. if (ret)
  169. goto exit;
  170. ret = __adrf6780_spi_read(st, ADRF6780_REG_ADC_OUTPUT, read_val);
  171. exit:
  172. mutex_unlock(&st->lock);
  173. return ret;
  174. }
  175. static int adrf6780_read_raw(struct iio_dev *indio_dev,
  176. struct iio_chan_spec const *chan,
  177. int *val, int *val2, long info)
  178. {
  179. struct adrf6780_state *dev = iio_priv(indio_dev);
  180. unsigned int data;
  181. int ret;
  182. switch (info) {
  183. case IIO_CHAN_INFO_RAW:
  184. ret = adrf6780_read_adc_raw(dev, &data);
  185. if (ret)
  186. return ret;
  187. *val = data & ADRF6780_ADC_VALUE_MSK;
  188. return IIO_VAL_INT;
  189. case IIO_CHAN_INFO_SCALE:
  190. ret = adrf6780_spi_read(dev, ADRF6780_REG_LINEARIZE, &data);
  191. if (ret)
  192. return ret;
  193. *val = data & ADRF6780_RDAC_LINEARIZE_MSK;
  194. return IIO_VAL_INT;
  195. case IIO_CHAN_INFO_PHASE:
  196. ret = adrf6780_spi_read(dev, ADRF6780_REG_LO_PATH, &data);
  197. if (ret)
  198. return ret;
  199. switch (chan->channel2) {
  200. case IIO_MOD_I:
  201. *val = data & ADRF6780_I_PATH_PHASE_ACCURACY_MSK;
  202. return IIO_VAL_INT;
  203. case IIO_MOD_Q:
  204. *val = FIELD_GET(ADRF6780_Q_PATH_PHASE_ACCURACY_MSK,
  205. data);
  206. return IIO_VAL_INT;
  207. default:
  208. return -EINVAL;
  209. }
  210. default:
  211. return -EINVAL;
  212. }
  213. }
  214. static int adrf6780_write_raw(struct iio_dev *indio_dev,
  215. struct iio_chan_spec const *chan,
  216. int val, int val2, long info)
  217. {
  218. struct adrf6780_state *st = iio_priv(indio_dev);
  219. switch (info) {
  220. case IIO_CHAN_INFO_SCALE:
  221. return adrf6780_spi_write(st, ADRF6780_REG_LINEARIZE, val);
  222. case IIO_CHAN_INFO_PHASE:
  223. switch (chan->channel2) {
  224. case IIO_MOD_I:
  225. return adrf6780_spi_update_bits(st,
  226. ADRF6780_REG_LO_PATH,
  227. ADRF6780_I_PATH_PHASE_ACCURACY_MSK,
  228. FIELD_PREP(ADRF6780_I_PATH_PHASE_ACCURACY_MSK, val));
  229. case IIO_MOD_Q:
  230. return adrf6780_spi_update_bits(st,
  231. ADRF6780_REG_LO_PATH,
  232. ADRF6780_Q_PATH_PHASE_ACCURACY_MSK,
  233. FIELD_PREP(ADRF6780_Q_PATH_PHASE_ACCURACY_MSK, val));
  234. default:
  235. return -EINVAL;
  236. }
  237. default:
  238. return -EINVAL;
  239. }
  240. }
  241. static int adrf6780_reg_access(struct iio_dev *indio_dev,
  242. unsigned int reg,
  243. unsigned int write_val,
  244. unsigned int *read_val)
  245. {
  246. struct adrf6780_state *st = iio_priv(indio_dev);
  247. if (read_val)
  248. return adrf6780_spi_read(st, reg, read_val);
  249. else
  250. return adrf6780_spi_write(st, reg, write_val);
  251. }
  252. static const struct iio_info adrf6780_info = {
  253. .read_raw = adrf6780_read_raw,
  254. .write_raw = adrf6780_write_raw,
  255. .debugfs_reg_access = &adrf6780_reg_access,
  256. };
  257. #define ADRF6780_CHAN_ADC(_channel) { \
  258. .type = IIO_ALTVOLTAGE, \
  259. .output = 0, \
  260. .indexed = 1, \
  261. .channel = _channel, \
  262. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) \
  263. }
  264. #define ADRF6780_CHAN_RDAC(_channel) { \
  265. .type = IIO_ALTVOLTAGE, \
  266. .output = 1, \
  267. .indexed = 1, \
  268. .channel = _channel, \
  269. .info_mask_separate = BIT(IIO_CHAN_INFO_SCALE) \
  270. }
  271. #define ADRF6780_CHAN_IQ_PHASE(_channel, rf_comp) { \
  272. .type = IIO_ALTVOLTAGE, \
  273. .modified = 1, \
  274. .output = 1, \
  275. .indexed = 1, \
  276. .channel2 = IIO_MOD_##rf_comp, \
  277. .channel = _channel, \
  278. .info_mask_separate = BIT(IIO_CHAN_INFO_PHASE) \
  279. }
  280. static const struct iio_chan_spec adrf6780_channels[] = {
  281. ADRF6780_CHAN_ADC(0),
  282. ADRF6780_CHAN_RDAC(0),
  283. ADRF6780_CHAN_IQ_PHASE(0, I),
  284. ADRF6780_CHAN_IQ_PHASE(0, Q),
  285. };
  286. static int adrf6780_reset(struct adrf6780_state *st)
  287. {
  288. int ret;
  289. struct spi_device *spi = st->spi;
  290. ret = __adrf6780_spi_update_bits(st, ADRF6780_REG_CONTROL,
  291. ADRF6780_SOFT_RESET_MSK,
  292. FIELD_PREP(ADRF6780_SOFT_RESET_MSK, 1));
  293. if (ret) {
  294. dev_err(&spi->dev, "ADRF6780 SPI software reset failed.\n");
  295. return ret;
  296. }
  297. ret = __adrf6780_spi_update_bits(st, ADRF6780_REG_CONTROL,
  298. ADRF6780_SOFT_RESET_MSK,
  299. FIELD_PREP(ADRF6780_SOFT_RESET_MSK, 0));
  300. if (ret) {
  301. dev_err(&spi->dev, "ADRF6780 SPI software reset disable failed.\n");
  302. return ret;
  303. }
  304. return 0;
  305. }
  306. static int adrf6780_init(struct adrf6780_state *st)
  307. {
  308. int ret;
  309. unsigned int chip_id, enable_reg, enable_reg_msk;
  310. struct spi_device *spi = st->spi;
  311. /* Perform a software reset */
  312. ret = adrf6780_reset(st);
  313. if (ret)
  314. return ret;
  315. ret = __adrf6780_spi_read(st, ADRF6780_REG_CONTROL, &chip_id);
  316. if (ret)
  317. return ret;
  318. chip_id = FIELD_GET(ADRF6780_CHIP_ID_MSK, chip_id);
  319. if (chip_id != ADRF6780_CHIP_ID) {
  320. dev_err(&spi->dev, "ADRF6780 Invalid Chip ID.\n");
  321. return -EINVAL;
  322. }
  323. enable_reg_msk = ADRF6780_VGA_BUFFER_EN_MSK |
  324. ADRF6780_DETECTOR_EN_MSK |
  325. ADRF6780_LO_BUFFER_EN_MSK |
  326. ADRF6780_IF_MODE_EN_MSK |
  327. ADRF6780_IQ_MODE_EN_MSK |
  328. ADRF6780_LO_X2_EN_MSK |
  329. ADRF6780_LO_PPF_EN_MSK |
  330. ADRF6780_LO_EN_MSK |
  331. ADRF6780_UC_BIAS_EN_MSK;
  332. enable_reg = FIELD_PREP(ADRF6780_VGA_BUFFER_EN_MSK, st->vga_buff_en) |
  333. FIELD_PREP(ADRF6780_DETECTOR_EN_MSK, 1) |
  334. FIELD_PREP(ADRF6780_LO_BUFFER_EN_MSK, st->lo_buff_en) |
  335. FIELD_PREP(ADRF6780_IF_MODE_EN_MSK, st->if_mode_en) |
  336. FIELD_PREP(ADRF6780_IQ_MODE_EN_MSK, st->iq_mode_en) |
  337. FIELD_PREP(ADRF6780_LO_X2_EN_MSK, st->lo_x2_en) |
  338. FIELD_PREP(ADRF6780_LO_PPF_EN_MSK, st->lo_ppf_en) |
  339. FIELD_PREP(ADRF6780_LO_EN_MSK, st->lo_en) |
  340. FIELD_PREP(ADRF6780_UC_BIAS_EN_MSK, st->uc_bias_en);
  341. ret = __adrf6780_spi_update_bits(st, ADRF6780_REG_ENABLE,
  342. enable_reg_msk, enable_reg);
  343. if (ret)
  344. return ret;
  345. ret = __adrf6780_spi_update_bits(st, ADRF6780_REG_LO_PATH,
  346. ADRF6780_LO_SIDEBAND_MSK,
  347. FIELD_PREP(ADRF6780_LO_SIDEBAND_MSK, st->lo_sideband));
  348. if (ret)
  349. return ret;
  350. return __adrf6780_spi_update_bits(st, ADRF6780_REG_ADC_CONTROL,
  351. ADRF6780_VDET_OUTPUT_SELECT_MSK,
  352. FIELD_PREP(ADRF6780_VDET_OUTPUT_SELECT_MSK, st->vdet_out_en));
  353. }
  354. static void adrf6780_properties_parse(struct adrf6780_state *st)
  355. {
  356. struct spi_device *spi = st->spi;
  357. st->vga_buff_en = device_property_read_bool(&spi->dev, "adi,vga-buff-en");
  358. st->lo_buff_en = device_property_read_bool(&spi->dev, "adi,lo-buff-en");
  359. st->if_mode_en = device_property_read_bool(&spi->dev, "adi,if-mode-en");
  360. st->iq_mode_en = device_property_read_bool(&spi->dev, "adi,iq-mode-en");
  361. st->lo_x2_en = device_property_read_bool(&spi->dev, "adi,lo-x2-en");
  362. st->lo_ppf_en = device_property_read_bool(&spi->dev, "adi,lo-ppf-en");
  363. st->lo_en = device_property_read_bool(&spi->dev, "adi,lo-en");
  364. st->uc_bias_en = device_property_read_bool(&spi->dev, "adi,uc-bias-en");
  365. st->lo_sideband = device_property_read_bool(&spi->dev, "adi,lo-sideband");
  366. st->vdet_out_en = device_property_read_bool(&spi->dev, "adi,vdet-out-en");
  367. }
  368. static void adrf6780_powerdown(void *data)
  369. {
  370. /* Disable all components in the Enable Register */
  371. adrf6780_spi_write(data, ADRF6780_REG_ENABLE, 0x0);
  372. }
  373. static int adrf6780_probe(struct spi_device *spi)
  374. {
  375. struct iio_dev *indio_dev;
  376. struct adrf6780_state *st;
  377. int ret;
  378. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
  379. if (!indio_dev)
  380. return -ENOMEM;
  381. st = iio_priv(indio_dev);
  382. indio_dev->info = &adrf6780_info;
  383. indio_dev->name = "adrf6780";
  384. indio_dev->channels = adrf6780_channels;
  385. indio_dev->num_channels = ARRAY_SIZE(adrf6780_channels);
  386. st->spi = spi;
  387. adrf6780_properties_parse(st);
  388. st->clkin = devm_clk_get_enabled(&spi->dev, "lo_in");
  389. if (IS_ERR(st->clkin))
  390. return dev_err_probe(&spi->dev, PTR_ERR(st->clkin),
  391. "failed to get the LO input clock\n");
  392. mutex_init(&st->lock);
  393. ret = adrf6780_init(st);
  394. if (ret)
  395. return ret;
  396. ret = devm_add_action_or_reset(&spi->dev, adrf6780_powerdown, st);
  397. if (ret)
  398. return ret;
  399. return devm_iio_device_register(&spi->dev, indio_dev);
  400. }
  401. static const struct spi_device_id adrf6780_id[] = {
  402. { "adrf6780", 0 },
  403. {}
  404. };
  405. MODULE_DEVICE_TABLE(spi, adrf6780_id);
  406. static const struct of_device_id adrf6780_of_match[] = {
  407. { .compatible = "adi,adrf6780" },
  408. {}
  409. };
  410. MODULE_DEVICE_TABLE(of, adrf6780_of_match);
  411. static struct spi_driver adrf6780_driver = {
  412. .driver = {
  413. .name = "adrf6780",
  414. .of_match_table = adrf6780_of_match,
  415. },
  416. .probe = adrf6780_probe,
  417. .id_table = adrf6780_id,
  418. };
  419. module_spi_driver(adrf6780_driver);
  420. MODULE_AUTHOR("Antoniu Miclaus <[email protected]");
  421. MODULE_DESCRIPTION("Analog Devices ADRF6780");
  422. MODULE_LICENSE("GPL v2");