On 1 September 2014 14:16, Markus Niebel <list-09_u-b...@tqsc.de> wrote: > From: Markus Niebel <markus.nie...@tq-group.com> > > 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.nie...@tq-group.com> > --- > drivers/spi/mxc_spi.c | 37 +++++++++++++++++++++---------------- > 1 file changed, 21 insertions(+), 16 deletions(-) > > diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c > index 6a05d15..c741738 100644 > --- a/drivers/spi/mxc_spi.c > +++ b/drivers/spi/mxc_spi.c > @@ -43,6 +43,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) > @@ -77,12 +79,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); > > @@ -114,19 +117,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 > @@ -404,6 +403,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"); > @@ -421,13 +425,9 @@ struct spi_slave *spi_setup_slave(unsigned int bus, > unsigned int cs, > cs = ret; > > 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; > } > > @@ -440,12 +440,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); > > -- > 2.1.0 >
In fact this driver is using spi_cfg_mxc() for configuring SPI clock,polarities and frequency in spi_setup_slave() time, but usually spi_setup_slave() will require only basic controller reg initialization. So while in spi_claim_bus() clock, polarities and frequencies will handle. Please think on that direction and will be good if you fix those and send the patches for next time. thanks! -- Jagan. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot