mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-11 07:34:31 +00:00
SPI: mxc_spi: delay initialisation until claim bus
it is not correct to init for a specific slave in spi_setup_slave. instead buffer the values and delay init until spi_claim_bus. Signed-off-by: Markus Niebel <Markus.Niebel@tq-group.com> Acked-by: Stefano Babic <sbabic@denx.de> Reviewed-by: Jagannadha Sutradharudu Teki <jagannadh.teki@gmail.com>
This commit is contained in:
parent
ba3451d3d8
commit
027a9a0024
1 changed files with 21 additions and 16 deletions
|
@ -49,6 +49,8 @@ struct mxc_spi_slave {
|
|||
#endif
|
||||
int gpio;
|
||||
int ss_pol;
|
||||
unsigned int max_hz;
|
||||
unsigned int mode;
|
||||
};
|
||||
|
||||
static inline struct mxc_spi_slave *to_mxc_spi_slave(struct spi_slave *slave)
|
||||
|
@ -83,12 +85,13 @@ u32 get_cspi_div(u32 div)
|
|||
}
|
||||
|
||||
#ifdef MXC_CSPI
|
||||
static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
|
||||
unsigned int max_hz, unsigned int mode)
|
||||
static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs)
|
||||
{
|
||||
unsigned int ctrl_reg;
|
||||
u32 clk_src;
|
||||
u32 div;
|
||||
unsigned int max_hz = mxcs->max_hz;
|
||||
unsigned int mode = mxcs->mode;
|
||||
|
||||
clk_src = mxc_get_clock(MXC_CSPI_CLK);
|
||||
|
||||
|
@ -120,19 +123,15 @@ static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
|
|||
#endif
|
||||
|
||||
#ifdef MXC_ECSPI
|
||||
static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
|
||||
unsigned int max_hz, unsigned int mode)
|
||||
static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs)
|
||||
{
|
||||
u32 clk_src = mxc_get_clock(MXC_CSPI_CLK);
|
||||
s32 reg_ctrl, reg_config;
|
||||
u32 ss_pol = 0, sclkpol = 0, sclkpha = 0, sclkctl = 0;
|
||||
u32 pre_div = 0, post_div = 0;
|
||||
struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
|
||||
|
||||
if (max_hz == 0) {
|
||||
printf("Error: desired clock is 0\n");
|
||||
return -1;
|
||||
}
|
||||
unsigned int max_hz = mxcs->max_hz;
|
||||
unsigned int mode = mxcs->mode;
|
||||
|
||||
/*
|
||||
* Reset SPI and set all CSs to master mode, if toggling
|
||||
|
@ -409,6 +408,11 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
|
|||
if (bus >= ARRAY_SIZE(spi_bases))
|
||||
return NULL;
|
||||
|
||||
if (max_hz == 0) {
|
||||
printf("Error: desired clock is 0\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mxcs = spi_alloc_slave(struct mxc_spi_slave, bus, cs);
|
||||
if (!mxcs) {
|
||||
puts("mxc_spi: SPI Slave not allocated !\n");
|
||||
|
@ -424,13 +428,9 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
|
|||
}
|
||||
|
||||
mxcs->base = spi_bases[bus];
|
||||
mxcs->max_hz = max_hz;
|
||||
mxcs->mode = mode;
|
||||
|
||||
ret = spi_cfg_mxc(mxcs, cs, max_hz, mode);
|
||||
if (ret) {
|
||||
printf("mxc_spi: cannot setup SPI controller\n");
|
||||
free(mxcs);
|
||||
return NULL;
|
||||
}
|
||||
return &mxcs->slave;
|
||||
}
|
||||
|
||||
|
@ -443,12 +443,17 @@ void spi_free_slave(struct spi_slave *slave)
|
|||
|
||||
int spi_claim_bus(struct spi_slave *slave)
|
||||
{
|
||||
int ret;
|
||||
struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
|
||||
struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
|
||||
|
||||
reg_write(®s->rxdata, 1);
|
||||
udelay(1);
|
||||
reg_write(®s->ctrl, mxcs->ctrl_reg);
|
||||
ret = spi_cfg_mxc(mxcs, slave->cs);
|
||||
if (ret) {
|
||||
printf("mxc_spi: cannot setup SPI controller\n");
|
||||
return ret;
|
||||
}
|
||||
reg_write(®s->period, MXC_CSPIPERIOD_32KHZ);
|
||||
reg_write(®s->intr, 0);
|
||||
|
||||
|
|
Loading…
Reference in a new issue