1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 00:32:04 +02:00

spi: Use spi_alloc_slave() in each SPI driver

Rather than each driver having its own way to allocate a SPI slave,
use the new allocation function everywhere. This will make it easier
to extend the interface without breaking drivers.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2013-03-18 19:23:40 +00:00
parent ba6c3ce9bd
commit d3504fee73
23 changed files with 36 additions and 83 deletions

View File

@@ -83,12 +83,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
altspi = malloc(sizeof(*altspi)); altspi = spi_alloc_slave(struct altera_spi_slave, bus, cs);
if (!altspi) if (!altspi)
return NULL; return NULL;
altspi->slave.bus = bus;
altspi->slave.cs = cs;
altspi->base = altera_spi_base_list[bus]; altspi->base = altera_spi_base_list[bus];
debug("%s: bus:%i cs:%i base:%lx\n", __func__, debug("%s: bus:%i cs:%i base:%lx\n", __func__,
bus, cs, altspi->base); bus, cs, altspi->base);

View File

@@ -53,12 +53,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
ds = malloc(sizeof(*ds)); ds = spi_alloc_slave(struct andes_spi_slave, bus, cs);
if (!ds) if (!ds)
return NULL; return NULL;
ds->slave.bus = bus;
ds->slave.cs = cs;
ds->regs = (struct andes_spi_regs *)CONFIG_SYS_SPI_BASE; ds->regs = (struct andes_spi_regs *)CONFIG_SYS_SPI_BASE;
/* /*

View File

@@ -120,12 +120,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
{ {
struct armd_spi_slave *pss; struct armd_spi_slave *pss;
pss = malloc(sizeof(*pss)); pss = spi_alloc_slave(struct armd_spi_slave, bus, cs);
if (!pss) if (!pss)
return NULL; return NULL;
pss->slave.bus = bus;
pss->slave.cs = cs;
pss->spi_reg = (struct ssp_reg *)SSP_REG_BASE(CONFIG_SYS_SSP_PORT); pss->spi_reg = (struct ssp_reg *)SSP_REG_BASE(CONFIG_SYS_SSP_PORT);
pss->cr0 = SSCR0_MOTO | SSCR0_DATASIZE(DEFAULT_WORD_LEN) | SSCR0_SSE; pss->cr0 = SSCR0_MOTO | SSCR0_DATASIZE(DEFAULT_WORD_LEN) | SSCR0_SSE;

View File

@@ -84,12 +84,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (mode & SPI_CPOL) if (mode & SPI_CPOL)
csrx |= ATMEL_SPI_CSRx_CPOL; csrx |= ATMEL_SPI_CSRx_CPOL;
as = malloc(sizeof(struct atmel_spi_slave)); as = spi_alloc_slave(struct atmel_spi_slave, bus, cs);
if (!as) if (!as)
return NULL; return NULL;
as->slave.bus = bus;
as->slave.cs = cs;
as->regs = regs; as->regs = regs;
as->mr = ATMEL_SPI_MR_MSTR | ATMEL_SPI_MR_MODFDIS as->mr = ATMEL_SPI_MR_MSTR | ATMEL_SPI_MR_MODFDIS
#if defined(CONFIG_AT91SAM9X5) || defined(CONFIG_AT91SAM9M10G45) #if defined(CONFIG_AT91SAM9X5) || defined(CONFIG_AT91SAM9M10G45)

View File

@@ -182,12 +182,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
default: return NULL; default: return NULL;
} }
bss = malloc(sizeof(*bss)); bss = spi_alloc_slave(struct bfin_spi_slave, bus, cs);
if (!bss) if (!bss)
return NULL; return NULL;
bss->slave.bus = bus;
bss->slave.cs = cs;
bss->mmr_base = (void *)mmr_base; bss->mmr_base = (void *)mmr_base;
bss->ctl = SPE | MSTR | TDBR_CORE; bss->ctl = SPE | MSTR | TDBR_CORE;
if (mode & SPI_CPHA) bss->ctl |= CPHA; if (mode & SPI_CPHA) bss->ctl |= CPHA;

View File

@@ -178,12 +178,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
return NULL; return NULL;
} }
bss = malloc(sizeof(*bss)); bss = spi_alloc_slave(struct bfin_spi_slave, bus, cs);
if (!bss) if (!bss)
return NULL; return NULL;
bss->slave.bus = bus;
bss->slave.cs = cs;
bss->regs = (struct bfin_spi_regs *)reg_base; bss->regs = (struct bfin_spi_regs *)reg_base;
bss->control = SPI_CTL_EN | SPI_CTL_MSTR; bss->control = SPI_CTL_EN | SPI_CTL_MSTR;
if (mode & SPI_CPHA) if (mode & SPI_CPHA)

View File

@@ -120,13 +120,11 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
dev = malloc(sizeof(struct cf_qspi_slave)); dev = spi_alloc_slave(struct cf_qspi_slave, bus, cs);
if (!dev) if (!dev)
return NULL; return NULL;
/* Initialize to known value */ /* Initialize to known value */
dev->slave.bus = bus;
dev->slave.cs = cs;
dev->regs = (qspi_t *)MMAP_QSPI; dev->regs = (qspi_t *)MMAP_QSPI;
dev->qmr = 0; dev->qmr = 0;
dev->qwr = 0; dev->qwr = 0;

View File

@@ -330,12 +330,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
cfslave = malloc(sizeof(struct cf_spi_slave)); cfslave = spi_alloc_slave(struct cf_spi_slave, bus, cs);
if (!cfslave) if (!cfslave)
return NULL; return NULL;
cfslave->slave.bus = bus;
cfslave->slave.cs = cs;
cfslave->baudrate = max_hz; cfslave->baudrate = max_hz;
/* specific setup */ /* specific setup */

View File

@@ -44,12 +44,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
ds = malloc(sizeof(*ds)); ds = spi_alloc_slave(struct davinci_spi_slave, bus, cs);
if (!ds) if (!ds)
return NULL; return NULL;
ds->slave.bus = bus;
ds->slave.cs = cs;
ds->regs = (struct davinci_spi_regs *)CONFIG_SYS_SPI_BASE; ds->regs = (struct davinci_spi_regs *)CONFIG_SYS_SPI_BASE;
ds->freq = max_hz; ds->freq = max_hz;

View File

@@ -89,15 +89,13 @@ struct spi_slave *spi_setup_slave(unsigned int busnum, unsigned int cs,
return NULL; return NULL;
} }
spi_slave = malloc(sizeof(*spi_slave)); spi_slave = spi_alloc_slave(struct exynos_spi_slave, busnum, cs);
if (!spi_slave) { if (!spi_slave) {
debug("%s: Could not allocate spi_slave\n", __func__); debug("%s: Could not allocate spi_slave\n", __func__);
return NULL; return NULL;
} }
bus = &spi_bus[busnum]; bus = &spi_bus[busnum];
spi_slave->slave.bus = busnum;
spi_slave->slave.cs = cs;
spi_slave->regs = bus->regs; spi_slave->regs = bus->regs;
spi_slave->mode = mode; spi_slave->mode = mode;
spi_slave->periph_id = bus->periph_id; spi_slave->periph_id = bus->periph_id;

View File

@@ -79,12 +79,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
fsl = malloc(sizeof(struct fsl_spi_slave)); fsl = spi_alloc_slave(struct fsl_spi_slave, bus, cs);
if (!fsl) if (!fsl)
return NULL; return NULL;
fsl->slave.bus = bus;
fsl->slave.cs = cs;
fsl->mode = mode; fsl->mode = mode;
fsl->max_transfer_length = ESPI_MAX_DATA_TRANSFER_LEN; fsl->max_transfer_length = ESPI_MAX_DATA_TRANSFER_LEN;

View File

@@ -49,13 +49,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
slave = malloc(sizeof(struct spi_slave)); slave = spi_alloc_slave_base(bus, cs);
if (!slave) if (!slave)
return NULL; return NULL;
slave->bus = bus;
slave->cs = cs;
writel(~KWSPI_CSN_ACT | KWSPI_SMEMRDY, &spireg->ctrl); writel(~KWSPI_CSN_ACT | KWSPI_SMEMRDY, &spireg->ctrl);
/* calculate spi clock prescaller using max_hz */ /* calculate spi clock prescaller using max_hz */

View File

@@ -48,13 +48,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
{ {
struct spi_slave *slave; struct spi_slave *slave;
slave = malloc(sizeof(struct spi_slave)); slave = spi_alloc_slave_base(bus, cs);
if (!slave) if (!slave)
return NULL; return NULL;
slave->bus = bus;
slave->cs = cs;
return slave; return slave;
} }

View File

@@ -45,13 +45,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
slave = malloc(sizeof(struct spi_slave)); slave = spi_alloc_slave_base(bus, cs);
if (!slave) if (!slave)
return NULL; return NULL;
slave->bus = bus;
slave->cs = cs;
/* /*
* TODO: Some of the code in spi_init() should probably move * TODO: Some of the code in spi_init() should probably move
* here, or into spi_claim_bus() below. * here, or into spi_claim_bus() below.

View File

@@ -408,7 +408,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (bus >= ARRAY_SIZE(spi_bases)) if (bus >= ARRAY_SIZE(spi_bases))
return NULL; return NULL;
mxcs = calloc(sizeof(struct mxc_spi_slave), 1); mxcs = spi_alloc_slave(struct mxc_spi_slave, bus, cs);
if (!mxcs) { if (!mxcs) {
puts("mxc_spi: SPI Slave not allocated !\n"); puts("mxc_spi: SPI Slave not allocated !\n");
return NULL; return NULL;
@@ -424,8 +424,6 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
cs = ret; cs = ret;
mxcs->slave.bus = bus;
mxcs->slave.cs = cs;
mxcs->base = spi_bases[bus]; mxcs->base = spi_bases[bus];
ret = spi_cfg_mxc(mxcs, cs, max_hz, mode); ret = spi_cfg_mxc(mxcs, cs, max_hz, mode);

View File

@@ -77,15 +77,13 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
return NULL; return NULL;
} }
mxs_slave = calloc(sizeof(struct mxs_spi_slave), 1); mxs_slave = spi_alloc_slave(struct mxs_spi_slave, bus, cs);
if (!mxs_slave) if (!mxs_slave)
return NULL; return NULL;
if (mxs_dma_init_channel(MXS_DMA_CHANNEL_AHB_APBH_SSP0 + bus)) if (mxs_dma_init_channel(MXS_DMA_CHANNEL_AHB_APBH_SSP0 + bus))
goto err_init; goto err_init;
mxs_slave->slave.bus = bus;
mxs_slave->slave.cs = cs;
mxs_slave->max_khz = max_hz / 1000; mxs_slave->max_khz = max_hz / 1000;
mxs_slave->mode = mode; mxs_slave->mode = mode;
mxs_slave->regs = mxs_ssp_regs_by_bus(bus); mxs_slave->regs = mxs_ssp_regs_by_bus(bus);

View File

@@ -90,13 +90,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs) || gpio_request(cs, "tiny_spi")) if (!spi_cs_is_valid(bus, cs) || gpio_request(cs, "tiny_spi"))
return NULL; return NULL;
tiny_spi = malloc(sizeof(*tiny_spi)); tiny_spi = spi_alloc_slave(struct tiny_spi_slave, bus, cs);
if (!tiny_spi) if (!tiny_spi)
return NULL; return NULL;
memset(tiny_spi, 0, sizeof(*tiny_spi));
tiny_spi->slave.bus = bus;
tiny_spi->slave.cs = cs;
tiny_spi->host = &tiny_spi_host_list[bus]; tiny_spi->host = &tiny_spi_host_list[bus];
tiny_spi->mode = mode & (SPI_CPOL | SPI_CPHA); tiny_spi->mode = mode & (SPI_CPOL | SPI_CPHA);
tiny_spi->flg = mode & SPI_CS_HIGH ? 1 : 0; tiny_spi->flg = mode & SPI_CS_HIGH ? 1 : 0;

View File

@@ -80,12 +80,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
unsigned int max_hz, unsigned int mode) unsigned int max_hz, unsigned int mode)
{ {
struct omap3_spi_slave *ds; struct omap3_spi_slave *ds;
struct mcspi *regs;
ds = malloc(sizeof(struct omap3_spi_slave));
if (!ds) {
printf("SPI error: malloc of SPI structure failed\n");
return NULL;
}
/* /*
* OMAP3 McSPI (MultiChannel SPI) has 4 busses (modules) * OMAP3 McSPI (MultiChannel SPI) has 4 busses (modules)
@@ -98,21 +93,21 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
switch (bus) { switch (bus) {
case 0: case 0:
ds->regs = (struct mcspi *)OMAP3_MCSPI1_BASE; regs = (struct mcspi *)OMAP3_MCSPI1_BASE;
break; break;
#ifdef OMAP3_MCSPI2_BASE #ifdef OMAP3_MCSPI2_BASE
case 1: case 1:
ds->regs = (struct mcspi *)OMAP3_MCSPI2_BASE; regs = (struct mcspi *)OMAP3_MCSPI2_BASE;
break; break;
#endif #endif
#ifdef OMAP3_MCSPI3_BASE #ifdef OMAP3_MCSPI3_BASE
case 2: case 2:
ds->regs = (struct mcspi *)OMAP3_MCSPI3_BASE; regs = (struct mcspi *)OMAP3_MCSPI3_BASE;
break; break;
#endif #endif
#ifdef OMAP3_MCSPI4_BASE #ifdef OMAP3_MCSPI4_BASE
case 3: case 3:
ds->regs = (struct mcspi *)OMAP3_MCSPI4_BASE; regs = (struct mcspi *)OMAP3_MCSPI4_BASE;
break; break;
#endif #endif
default: default:
@@ -120,7 +115,6 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
Supported busses 0 - 3\n", bus); Supported busses 0 - 3\n", bus);
return NULL; return NULL;
} }
ds->slave.bus = bus;
if (((bus == 0) && (cs > 3)) || if (((bus == 0) && (cs > 3)) ||
((bus == 1) && (cs > 1)) || ((bus == 1) && (cs > 1)) ||
@@ -130,19 +124,26 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
on bus %i\n", cs, bus); on bus %i\n", cs, bus);
return NULL; return NULL;
} }
ds->slave.cs = cs;
if (max_hz > OMAP3_MCSPI_MAX_FREQ) { if (max_hz > OMAP3_MCSPI_MAX_FREQ) {
printf("SPI error: unsupported frequency %i Hz. \ printf("SPI error: unsupported frequency %i Hz. \
Max frequency is 48 Mhz\n", max_hz); Max frequency is 48 Mhz\n", max_hz);
return NULL; return NULL;
} }
ds->freq = max_hz;
if (mode > SPI_MODE_3) { if (mode > SPI_MODE_3) {
printf("SPI error: unsupported SPI mode %i\n", mode); printf("SPI error: unsupported SPI mode %i\n", mode);
return NULL; return NULL;
} }
ds = spi_alloc_slave(struct omap3_spi_slave, bus, cs);
if (!ds) {
printf("SPI error: malloc of SPI structure failed\n");
return NULL;
}
ds->regs = regs;
ds->freq = max_hz;
ds->mode = mode; ds->mode = mode;
return &ds->slave; return &ds->slave;

View File

@@ -103,12 +103,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
ss = malloc(sizeof(struct spi_slave)); ss = spi_alloc_slave(struct sh_spi, bus, cs);
if (!ss) if (!ss)
return NULL; return NULL;
ss->slave.bus = bus;
ss->slave.cs = cs;
ss->regs = (struct sh_spi_regs *)CONFIG_SH_SPI_BASE; ss->regs = (struct sh_spi_regs *)CONFIG_SH_SPI_BASE;
/* SPI sycle stop */ /* SPI sycle stop */

View File

@@ -73,12 +73,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
if (!spi_cs_is_valid(bus, cs)) if (!spi_cs_is_valid(bus, cs))
return NULL; return NULL;
ss = malloc(sizeof(struct soft_spi_slave)); ss = spi_alloc_slave(struct soft_spi_slave, bus, cs);
if (!ss) if (!ss)
return NULL; return NULL;
ss->slave.bus = bus;
ss->slave.cs = cs;
ss->mode = mode; ss->mode = mode;
/* TODO: Use max_hz to limit the SCK rate */ /* TODO: Use max_hz to limit the SCK rate */

View File

@@ -81,13 +81,11 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
return NULL; return NULL;
} }
spi = malloc(sizeof(struct tegra_spi_slave)); spi = spi_alloc_slave(struct tegra_spi_slave, bus, cs);
if (!spi) { if (!spi) {
printf("SPI error: malloc of SPI structure failed\n"); printf("SPI error: malloc of SPI structure failed\n");
return NULL; return NULL;
} }
spi->slave.bus = bus;
spi->slave.cs = cs;
spi->ctrl = &spi_ctrls[bus]; spi->ctrl = &spi_ctrls[bus];
if (!spi->ctrl) { if (!spi->ctrl) {
printf("SPI error: could not find controller for bus %d\n", printf("SPI error: could not find controller for bus %d\n",

View File

@@ -81,13 +81,11 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
return NULL; return NULL;
} }
spi = malloc(sizeof(struct tegra_spi_slave)); spi = spi_alloc_slave(struct tegra_spi_slave, bus, cs);
if (!spi) { if (!spi) {
printf("SPI error: malloc of SPI structure failed\n"); printf("SPI error: malloc of SPI structure failed\n");
return NULL; return NULL;
} }
spi->slave.bus = bus;
spi->slave.cs = cs;
#ifdef CONFIG_OF_CONTROL #ifdef CONFIG_OF_CONTROL
int node = fdtdec_next_compatible(gd->fdt_blob, 0, int node = fdtdec_next_compatible(gd->fdt_blob, 0,
COMPAT_NVIDIA_TEGRA20_SFLASH); COMPAT_NVIDIA_TEGRA20_SFLASH);

View File

@@ -85,14 +85,12 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
return NULL; return NULL;
} }
xilspi = malloc(sizeof(*xilspi)); xilspi = spi_alloc_slave(struct xilinx_spi_slave, bus, cs);
if (!xilspi) { if (!xilspi) {
printf("XILSPI error: %s: malloc of SPI structure failed\n", printf("XILSPI error: %s: malloc of SPI structure failed\n",
__func__); __func__);
return NULL; return NULL;
} }
xilspi->slave.bus = bus;
xilspi->slave.cs = cs;
xilspi->regs = (struct xilinx_spi_reg *)xilinx_spi_base_list[bus]; xilspi->regs = (struct xilinx_spi_reg *)xilinx_spi_base_list[bus];
xilspi->freq = max_hz; xilspi->freq = max_hz;
xilspi->mode = mode; xilspi->mode = mode;