8 #include <soc/addressmap.h>
10 #include <soc/clock.h>
20 #define SPI_TIMEOUT_US 1000
21 #define SPI_SRCCLK_HZ (198*MHz)
22 #define SPI_FIFO_DEPTH 32
156 "RK SPI: Status keeps busy for 1000us after a read/write!\n");
167 unsigned int sout,
unsigned int sin)
171 else if (sin && sout)
181 size_t *bytes_out,
void *din,
size_t *bytes_in)
188 min_xfer = *bytes_in;
189 else if (*bytes_in == 0)
190 min_xfer = *bytes_out;
192 min_xfer =
MIN(*bytes_in, *bytes_out);
211 int w = use_16bit ? 2 : 1;
214 *bytes_in -= xferred;
230 size_t bytes_out,
void *din,
size_t bytes_in)
243 while (bytes_out || bytes_in) {
244 size_t in_now =
MIN(bytes_in, 0xfffe);
245 size_t out_now =
MIN(bytes_out, 0xfffe);
246 size_t in_rem, out_rem;
257 if (bytes_out == 0) {
258 if ((in_now & 1) && in_now > 1)
280 ret =
do_xfer(
regs, use_16bit, dout, &out_rem, din, &in_rem);
285 size_t sent = out_now - out_rem;
291 size_t received = in_now - in_rem;
292 bytes_in -= received;
298 return ret < 0 ? ret : 0;
305 .max_xfer_size = 65535,
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
#define assert(statement)
#define printk(level,...)
void buffer_from_fifo32(void *buffer, size_t size, void *fifo, int fifo_stride, int fifo_width)
#define DIV_ROUND_CLOSEST(x, divisor)
#define setbits32(addr, set)
#define clrsetbits32(addr, clear, set)
#define clrbits32(addr, clear)
static int stopwatch_expired(struct stopwatch *sw)
static void stopwatch_init_usecs_expire(struct stopwatch *sw, long us)
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
const struct spi_ctrlr_buses spi_ctrlr_bus_map[]
const size_t spi_ctrlr_bus_map_count
#define SPI_SSN_DELAY_OFFSET
#define SPI_SSN_DELAY_ONE
#define SPI_HALF_WORLD_TX_OFFSET
static void rockchip_spi_set_clk(struct rockchip_spi *regs, unsigned int hz)
static void rockchip_spi_enable_chip(struct rockchip_spi *regs, int enable)
static void set_transfer_mode(struct rockchip_spi *regs, unsigned int sout, unsigned int sin)
static void spi_ctrlr_release_bus(const struct spi_slave *slave)
static void spi_cs_activate(const struct spi_slave *slave)
static void spi_cs_deactivate(const struct spi_slave *slave)
static struct rockchip_spi_slave rockchip_spi_slaves[]
void rockchip_spi_set_sample_delay(unsigned int bus, unsigned int delay_ns)
void rockchip_spi_init(unsigned int bus, unsigned int speed_hz)
static int rockchip_spi_wait_till_not_busy(struct rockchip_spi *regs)
static int spi_ctrlr_xfer(const struct spi_slave *slave, const void *dout, size_t bytes_out, void *din, size_t bytes_in)
static int do_xfer(struct rockchip_spi *regs, bool use_16bit, const void *dout, size_t *bytes_out, void *din, size_t *bytes_in)
static void set_tmod(struct rockchip_spi *regs, unsigned int tmod)
static int spi_ctrlr_claim_bus(const struct spi_slave *slave)
static struct rockchip_spi_slave * to_rockchip_spi(const struct spi_slave *slave)
void rkclk_configure_spi(unsigned int bus, unsigned int hz)
static struct spi_slave slave
struct rockchip_spi * regs
const struct spi_ctrlr * ctrlr
int(* claim_bus)(const struct spi_slave *slave)