15 #define EXYNOS_SPI_MAX_TRANSFER_BYTES (65535)
17 #if defined(CONFIG_DEBUG_SPI) && CONFIG_DEBUG_SPI
18 # define DEBUG_SPI(x,...) printk(BIOS_DEBUG, "EXYNOS_SPI: " x)
20 # define DEBUG_SPI(x,...)
39 .slave = { .bus = 1, },
44 .slave = { .bus = 2, },
75 if (mode_cfg != orig_mode_cfg)
77 if (swap_cfg != orig_swap_cfg)
118 size_t width = (size % 4) ? 1 : 4;
121 size_t packets = size /
width;
123 packets =
MIN(packets, (1 << 16) - 1);
125 size_t out_bytes, in_bytes;
126 out_bytes = in_bytes = packets *
width;
131 while (out_bytes || in_bytes) {
133 int rx_lvl = ((
spi_sts >> 15) & 0x1ff);
134 int tx_lvl = ((
spi_sts >> 6) & 0x1ff);
136 if (tx_lvl < 32 && tx_lvl < out_bytes) {
148 if (rx_lvl >=
width) {
160 size -= packets *
width;
165 void *din,
size_t bytes_in)
169 if (bytes_out && bytes_in) {
170 size_t min_size =
MIN(bytes_out, bytes_in);
174 bytes_out -= min_size;
175 bytes_in -= min_size;
177 din = (
uint8_t *)din + min_size;
178 dout = (
const uint8_t *)dout + min_size;
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
void * memcpy(void *dest, const void *src, size_t n)
struct mem_pool cbfs_cache
void outb(u8 val, u16 port)
static struct region_device rdev
#define setbits32(addr, set)
#define clrbits32(addr, clear)
void * mmap_helper_rdev_mmap(const struct region_device *, size_t, size_t)
int mmap_helper_rdev_munmap(const struct region_device *, void *)
#define MMAP_HELPER_DEV_INIT(ops_, offset_, size_, mpool_)
const struct spi_ctrlr_buses spi_ctrlr_bus_map[]
const size_t spi_ctrlr_bus_map_count
#define EXYNOS5_SPI1_BASE
#define EXYNOS5_SPI0_BASE
#define SPI_SLAVE_SIG_INACT
#define SPI_TX_HWORD_SWAP
#define SPI_MODE_CH_WIDTH_WORD
#define SPI_RX_HWORD_SWAP
#define SPI_MODE_BUS_WIDTH_WORD
#define SPI_PACKET_CNT_EN
void exynos_init_spi_boot_device(void)
const struct region_device * exynos_spi_boot_device(void)
int exynos_spi_read(struct exynos_spi *regs, void *dest, u32 len, u32 off)
#define EXYNOS5_SPI2_BASE
#define SPI_MODE_BUS_WIDTH_BYTE
#define SPI_MODE_BUS_WIDTH_MASK
#define SPI_MODE_CH_WIDTH_MASK
#define SPI_MODE_CH_WIDTH_BYTE
static void spi_sw_reset(struct exynos_spi *regs, int word)
static void spi_ctrlr_release_bus(const struct spi_slave *slave)
static struct mmap_helper_region_device mdev
static ssize_t exynos_spi_readat(const struct region_device *rdev, void *dest, size_t offset, size_t count)
static void spi_transfer(struct exynos_spi *regs, void *in, const void *out, size_t size)
static void * exynos_spi_map(const struct region_device *rdev, size_t offset, size_t count)
static struct exynos_spi_slave exynos_spi_slaves[3]
static const struct region_device_ops exynos_spi_ops
static int spi_ctrlr_xfer(const struct spi_slave *slave, const void *dout, size_t bytes_out, void *din, size_t bytes_in)
static struct exynos_spi_slave * to_exynos_spi(const struct spi_slave *slave)
static void exynos_spi_init(struct exynos_spi *regs)
static int spi_ctrlr_claim_bus(const struct spi_slave *slave)
static int spi_ctrlr_setup(const struct spi_slave *slave)
static struct exynos_spi_slave * boot_slave
int spi_claim_bus(const struct spi_slave *slave)
void spi_release_bus(const struct spi_slave *slave)
#define SPI_CTRLR_DEFAULT_MAX_XFER_SIZE
static struct spi_slave slave
struct region_device rdev
void *(* mmap)(const struct region_device *, size_t, size_t)
const struct spi_ctrlr * ctrlr
int(* setup)(const struct spi_slave *slave)