OpenCores
URL https://opencores.org/ocsvn/tiny_spi/tiny_spi/trunk

Subversion Repositories tiny_spi

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /tiny_spi/trunk
    from Rev 8 to Rev 9
    Reverse comparison

Rev 8 → Rev 9

/driver/u-boot/oc_tiny_spi.c
1,6 → 1,8
/*
* Opencore tiny_spi driver
*
* http://opencores.org/project,tiny_spi
*
* based on bfin_spi.c
* Copyright (c) 2005-2008 Analog Devices Inc.
* Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
7,11 → 9,13
*
* Licensed under the GPL-2 or later.
*/
 
#include <common.h>
#include <asm/io.h>
#include <malloc.h>
#include <spi.h>
#include <asm/gpio.h>
 
#define TINY_SPI_RXDATA 0
#define TINY_SPI_TXDATA 4
#define TINY_SPI_STATUS 8
26,11 → 30,12
uint freq;
uint baudwidth;
};
static struct tiny_spi_host tiny_spi_host_list[] = CONFIG_SYS_TINY_SPI_LIST;
static const struct tiny_spi_host tiny_spi_host_list[] =
CONFIG_SYS_TINY_SPI_LIST;
 
struct tiny_spi_slave {
struct spi_slave slave;
struct tiny_spi_host *host;
const struct tiny_spi_host *host;
uint mode;
uint baud;
uint flg;
37,13 → 42,11
};
#define to_tiny_spi_slave(s) container_of(s, struct tiny_spi_slave, slave)
 
__attribute__((weak))
int spi_cs_is_valid(unsigned int bus, unsigned int cs)
{
return bus < ARRAY_SIZE(tiny_spi_host_list) && gpio_is_valid(cs);
}
 
__attribute__((weak))
void spi_cs_activate(struct spi_slave *slave)
{
struct tiny_spi_slave *tiny_spi = to_tiny_spi_slave(slave);
52,7 → 55,6
debug("%s: SPI_CS_GPIO:%x\n", __func__, gpio_get_value(cs));
}
 
__attribute__((weak))
void spi_cs_deactivate(struct spi_slave *slave)
{
struct tiny_spi_slave *tiny_spi = to_tiny_spi_slave(slave);
64,10 → 66,9
void spi_set_speed(struct spi_slave *slave, uint hz)
{
struct tiny_spi_slave *tiny_spi = to_tiny_spi_slave(slave);
struct tiny_spi_host *host = tiny_spi->host;
tiny_spi->baud = DIV_ROUND_UP(host->freq, hz * 2) - 1;
if (tiny_spi->baud > (1 << host->baudwidth) - 1)
tiny_spi->baud =(1 << host->baudwidth) - 1;
const struct tiny_spi_host *host = tiny_spi->host;
tiny_spi->baud = min(DIV_ROUND_UP(host->freq, hz * 2),
(1 << host->baudwidth)) - 1;
debug("%s: speed %u actual %u\n", __func__, hz,
host->freq / ((tiny_spi->baud + 1) * 2));
}
111,7 → 112,7
int spi_claim_bus(struct spi_slave *slave)
{
struct tiny_spi_slave *tiny_spi = to_tiny_spi_slave(slave);
struct tiny_spi_host *host = tiny_spi->host;
const struct tiny_spi_host *host = tiny_spi->host;
debug("%s: bus:%i cs:%i\n", __func__, slave->bus, slave->cs);
gpio_direction_output(slave->cs, !tiny_spi->flg);
writel(tiny_spi->mode, host->base + TINY_SPI_CONTROL);
131,7 → 132,7
int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
void *din, unsigned long flags)
{
struct tiny_spi_host *host = to_tiny_spi_slave(slave)->host;
const struct tiny_spi_host *host = to_tiny_spi_slave(slave)->host;
const u8 *txp = dout;
u8 *rxp = din;
uint bytes = bitlen / 8;
159,17 → 160,20
for (i = 2; i < bytes; i++) {
u8 rx, tx = *txp++;
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXR));
TINY_SPI_STATUS_TXR))
;
rx = readb(host->base + TINY_SPI_TXDATA);
writeb(tx, host->base + TINY_SPI_TXDATA);
*rxp++ = rx;
}
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXR));
TINY_SPI_STATUS_TXR))
;
*rxp++ = readb(host->base + TINY_SPI_TXDATA);
}
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXE));
TINY_SPI_STATUS_TXE))
;
*rxp++ = readb(host->base + TINY_SPI_RXDATA);
} else if (rxp) {
writeb(CONFIG_TINY_SPI_IDLE_VAL, host->base + TINY_SPI_TXDATA);
179,7 → 183,8
for (i = 2; i < bytes; i++) {
u8 rx;
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXR));
TINY_SPI_STATUS_TXR))
;
rx = readb(host->base + TINY_SPI_TXDATA);
writeb(CONFIG_TINY_SPI_IDLE_VAL,
host->base + TINY_SPI_TXDATA);
186,11 → 191,13
*rxp++ = rx;
}
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXR));
TINY_SPI_STATUS_TXR))
;
*rxp++ = readb(host->base + TINY_SPI_TXDATA);
}
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXE));
TINY_SPI_STATUS_TXE))
;
*rxp++ = readb(host->base + TINY_SPI_RXDATA);
} else if (txp) {
writeb(*txp++, host->base + TINY_SPI_TXDATA);
199,12 → 206,14
for (i = 2; i < bytes; i++) {
u8 tx = *txp++;
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXR));
TINY_SPI_STATUS_TXR))
;
writeb(tx, host->base + TINY_SPI_TXDATA);
}
}
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXE));
TINY_SPI_STATUS_TXE))
;
} else {
writeb(CONFIG_TINY_SPI_IDLE_VAL, host->base + TINY_SPI_TXDATA);
if (bytes > 1) {
212,13 → 221,15
host->base + TINY_SPI_TXDATA);
for (i = 2; i < bytes; i++) {
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXR));
TINY_SPI_STATUS_TXR))
;
writeb(CONFIG_TINY_SPI_IDLE_VAL,
host->base + TINY_SPI_TXDATA);
}
}
while (!(readb(host->base + TINY_SPI_STATUS) &
TINY_SPI_STATUS_TXE));
TINY_SPI_STATUS_TXE))
;
}
 
done:

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.