ad3552r.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * AD3552R Digital <-> Analog converters common header
  4. *
  5. * Copyright 2021-2024 Analog Devices Inc.
  6. * Author: Angelo Dureghello <adureghello@baylibre.com>
  7. */
  8. #ifndef __DRIVERS_IIO_DAC_AD3552R_H__
  9. #define __DRIVERS_IIO_DAC_AD3552R_H__
  10. /* Register addresses */
  11. /* Primary address space */
  12. #define AD3552R_REG_ADDR_INTERFACE_CONFIG_A 0x00
  13. #define AD3552R_MASK_SOFTWARE_RESET (BIT(7) | BIT(0))
  14. #define AD3552R_MASK_ADDR_ASCENSION BIT(5)
  15. #define AD3552R_MASK_SDO_ACTIVE BIT(4)
  16. #define AD3552R_REG_ADDR_INTERFACE_CONFIG_B 0x01
  17. #define AD3552R_MASK_SINGLE_INST BIT(7)
  18. #define AD3552R_MASK_SHORT_INSTRUCTION BIT(3)
  19. #define AD3552R_REG_ADDR_DEVICE_CONFIG 0x02
  20. #define AD3552R_MASK_DEVICE_STATUS(n) BIT(4 + (n))
  21. #define AD3552R_MASK_CUSTOM_MODES GENMASK(3, 2)
  22. #define AD3552R_MASK_OPERATING_MODES GENMASK(1, 0)
  23. #define AD3552R_REG_ADDR_CHIP_TYPE 0x03
  24. #define AD3552R_MASK_CLASS GENMASK(7, 0)
  25. #define AD3552R_REG_ADDR_PRODUCT_ID_L 0x04
  26. #define AD3552R_REG_ADDR_PRODUCT_ID_H 0x05
  27. #define AD3552R_REG_ADDR_CHIP_GRADE 0x06
  28. #define AD3552R_MASK_GRADE GENMASK(7, 4)
  29. #define AD3552R_MASK_DEVICE_REVISION GENMASK(3, 0)
  30. #define AD3552R_REG_ADDR_SCRATCH_PAD 0x0A
  31. #define AD3552R_REG_ADDR_SPI_REVISION 0x0B
  32. #define AD3552R_REG_ADDR_VENDOR_L 0x0C
  33. #define AD3552R_REG_ADDR_VENDOR_H 0x0D
  34. #define AD3552R_REG_ADDR_STREAM_MODE 0x0E
  35. #define AD3552R_MASK_LENGTH GENMASK(7, 0)
  36. #define AD3552R_REG_ADDR_TRANSFER_REGISTER 0x0F
  37. #define AD3552R_MASK_MULTI_IO_MODE GENMASK(7, 6)
  38. #define AD3552R_MASK_STREAM_LENGTH_KEEP_VALUE BIT(2)
  39. #define AD3552R_REG_ADDR_INTERFACE_CONFIG_C 0x10
  40. #define AD3552R_MASK_CRC_ENABLE \
  41. (GENMASK(7, 6) | GENMASK(1, 0))
  42. #define AD3552R_MASK_STRICT_REGISTER_ACCESS BIT(5)
  43. #define AD3552R_REG_ADDR_INTERFACE_STATUS_A 0x11
  44. #define AD3552R_MASK_INTERFACE_NOT_READY BIT(7)
  45. #define AD3552R_MASK_CLOCK_COUNTING_ERROR BIT(5)
  46. #define AD3552R_MASK_INVALID_OR_NO_CRC BIT(3)
  47. #define AD3552R_MASK_WRITE_TO_READ_ONLY_REGISTER BIT(2)
  48. #define AD3552R_MASK_PARTIAL_REGISTER_ACCESS BIT(1)
  49. #define AD3552R_MASK_REGISTER_ADDRESS_INVALID BIT(0)
  50. #define AD3552R_REG_ADDR_INTERFACE_CONFIG_D 0x14
  51. #define AD3552R_MASK_ALERT_ENABLE_PULLUP BIT(6)
  52. #define AD3552R_MASK_MEM_CRC_EN BIT(4)
  53. #define AD3552R_MASK_SDO_DRIVE_STRENGTH GENMASK(3, 2)
  54. #define AD3552R_MASK_DUAL_SPI_SYNCHROUNOUS_EN BIT(1)
  55. #define AD3552R_MASK_SPI_CONFIG_DDR BIT(0)
  56. #define AD3552R_REG_ADDR_SH_REFERENCE_CONFIG 0x15
  57. #define AD3552R_MASK_IDUMP_FAST_MODE BIT(6)
  58. #define AD3552R_MASK_SAMPLE_HOLD_DIFF_USER_EN BIT(5)
  59. #define AD3552R_MASK_SAMPLE_HOLD_USER_TRIM GENMASK(4, 3)
  60. #define AD3552R_MASK_SAMPLE_HOLD_USER_ENABLE BIT(2)
  61. #define AD3552R_MASK_REFERENCE_VOLTAGE_SEL GENMASK(1, 0)
  62. #define AD3552R_REG_ADDR_ERR_ALARM_MASK 0x16
  63. #define AD3552R_MASK_REF_RANGE_ALARM BIT(6)
  64. #define AD3552R_MASK_CLOCK_COUNT_ERR_ALARM BIT(5)
  65. #define AD3552R_MASK_MEM_CRC_ERR_ALARM BIT(4)
  66. #define AD3552R_MASK_SPI_CRC_ERR_ALARM BIT(3)
  67. #define AD3552R_MASK_WRITE_TO_READ_ONLY_ALARM BIT(2)
  68. #define AD3552R_MASK_PARTIAL_REGISTER_ACCESS_ALARM BIT(1)
  69. #define AD3552R_MASK_REGISTER_ADDRESS_INVALID_ALARM BIT(0)
  70. #define AD3552R_REG_ADDR_ERR_STATUS 0x17
  71. #define AD3552R_MASK_REF_RANGE_ERR_STATUS BIT(6)
  72. #define AD3552R_MASK_STREAM_EXCEEDS_DAC_ERR_STATUS BIT(5)
  73. #define AD3552R_MASK_MEM_CRC_ERR_STATUS BIT(4)
  74. #define AD3552R_MASK_RESET_STATUS BIT(0)
  75. #define AD3552R_REG_ADDR_POWERDOWN_CONFIG 0x18
  76. #define AD3552R_MASK_CH_DAC_POWERDOWN(ch) BIT(4 + (ch))
  77. #define AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(ch) BIT(ch)
  78. #define AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE 0x19
  79. #define AD3552R_MASK_CH0_RANGE GENMASK(2, 0)
  80. #define AD3552R_MASK_CH1_RANGE GENMASK(6, 4)
  81. #define AD3552R_MASK_CH_OUTPUT_RANGE GENMASK(7, 0)
  82. #define AD3552R_MASK_CH_OUTPUT_RANGE_SEL(ch) \
  83. ((ch) ? GENMASK(7, 4) : GENMASK(3, 0))
  84. #define AD3552R_REG_ADDR_CH_OFFSET(ch) (0x1B + (ch) * 2)
  85. #define AD3552R_MASK_CH_OFFSET_BITS_0_7 GENMASK(7, 0)
  86. #define AD3552R_REG_ADDR_CH_GAIN(ch) (0x1C + (ch) * 2)
  87. #define AD3552R_MASK_CH_RANGE_OVERRIDE BIT(7)
  88. #define AD3552R_MASK_CH_GAIN_SCALING_N GENMASK(6, 5)
  89. #define AD3552R_MASK_CH_GAIN_SCALING_P GENMASK(4, 3)
  90. #define AD3552R_MASK_CH_OFFSET_POLARITY BIT(2)
  91. #define AD3552R_MASK_CH_OFFSET_BIT_8 BIT(8)
  92. /*
  93. * Secondary region
  94. * For multibyte registers specify the highest address because the access is
  95. * done in descending order
  96. */
  97. #define AD3552R_SECONDARY_REGION_START 0x28
  98. #define AD3552R_REG_ADDR_HW_LDAC_16B 0x28
  99. #define AD3552R_REG_ADDR_CH_DAC_16B(ch) (0x2C - (1 - (ch)) * 2)
  100. #define AD3552R_REG_ADDR_DAC_PAGE_MASK_16B 0x2E
  101. #define AD3552R_REG_ADDR_CH_SELECT_16B 0x2F
  102. #define AD3552R_REG_ADDR_INPUT_PAGE_MASK_16B 0x31
  103. #define AD3552R_REG_ADDR_SW_LDAC_16B 0x32
  104. #define AD3552R_REG_ADDR_CH_INPUT_16B(ch) (0x36 - (1 - (ch)) * 2)
  105. /* 3 bytes registers */
  106. #define AD3552R_REG_START_24B 0x37
  107. #define AD3552R_REG_ADDR_HW_LDAC_24B 0x37
  108. #define AD3552R_REG_ADDR_CH_DAC_24B(ch) (0x3D - (1 - (ch)) * 3)
  109. #define AD3552R_REG_ADDR_DAC_PAGE_MASK_24B 0x40
  110. #define AD3552R_REG_ADDR_CH_SELECT_24B 0x41
  111. #define AD3552R_REG_ADDR_INPUT_PAGE_MASK_24B 0x44
  112. #define AD3552R_REG_ADDR_SW_LDAC_24B 0x45
  113. #define AD3552R_REG_ADDR_CH_INPUT_24B(ch) (0x4B - (1 - (ch)) * 3)
  114. #define AD3552R_MAX_CH 2
  115. #define AD3552R_MASK_CH(ch) BIT(ch)
  116. #define AD3552R_MASK_ALL_CH GENMASK(1, 0)
  117. #define AD3552R_MAX_REG_SIZE 3
  118. #define AD3552R_READ_BIT BIT(7)
  119. #define AD3552R_ADDR_MASK GENMASK(6, 0)
  120. #define AD3552R_MASK_DAC_12B GENMASK(15, 4)
  121. #define AD3552R_DEFAULT_CONFIG_B_VALUE 0x8
  122. #define AD3552R_SCRATCH_PAD_TEST_VAL1 0x34
  123. #define AD3552R_SCRATCH_PAD_TEST_VAL2 0xB2
  124. #define AD3552R_GAIN_SCALE 1000
  125. #define AD3552R_LDAC_PULSE_US 100
  126. #define AD3552R_CH0_ACTIVE BIT(0)
  127. #define AD3552R_CH1_ACTIVE BIT(1)
  128. #define AD3552R_MAX_RANGES 5
  129. #define AD3542R_MAX_RANGES 5
  130. #define AD3552R_SPI 0
  131. #define AD3552R_DUAL_SPI 1
  132. #define AD3552R_QUAD_SPI 2
  133. extern const struct ad3552r_model_data ad3541r_model_data;
  134. extern const struct ad3552r_model_data ad3542r_model_data;
  135. extern const struct ad3552r_model_data ad3551r_model_data;
  136. extern const struct ad3552r_model_data ad3552r_model_data;
  137. enum ad3552r_id {
  138. AD3541R_ID = 0x400b,
  139. AD3542R_ID = 0x4009,
  140. AD3551R_ID = 0x400a,
  141. AD3552R_ID = 0x4008,
  142. };
  143. struct ad3552r_model_data {
  144. const char *model_name;
  145. enum ad3552r_id chip_id;
  146. unsigned int num_hw_channels;
  147. const s32 (*ranges_table)[2];
  148. int num_ranges;
  149. bool requires_output_range;
  150. int num_spi_data_lanes;
  151. int max_reg_addr;
  152. };
  153. struct ad3552r_ch_data {
  154. s32 scale_int;
  155. s32 scale_dec;
  156. s32 offset_int;
  157. s32 offset_dec;
  158. s16 gain_offset;
  159. u16 rfb;
  160. u8 n;
  161. u8 p;
  162. u8 range;
  163. bool range_override;
  164. };
  165. enum ad3552r_ch_gain_scaling {
  166. /* Gain scaling of 1 */
  167. AD3552R_CH_GAIN_SCALING_1,
  168. /* Gain scaling of 0.5 */
  169. AD3552R_CH_GAIN_SCALING_0_5,
  170. /* Gain scaling of 0.25 */
  171. AD3552R_CH_GAIN_SCALING_0_25,
  172. /* Gain scaling of 0.125 */
  173. AD3552R_CH_GAIN_SCALING_0_125,
  174. };
  175. enum ad3552r_ch_vref_select {
  176. /* Internal source with Vref I/O floating */
  177. AD3552R_INTERNAL_VREF_PIN_FLOATING,
  178. /* Internal source with Vref I/O at 2.5V */
  179. AD3552R_INTERNAL_VREF_PIN_2P5V,
  180. /* External source with Vref I/O as input */
  181. AD3552R_EXTERNAL_VREF_PIN_INPUT
  182. };
  183. enum ad3542r_ch_output_range {
  184. /* Range from 0 V to 2.5 V. Requires Rfb1x connection */
  185. AD3542R_CH_OUTPUT_RANGE_0__2P5V,
  186. /* Range from 0 V to 5 V. Requires Rfb1x connection */
  187. AD3542R_CH_OUTPUT_RANGE_0__5V,
  188. /* Range from 0 V to 10 V. Requires Rfb2x connection */
  189. AD3542R_CH_OUTPUT_RANGE_0__10V,
  190. /* Range from -5 V to 5 V. Requires Rfb2x connection */
  191. AD3542R_CH_OUTPUT_RANGE_NEG_5__5V,
  192. /* Range from -2.5 V to 7.5 V. Requires Rfb2x connection */
  193. AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V,
  194. };
  195. enum ad3552r_ch_output_range {
  196. /* Range from 0 V to 2.5 V. Requires Rfb1x connection */
  197. AD3552R_CH_OUTPUT_RANGE_0__2P5V,
  198. /* Range from 0 V to 5 V. Requires Rfb1x connection */
  199. AD3552R_CH_OUTPUT_RANGE_0__5V,
  200. /* Range from 0 V to 10 V. Requires Rfb2x connection */
  201. AD3552R_CH_OUTPUT_RANGE_0__10V,
  202. /* Range from -5 V to 5 V. Requires Rfb2x connection */
  203. AD3552R_CH_OUTPUT_RANGE_NEG_5__5V,
  204. /* Range from -10 V to 10 V. Requires Rfb4x connection */
  205. AD3552R_CH_OUTPUT_RANGE_NEG_10__10V,
  206. };
  207. int ad3552r_get_output_range(struct device *dev,
  208. const struct ad3552r_model_data *model_info,
  209. struct fwnode_handle *child, u32 *val);
  210. int ad3552r_get_custom_gain(struct device *dev, struct fwnode_handle *child,
  211. u8 *gs_p, u8 *gs_n, u16 *rfb, s16 *goffs);
  212. u16 ad3552r_calc_custom_gain(u8 p, u8 n, s16 goffs);
  213. int ad3552r_get_ref_voltage(struct device *dev, u32 *val);
  214. int ad3552r_get_drive_strength(struct device *dev, u32 *val);
  215. void ad3552r_calc_gain_and_offset(struct ad3552r_ch_data *ch_data,
  216. const struct ad3552r_model_data *model_data);
  217. #endif /* __DRIVERS_IIO_DAC_AD3552R_H__ */