Lines Matching +full:spi +full:- +full:slave

2  * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
4 * Driver for SPI controller on DaVinci. Based on atmel_spi.c
9 * SPDX-License-Identifier: GPL-2.0+
13 #include <spi.h>
70 * define CONFIG_SYS_SPI1 when platform has spi-1 device (bus #1) and
80 * define CONFIG_SYS_SPI2 when platform has spi-2 device (bus #2) and
92 /* davinci spi register set */
120 /* davinci spi slave */
123 struct spi_slave slave; member
126 unsigned int freq; /* current SPI bus frequency */
127 unsigned int mode; /* current SPI mode used */
129 u8 cur_cs; /* CS of current slave */
130 bool half_duplex; /* true, if master is half-duplex only */
144 writel(data, &ds->regs->dat1); in davinci_spi_xfer_data()
147 while ((buf_reg_val = readl(&ds->regs->buf)) & SPIBUF_RXEMPTY_MASK) in davinci_spi_xfer_data()
160 (ds->cur_cs << SPIDAT1_CSNR_SHIFT)); in davinci_spi_read()
163 while (readl(&ds->regs->buf) & SPIBUF_TXFULL_MASK) in davinci_spi_read()
167 writel(data1_reg_val, &ds->regs->dat1); in davinci_spi_read()
170 while ((len--) > 1) in davinci_spi_read()
190 (ds->cur_cs << SPIDAT1_CSNR_SHIFT)); in davinci_spi_write()
193 while (readl(&ds->regs->buf) & SPIBUF_TXFULL_MASK) in davinci_spi_write()
198 writel(data1_reg_val | *txp++, &ds->regs->dat1); in davinci_spi_write()
199 len--; in davinci_spi_write()
203 while ((len--) > 1) in davinci_spi_write()
224 (ds->cur_cs << SPIDAT1_CSNR_SHIFT)); in davinci_spi_read_write()
227 while (readl(&ds->regs->buf) & SPIBUF_TXFULL_MASK) in davinci_spi_read_write()
231 while ((len--) > 1) in davinci_spi_read_write()
249 /* Enable the SPI hardware */ in __davinci_spi_claim_bus()
250 writel(SPIGCR0_SPIRST_MASK, &ds->regs->gcr0); in __davinci_spi_claim_bus()
252 writel(SPIGCR0_SPIENA_MASK, &ds->regs->gcr0); in __davinci_spi_claim_bus()
255 writel(SPIGCR1_MASTER_MASK | SPIGCR1_CLKMOD_MASK, &ds->regs->gcr1); in __davinci_spi_claim_bus()
259 SPIPC0_DOFUN_MASK | SPIPC0_DIFUN_MASK), &ds->regs->pc0); in __davinci_spi_claim_bus()
262 scalar = ((CONFIG_SYS_SPI_CLK / ds->freq) - 1) & 0xFF; in __davinci_spi_claim_bus()
269 if (ds->mode & SPI_CPOL) in __davinci_spi_claim_bus()
271 if (!(ds->mode & SPI_CPHA)) in __davinci_spi_claim_bus()
274 (mode << SPIFMT_PHASE_SHIFT), &ds->regs->fmt0); in __davinci_spi_claim_bus()
281 (50 << SPI_T2CDELAY_SHIFT), &ds->regs->delay); in __davinci_spi_claim_bus()
284 writel(SPIDEF_CSDEF0_MASK, &ds->regs->def); in __davinci_spi_claim_bus()
287 writel(0, &ds->regs->int0); in __davinci_spi_claim_bus()
288 writel(0, &ds->regs->lvl); in __davinci_spi_claim_bus()
290 /* enable SPI */ in __davinci_spi_claim_bus()
291 writel((readl(&ds->regs->gcr1) | SPIGCR1_SPIENA_MASK), &ds->regs->gcr1); in __davinci_spi_claim_bus()
298 /* Disable the SPI hardware */ in __davinci_spi_release_bus()
299 writel(SPIGCR0_SPIRST_MASK, &ds->regs->gcr0); in __davinci_spi_release_bus()
315 * It's not clear how non-8-bit-aligned transfers are supposed to be in __davinci_spi_xfer()
317 * the current SPI interface - here we terminate on receiving such a in __davinci_spi_xfer()
332 if (!ds->half_duplex) in __davinci_spi_xfer()
335 printf("SPI full duplex not supported\n"); in __davinci_spi_xfer()
348 static inline struct davinci_spi_slave *to_davinci_spi(struct spi_slave *slave) in to_davinci_spi() argument
350 return container_of(slave, struct davinci_spi_slave, slave); in to_davinci_spi()
381 void spi_cs_activate(struct spi_slave *slave) in spi_cs_activate() argument
386 void spi_cs_deactivate(struct spi_slave *slave) in spi_cs_deactivate() argument
410 ds->regs = (struct davinci_spi_regs *)SPI0_BASE; in spi_setup_slave()
414 ds->regs = (struct davinci_spi_regs *)SPI1_BASE; in spi_setup_slave()
419 ds->regs = (struct davinci_spi_regs *)SPI2_BASE; in spi_setup_slave()
426 ds->freq = max_hz; in spi_setup_slave()
427 ds->mode = mode; in spi_setup_slave()
429 return &ds->slave; in spi_setup_slave()
432 void spi_free_slave(struct spi_slave *slave) in spi_free_slave() argument
434 struct davinci_spi_slave *ds = to_davinci_spi(slave); in spi_free_slave()
439 int spi_xfer(struct spi_slave *slave, unsigned int bitlen, in spi_xfer() argument
442 struct davinci_spi_slave *ds = to_davinci_spi(slave); in spi_xfer()
444 ds->cur_cs = slave->cs; in spi_xfer()
449 int spi_claim_bus(struct spi_slave *slave) in spi_claim_bus() argument
451 struct davinci_spi_slave *ds = to_davinci_spi(slave); in spi_claim_bus()
454 ds->half_duplex = true; in spi_claim_bus()
456 ds->half_duplex = false; in spi_claim_bus()
458 return __davinci_spi_claim_bus(ds, ds->slave.cs); in spi_claim_bus()
461 void spi_release_bus(struct spi_slave *slave) in spi_release_bus() argument
463 struct davinci_spi_slave *ds = to_davinci_spi(slave); in spi_release_bus()
475 return -EINVAL; in davinci_spi_set_speed()
477 ds->freq = max_hz; in davinci_spi_set_speed()
487 ds->mode = mode; in davinci_spi_set_mode()
496 struct udevice *bus = dev->parent; in davinci_spi_claim_bus()
499 if (slave_plat->cs >= ds->num_cs) { in davinci_spi_claim_bus()
500 printf("Invalid SPI chipselect\n"); in davinci_spi_claim_bus()
501 return -EINVAL; in davinci_spi_claim_bus()
503 ds->half_duplex = slave_plat->mode & SPI_PREAMBLE; in davinci_spi_claim_bus()
505 return __davinci_spi_claim_bus(ds, slave_plat->cs); in davinci_spi_claim_bus()
510 struct davinci_spi_slave *ds = dev_get_priv(dev->parent); in davinci_spi_release_bus()
519 struct dm_spi_slave_platdata *slave = in davinci_spi_xfer() local
521 struct udevice *bus = dev->parent; in davinci_spi_xfer()
524 if (slave->cs >= ds->num_cs) { in davinci_spi_xfer()
525 printf("Invalid SPI chipselect\n"); in davinci_spi_xfer()
526 return -EINVAL; in davinci_spi_xfer()
528 ds->cur_cs = slave->cs; in davinci_spi_xfer()
542 const void *blob = gd->fdt_blob; in davinci_ofdata_to_platadata()
545 ds->regs = devfdt_map_physmem(bus, sizeof(struct davinci_spi_regs)); in davinci_ofdata_to_platadata()
546 if (!ds->regs) { in davinci_ofdata_to_platadata()
548 return -EINVAL; in davinci_ofdata_to_platadata()
550 ds->num_cs = fdtdec_get_int(blob, node, "num-cs", 4); in davinci_ofdata_to_platadata()
564 { .compatible = "ti,keystone-spi" },
565 { .compatible = "ti,dm6441-spi" },
566 { .compatible = "ti,da830-spi" },