soc/mediatek: Move the common part of SPI drivers to common/
The SPI drivers can be shared by MT8183, MT8192 and MT8195. TEST=emerge-{oak, kukui, asurada, cherry} coreboot; verified on Cherry P0 Signed-off-by: Rex-BC Chen <rex-bc.chen@mediatek.com> Change-Id: I7bb7809a88fbda67eca67ecfde45b9cb5f09dffe Reviewed-on: https://review.coreboot.org/c/coreboot/+/52854 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Yu-Ping Wu <yupingso@google.com>
This commit is contained in:
parent
0575778667
commit
47095d5ec3
|
@ -3,20 +3,11 @@
|
||||||
#ifndef MTK_COMMON_SPI_H
|
#ifndef MTK_COMMON_SPI_H
|
||||||
#define MTK_COMMON_SPI_H
|
#define MTK_COMMON_SPI_H
|
||||||
|
|
||||||
|
#include <device/mmio.h>
|
||||||
#include <soc/gpio_base.h>
|
#include <soc/gpio_base.h>
|
||||||
#include <spi-generic.h>
|
#include <spi-generic.h>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
|
||||||
enum {
|
|
||||||
SPI_CFG1_CS_IDLE_SHIFT = 0,
|
|
||||||
SPI_CFG1_PACKET_LOOP_SHIFT = 8,
|
|
||||||
SPI_CFG1_PACKET_LENGTH_SHIFT = 16,
|
|
||||||
|
|
||||||
SPI_CFG1_CS_IDLE_MASK = 0xff << SPI_CFG1_CS_IDLE_SHIFT,
|
|
||||||
SPI_CFG1_PACKET_LOOP_MASK = 0xff << SPI_CFG1_PACKET_LOOP_SHIFT,
|
|
||||||
SPI_CFG1_PACKET_LENGTH_MASK = 0x3ff << SPI_CFG1_PACKET_LENGTH_SHIFT,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SPI_CMD_ACT_SHIFT = 0,
|
SPI_CMD_ACT_SHIFT = 0,
|
||||||
SPI_CMD_RESUME_SHIFT = 1,
|
SPI_CMD_RESUME_SHIFT = 1,
|
||||||
|
@ -59,7 +50,24 @@ enum spi_pad_mask {
|
||||||
SPI_PAD_SEL_MASK = 0x3
|
SPI_PAD_SEL_MASK = 0x3
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mtk_spi_regs;
|
/* SPI peripheral register map. */
|
||||||
|
typedef struct mtk_spi_regs {
|
||||||
|
uint32_t spi_cfg0_reg;
|
||||||
|
uint32_t spi_cfg1_reg;
|
||||||
|
uint32_t spi_tx_src_reg;
|
||||||
|
uint32_t spi_rx_dst_reg;
|
||||||
|
uint32_t spi_tx_data_reg;
|
||||||
|
uint32_t spi_rx_data_reg;
|
||||||
|
uint32_t spi_cmd_reg;
|
||||||
|
uint32_t spi_status0_reg;
|
||||||
|
uint32_t spi_status1_reg;
|
||||||
|
uint32_t spi_pad_macro_sel_reg;
|
||||||
|
uint32_t spi_cfg2_reg;
|
||||||
|
uint32_t spi_tx_src_64_reg;
|
||||||
|
uint32_t spi_rx_dst_64_reg;
|
||||||
|
} mtk_spi_regs;
|
||||||
|
|
||||||
|
check_member(mtk_spi_regs, spi_pad_macro_sel_reg, 0x24);
|
||||||
|
|
||||||
struct mtk_spi_bus {
|
struct mtk_spi_bus {
|
||||||
struct spi_slave slave;
|
struct spi_slave slave;
|
||||||
|
|
|
@ -34,6 +34,19 @@ static inline struct mtk_spi_bus *to_mtk_spi(const struct spi_slave *slave)
|
||||||
return &spi_bus[slave->bus];
|
return &spi_bus[slave->bus];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mtk_spi_set_timing(struct mtk_spi_regs *regs, u32 sck_ticks,
|
||||||
|
u32 cs_ticks, unsigned int tick_dly)
|
||||||
|
{
|
||||||
|
SET32_BITFIELDS(®s->spi_cfg0_reg, SPI_CFG_CS_HOLD, cs_ticks - 1,
|
||||||
|
SPI_CFG_CS_SETUP, cs_ticks - 1);
|
||||||
|
|
||||||
|
SET32_BITFIELDS(&GET_SCK_REG(regs), SPI_CFG_SCK_LOW, sck_ticks - 1,
|
||||||
|
SPI_CFG_SCK_HIGH, sck_ticks - 1);
|
||||||
|
|
||||||
|
SET32_BITFIELDS(®s->spi_cfg1_reg, SPI_CFG1_TICK_DLY, tick_dly,
|
||||||
|
SPI_CFG1_CS_IDLE, cs_ticks - 1);
|
||||||
|
}
|
||||||
|
|
||||||
static void spi_sw_reset(struct mtk_spi_regs *regs)
|
static void spi_sw_reset(struct mtk_spi_regs *regs)
|
||||||
{
|
{
|
||||||
setbits32(®s->spi_cmd_reg, SPI_CMD_RST_EN);
|
setbits32(®s->spi_cmd_reg, SPI_CMD_RST_EN);
|
||||||
|
@ -121,10 +134,8 @@ static int do_transfer(const struct spi_slave *slave, void *in, const void *out,
|
||||||
else
|
else
|
||||||
size = MIN(*bytes_in, *bytes_out);
|
size = MIN(*bytes_in, *bytes_out);
|
||||||
|
|
||||||
clrsetbits32(®s->spi_cfg1_reg,
|
SET32_BITFIELDS(®s->spi_cfg1_reg, SPI_CFG1_PACKET_LENGTH, size - 1,
|
||||||
SPI_CFG1_PACKET_LENGTH_MASK | SPI_CFG1_PACKET_LOOP_MASK,
|
SPI_CFG1_PACKET_LOOP, 0);
|
||||||
((size - 1) << SPI_CFG1_PACKET_LENGTH_SHIFT) |
|
|
||||||
(0 << SPI_CFG1_PACKET_LOOP_SHIFT));
|
|
||||||
|
|
||||||
if (*bytes_out) {
|
if (*bytes_out) {
|
||||||
const uint8_t *outb = (const uint8_t *)out;
|
const uint8_t *outb = (const uint8_t *)out;
|
||||||
|
|
|
@ -7,32 +7,16 @@
|
||||||
|
|
||||||
#define SPI_BUS_NUMBER 1
|
#define SPI_BUS_NUMBER 1
|
||||||
|
|
||||||
/* SPI peripheral register map. */
|
#define GET_SCK_REG(x) x->spi_cfg0_reg
|
||||||
typedef struct mtk_spi_regs {
|
|
||||||
uint32_t spi_cfg0_reg;
|
|
||||||
uint32_t spi_cfg1_reg;
|
|
||||||
uint32_t spi_tx_src_reg;
|
|
||||||
uint32_t spi_rx_dst_reg;
|
|
||||||
uint32_t spi_tx_data_reg;
|
|
||||||
uint32_t spi_rx_data_reg;
|
|
||||||
uint32_t spi_cmd_reg;
|
|
||||||
uint32_t spi_status0_reg;
|
|
||||||
uint32_t spi_status1_reg;
|
|
||||||
uint32_t spi_pad_macro_sel_reg;
|
|
||||||
} mtk_spi_regs;
|
|
||||||
|
|
||||||
check_member(mtk_spi_regs, spi_pad_macro_sel_reg, 0x24);
|
DEFINE_BITFIELD(SPI_CFG_SCK_HIGH, 7, 0)
|
||||||
|
DEFINE_BITFIELD(SPI_CFG_SCK_LOW, 15, 8)
|
||||||
|
DEFINE_BITFIELD(SPI_CFG_CS_HOLD, 23, 16)
|
||||||
|
DEFINE_BITFIELD(SPI_CFG_CS_SETUP, 31, 24)
|
||||||
|
|
||||||
enum {
|
DEFINE_BITFIELD(SPI_CFG1_CS_IDLE, 7, 0)
|
||||||
SPI_CFG0_SCK_HIGH_SHIFT = 0,
|
DEFINE_BITFIELD(SPI_CFG1_PACKET_LOOP, 15, 8)
|
||||||
SPI_CFG0_SCK_LOW_SHIFT = 8,
|
DEFINE_BITFIELD(SPI_CFG1_PACKET_LENGTH, 28, 16)
|
||||||
SPI_CFG0_CS_HOLD_SHIFT = 16,
|
DEFINE_BITFIELD(SPI_CFG1_TICK_DLY, 31, 29)
|
||||||
SPI_CFG0_CS_SETUP_SHIFT = 24,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
SPI_CFG1_TICK_DLY_SHIFT = 30,
|
|
||||||
SPI_CFG1_TICK_DLY_MASK = 0x3 << SPI_CFG1_TICK_DLY_SHIFT,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,20 +26,6 @@ void mtk_spi_set_gpio_pinmux(unsigned int bus,
|
||||||
gpio_set_mode(GPIO(MSDC2_CMD), 0);
|
gpio_set_mode(GPIO(MSDC2_CMD), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mtk_spi_set_timing(struct mtk_spi_regs *regs, u32 sck_ticks, u32 cs_ticks,
|
|
||||||
unsigned int tick_dly)
|
|
||||||
{
|
|
||||||
write32(®s->spi_cfg0_reg,
|
|
||||||
((sck_ticks - 1) << SPI_CFG0_SCK_HIGH_SHIFT) |
|
|
||||||
((sck_ticks - 1) << SPI_CFG0_SCK_LOW_SHIFT) |
|
|
||||||
((cs_ticks - 1) << SPI_CFG0_CS_HOLD_SHIFT) |
|
|
||||||
((cs_ticks - 1) << SPI_CFG0_CS_SETUP_SHIFT));
|
|
||||||
clrsetbits32(®s->spi_cfg1_reg, SPI_CFG1_CS_IDLE_MASK |
|
|
||||||
SPI_CFG1_TICK_DLY_MASK,
|
|
||||||
(tick_dly << SPI_CFG1_TICK_DLY_SHIFT) |
|
|
||||||
((cs_ticks - 1) << SPI_CFG1_CS_IDLE_SHIFT));
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct spi_ctrlr spi_flash_ctrlr = {
|
static const struct spi_ctrlr spi_flash_ctrlr = {
|
||||||
.max_xfer_size = 65535,
|
.max_xfer_size = 65535,
|
||||||
.flash_probe = mtk_spi_flash_probe,
|
.flash_probe = mtk_spi_flash_probe,
|
||||||
|
|
|
@ -7,39 +7,18 @@
|
||||||
|
|
||||||
#define SPI_BUS_NUMBER 6
|
#define SPI_BUS_NUMBER 6
|
||||||
|
|
||||||
/* SPI peripheral register map. */
|
#define GET_SCK_REG(x) x->spi_cfg2_reg
|
||||||
typedef struct mtk_spi_regs {
|
|
||||||
uint32_t spi_cfg0_reg;
|
|
||||||
uint32_t spi_cfg1_reg;
|
|
||||||
uint32_t spi_tx_src_reg;
|
|
||||||
uint32_t spi_rx_dst_reg;
|
|
||||||
uint32_t spi_tx_data_reg;
|
|
||||||
uint32_t spi_rx_data_reg;
|
|
||||||
uint32_t spi_cmd_reg;
|
|
||||||
uint32_t spi_status0_reg;
|
|
||||||
uint32_t spi_status1_reg;
|
|
||||||
uint32_t spi_pad_macro_sel_reg;
|
|
||||||
uint32_t spi_cfg2_reg;
|
|
||||||
uint32_t spi_tx_src_64_reg;
|
|
||||||
uint32_t spi_rx_dst_64_reg;
|
|
||||||
} mtk_spi_regs;
|
|
||||||
|
|
||||||
check_member(mtk_spi_regs, spi_pad_macro_sel_reg, 0x24);
|
DEFINE_BITFIELD(SPI_CFG_CS_HOLD, 15, 0)
|
||||||
|
DEFINE_BITFIELD(SPI_CFG_CS_SETUP, 31, 16)
|
||||||
|
|
||||||
enum {
|
DEFINE_BITFIELD(SPI_CFG_SCK_LOW, 15, 0)
|
||||||
SPI_CFG0_CS_HOLD_SHIFT = 0,
|
DEFINE_BITFIELD(SPI_CFG_SCK_HIGH, 31, 16)
|
||||||
SPI_CFG0_CS_SETUP_SHIFT = 16,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
DEFINE_BITFIELD(SPI_CFG1_CS_IDLE, 7, 0)
|
||||||
SPI_CFG2_SCK_LOW_SHIFT = 0,
|
DEFINE_BITFIELD(SPI_CFG1_PACKET_LOOP, 15, 8)
|
||||||
SPI_CFG2_SCK_HIGH_SHIFT = 16,
|
DEFINE_BITFIELD(SPI_CFG1_PACKET_LENGTH, 28, 16)
|
||||||
};
|
DEFINE_BITFIELD(SPI_CFG1_TICK_DLY, 31, 29)
|
||||||
|
|
||||||
enum {
|
|
||||||
SPI_CFG1_TICK_DLY_SHIFT = 29,
|
|
||||||
SPI_CFG1_TICK_DLY_MASK = 0x7 << SPI_CFG1_TICK_DLY_SHIFT,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -103,23 +103,6 @@ void mtk_spi_set_gpio_pinmux(unsigned int bus, enum spi_pad_mask pad_select)
|
||||||
gpio_set_mode((gpio_t){.id = ptr[i].pin_id}, ptr[i].func);
|
gpio_set_mode((gpio_t){.id = ptr[i].pin_id}, ptr[i].func);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mtk_spi_set_timing(struct mtk_spi_regs *regs, u32 sck_ticks, u32 cs_ticks,
|
|
||||||
unsigned int tick_dly)
|
|
||||||
{
|
|
||||||
write32(®s->spi_cfg0_reg,
|
|
||||||
((cs_ticks - 1) << SPI_CFG0_CS_HOLD_SHIFT) |
|
|
||||||
((cs_ticks - 1) << SPI_CFG0_CS_SETUP_SHIFT));
|
|
||||||
|
|
||||||
write32(®s->spi_cfg2_reg,
|
|
||||||
((sck_ticks - 1) << SPI_CFG2_SCK_HIGH_SHIFT) |
|
|
||||||
((sck_ticks - 1) << SPI_CFG2_SCK_LOW_SHIFT));
|
|
||||||
|
|
||||||
clrsetbits32(®s->spi_cfg1_reg, SPI_CFG1_TICK_DLY_MASK |
|
|
||||||
SPI_CFG1_CS_IDLE_MASK,
|
|
||||||
(tick_dly << SPI_CFG1_TICK_DLY_SHIFT) |
|
|
||||||
((cs_ticks - 1) << SPI_CFG1_CS_IDLE_SHIFT));
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct spi_ctrlr_buses spi_ctrlr_bus_map[] = {
|
const struct spi_ctrlr_buses spi_ctrlr_bus_map[] = {
|
||||||
{
|
{
|
||||||
.ctrlr = &spi_ctrlr,
|
.ctrlr = &spi_ctrlr,
|
||||||
|
|
|
@ -7,38 +7,17 @@
|
||||||
|
|
||||||
#define SPI_BUS_NUMBER 8
|
#define SPI_BUS_NUMBER 8
|
||||||
|
|
||||||
/* SPI peripheral register map. */
|
#define GET_SCK_REG(x) x->spi_cfg2_reg
|
||||||
typedef struct mtk_spi_regs {
|
|
||||||
uint32_t spi_cfg0_reg;
|
|
||||||
uint32_t spi_cfg1_reg;
|
|
||||||
uint32_t spi_tx_src_reg;
|
|
||||||
uint32_t spi_rx_dst_reg;
|
|
||||||
uint32_t spi_tx_data_reg;
|
|
||||||
uint32_t spi_rx_data_reg;
|
|
||||||
uint32_t spi_cmd_reg;
|
|
||||||
uint32_t spi_status0_reg;
|
|
||||||
uint32_t spi_status1_reg;
|
|
||||||
uint32_t spi_pad_macro_sel_reg;
|
|
||||||
uint32_t spi_cfg2_reg;
|
|
||||||
uint32_t spi_tx_src_64_reg;
|
|
||||||
uint32_t spi_rx_dst_64_reg;
|
|
||||||
} mtk_spi_regs;
|
|
||||||
|
|
||||||
check_member(mtk_spi_regs, spi_pad_macro_sel_reg, 0x24);
|
DEFINE_BITFIELD(SPI_CFG_CS_HOLD, 15, 0)
|
||||||
|
DEFINE_BITFIELD(SPI_CFG_CS_SETUP, 31, 16)
|
||||||
|
|
||||||
enum {
|
DEFINE_BITFIELD(SPI_CFG_SCK_LOW, 15, 0)
|
||||||
SPI_CFG0_CS_HOLD_SHIFT = 0,
|
DEFINE_BITFIELD(SPI_CFG_SCK_HIGH, 31, 16)
|
||||||
SPI_CFG0_CS_SETUP_SHIFT = 16,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
DEFINE_BITFIELD(SPI_CFG1_CS_IDLE, 7, 0)
|
||||||
SPI_CFG2_SCK_LOW_SHIFT = 0,
|
DEFINE_BITFIELD(SPI_CFG1_PACKET_LOOP, 15, 8)
|
||||||
SPI_CFG2_SCK_HIGH_SHIFT = 16,
|
DEFINE_BITFIELD(SPI_CFG1_PACKET_LENGTH, 28, 16)
|
||||||
};
|
DEFINE_BITFIELD(SPI_CFG1_TICK_DLY, 31, 29)
|
||||||
|
|
||||||
enum {
|
|
||||||
SPI_CFG1_TICK_DLY_SHIFT = 29,
|
|
||||||
SPI_CFG1_TICK_DLY_MASK = 0x7 << SPI_CFG1_TICK_DLY_SHIFT,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -112,23 +112,6 @@ void mtk_spi_set_gpio_pinmux(unsigned int bus, enum spi_pad_mask pad_select)
|
||||||
gpio_set_mode((gpio_t){.id = ptr[i].pin_id}, ptr[i].func);
|
gpio_set_mode((gpio_t){.id = ptr[i].pin_id}, ptr[i].func);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mtk_spi_set_timing(struct mtk_spi_regs *regs, u32 sck_ticks, u32 cs_ticks,
|
|
||||||
unsigned int tick_dly)
|
|
||||||
{
|
|
||||||
write32(®s->spi_cfg0_reg,
|
|
||||||
((cs_ticks - 1) << SPI_CFG0_CS_HOLD_SHIFT) |
|
|
||||||
((cs_ticks - 1) << SPI_CFG0_CS_SETUP_SHIFT));
|
|
||||||
|
|
||||||
write32(®s->spi_cfg2_reg,
|
|
||||||
((sck_ticks - 1) << SPI_CFG2_SCK_HIGH_SHIFT) |
|
|
||||||
((sck_ticks - 1) << SPI_CFG2_SCK_LOW_SHIFT));
|
|
||||||
|
|
||||||
clrsetbits32(®s->spi_cfg1_reg, SPI_CFG1_TICK_DLY_MASK |
|
|
||||||
SPI_CFG1_CS_IDLE_MASK,
|
|
||||||
(tick_dly << SPI_CFG1_TICK_DLY_SHIFT) |
|
|
||||||
((cs_ticks - 1) << SPI_CFG1_CS_IDLE_SHIFT));
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct spi_ctrlr spi_flash_ctrlr = {
|
static const struct spi_ctrlr spi_flash_ctrlr = {
|
||||||
.max_xfer_size = 65535,
|
.max_xfer_size = 65535,
|
||||||
.flash_probe = mtk_spi_flash_probe,
|
.flash_probe = mtk_spi_flash_probe,
|
||||||
|
|
Loading…
Reference in New Issue