summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorTom Rini <trini@ti.com>2014-10-22 13:51:45 -0400
committerTom Rini <trini@ti.com>2014-10-22 13:51:45 -0400
commit68e80fdda1336068f40915388bbdacfd2b75233a (patch)
treedeb28e65fdd601e47bf5564f67da3035a840e284 /common
parent35d4fed320d577a4446531d7b9350ce40065c4b0 (diff)
parent8a9cd5ad6f89ab721a352cbb9264bea5ede68789 (diff)
Merge git://git.denx.de/u-boot-dm
Diffstat (limited to 'common')
-rw-r--r--common/board_r.c2
-rw-r--r--common/cmd_sf.c26
-rw-r--r--common/cmd_spi.c39
-rw-r--r--common/cros_ec.c30
-rw-r--r--common/env_sf.c1
-rw-r--r--common/exports.c4
6 files changed, 92 insertions, 10 deletions
diff --git a/common/board_r.c b/common/board_r.c
index 7e1a76d97f..3affb6362f 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -354,7 +354,7 @@ static int initr_flash(void)
}
#endif
-#ifdef CONFIG_PPC
+#if defined(CONFIG_PPC) && !defined(CONFIG_DM_SPI)
static int initr_spi(void)
{
/* PPC does this here */
diff --git a/common/cmd_sf.c b/common/cmd_sf.c
index c60e8d10df..95a6f89a84 100644
--- a/common/cmd_sf.c
+++ b/common/cmd_sf.c
@@ -8,10 +8,13 @@
#include <common.h>
#include <div64.h>
+#include <dm.h>
#include <malloc.h>
+#include <spi.h>
#include <spi_flash.h>
#include <asm/io.h>
+#include <dm/device-internal.h>
static struct spi_flash *flash;
@@ -80,7 +83,12 @@ static int do_spi_flash_probe(int argc, char * const argv[])
unsigned int speed = CONFIG_SF_DEFAULT_SPEED;
unsigned int mode = CONFIG_SF_DEFAULT_MODE;
char *endp;
+#ifdef CONFIG_DM_SPI_FLASH
+ struct udevice *new, *bus_dev;
+ int ret;
+#else
struct spi_flash *new;
+#endif
if (argc >= 2) {
cs = simple_strtoul(argv[1], &endp, 0);
@@ -108,6 +116,23 @@ static int do_spi_flash_probe(int argc, char * const argv[])
return -1;
}
+#ifdef CONFIG_DM_SPI_FLASH
+ /* Remove the old device, otherwise probe will just be a nop */
+ ret = spi_find_bus_and_cs(bus, cs, &bus_dev, &new);
+ if (!ret) {
+ device_remove(new);
+ device_unbind(new);
+ }
+ flash = NULL;
+ ret = spi_flash_probe_bus_cs(bus, cs, speed, mode, &new);
+ if (ret) {
+ printf("Failed to initialize SPI flash at %u:%u (error %d)\n",
+ bus, cs, ret);
+ return 1;
+ }
+
+ flash = new->uclass_priv;
+#else
new = spi_flash_probe(bus, cs, speed, mode);
if (!new) {
printf("Failed to initialize SPI flash at %u:%u\n", bus, cs);
@@ -117,6 +142,7 @@ static int do_spi_flash_probe(int argc, char * const argv[])
if (flash)
spi_flash_free(flash);
flash = new;
+#endif
return 0;
}
diff --git a/common/cmd_spi.c b/common/cmd_spi.c
index be5709c617..64c3ffcf42 100644
--- a/common/cmd_spi.c
+++ b/common/cmd_spi.c
@@ -11,6 +11,7 @@
#include <common.h>
#include <command.h>
+#include <dm.h>
#include <errno.h>
#include <spi.h>
@@ -42,19 +43,38 @@ static uchar din[MAX_SPI_BYTES];
static int do_spi_xfer(int bus, int cs)
{
struct spi_slave *slave;
- int rcode = 0;
-
+ int ret = 0;
+
+#ifdef CONFIG_DM_SPI
+ char name[30], *str;
+ struct udevice *dev;
+
+ snprintf(name, sizeof(name), "generic_%d:%d", bus, cs);
+ str = strdup(name);
+ ret = spi_get_bus_and_cs(bus, cs, 1000000, mode, "spi_generic_drv",
+ str, &dev, &slave);
+ if (ret)
+ return ret;
+#else
slave = spi_setup_slave(bus, cs, 1000000, mode);
if (!slave) {
printf("Invalid device %d:%d\n", bus, cs);
return -EINVAL;
}
+#endif
- spi_claim_bus(slave);
- if (spi_xfer(slave, bitlen, dout, din,
- SPI_XFER_BEGIN | SPI_XFER_END) != 0) {
- printf("Error during SPI transaction\n");
- rcode = -EIO;
+ ret = spi_claim_bus(slave);
+ if (ret)
+ goto done;
+ ret = spi_xfer(slave, bitlen, dout, din,
+ SPI_XFER_BEGIN | SPI_XFER_END);
+#ifndef CONFIG_DM_SPI
+ /* We don't get an error code in this case */
+ if (ret)
+ ret = -EIO;
+#endif
+ if (ret) {
+ printf("Error %d during SPI transaction\n", ret);
} else {
int j;
@@ -62,10 +82,13 @@ static int do_spi_xfer(int bus, int cs)
printf("%02X", din[j]);
printf("\n");
}
+done:
spi_release_bus(slave);
+#ifndef CONFIG_DM_SPI
spi_free_slave(slave);
+#endif
- return rcode;
+ return ret;
}
/*
diff --git a/common/cros_ec.c b/common/cros_ec.c
index b8ce1b581a..bb299bccff 100644
--- a/common/cros_ec.c
+++ b/common/cros_ec.c
@@ -10,25 +10,44 @@
#include <common.h>
#include <cros_ec.h>
+#include <dm.h>
+#include <errno.h>
+
DECLARE_GLOBAL_DATA_PTR;
+#ifndef CONFIG_DM_CROS_EC
struct local_info {
struct cros_ec_dev *cros_ec_dev; /* Pointer to cros_ec device */
int cros_ec_err; /* Error for cros_ec, 0 if ok */
};
static struct local_info local;
+#endif
struct cros_ec_dev *board_get_cros_ec_dev(void)
{
+#ifdef CONFIG_DM_CROS_EC
+ struct udevice *dev;
+ int ret;
+
+ ret = uclass_get_device(UCLASS_CROS_EC, 0, &dev);
+ if (ret) {
+ debug("%s: Error %d\n", __func__, ret);
+ return NULL;
+ }
+ return dev->uclass_priv;
+#else
return local.cros_ec_dev;
+#endif
}
static int board_init_cros_ec_devices(const void *blob)
{
+#ifndef CONFIG_DM_CROS_EC
local.cros_ec_err = cros_ec_init(blob, &local.cros_ec_dev);
if (local.cros_ec_err)
return -1; /* Will report in board_late_init() */
+#endif
return 0;
}
@@ -40,5 +59,16 @@ int cros_ec_board_init(void)
int cros_ec_get_error(void)
{
+#ifdef CONFIG_DM_CROS_EC
+ struct udevice *dev;
+ int ret;
+
+ ret = uclass_get_device(UCLASS_CROS_EC, 0, &dev);
+ if (ret && ret != -ENODEV)
+ return ret;
+
+ return 0;
+#else
return local.cros_ec_err;
+#endif
}
diff --git a/common/env_sf.c b/common/env_sf.c
index 37ab13ae17..5e3729c2c2 100644
--- a/common/env_sf.c
+++ b/common/env_sf.c
@@ -12,6 +12,7 @@
#include <common.h>
#include <environment.h>
#include <malloc.h>
+#include <spi.h>
#include <spi_flash.h>
#include <search.h>
#include <errno.h>
diff --git a/common/exports.c b/common/exports.c
index b97ca48307..88fcfc8cb6 100644
--- a/common/exports.c
+++ b/common/exports.c
@@ -27,10 +27,12 @@ unsigned long get_version(void)
# define i2c_write dummy
# define i2c_read dummy
#endif
-#ifndef CONFIG_CMD_SPI
+#if !defined(CONFIG_CMD_SPI) || defined(CONFIG_DM_SPI)
# define spi_init dummy
# define spi_setup_slave dummy
# define spi_free_slave dummy
+#endif
+#ifndef CONFIG_CMD_SPI
# define spi_claim_bus dummy
# define spi_release_bus dummy
# define spi_xfer dummy