Lines Matching defs:amd_spi
87 * struct amd_spi - SPI driver instance
92 struct amd_spi {
98 static inline u8 amd_spi_readreg8(struct amd_spi *amd_spi, int idx)
100 return ioread8((u8 __iomem *)amd_spi->io_remap_addr + idx);
103 static inline void amd_spi_writereg8(struct amd_spi *amd_spi, int idx, u8 val)
105 iowrite8(val, ((u8 __iomem *)amd_spi->io_remap_addr + idx));
108 static void amd_spi_setclear_reg8(struct amd_spi *amd_spi, int idx, u8 set, u8 clear)
110 u8 tmp = amd_spi_readreg8(amd_spi, idx);
113 amd_spi_writereg8(amd_spi, idx, tmp);
116 static inline u32 amd_spi_readreg32(struct amd_spi *amd_spi, int idx)
118 return ioread32((u8 __iomem *)amd_spi->io_remap_addr + idx);
121 static inline void amd_spi_writereg32(struct amd_spi *amd_spi, int idx, u32 val)
123 iowrite32(val, ((u8 __iomem *)amd_spi->io_remap_addr + idx));
126 static inline void amd_spi_setclear_reg32(struct amd_spi *amd_spi, int idx, u32 set, u32 clear)
128 u32 tmp = amd_spi_readreg32(amd_spi, idx);
131 amd_spi_writereg32(amd_spi, idx, tmp);
134 static void amd_spi_select_chip(struct amd_spi *amd_spi, u8 cs)
136 amd_spi_setclear_reg8(amd_spi, AMD_SPI_ALT_CS_REG, cs, AMD_SPI_ALT_CS_MASK);
139 static inline void amd_spi_clear_chip(struct amd_spi *amd_spi, u8 chip_select)
141 amd_spi_writereg8(amd_spi, AMD_SPI_ALT_CS_REG, chip_select & ~AMD_SPI_ALT_CS_MASK);
144 static void amd_spi_clear_fifo_ptr(struct amd_spi *amd_spi)
146 amd_spi_setclear_reg32(amd_spi, AMD_SPI_CTRL0_REG, AMD_SPI_FIFO_CLEAR, AMD_SPI_FIFO_CLEAR);
149 static int amd_spi_set_opcode(struct amd_spi *amd_spi, u8 cmd_opcode)
151 switch (amd_spi->version) {
153 amd_spi_setclear_reg32(amd_spi, AMD_SPI_CTRL0_REG, cmd_opcode,
157 amd_spi_writereg8(amd_spi, AMD_SPI_OPCODE_REG, cmd_opcode);
164 static inline void amd_spi_set_rx_count(struct amd_spi *amd_spi, u8 rx_count)
166 amd_spi_setclear_reg8(amd_spi, AMD_SPI_RX_COUNT_REG, rx_count, 0xff);
169 static inline void amd_spi_set_tx_count(struct amd_spi *amd_spi, u8 tx_count)
171 amd_spi_setclear_reg8(amd_spi, AMD_SPI_TX_COUNT_REG, tx_count, 0xff);
174 static int amd_spi_busy_wait(struct amd_spi *amd_spi)
179 switch (amd_spi->version) {
190 return readl_poll_timeout(amd_spi->io_remap_addr + reg, val,
194 static int amd_spi_execute_opcode(struct amd_spi *amd_spi)
198 ret = amd_spi_busy_wait(amd_spi);
202 switch (amd_spi->version) {
205 amd_spi_setclear_reg32(amd_spi, AMD_SPI_CTRL0_REG, AMD_SPI_EXEC_CMD,
210 amd_spi_setclear_reg8(amd_spi, AMD_SPI_CMD_TRIGGER_REG,
220 struct amd_spi *amd_spi = spi_controller_get_devdata(spi->controller);
222 amd_spi_clear_fifo_ptr(amd_spi);
239 static int amd_set_spi_freq(struct amd_spi *amd_spi, u32 speed_hz)
250 if (amd_spi->speed_hz == amd_spi_freq[i].speed_hz)
253 amd_spi->speed_hz = amd_spi_freq[i].speed_hz;
257 amd_spi_setclear_reg32(amd_spi, AMD_SPI_ENA_REG, alt_spd,
260 if (amd_spi->speed_hz == AMD_SPI_MAX_HZ)
261 amd_spi_setclear_reg32(amd_spi, AMD_SPI_ENA_REG, 1,
267 amd_spi_setclear_reg32(amd_spi, AMD_SPI_SPEED_REG, spd7_val,
274 static inline int amd_spi_fifo_xfer(struct amd_spi *amd_spi,
288 amd_set_spi_freq(amd_spi, xfer->speed_hz);
290 amd_set_spi_freq(amd_spi, spi->max_speed_hz);
303 amd_spi_writereg8(amd_spi, fifo_pos + i, buf[i]);
318 amd_spi_set_opcode(amd_spi, cmd_opcode);
319 amd_spi_set_tx_count(amd_spi, tx_len);
320 amd_spi_set_rx_count(amd_spi, rx_len);
323 message->status = amd_spi_execute_opcode(amd_spi);
328 message->status = amd_spi_busy_wait(amd_spi);
337 buf[i] = amd_spi_readreg8(amd_spi, fifo_pos + i);
346 switch (amd_spi->version) {
350 amd_spi_clear_chip(amd_spi, spi_get_chipselect(message->spi, 0));
364 struct amd_spi *amd_spi = spi_controller_get_devdata(host);
367 amd_spi_select_chip(amd_spi, spi_get_chipselect(spi, 0));
373 return amd_spi_fifo_xfer(amd_spi, host, msg);
385 struct amd_spi *amd_spi;
389 host = devm_spi_alloc_host(dev, sizeof(struct amd_spi));
393 amd_spi = spi_controller_get_devdata(host);
394 amd_spi->io_remap_addr = devm_platform_ioremap_resource(pdev, 0);
395 if (IS_ERR(amd_spi->io_remap_addr))
396 return dev_err_probe(dev, PTR_ERR(amd_spi->io_remap_addr),
399 dev_dbg(dev, "io_remap_address: %p\n", amd_spi->io_remap_addr);
401 amd_spi->version = (uintptr_t) device_get_match_data(dev);
434 .name = "amd_spi",