coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
spi.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 <gpio.h>
7 #include <soc/iomap.h>
8 #include <soc/spi.h>
9 
10 static const struct blsp_spi spi_reg[] = {
11  /* BLSP0 registers for SPI interface */
12  {
28  0,
29  0,
32  },
33  /* BLSP1 registers for SPI interface */
34  {
50  0,
51  0,
54  },
55 };
56 
57 static int check_bit_state(void *reg_addr, int mask,
58  int val, int us_delay)
59 {
60  unsigned int count = TIMEOUT_CNT;
61 
62  while ((read32(reg_addr) & mask) != val) {
63  count--;
64  if (count == 0)
65  return -ETIMEDOUT;
66  udelay(us_delay);
67  }
68 
69  return SUCCESS;
70 }
71 
72 /*
73  * Check whether QUPn State is valid
74  */
75 static int check_qup_state_valid(struct ipq_spi_slave *ds)
76 {
77 
79  QUP_STATE_VALID, 1);
80 
81 }
82 
83 /*
84  * Configure QUPn Core state
85  */
86 static int config_spi_state(struct ipq_spi_slave *ds, unsigned int state)
87 {
88  uint32_t val;
89  int ret = SUCCESS;
90 
91  ret = check_qup_state_valid(ds);
92  if (ret != SUCCESS)
93  return ret;
94 
95  switch (state) {
96  case QUP_STATE_RUN:
97  /* Set the state to RUN */
98  val = ((read32(ds->regs->qup_state) & ~QUP_STATE_MASK)
99  | QUP_STATE_RUN);
100  write32(ds->regs->qup_state, val);
101  ret = check_qup_state_valid(ds);
102  break;
103  case QUP_STATE_RESET:
104  /* Set the state to RESET */
105  val = ((read32(ds->regs->qup_state) & ~QUP_STATE_MASK)
106  | QUP_STATE_RESET);
107  write32(ds->regs->qup_state, val);
108  ret = check_qup_state_valid(ds);
109  break;
110  default:
111  printk(BIOS_ERR, "unsupported QUP SPI state : %d\n", state);
112  ret = -EINVAL;
113  break;
114  }
115 
116  return ret;
117 }
118 
119 /*
120  * Set QUPn SPI Mode
121  */
122 static void spi_set_mode(struct ipq_spi_slave *ds, unsigned int mode)
123 {
124  unsigned int clk_idle_state;
125  unsigned int input_first_mode;
126  uint32_t val;
127 
128  switch (mode) {
129  case SPI_MODE0:
130  clk_idle_state = 0;
131  input_first_mode = SPI_CONFIG_INPUT_FIRST;
132  break;
133  case SPI_MODE1:
134  clk_idle_state = 0;
135  input_first_mode = 0;
136  break;
137  case SPI_MODE2:
138  clk_idle_state = 1;
139  input_first_mode = SPI_CONFIG_INPUT_FIRST;
140  break;
141  case SPI_MODE3:
142  clk_idle_state = 1;
143  input_first_mode = 0;
144  break;
145  default:
146  printk(BIOS_ERR, "unsupported spi mode : %d\n", mode);
147  return;
148  }
149 
150  val = read32(ds->regs->spi_config);
151  val |= input_first_mode;
152  write32(ds->regs->spi_config, val);
153 
154  val = read32(ds->regs->io_control);
155  if (clk_idle_state)
157  else
159 
160  write32(ds->regs->io_control, val);
161 }
162 
163 /*
164  * Reset entire QUP and all mini cores
165  */
166 static void spi_reset(struct ipq_spi_slave *ds)
167 {
168  write32(ds->regs->qup_sw_reset, 0x1);
169  udelay(5);
171 }
172 
173 static struct ipq_spi_slave spi_slave_pool[2];
174 
175 static struct ipq_spi_slave *to_ipq_spi(const struct spi_slave *slave)
176 {
177  struct ipq_spi_slave *ds;
178  size_t i;
179 
180  for (i = 0; i < ARRAY_SIZE(spi_slave_pool); i++) {
181  ds = spi_slave_pool + i;
182 
183  if (!ds->allocated)
184  continue;
185 
186  if ((ds->slave.bus == slave->bus) &&
187  (ds->slave.cs == slave->cs))
188  return ds;
189  }
190 
191  return NULL;
192 }
193 
194 /*
195  * BLSP QUPn SPI Hardware Initialisation
196  */
197 static int spi_hw_init(struct ipq_spi_slave *ds)
198 {
199  int ret;
200 
201  ds->initialized = 0;
202 
203  /* QUPn module configuration */
204  spi_reset(ds);
205 
206  /* Set the QUPn state */
208  if (ret)
209  return ret;
210 
211  /*
212  * Configure Mini core to SPI core with Input Output enabled,
213  * SPI master, N = 8 bits
214  */
223 
224  /*
225  * Configure Input first SPI protocol,
226  * SPI master mode and no loopback
227  */
232 
233  /*
234  * Configure SPI IO Control Register
235  * CLK_ALWAYS_ON = 0
236  * MX_CS_MODE = 0
237  * NO_TRI_STATE = 1
238  */
241 
242  /*
243  * Configure SPI IO Modes.
244  * OUTPUT_BIT_SHIFT_EN = 1
245  * INPUT_MODE = Block Mode
246  * OUTPUT MODE = Block Mode
247  */
255 
256  spi_set_mode(ds, ds->mode);
257 
258  /* Disable Error mask */
259  write32(ds->regs->error_flags_en, 0);
261 
262  write32(ds->regs->qup_deassert_wait, 0);
263 
264  ds->initialized = 1;
265 
266  return SUCCESS;
267 }
268 
269 static int spi_ctrlr_claim_bus(const struct spi_slave *slave)
270 {
271  struct ipq_spi_slave *ds = to_ipq_spi(slave);
272  unsigned int ret;
273 
274  ret = spi_hw_init(ds);
275  if (ret)
276  return -EIO;
277 
278  return SUCCESS;
279 }
280 
281 static void spi_ctrlr_release_bus(const struct spi_slave *slave)
282 {
283  struct ipq_spi_slave *ds = to_ipq_spi(slave);
284 
285  /* Reset the SPI hardware */
286  spi_reset(ds);
287  ds->initialized = 0;
288 }
289 
290 static void write_force_cs(const struct spi_slave *slave, int assert)
291 {
292  struct ipq_spi_slave *ds = to_ipq_spi(slave);
293 
294  if (assert)
297  else
300 
301 }
302 
303 /*
304  * Function to write data to OUTPUT FIFO
305  */
306 static void spi_write_byte(struct ipq_spi_slave *ds, unsigned char data)
307 {
308  /* Wait for space in the FIFO */
309  while ((read32(ds->regs->qup_operational) & OUTPUT_FIFO_FULL))
310  udelay(1);
311 
312  /* Write the byte of data */
313  write32(ds->regs->qup_output_fifo, data);
314 }
315 
316 /*
317  * Function to read data from Input FIFO
318  */
319 static unsigned char spi_read_byte(struct ipq_spi_slave *ds)
320 {
321  /* Wait for Data in FIFO */
323  udelay(1);
324 
325  /* Read a byte of data */
326  return read32(ds->regs->qup_input_fifo) & 0xff;
327 }
328 
329 /*
330  * Function to check whether Input or Output FIFO
331  * has data to be serviced
332  */
333 static int check_fifo_status(void *reg_addr)
334 {
335  unsigned int count = TIMEOUT_CNT;
336  unsigned int status_flag;
337  unsigned int val;
338 
339  do {
340  val = read32(reg_addr);
341  count--;
342  if (count == 0)
343  return -ETIMEDOUT;
344  status_flag = ((val & OUTPUT_SERVICE_FLAG) |
345  (val & INPUT_SERVICE_FLAG));
346  } while (!status_flag);
347 
348  return SUCCESS;
349 }
350 
351 /*
352  * Function to configure Input and Output enable/disable
353  */
354 static void enable_io_config(struct ipq_spi_slave *ds,
355  uint32_t write_cnt, uint32_t read_cnt)
356 {
357 
358  if (write_cnt) {
361  } else {
364  }
365 
366  if (read_cnt) {
369  } else {
372  }
373 
374 }
375 
376 /*
377  * Function to read bytes number of data from the Input FIFO
378  */
379 static int __blsp_spi_read(struct ipq_spi_slave *ds, u8 *data_buffer,
380  unsigned int bytes)
381 {
382  uint32_t val;
383  unsigned int i;
384  unsigned int fifo_count;
385  int ret = SUCCESS;
386  int state_config;
387 
388  /* Configure no of bytes to read */
389  state_config = config_spi_state(ds, QUP_STATE_RESET);
390  if (state_config)
391  return state_config;
392 
393  /* Configure input and output enable */
394  enable_io_config(ds, 0, bytes);
395 
396  write32(ds->regs->qup_mx_input_count, bytes);
397 
398  state_config = config_spi_state(ds, QUP_STATE_RUN);
399  if (state_config)
400  return state_config;
401 
402  while (bytes) {
404  if (ret != SUCCESS)
405  goto out;
406 
407  val = read32(ds->regs->qup_operational);
408  if (val & INPUT_SERVICE_FLAG) {
409  /*
410  * acknowledge to hw that software will
411  * read input data
412  */
415 
416  fifo_count = ((bytes > SPI_INPUT_BLOCK_SIZE) ?
417  SPI_INPUT_BLOCK_SIZE : bytes);
418 
419  for (i = 0; i < fifo_count; i++) {
420  *data_buffer = spi_read_byte(ds);
421  data_buffer++;
422  bytes--;
423  }
424  }
425  }
426 
427 out:
428  /*
429  * Put the SPI Core back in the Reset State
430  * to end the transfer
431  */
433  return ret;
434 }
435 
436 static int blsp_spi_read(struct ipq_spi_slave *ds, u8 *data_buffer,
437  unsigned int bytes)
438 {
439  int length, ret;
440 
441  while (bytes) {
442  length = (bytes < MAX_COUNT_SIZE) ? bytes : MAX_COUNT_SIZE;
443 
444  ret = __blsp_spi_read(ds, data_buffer, length);
445  if (ret != SUCCESS)
446  return ret;
447 
448  data_buffer += length;
449  bytes -= length;
450  }
451 
452  return 0;
453 }
454 
455 /*
456  * Function to write data to the Output FIFO
457  */
458 static int __blsp_spi_write(struct ipq_spi_slave *ds, const u8 *cmd_buffer,
459  unsigned int bytes)
460 {
461  uint32_t val;
462  unsigned int i;
463  unsigned int write_len = bytes;
464  unsigned int read_len = bytes;
465  unsigned int fifo_count;
466  int ret = SUCCESS;
467  int state_config;
468 
469  state_config = config_spi_state(ds, QUP_STATE_RESET);
470  if (state_config)
471  return state_config;
472 
473  /* No of bytes to be written in Output FIFO */
474  write32(ds->regs->qup_mx_output_count, bytes);
475  write32(ds->regs->qup_mx_input_count, bytes);
476  state_config = config_spi_state(ds, QUP_STATE_RUN);
477  if (state_config)
478  return state_config;
479 
480  /* Configure input and output enable */
481  enable_io_config(ds, write_len, read_len);
482 
483  /*
484  * read_len considered to ensure that we read the dummy data for the
485  * write we performed. This is needed to ensure with WR-RD transaction
486  * to get the actual data on the subsequent read cycle that happens
487  */
488  while (write_len || read_len) {
489 
491  if (ret != SUCCESS)
492  goto out;
493 
494  val = read32(ds->regs->qup_operational);
495  if (val & OUTPUT_SERVICE_FLAG) {
496  /*
497  * acknowledge to hw that software will write
498  * expected output data
499  */
502 
503  if (write_len > SPI_OUTPUT_BLOCK_SIZE)
504  fifo_count = SPI_OUTPUT_BLOCK_SIZE;
505  else
506  fifo_count = write_len;
507 
508  for (i = 0; i < fifo_count; i++) {
509  /* Write actual data to output FIFO */
510  spi_write_byte(ds, *cmd_buffer);
511  cmd_buffer++;
512  write_len--;
513  }
514  }
515  if (val & INPUT_SERVICE_FLAG) {
516  /*
517  * acknowledge to hw that software
518  * will read input data
519  */
522 
523  if (read_len > SPI_INPUT_BLOCK_SIZE)
524  fifo_count = SPI_INPUT_BLOCK_SIZE;
525  else
526  fifo_count = read_len;
527 
528  for (i = 0; i < fifo_count; i++) {
529  /* Read dummy data for the data written */
530  (void)spi_read_byte(ds);
531 
532  /* Decrement the read count after reading the
533  * dummy data from the device. This is to make
534  * sure we read dummy data before we write the
535  * data to fifo
536  */
537  read_len--;
538  }
539  }
540  }
541 
542 out:
543  /*
544  * Put the SPI Core back in the Reset State
545  * to end the transfer
546  */
548 
549  return ret;
550 }
551 
552 static int blsp_spi_write(struct ipq_spi_slave *ds, u8 *cmd_buffer,
553  unsigned int bytes)
554 {
555  int length, ret;
556 
557  while (bytes) {
558  length = (bytes < MAX_COUNT_SIZE) ? bytes : MAX_COUNT_SIZE;
559 
560  ret = __blsp_spi_write(ds, cmd_buffer, length);
561  if (ret != SUCCESS)
562  return ret;
563 
564  cmd_buffer += length;
565  bytes -= length;
566  }
567 
568  return 0;
569 }
570 
571 /*
572  * This function is invoked with either tx_buf or rx_buf.
573  * Calling this function with both null does a chip select change.
574  */
575 static int spi_ctrlr_xfer(const struct spi_slave *slave, const void *dout,
576  size_t out_bytes, void *din, size_t in_bytes)
577 {
578  struct ipq_spi_slave *ds = to_ipq_spi(slave);
579  u8 *txp = (u8 *)dout;
580  u8 *rxp = (u8 *)din;
581  int ret;
582 
583  /* Driver implementation does not support full duplex. */
584  if (dout && din)
585  return -1;
586 
588  if (ret != SUCCESS)
589  return ret;
590 
591  write_force_cs(slave, 1);
592 
593  if (dout != NULL) {
594  ret = blsp_spi_write(ds, txp, (unsigned int) out_bytes);
595  if (ret != SUCCESS)
596  goto out;
597  }
598 
599  if (din != NULL) {
600  ret = blsp_spi_read(ds, rxp, in_bytes);
601  if (ret != SUCCESS)
602  goto out;
603  }
604 
605 out:
606  write_force_cs(slave, 0);
607 
608  /*
609  * Put the SPI Core back in the Reset State
610  * to end the transfer
611  */
613 
614  return ret;
615 }
616 
617 static int spi_ctrlr_setup(const struct spi_slave *slave)
618 {
619  struct ipq_spi_slave *ds = NULL;
620  int i;
621  int bus = slave->bus;
622  int cs = slave->cs;
623 
624  if ((bus < BLSP0_SPI) || (bus > BLSP1_SPI)
625  || ((bus == BLSP0_SPI) && (cs > 2))
626  || ((bus == BLSP1_SPI) && (cs > 0))) {
628  "SPI error: unsupported bus %d (Supported buses 0, 1 and 2) "
629  "or chipselect\n", bus);
630  return -1;
631  }
632 
633  for (i = 0; i < ARRAY_SIZE(spi_slave_pool); i++) {
634  if (spi_slave_pool[i].allocated)
635  continue;
636  ds = spi_slave_pool + i;
637 
638  ds->slave.bus = bus;
639  ds->slave.cs = cs;
640  ds->regs = &spi_reg[bus];
641 
642  /*
643  * TODO(vbendeb):
644  * hardcoded frequency and mode - we might need to find a way
645  * to configure this
646  */
647  ds->freq = 10000000;
648  ds->mode = SPI_MODE3;
649  ds->allocated = 1;
650 
651  return 0;
652  }
653 
654  printk(BIOS_ERR, "SPI error: all %d pools busy\n", i);
655  return -1;
656 }
657 
658 static const struct spi_ctrlr spi_ctrlr = {
660  .claim_bus = spi_ctrlr_claim_bus,
661  .release_bus = spi_ctrlr_release_bus,
662  .xfer = spi_ctrlr_xfer,
663  .max_xfer_size = MAX_PACKET_COUNT,
664 };
665 
666 const struct spi_ctrlr_buses spi_ctrlr_bus_map[] = {
667  {
668  .ctrlr = &spi_ctrlr,
669  .bus_start = BLSP0_SPI,
670  .bus_end = BLSP1_SPI,
671  },
672 };
673 
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define assert(statement)
Definition: assert.h:74
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define printk(level,...)
Definition: stdlib.h:16
@ SUCCESS
uint64_t length
Definition: fw_cfg_if.h:1
#define clrsetbits32(addr, clear, set)
Definition: mmio.h:16
#define OUTPUT_FIFO_FULL
Definition: qup.h:43
#define OUTPUT_SERVICE_FLAG
Definition: qup.h:47
#define QUP_STATE_VALID_MASK
Definition: qup.h:69
#define QUP_STATE_VALID
Definition: qup.h:67
#define QUP_STATE_RESET
Definition: qup.h:64
#define INPUT_SERVICE_FLAG
Definition: qup.h:46
#define QUP_STATE_RUN
Definition: qup.h:65
#define QUP_STATE_MASK
Definition: qup.h:68
#define INPUT_FIFO_NOT_EMPTY
Definition: qup.h:44
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
state
Definition: raminit.c:1787
const struct spi_ctrlr_buses spi_ctrlr_bus_map[]
Definition: spi.c:401
const size_t spi_ctrlr_bus_map_count
Definition: spi.c:408
static const int mask[4]
Definition: gpio.c:308
const struct spi_ctrlr spi_ctrlr
Definition: spi.c:261
#define BLSP0_SPI_ERROR_FLAGS_EN_REG
Definition: spi.h:25
#define BLSP1_QUP_INPUT_FIFOc_REG(c)
Definition: spi.h:51
#define SPI_CONFIG_LOOP_BACK_MSK
Definition: spi.h:81
#define BLSP0_QUP_OUTPUT_FIFOc_REG(c)
Definition: spi.h:54
#define QUP_IO_MODES_OUTPUT_MODE_MSK
Definition: spi.h:98
#define BLSP0_QUP_MX_INPUT_COUNT_REG
Definition: spi.h:59
#define SPI_INPUT_BLOCK_SIZE
Definition: spi.h:101
#define BLSP1_SPI_ERROR_FLAGS_REG
Definition: spi.h:21
#define BLSP0_SPI_DEASSERT_WAIT_REG
Definition: spi.h:23
#define BLSP0_QUP_OPERATIONAL_REG
Definition: spi.h:40
#define BLSP1_QUP_OUTPUT_FIFOc_REG(c)
Definition: spi.h:56
#define QUP_CONF_OUTPUT_MSK
Definition: spi.h:73
#define SPI_CONFIG_INPUT_FIRST
Definition: spi.h:79
#define SPI_IO_CTRL_CLK_ALWAYS_ON
Definition: spi.h:86
#define BLSP1_QUP_SW_RESET_REG
Definition: spi.h:66
#define SPI_MODE3
Definition: spi.h:111
#define BLSP1_QUP_MX_INPUT_COUNT_REG
Definition: spi.h:60
#define QUP_CONF_OUTPUT_ENA
Definition: spi.h:74
#define QUP_IO_MODES_OUTPUT_BIT_SHIFT_MSK
Definition: spi.h:94
#define BLSP0_QUP_ERROR_FLAGS_EN_REG
Definition: spi.h:34
#define BLSP0_QUP_ERROR_FLAGS_REG
Definition: spi.h:31
#define BLSP0_QUP_OPERATIONAL_MASK
Definition: spi.h:37
#define BLSP0_SPI_IO_CONTROL_REG
Definition: spi.h:17
#define SPI_IO_CTRL_CLOCK_IDLE_HIGH
Definition: spi.h:92
#define BLSP1_QUP_CONFIG_REG
Definition: spi.h:29
#define BLSP1_QUP_ERROR_FLAGS_EN_REG
Definition: spi.h:35
#define QUP_CONF_N_SPI_8_BIT_WORD
Definition: spi.h:77
#define BLSP1_QUP_IO_MODES_REG
Definition: spi.h:44
#define SPI_OUTPUT_BLOCK_SIZE
Definition: spi.h:102
#define QUP_CONFIG_MINI_CORE_MSK
Definition: spi.h:68
#define SPI_IO_CTRL_FORCE_CS_DIS
Definition: spi.h:91
#define BLSP0_QUP_MX_OUTPUT_COUNT_REG
Definition: spi.h:62
#define BLSP1_QUP_MX_OUTPUT_COUNT_REG
Definition: spi.h:63
#define SPI_MODE1
Definition: spi.h:109
#define SPI_IO_CTRL_NO_TRI_STATE
Definition: spi.h:88
#define QUP_IO_MODES_INPUT_MODE_MSK
Definition: spi.h:96
#define SPI_MODE2
Definition: spi.h:110
#define BLSP1_SPI_ERROR_FLAGS_EN_REG
Definition: spi.h:26
#define BLSP0_SPI
Definition: spi.h:112
#define QUP_CONF_NO_OUTPUT
Definition: spi.h:75
#define BLSP0_SPI_ERROR_FLAGS_REG
Definition: spi.h:20
#define BLSP0_QUP_STATE_REG
Definition: spi.h:46
#define BLSP1_SPI_DEASSERT_WAIT_REG
Definition: spi.h:24
#define BLSP1_QUP_OPERATIONAL_REG
Definition: spi.h:41
#define MAX_COUNT_SIZE
Definition: spi.h:104
#define BLSP1_QUP_ERROR_FLAGS_REG
Definition: spi.h:32
#define BLSP1_SPI
Definition: spi.h:113
#define BLSP0_QUP_INPUT_FIFOc_REG(c)
Definition: spi.h:49
#define SPI_IO_CTRL_FORCE_CS_MSK
Definition: spi.h:89
#define BLSP1_QUP_OPERATIONAL_MASK
Definition: spi.h:38
#define SPI_CONFIG_NO_LOOP_BACK
Definition: spi.h:82
#define SPI_MODE0
Definition: spi.h:108
#define QUP_IO_MODES_INPUT_BLOCK_MODE
Definition: spi.h:97
#define QUP_CONF_NO_INPUT
Definition: spi.h:72
#define QUP_CONF_INPUT_MSK
Definition: spi.h:70
#define BLSP0_SPI_CONFIG_REG
Definition: spi.h:14
#define QUP_IO_MODES_OUTPUT_BIT_SHIFT_EN
Definition: spi.h:95
#define QUP_CONFIG_MINI_CORE_SPI
Definition: spi.h:69
#define QUP_CONF_N_MASK
Definition: spi.h:76
#define BLSP0_QUP_CONFIG_REG
Definition: spi.h:28
#define QUP_CONF_INPUT_ENA
Definition: spi.h:71
#define BLSP0_QUP_IO_MODES_REG
Definition: spi.h:43
#define SPI_CONFIG_NO_SLAVE_OPER
Definition: spi.h:84
#define SPI_IO_CTRL_FORCE_CS_EN
Definition: spi.h:90
#define BLSP1_QUP_STATE_REG
Definition: spi.h:47
#define BLSP1_SPI_IO_CONTROL_REG
Definition: spi.h:18
#define BLSP0_QUP_SW_RESET_REG
Definition: spi.h:65
#define BLSP1_SPI_CONFIG_REG
Definition: spi.h:15
#define QUP_IO_MODES_OUTPUT_BLOCK_MODE
Definition: spi.h:99
#define SPI_CONFIG_NO_SLAVE_OPER_MSK
Definition: spi.h:83
static int blsp_spi_read(struct ipq_spi_slave *ds, u8 *data_buffer, unsigned int bytes)
Definition: spi.c:436
static void spi_ctrlr_release_bus(const struct spi_slave *slave)
Definition: spi.c:281
static unsigned char spi_read_byte(struct ipq_spi_slave *ds)
Definition: spi.c:319
static int check_bit_state(void *reg_addr, int mask, int val, int us_delay)
Definition: spi.c:57
static int check_qup_state_valid(struct ipq_spi_slave *ds)
Definition: spi.c:75
static int __blsp_spi_write(struct ipq_spi_slave *ds, const u8 *cmd_buffer, unsigned int bytes)
Definition: spi.c:458
static void spi_set_mode(struct ipq_spi_slave *ds, unsigned int mode)
Definition: spi.c:122
static int blsp_spi_write(struct ipq_spi_slave *ds, u8 *cmd_buffer, unsigned int bytes)
Definition: spi.c:552
static void spi_reset(struct ipq_spi_slave *ds)
Definition: spi.c:166
static int check_fifo_status(void *reg_addr)
Definition: spi.c:333
static int __blsp_spi_read(struct ipq_spi_slave *ds, u8 *data_buffer, unsigned int bytes)
Definition: spi.c:379
static int config_spi_state(struct ipq_spi_slave *ds, unsigned int state)
Definition: spi.c:86
static struct ipq_spi_slave spi_slave_pool[2]
Definition: spi.c:173
static int spi_hw_init(struct ipq_spi_slave *ds)
Definition: spi.c:197
static void write_force_cs(const struct spi_slave *slave, int assert)
Definition: spi.c:290
static int spi_ctrlr_claim_bus(const struct spi_slave *slave)
Definition: spi.c:269
static int spi_ctrlr_xfer(const struct spi_slave *slave, const void *dout, size_t out_bytes, void *din, size_t in_bytes)
Definition: spi.c:575
static void spi_write_byte(struct ipq_spi_slave *ds, unsigned char data)
Definition: spi.c:306
static void enable_io_config(struct ipq_spi_slave *ds, uint32_t write_cnt, uint32_t read_cnt)
Definition: spi.c:354
static int spi_ctrlr_setup(const struct spi_slave *slave)
Definition: spi.c:617
static const struct blsp_spi spi_reg[]
Definition: spi.c:10
static struct ipq_spi_slave * to_ipq_spi(const struct spi_slave *slave)
Definition: spi.c:175
#define MAX_PACKET_COUNT
Definition: spi.c:37
#define EINVAL
Definition: spi.c:30
#define ETIMEDOUT
Definition: spi.c:29
#define EIO
Definition: spi.c:31
#define TIMEOUT_CNT
Definition: spi.c:14
static struct spi_slave slave
Definition: spiconsole.c:7
#define NULL
Definition: stddef.h:19
unsigned int uint32_t
Definition: stdint.h:14
uint8_t u8
Definition: stdint.h:45
Definition: spi.h:115
void * qup_output_fifo
Definition: spi.h:127
void * io_control
Definition: spi.h:117
void * spi_config
Definition: spi.h:116
void * qup_operational
Definition: spi.h:123
void * qup_deassert_wait
Definition: spi.h:134
void * qup_state
Definition: spi.h:125
void * qup_mx_output_count
Definition: spi.h:129
void * error_flags_en
Definition: spi.h:119
void * qup_config
Definition: spi.h:120
void * qup_input_fifo
Definition: spi.h:126
void * qup_io_modes
Definition: spi.h:124
void * qup_sw_reset
Definition: spi.h:130
void * qup_error_flags_en
Definition: spi.h:122
void * qup_mx_input_count
Definition: spi.h:128
Definition: device.h:76
const struct blsp_spi * regs
Definition: spi.h:152
unsigned int initialized
Definition: spi.h:154
struct spi_slave slave
Definition: spi.h:151
unsigned long freq
Definition: spi.h:155
int allocated
Definition: spi.h:156
unsigned int mode
Definition: spi.h:153
const struct spi_ctrlr * ctrlr
Definition: spi-generic.h:175
int(* setup)(const struct spi_slave *slave)
Definition: spi-generic.h:151
unsigned int bus
Definition: spi-generic.h:41
unsigned int cs
Definition: spi-generic.h:42
u8 val
Definition: sys.c:300
void udelay(uint32_t us)
Definition: udelay.c:15
#define count
typedef void(X86APIP X86EMU_intrFuncs)(int num)