coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
qup.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 
3 #include <device/mmio.h>
4 #include <console/console.h>
5 #include <delay.h>
6 #include <timer.h>
7 #include <soc/gpio.h>
8 #include <soc/iomap.h>
9 #include <soc/qup.h>
10 
11 #define TIMEOUT_CNT 100
12 
13 #define QUP_ADDR(id, reg) (blsp_qup_base(id) + (reg))
14 
15 #define QUP_DEBUG 0
16 
17 #define QUPDBG BIOS_ERR, "\t-> "
18 
19 #if QUP_DEBUG
20 #define qup_write32(a, v) do { \
21  write32(a, v); \
22  printk(QUPDBG "%s(%d): write32(%p, 0x%x)\n", \
23  __func__, __LINE__, a, v); \
24 } while (0)
25 #else
26 #define qup_write32 write32
27 #endif
28 
33 };
34 
35 static struct i2c_clk_div_fld i2c_clk_div_map[] = {
36  {100000, 124, 62},
37  {400000, 28, 14},
38  {1000000, 8, 5},
39 };
40 
41 static void i2c_set_mstr_clk_ctl(unsigned int id, unsigned int hz)
42 {
43  int i;
44  struct i2c_clk_div_fld *itr = i2c_clk_div_map;
45  u8 fs_div = 0;
46  u8 ht_div = 0;
47  u32 mstr_clk_ctl;
48 
49  for (i = 0; i < ARRAY_SIZE(i2c_clk_div_map); ++i, ++itr) {
50  if (hz == itr->clk_freq_out) {
51  if (!fs_div)
52  fs_div = itr->fs_div;
53  if (!ht_div)
54  ht_div = itr->ht_div;
55  break;
56  }
57  }
58 
59  /* format values in clk-ctl cache */
60  mstr_clk_ctl = ((ht_div & 0xff) << 16) | (fs_div & 0xff);
61  qup_write32(QUP_ADDR(id, QUP_I2C_MASTER_CLK_CTL), mstr_clk_ctl);
62 }
63 
65 {
67 
69  return QUP_ERR_XFER_FAIL;
70 
71 #if QUP_DEBUG
72  printk(QUPDBG "%s: 0x%x\n", __func__, reg_val);
73 #endif
74 
75  if (reg_val & QUP_I2C_INVALID_READ_ADDR)
77  if (reg_val & QUP_I2C_FAILED_MASK)
78  return QUP_ERR_I2C_FAILED;
79  if (reg_val & QUP_I2C_ARB_LOST)
80  return QUP_ERR_I2C_ARB_LOST;
81  if (reg_val & QUP_I2C_BUS_ERROR)
82  return QUP_ERR_I2C_BUS_ERROR;
83  if (reg_val & QUP_I2C_INVALID_WRITE)
85  if (reg_val & QUP_I2C_PACKET_NACK)
86  return QUP_ERR_I2C_NACK;
87  if (reg_val & QUP_I2C_INVALID_TAG)
89 
90  return QUP_SUCCESS;
91 }
92 
93 static int check_bit_state(uint32_t *reg, int wait_for)
94 {
95  unsigned int count = TIMEOUT_CNT;
96 
97  while ((read32(reg) & (QUP_STATE_VALID_MASK | QUP_STATE_MASK)) !=
98  (QUP_STATE_VALID | wait_for)) {
99  if (count == 0)
100  return QUP_ERR_TIMEOUT;
101  count--;
102  }
103 
104  return QUP_SUCCESS;
105 }
106 
107 /*
108  * Check whether GSBIn_QUP State is valid
109  */
110 static qup_return_t qup_wait_for_state(blsp_qup_id_t id, unsigned int wait_for)
111 {
112  return check_bit_state(QUP_ADDR(id, QUP_STATE), wait_for);
113 }
114 
116 {
117  /*
118  * The I2C_STATUS is a status register.
119  * Writing any value clears the status bits.
120  */
122  return QUP_SUCCESS;
123 }
124 
126 {
130  return QUP_SUCCESS;
131 }
132 
134  struct stopwatch *timeout)
135 {
137 
138  while (!(read32(QUP_ADDR(id, QUP_OPERATIONAL)) & status)) {
139  ret = qup_i2c_master_status(id);
140  if (ret)
141  return ret;
142  if (stopwatch_expired(timeout))
143  return QUP_ERR_TIMEOUT;
144  }
145 
146  return QUP_SUCCESS;
147 }
148 
150  struct stopwatch *timeout)
151 {
153 
154  while (read32(QUP_ADDR(id, QUP_OPERATIONAL)) & status) {
155  ret = qup_i2c_master_status(id);
156  if (ret)
157  return ret;
158  if (stopwatch_expired(timeout))
159  return QUP_ERR_TIMEOUT;
160  }
161 
162  return QUP_SUCCESS;
163 }
164 
165 static inline uint32_t qup_i2c_create_output_tag(int stop, u8 data)
166 {
167  uint32_t tag;
168 
169  if (stop)
170  tag = QUP_I2C_STOP_SEQ | QUP_I2C_DATA(data);
171  else
172  tag = QUP_I2C_DATA_SEQ | QUP_I2C_DATA(data);
173 
174  return tag;
175 }
176 
178  struct stopwatch *timeout)
179 {
181 
183 
184  mdelay(4); /* TPM seems to need this */
185 
186  ret = qup_fifo_wait_while(id, OUTPUT_FIFO_NOT_EMPTY, timeout);
187  if (ret)
188  return ret;
189 
190  ret = qup_i2c_master_status(id);
191 
192  if (ret)
193  printk(BIOS_DEBUG, "%s: error\n", __func__);
194 
195  return ret;
196 }
197 
199  uint8_t stop_seq)
200 {
202  uint8_t addr = p_tx_obj->p.iic.addr;
203  uint8_t *data_ptr = p_tx_obj->p.iic.data;
204  unsigned int data_len = p_tx_obj->p.iic.data_len;
205  unsigned int idx = 0;
206  uint32_t tag, *fifo = QUP_ADDR(id, QUP_OUTPUT_FIFO);
207  struct stopwatch timeout;
208 
210 
211  qup_write32(QUP_ADDR(id, QUP_MX_OUTPUT_COUNT), data_len + 1);
212 
214 
215  /*
216  * Since UNPACK enable is set in io mode register, populate 2 tags
217  * for each fifo register.
218  *
219  * Create the first tag as follows, with the start tag and first byte
220  * of the data to be written
221  * +--------+--------+--------+--------+
222  * | STOP / | data | START | ADDR |
223  * |DATA tag| byte | tag | << 1 |
224  * +--------+--------+--------+--------+
225  * rest will be created in the following while loop.
226  */
227  tag = qup_i2c_create_output_tag(data_len == 1 && stop_seq,
228  data_ptr[idx]);
229  tag = ((tag << 16) & 0xffff0000) |
231  data_len--;
232  idx++;
233 
234  qup_write32(fifo, tag);
235 
236  stopwatch_init_usecs_expire(&timeout, CONFIG_I2C_TRANSFER_TIMEOUT_US);
237  while (data_len) {
238 
239  tag = qup_i2c_create_output_tag(data_len == 1 && stop_seq,
240  data_ptr[idx]);
241  data_len--;
242  idx++;
243 
244  if (data_len) {
246  data_len == 1 && stop_seq,
247  data_ptr[idx]) << 16;
248  data_len--;
249  idx++;
250  }
251 
252  qup_write32(fifo, tag);
253 
254  ret = qup_i2c_write_fifo_flush(id, &timeout);
255 
256  if (ret) {
257  printk(QUPDBG "%s: error\n", __func__);
258  return ret;
259  }
260  }
261 
262  ret = qup_i2c_write_fifo_flush(id, &timeout);
263 
265 
266  return ret;
267 }
268 
270  qup_data_t *p_tx_obj, uint8_t stop_seq)
271 {
273 
274  switch (mode) {
275  case QUP_MODE_FIFO:
276  case QUP_MODE_BLOCK:
277  ret = qup_i2c_write_fifo(id, p_tx_obj, stop_seq);
278  break;
279  default:
280  ret = QUP_ERR_UNSUPPORTED;
281  }
282 
283  if (ret) {
285  printk(QUPDBG "%s() failed (%d)\n", __func__, ret);
286  }
287 
288  return ret;
289 }
290 
291 static int qup_i2c_parse_tag(uint32_t data, uint8_t *data_ptr, uint32_t len)
292 {
293  int i, idx = 0;
294  int max = (len > 2) ? 2 : len;
295 
296  for (i = 0; i < max; i++) {
297  switch (QUP_I2C_MI_TAG(data)) {
298  case QUP_I2C_MIDATA_SEQ:
299  data_ptr[idx] = QUP_I2C_DATA(data);
300  idx++;
301  break;
302  case QUP_I2C_MISTOP_SEQ:
303  data_ptr[idx] = QUP_I2C_DATA(data);
304  idx++;
305  return idx;
306  default:
307  printk(QUPDBG "%s: Unexpected tag (0x%x)\n", __func__,
308  QUP_I2C_MI_TAG(data));
309  return -1;
310  }
311 
312  data = (data >> 16);
313  }
314 
315  return idx;
316 }
317 
319 {
321  uint8_t addr = p_tx_obj->p.iic.addr;
322  uint8_t *data_ptr = p_tx_obj->p.iic.data;
323  unsigned int data_len = p_tx_obj->p.iic.data_len;
324  unsigned int idx = 0;
325  uint32_t *fifo = QUP_ADDR(id, QUP_OUTPUT_FIFO);
326  struct stopwatch timeout;
327 
329 
336 
337  qup_write32(QUP_ADDR(id, QUP_MX_INPUT_COUNT), data_len);
338 
340 
343  ((QUP_I2C_RECV_SEQ | data_len) << 16));
344 
345  stopwatch_init_usecs_expire(&timeout, CONFIG_I2C_TRANSFER_TIMEOUT_US);
346  ret = qup_i2c_write_fifo_flush(id, &timeout);
347  if (ret) {
348  printk(QUPDBG "%s: OUTPUT_FIFO_NOT_EMPTY\n", __func__);
349  return ret;
350  }
351 
352  ret = qup_fifo_wait_for(id, INPUT_SERVICE_FLAG, &timeout);
353  if (ret) {
354  printk(QUPDBG "%s: INPUT_SERVICE_FLAG\n", __func__);
355  return ret;
356  }
357 
358  fifo = QUP_ADDR(id, QUP_INPUT_FIFO);
359 
360  while (data_len) {
361  uint32_t data;
362  int count;
363 
364  data = read32(fifo);
365  mdelay(1);
366 
367  count = qup_i2c_parse_tag(data, data_ptr + idx, data_len);
368 
369  if (count < 0) {
370  printk(QUPDBG "%s: Cannot parse tag 0x%x\n",
371  __func__, data);
373 
375  }
376 
377  idx += count;
378  data_len -= count;
379 
381  }
382 
383  p_tx_obj->p.iic.data_len = idx;
384 
386 
388 
389  return QUP_SUCCESS;
390 }
391 
393  qup_data_t *p_tx_obj)
394 {
396 
398 
399  switch (mode) {
400  case QUP_MODE_FIFO:
401  case QUP_MODE_BLOCK:
402  ret = qup_i2c_read_fifo(id, p_tx_obj);
403  break;
404  default:
405  ret = QUP_ERR_UNSUPPORTED;
406  }
407 
408  if (ret) {
410  printk(QUPDBG "%s() failed (%d)\n", __func__, ret);
411  }
412 
413  return ret;
414 }
415 
417 {
419  uint32_t reg_val;
420 
421  /* Reset the QUP core.*/
422  qup_write32(QUP_ADDR(id, QUP_SW_RESET), 0x1);
423 
424  /* Wait till the reset takes effect */
426  if (ret)
427  goto bailout;
428 
429  /* Reset the config */
431 
432  /* Program the config register */
433  /* Set N value */
434  reg_val = 0x0F;
435  /* Set protocol */
436  switch (config_ptr->protocol) {
438  reg_val |= ((config_ptr->protocol &
441  break;
442  default:
443  ret = QUP_ERR_UNSUPPORTED;
444  goto bailout;
445  }
447  qup_write32(QUP_ADDR(id, QUP_CONFIG), reg_val);
448 
449  /* Choose version 1 tag */
451 
452  /* Reset i2c clk cntl register */
454 
455  /* Set QUP IO Mode */
456  switch (config_ptr->mode) {
457  case QUP_MODE_FIFO:
458  case QUP_MODE_BLOCK:
459  reg_val = QUP_UNPACK_EN | QUP_PACK_EN |
460  ((config_ptr->mode & QUP_MODE_MASK) <<
462  ((config_ptr->mode & QUP_MODE_MASK) <<
464  break;
465  default:
466  ret = QUP_ERR_UNSUPPORTED;
467  goto bailout;
468  }
469  qup_write32(QUP_ADDR(id, QUP_IO_MODES), reg_val);
470 
471  /*Set i2c clk cntl*/
472  i2c_set_mstr_clk_ctl(id, 400000);
473 
475 bailout:
476  if (ret)
477  printk(QUPDBG "failed to init qup (%d)\n", ret);
478 
479  return ret;
480 }
481 
483 {
485  unsigned int curr_state = read32(QUP_ADDR(id, QUP_STATE));
486 
487  if ((state <= QUP_STATE_PAUSE)
488  && (curr_state & QUP_STATE_VALID_MASK)) {
489  /*
490  * For PAUSE_STATE to RESET_STATE transition,
491  * two writes of 10[binary]) are required for the
492  * transition to complete.
493  */
494  if (curr_state == QUP_STATE_PAUSE && state == QUP_STATE_RESET) {
495  qup_write32(QUP_ADDR(id, QUP_STATE), 0x2);
496  qup_write32(QUP_ADDR(id, QUP_STATE), 0x2);
497  } else {
499  }
500  ret = qup_wait_for_state(id, state);
501  }
502 
503  return ret;
504 }
505 
507  uint8_t stop_seq)
508 {
510  uint8_t mode = (read32(QUP_ADDR(id, QUP_IO_MODES)) >>
512 
513  ret = qup_i2c_write(id, mode, p_tx_obj, stop_seq);
514  if (QUP_DEBUG) {
515  int i;
516 
517  printk(BIOS_DEBUG, "i2c tx bus %d device %2.2x:",
518  id, p_tx_obj->p.iic.addr);
519  for (i = 0; i < p_tx_obj->p.iic.data_len; i++)
520  printk(BIOS_DEBUG, " %2.2x", p_tx_obj->p.iic.data[i]);
521  printk(BIOS_DEBUG, "\n");
522  }
523 
524  return ret;
525 }
526 
528  uint8_t stop_seq)
529 {
531 
532  if (p_tx_obj->protocol == ((read32(QUP_ADDR(id, QUP_CONFIG)) >>
534  switch (p_tx_obj->protocol) {
536  ret = qup_i2c_send_data(id, p_tx_obj, stop_seq);
537  break;
538  default:
539  ret = QUP_ERR_UNSUPPORTED;
540  }
541  }
542 
543  return ret;
544 }
545 
547 {
549  uint8_t mode = (read32(QUP_ADDR(id, QUP_IO_MODES)) >>
551 
552  ret = qup_i2c_read(id, mode, p_rx_obj);
553  if (QUP_DEBUG) {
554  int i;
555 
556  printk(BIOS_DEBUG, "i2c rxed on bus %d device %2.2x:",
557  id, p_rx_obj->p.iic.addr);
558  for (i = 0; i < p_rx_obj->p.iic.data_len; i++)
559  printk(BIOS_DEBUG, " %2.2x", p_rx_obj->p.iic.data[i]);
560  printk(BIOS_DEBUG, "\n");
561  }
562 
563  return ret;
564 }
565 
567 {
569 
570  if (p_rx_obj->protocol == ((read32(QUP_ADDR(id, QUP_CONFIG)) >>
572  switch (p_rx_obj->protocol) {
574  ret = qup_i2c_recv_data(id, p_rx_obj);
575  break;
576  default:
577  ret = QUP_ERR_UNSUPPORTED;
578  }
579  }
580 
581  return ret;
582 }
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define ARRAY_SIZE(a)
Definition: helpers.h:12
static u32 addr
Definition: cirrus.c:14
#define printk(level,...)
Definition: stdlib.h:16
void mdelay(unsigned int msecs)
Definition: delay.c:2
static int stopwatch_expired(struct stopwatch *sw)
Definition: timer.h:152
static void stopwatch_init_usecs_expire(struct stopwatch *sw, long us)
Definition: timer.h:127
blsp_qup_id_t
Definition: blsp.h:6
#define QUP_STATE
Definition: qup.h:10
#define QUP_I2C_INVALID_READ_ADDR
Definition: qup.h:94
#define QUP_ERROR_FLAGS
Definition: qup.h:15
#define QUP_OUTPUT_FIFO
Definition: qup.h:24
#define QUP_I2C_STOP_SEQ
Definition: qup.h:75
#define QUP_I2C_MISTOP_SEQ
Definition: qup.h:80
#define QUP_MX_INPUT_COUNT
Definition: qup.h:28
#define QUP_MINI_CORE_PROTO_MASK
Definition: qup.h:61
#define QUP_UNPACK_EN
Definition: qup.h:48
#define QUP_I2C_BUS_ERROR
Definition: qup.h:100
#define QUP_I2C_FAILED_MASK
Definition: qup.h:96
#define QUP_ERROR_FLAGS_EN
Definition: qup.h:16
#define OUTPUT_SERVICE_FLAG
Definition: qup.h:47
#define QUP_I2C_MIDATA_SEQ
Definition: qup.h:79
#define QUP_I2C_INVALID_TAG
Definition: qup.h:95
#define QUP_PACK_EN
Definition: qup.h:49
#define QUP_MINI_CORE_PROTO_SHFT
Definition: qup.h:60
#define QUP_SW_RESET
Definition: qup.h:12
#define QUP_CORE_CLK_ON_EN
Definition: qup.h:59
#define QUP_I2C_SLAVE_READ
Definition: qup.h:86
#define QUP_I2C_ARB_LOST
Definition: qup.h:98
#define QUP_I2C_MASTER_CLK_CTL
Definition: qup.h:36
@ QUP_MINICORE_I2C_MASTER
Definition: qup.h:121
#define QUP_STATE_VALID_MASK
Definition: qup.h:69
#define QUP_STATE_VALID
Definition: qup.h:67
#define QUP_APP_CLK_ON_EN
Definition: qup.h:58
#define QUP_I2C_MASTER_STATUS
Definition: qup.h:37
#define QUP_I2C_DATA(x)
Definition: qup.h:84
#define QUP_IO_MODES
Definition: qup.h:11
#define QUP_I2C_PACKET_NACK
Definition: qup.h:99
#define QUP_STATE_RESET
Definition: qup.h:64
qup_return_t
Definition: qup.h:102
@ QUP_ERR_I2C_INVALID_SLAVE_ADDR
Definition: qup.h:111
@ QUP_ERR_TIMEOUT
Definition: qup.h:106
@ QUP_ERR_UNSUPPORTED
Definition: qup.h:107
@ QUP_ERR_I2C_ARB_LOST
Definition: qup.h:109
@ QUP_ERR_UNDEFINED
Definition: qup.h:116
@ QUP_ERR_I2C_BUS_ERROR
Definition: qup.h:110
@ QUP_ERR_I2C_INVALID_WRITE
Definition: qup.h:114
@ QUP_ERR_I2C_NACK
Definition: qup.h:113
@ QUP_ERR_I2C_INVALID_TAG
Definition: qup.h:115
@ QUP_SUCCESS
Definition: qup.h:103
@ QUP_ERR_XFER_FAIL
Definition: qup.h:112
@ QUP_ERR_I2C_FAILED
Definition: qup.h:108
#define QUP_MX_READ_COUNT
Definition: qup.h:30
#define QUP_I2C_DATA_SEQ
Definition: qup.h:74
#define QUP_I2C_RECV_SEQ
Definition: qup.h:76
#define QUP_MX_OUTPUT_COUNT
Definition: qup.h:20
#define QUP_I2C_MASTER_CONFIG
Definition: qup.h:38
#define QUP_MODE_MASK
Definition: qup.h:52
#define QUP_OPERATIONAL
Definition: qup.h:14
#define QUP_I2C_MI_TAG(x)
Definition: qup.h:85
#define INPUT_SERVICE_FLAG
Definition: qup.h:46
#define QUP_INPUT_FIFO
Definition: qup.h:34
#define QUP_OUTPUT_MODE_SHFT
Definition: qup.h:53
#define QUP_INPUT_MODE_SHFT
Definition: qup.h:54
#define QUP_STATE_PAUSE
Definition: qup.h:66
#define QUP_STATE_RUN
Definition: qup.h:65
@ QUP_MODE_BLOCK
Definition: qup.h:127
@ QUP_MODE_FIFO
Definition: qup.h:126
#define QUP_I2C_INVALID_WRITE
Definition: qup.h:97
#define OUTPUT_FIFO_NOT_EMPTY
Definition: qup.h:45
#define QUP_I2C_START_SEQ
Definition: qup.h:73
#define QUP_CONFIG
Definition: qup.h:9
#define QUP_STATE_MASK
Definition: qup.h:68
#define QUP_I2C_ADDR(x)
Definition: qup.h:83
qup_return_t qup_recv_data(blsp_qup_id_t id, qup_data_t *p_rx_obj)
Definition: qup.c:533
qup_return_t qup_set_state(blsp_qup_id_t id, uint32_t state)
Definition: qup.c:450
qup_return_t qup_send_data(blsp_qup_id_t id, qup_data_t *p_tx_obj, uint8_t stop_seq)
Definition: qup.c:494
qup_return_t qup_reset_i2c_master_status(blsp_qup_id_t id)
Definition: qup.c:79
qup_return_t qup_init(blsp_qup_id_t id, const qup_config_t *config_ptr)
Definition: qup.c:380
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
state
Definition: raminit.c:1787
#define QUP_DEBUG
Definition: qup.c:15
static uint32_t qup_i2c_create_output_tag(int stop, u8 data)
Definition: qup.c:165
static struct i2c_clk_div_fld i2c_clk_div_map[]
Definition: qup.c:35
#define QUPDBG
Definition: qup.c:17
static qup_return_t qup_i2c_master_status(blsp_qup_id_t id)
Definition: qup.c:64
static qup_return_t qup_wait_for_state(blsp_qup_id_t id, unsigned int wait_for)
Definition: qup.c:110
static qup_return_t qup_i2c_write(blsp_qup_id_t id, uint8_t mode, qup_data_t *p_tx_obj, uint8_t stop_seq)
Definition: qup.c:269
static qup_return_t qup_i2c_write_fifo_flush(blsp_qup_id_t id, struct stopwatch *timeout)
Definition: qup.c:177
static int qup_i2c_parse_tag(uint32_t data, uint8_t *data_ptr, uint32_t len)
Definition: qup.c:291
static void i2c_set_mstr_clk_ctl(unsigned int id, unsigned int hz)
Definition: qup.c:41
#define QUP_ADDR(id, reg)
Definition: qup.c:13
static qup_return_t qup_i2c_read_fifo(blsp_qup_id_t id, qup_data_t *p_tx_obj)
Definition: qup.c:318
static qup_return_t qup_i2c_send_data(blsp_qup_id_t id, qup_data_t *p_tx_obj, uint8_t stop_seq)
Definition: qup.c:506
#define TIMEOUT_CNT
Definition: qup.c:11
#define qup_write32
Definition: qup.c:26
static qup_return_t qup_i2c_recv_data(blsp_qup_id_t id, qup_data_t *p_rx_obj)
Definition: qup.c:546
static qup_return_t qup_fifo_wait_for(blsp_qup_id_t id, uint32_t status, struct stopwatch *timeout)
Definition: qup.c:133
static qup_return_t qup_fifo_wait_while(blsp_qup_id_t id, uint32_t status, struct stopwatch *timeout)
Definition: qup.c:149
static int check_bit_state(uint32_t *reg, int wait_for)
Definition: qup.c:93
static qup_return_t qup_i2c_read(blsp_qup_id_t id, uint8_t mode, qup_data_t *p_tx_obj)
Definition: qup.c:392
static qup_return_t qup_reset_master_status(blsp_qup_id_t id)
Definition: qup.c:125
static qup_return_t qup_i2c_write_fifo(blsp_qup_id_t id, qup_data_t *p_tx_obj, uint8_t stop_seq)
Definition: qup.c:198
unsigned int uint32_t
Definition: stdint.h:14
uint32_t u32
Definition: stdint.h:51
uint8_t u8
Definition: stdint.h:45
unsigned char uint8_t
Definition: stdint.h:8
u8 ht_div
Definition: qup.c:32
u32 clk_freq_out
Definition: qup.c:30
u8 fs_div
Definition: qup.c:31
qup_protocol_t protocol
Definition: qup.h:132
qup_mode_t mode
Definition: qup.h:135
struct qup_data_t::@1401::@1402 iic
qup_protocol_t protocol
Definition: qup.h:140
union qup_data_t::@1401 p
#define count