summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--arch/arm/boards/nhk8815/setup.c3
-rw-r--r--arch/arm/pbl/Makefile2
-rw-r--r--arch/arm/tools/Makefile4
-rw-r--r--arch/nios2/Makefile2
-rw-r--r--commands/Kconfig19
-rw-r--r--commands/Makefile1
-rw-r--r--commands/help.c7
-rw-r--r--commands/miitool.c268
-rw-r--r--commands/printenv.c22
-rw-r--r--common/complete.c12
-rw-r--r--common/env.c121
-rw-r--r--common/partitions.c3
-rw-r--r--common/resource.c10
-rw-r--r--common/startup.c4
-rw-r--r--common/uimage.c2
-rw-r--r--drivers/base/driver.c55
-rw-r--r--drivers/mtd/nand/nomadik_nand.c6
-rw-r--r--drivers/spi/Kconfig25
-rw-r--r--include/driver.h15
-rw-r--r--include/environment.h11
-rw-r--r--include/param.h11
-rw-r--r--lib/parameter.c18
-rw-r--r--lib/show_progress.c3
-rw-r--r--net/eth.c2
25 files changed, 501 insertions, 131 deletions
diff --git a/Makefile b/Makefile
index 8df235c854..05b8be54bd 100644
--- a/Makefile
+++ b/Makefile
@@ -897,7 +897,7 @@ endef
# directory for generated filesas used by some architectures.
define create-symlink
if [ ! -L include/asm ]; then \
- echo ' SYMLINK $@ -> include/asm-$(SRCARCH)'; \
+ $(kecho) ' SYMLINK $@ -> include/asm-$(SRCARCH)'; \
if [ ! -d include/asm-$(SRCARCH) ]; then \
mkdir -p include/asm-$(SRCARCH); \
fi; \
@@ -910,11 +910,11 @@ include/asm:
$(Q)$(create-symlink)
include/config.h: include/config/auto.conf
- @echo ' SYMLINK $@ -> $(BOARD)/config.h'
+ $(Q)$(kecho) ' SYMLINK $@ -> $(BOARD)/config.h'
ifneq ($(KBUILD_SRC),)
$(Q)ln -fsn $(srctree)/$(BOARD)/config.h $@
else
- @ln -fsn ../$(BOARD)/config.h $@
+ $(Q)ln -fsn ../$(BOARD)/config.h $@
endif
# Generate some files
diff --git a/arch/arm/boards/nhk8815/setup.c b/arch/arm/boards/nhk8815/setup.c
index 7f93ecb196..0c85b25c71 100644
--- a/arch/arm/boards/nhk8815/setup.c
+++ b/arch/arm/boards/nhk8815/setup.c
@@ -50,14 +50,17 @@ static struct nomadik_nand_platform_data nhk8815_nand_data = {
static struct resource nhk8815_nand_resources[] = {
{
+ .name = "nand_addr",
.start = NAND_IO_ADDR,
.end = NAND_IO_ADDR + 0xfff,
.flags = IORESOURCE_MEM,
}, {
+ .name = "nand_cmd",
.start = NAND_IO_CMD,
.end = NAND_IO_CMD + 0xfff,
.flags = IORESOURCE_MEM,
}, {
+ .name = "nand_data",
.start = NAND_IO_DATA,
.end = NAND_IO_DATA + 0xfff,
.flags = IORESOURCE_MEM,
diff --git a/arch/arm/pbl/Makefile b/arch/arm/pbl/Makefile
index fe68e72eed..286f8b5923 100644
--- a/arch/arm/pbl/Makefile
+++ b/arch/arm/pbl/Makefile
@@ -14,7 +14,7 @@ extra-y += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern
$(obj)/zbarebox.bin: $(obj)/zbarebox FORCE
$(call if_changed,objcopy)
$(call cmd,check_file_size,$(CONFIG_BAREBOX_MAX_IMAGE_SIZE))
- @echo ' Barebox: $@ is ready'
+ $(Q)$(kecho) ' Barebox: $@ is ready'
$(obj)/zbarebox.S: $(obj)/zbarebox FORCE
$(call if_changed,disasm)
diff --git a/arch/arm/tools/Makefile b/arch/arm/tools/Makefile
index 635cb1865e..67ae9e701b 100644
--- a/arch/arm/tools/Makefile
+++ b/arch/arm/tools/Makefile
@@ -5,6 +5,6 @@
#
include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types
- @echo ' Generating $@'
- @mkdir -p $(dir $@)
+ $(Q)$(kecho) ' Generating $@'
+ $(Q)mkdir -p $(dir $@)
$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
diff --git a/arch/nios2/Makefile b/arch/nios2/Makefile
index b94e07465b..681944f22d 100644
--- a/arch/nios2/Makefile
+++ b/arch/nios2/Makefile
@@ -6,7 +6,7 @@ KALLSYMS += --symbol-prefix=_
archprepare: maketools
- @echo " SYMLINK include/nios_sopc.h -> arch/nios2/boards/$(board-y)/nios_sopc.h"
+ @$(kecho) " SYMLINK include/nios_sopc.h -> arch/nios2/boards/$(board-y)/nios_sopc.h"
@ln -fsn ../arch/nios2/boards/$(board-y)/nios_sopc.h include/nios_sopc.h
PHONY += maketools
diff --git a/commands/Kconfig b/commands/Kconfig
index 1336097671..5e4db90c21 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -57,10 +57,6 @@ config CMD_READLINE
tristate
prompt "readline"
-config CMD_LN
- tristate
- prompt "ln"
-
config CMD_TRUE
tristate
default y
@@ -216,6 +212,10 @@ config CMD_DIRNAME
Strip last component of file name and store the result in a
environment variable
+config CMD_LN
+ tristate
+ prompt "ln"
+
config CMD_READLINK
tristate
prompt "readlink"
@@ -630,6 +630,17 @@ config CMD_USB
help
The usb command allows to rescan for USB devices.
+config CMD_MIITOOL
+ tristate
+ depends on PHYLIB
+ prompt "miitool"
+ help
+ The miitool command allows to view media-independent interface status.
+ The default short output reports the negotiated link speed and
+ link status for selected MII. The '-v' option displays more
+ detailed MII status information, such as MII capabilities,
+ current advertising mode, and link partner capabilities.
+
config CMD_CLK
tristate
depends on COMMON_CLK
diff --git a/commands/Makefile b/commands/Makefile
index 53c8c51665..db431d35f1 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -78,3 +78,4 @@ obj-$(CONFIG_CMD_CLK) += clk.o
obj-$(CONFIG_CMD_TFTP) += tftp.o
obj-$(CONFIG_CMD_FILETYPE) += filetype.o
obj-$(CONFIG_CMD_BAREBOX_UPDATE)+= barebox-update.o
+obj-$(CONFIG_CMD_MIITOOL) += miitool.o
diff --git a/commands/help.c b/commands/help.c
index 72b0befecb..a12d9c3547 100644
--- a/commands/help.c
+++ b/commands/help.c
@@ -28,12 +28,17 @@
static int do_help(int argc, char *argv[])
{
struct command *cmdtp;
+ int max_length = 0;
if (argc == 1) { /* show list of commands */
+ for_each_command(cmdtp)
+ if(strlen(cmdtp->name) > max_length)
+ max_length = strlen(cmdtp->name);
+
for_each_command(cmdtp) {
if (!cmdtp->usage)
continue;
- printf("%10s - %s\n", cmdtp->name, cmdtp->usage);
+ printf("%*s - %s\n", max_length, cmdtp->name, cmdtp->usage);
}
return 0;
}
diff --git a/commands/miitool.c b/commands/miitool.c
new file mode 100644
index 0000000000..3a9ac45605
--- /dev/null
+++ b/commands/miitool.c
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2012 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This file is part of barebox.
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is based on Donald Becker's "mii-diag" and
+ * David A. Hinds' "mii-tool".
+ *
+ * mii-tool is written/copyright 2000 by David A. Hinds
+ * <dhinds@pcmcia.sourceforge.org>
+ *
+ * mii-diag is written/copyright 1997-2000 by Donald Becker
+ * <becker@scyld.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <common.h>
+#include <command.h>
+#include <init.h>
+#include <driver.h>
+#include <malloc.h>
+#include <errno.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <linux/stat.h>
+#include <xfuncs.h>
+#include <linux/mii.h>
+
+static u16 mdio_read(int fd, int offset)
+{
+ int ret;
+ u16 buf;
+
+ ret = lseek(fd, offset << 1, SEEK_SET);
+ if (ret < 0)
+ return 0;
+
+ ret = read(fd, &buf, sizeof(u16));
+ if (ret < 0)
+ return 0;
+
+ return buf;
+}
+
+/* Table of known MII's */
+static const struct {
+ u_short id1, id2;
+ u_short mask1, mask2;
+ char *name;
+} mii_id[] = {
+ { 0x0013, 0x78e0, 0xffff, 0xfff0, "Level One LXT971A" },
+};
+#define NMII (sizeof(mii_id)/sizeof(mii_id[0]))
+
+const struct {
+ char *name;
+ u_short value;
+} media[] = {
+ /* The order through 100baseT4 matches bits in the BMSR */
+ { "10baseT-HD", ADVERTISE_10HALF },
+ { "10baseT-FD", ADVERTISE_10FULL },
+ { "100baseTx-HD", ADVERTISE_100HALF },
+ { "100baseTx-FD", ADVERTISE_100FULL },
+ { "100baseT4", LPA_100BASE4 },
+ { "100baseTx", ADVERTISE_100FULL | ADVERTISE_100HALF },
+ { "10baseT", ADVERTISE_10FULL | ADVERTISE_10HALF },
+};
+#define NMEDIA (sizeof(media)/sizeof(media[0]))
+
+static char *media_list(int mask, int best)
+{
+ static char buf[100];
+ int i;
+
+ *buf = '\0';
+ mask >>= 5;
+ for (i = 4; i >= 0; i--) {
+ if (mask & (1 << i)) {
+ strcat(buf, " ");
+ strcat(buf, media[i].name);
+ if (best)
+ break;
+ }
+ }
+
+ if (mask & (1 << 5))
+ strcat(buf, " flow-control");
+
+ return buf;
+}
+
+static int show_basic_mii(int fd, int verbose)
+{
+ char buf[100];
+ int i, mii_val[32];
+ int bmcr, bmsr, advert, lkpar;
+
+ /* Some bits in the BMSR are latched, but we can't rely on being
+ the only reader, so only the current values are meaningful */
+ mdio_read(fd, MII_BMSR);
+ for (i = 0; i < ((verbose > 1) ? 32 : 8); i++)
+ mii_val[i] = mdio_read(fd, i);
+
+ if (mii_val[MII_BMCR] == 0xffff) {
+ fprintf(stderr, " No MII transceiver present!.\n");
+ return -1;
+ }
+
+ /* Descriptive rename. */
+ bmcr = mii_val[MII_BMCR];
+ bmsr = mii_val[MII_BMSR];
+ advert = mii_val[MII_ADVERTISE];
+ lkpar = mii_val[MII_LPA];
+
+ *buf = '\0';
+ if (bmcr & BMCR_ANENABLE) {
+ if (bmsr & BMSR_ANEGCOMPLETE) {
+ if (advert & lkpar) {
+ sprintf(buf, "%s%s, ", (lkpar & LPA_LPACK) ?
+ "negotiated" : "no autonegotiation,",
+ media_list(advert & lkpar, 1));
+ } else {
+ sprintf(buf, "autonegotiation failed, ");
+ }
+ } else if (bmcr & BMCR_ANRESTART) {
+ sprintf(buf, "autonegotiation restarted, ");
+ }
+ } else {
+ sprintf(buf, "%s Mbit, %s duplex, ",
+ (bmcr & BMCR_SPEED100) ? "100" : "10",
+ (bmcr & BMCR_FULLDPLX) ? "full" : "half");
+ }
+
+ strcat(buf, (bmsr & BMSR_LSTATUS) ? "link ok" : "no link");
+
+ printf("%s\n", buf);
+
+ if (verbose > 1) {
+ printf(" registers for MII PHY: ");
+ for (i = 0; i < 32; i++)
+ printf("%s %4.4x",
+ ((i % 8) ? "" : "\n "), mii_val[i]);
+
+ printf("\n");
+ }
+
+ if (verbose) {
+ printf(" product info: ");
+ for (i = 0; i < NMII; i++)
+ if ((mii_id[i].id1 == (mii_val[2] & mii_id[i].mask1)) &&
+ (mii_id[i].id2 ==
+ (mii_val[3] & mii_id[i].mask2)))
+ break;
+
+ if (i < NMII)
+ printf("%s rev %d\n", mii_id[i].name, mii_val[3]&0x0f);
+ else
+ printf("vendor %02x:%02x:%02x, model %d rev %d\n",
+ mii_val[2] >> 10, (mii_val[2] >> 2) & 0xff,
+ ((mii_val[2] << 6)|(mii_val[3] >> 10)) & 0xff,
+ (mii_val[3] >> 4) & 0x3f, mii_val[3] & 0x0f);
+
+ printf(" basic mode: ");
+ if (bmcr & BMCR_RESET)
+ printf("software reset, ");
+ if (bmcr & BMCR_LOOPBACK)
+ printf("loopback, ");
+ if (bmcr & BMCR_ISOLATE)
+ printf("isolate, ");
+ if (bmcr & BMCR_CTST)
+ printf("collision test, ");
+ if (bmcr & BMCR_ANENABLE) {
+ printf("autonegotiation enabled\n");
+ } else {
+ printf("%s Mbit, %s duplex\n",
+ (bmcr & BMCR_SPEED100) ? "100" : "10",
+ (bmcr & BMCR_FULLDPLX) ? "full" : "half");
+ }
+ printf(" basic status: ");
+ if (bmsr & BMSR_ANEGCOMPLETE)
+ printf("autonegotiation complete, ");
+ else if (bmcr & BMCR_ANRESTART)
+ printf("autonegotiation restarted, ");
+ if (bmsr & BMSR_RFAULT)
+ printf("remote fault, ");
+ printf((bmsr & BMSR_LSTATUS) ? "link ok" : "no link");
+ printf("\n capabilities:%s", media_list(bmsr >> 6, 0));
+ printf("\n advertising: %s", media_list(advert, 0));
+
+#define LPA_ABILITY_MASK (LPA_10HALF | LPA_10FULL \
+ | LPA_100HALF | LPA_100FULL \
+ | LPA_100BASE4 | LPA_PAUSE_CAP)
+
+ if (lkpar & LPA_ABILITY_MASK)
+ printf("\n link partner:%s", media_list(lkpar, 0));
+ printf("\n");
+ }
+
+ return 0;
+}
+
+static int do_miitool(int argc, char *argv[])
+{
+ char *filename;
+ int opt;
+ int argc_min;
+ int fd;
+ int verbose;
+
+ verbose = 0;
+ while ((opt = getopt(argc, argv, "v")) > 0) {
+ switch (opt) {
+ case 'v':
+ verbose++;
+ break;
+ default:
+ return COMMAND_ERROR_USAGE;
+ }
+ }
+
+ argc_min = optind + 1;
+
+ if (argc < argc_min)
+ return COMMAND_ERROR_USAGE;
+
+ filename = argv[optind];
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0) {
+ printf("unable to read %s\n", filename);
+ return COMMAND_ERROR;
+ }
+
+ show_basic_mii(fd, verbose);
+
+ close(fd);
+
+ return COMMAND_SUCCESS;
+}
+
+BAREBOX_CMD_HELP_START(miitool)
+BAREBOX_CMD_HELP_USAGE("miitool [[[-v] -v] -v] <phy>\n")
+BAREBOX_CMD_HELP_SHORT("view status for MII <phy>.\n")
+BAREBOX_CMD_HELP_END
+
+/**
+ * @page miitool_command
+This utility checks or sets the status of a network interface's
+Media Independent Interface (MII) unit. Most fast ethernet
+adapters use an MII to autonegotiate link speed and duplex setting.
+ */
+BAREBOX_CMD_START(miitool)
+ .cmd = do_miitool,
+ .usage = "view media-independent interface status",
+ BAREBOX_CMD_HELP(cmd_miitool_help)
+BAREBOX_CMD_END
diff --git a/commands/printenv.c b/commands/printenv.c
index b18c7a137e..10e882ae9f 100644
--- a/commands/printenv.c
+++ b/commands/printenv.c
@@ -27,8 +27,8 @@
static int do_printenv(int argc, char *argv[])
{
- struct variable_d *var;
- struct env_context *c, *current_c;
+ struct variable_d *v;
+ struct env_context *c;
if (argc == 2) {
const char *val = getenv(argv[1]);
@@ -40,22 +40,16 @@ static int do_printenv(int argc, char *argv[])
return 1;
}
- current_c = get_current_context();
- var = current_c->local->next;
+ c = get_current_context();
printf("locals:\n");
- while (var) {
- printf("%s=%s\n", var_name(var), var_val(var));
- var = var->next;
- }
+ list_for_each_entry(v, &c->local, list)
+ printf("%s=%s\n", var_name(v), var_val(v));
printf("globals:\n");
c = get_current_context();
- while(c) {
- var = c->global->next;
- while (var) {
- printf("%s=%s\n", var_name(var), var_val(var));
- var = var->next;
- }
+ while (c) {
+ list_for_each_entry(v, &c->global, list)
+ printf("%s=%s\n", var_name(v), var_val(v));
c = c->parent;
}
diff --git a/common/complete.c b/common/complete.c
index 32d0d194b7..9206ef02a5 100644
--- a/common/complete.c
+++ b/common/complete.c
@@ -208,7 +208,7 @@ static int env_param_complete(struct string_list *sl, char *instr, int eval)
{
struct device_d *dev;
struct variable_d *var;
- struct env_context *c, *current_c;
+ struct env_context *c;
char *instr_param;
int len;
char end = '=';
@@ -225,21 +225,23 @@ static int env_param_complete(struct string_list *sl, char *instr, int eval)
instr_param = strchr(instr, '.');
len = strlen(instr);
- current_c = get_current_context();
- for(var = current_c->local->next; var; var = var->next) {
+ c = get_current_context();
+ list_for_each_entry(var, &c->local, list) {
if (strncmp(instr, var_name(var), len))
continue;
string_list_add_asprintf(sl, "%s%s%c",
begin, var_name(var), end);
}
- for (c = get_current_context(); c; c = c->parent) {
- for (var = c->global->next; var; var = var->next) {
+ c = get_current_context();
+ while (c) {
+ list_for_each_entry(var, &c->global, list) {
if (strncmp(instr, var_name(var), len))
continue;
string_list_add_asprintf(sl, "%s%s%c",
begin, var_name(var), end);
}
+ c = c->parent;
}
if (instr_param) {
diff --git a/common/env.c b/common/env.c
index 1b2a7c25ad..33a871f7eb 100644
--- a/common/env.c
+++ b/common/env.c
@@ -30,23 +30,36 @@
#include <init.h>
#include <environment.h>
-#define VARIABLE_D_SIZE(name, value) (sizeof(struct variable_d) + strlen(name) + strlen(value) + 2)
+static struct env_context root = {
+ .local = LIST_HEAD_INIT(root.local),
+ .global = LIST_HEAD_INIT(root.global),
+};
-static struct env_context *context;
+static struct env_context *context = &root;
/**
* Remove a list of environment variables
* @param[in] v Variable anchor to remove
*/
-static void free_variables(struct variable_d *v)
+static void free_context(struct env_context *c)
{
- struct variable_d *next;
+ struct variable_d *v, *tmp;
- while (v) {
- next = v->next;
+ list_for_each_entry_safe(v, tmp, &c->local, list) {
+ free(v->name);
+ free(v->data);
+ list_del(&v->list);
free(v);
- v = next;
}
+
+ list_for_each_entry_safe(v, tmp, &c->global, list) {
+ free(v->name);
+ free(v->data);
+ list_del(&v->list);
+ free(v);
+ }
+
+ free(c);
}
/** Read back current context */
@@ -58,19 +71,14 @@ EXPORT_SYMBOL(get_current_context);
/**
- * FIXME
+ * Create a new variable context and put it on the stack
*/
int env_push_context(void)
{
struct env_context *c = xzalloc(sizeof(struct env_context));
- c->local = xzalloc(VARIABLE_D_SIZE("", ""));
- c->global = xzalloc(VARIABLE_D_SIZE("", ""));
-
- if (!context) {
- context = c;
- return 0;
- }
+ INIT_LIST_HEAD(&c->local);
+ INIT_LIST_HEAD(&c->global);
c->parent = context;
context = c;
@@ -78,10 +86,8 @@ int env_push_context(void)
return 0;
}
-postcore_initcall(env_push_context);
-
/**
- * FIXME
+ * free current variable context and restore the previous one
*/
int env_pop_context(void)
{
@@ -89,9 +95,7 @@ int env_pop_context(void)
if (context->parent) {
c = context->parent;
- free_variables(context->local);
- free_variables(context->global);
- free(context);
+ free_context(context);
context = c;
return 0;
}
@@ -105,7 +109,7 @@ int env_pop_context(void)
*/
char *var_val(struct variable_d *var)
{
- return &var->data[strlen(var->data) + 1];
+ return var->data;
}
/**
@@ -115,16 +119,18 @@ char *var_val(struct variable_d *var)
*/
char *var_name(struct variable_d *var)
{
- return var->data;
+ return var->name;
}
-static const char *getenv_raw(struct variable_d *var, const char *name)
+static const char *getenv_raw(struct list_head *l, const char *name)
{
- while (var) {
- if (!strcmp(var_name(var), name))
- return var_val(var);
- var = var->next;
+ struct variable_d *v;
+
+ list_for_each_entry(v, l, list) {
+ if (!strcmp(var_name(v), name))
+ return var_val(v);
}
+
return NULL;
}
@@ -150,12 +156,12 @@ const char *getenv (const char *name)
c = context;
- val = getenv_raw(c->local, name);
+ val = getenv_raw(&c->local, name);
if (val)
return val;
while (c) {
- val = getenv_raw(c->global, name);
+ val = getenv_raw(&c->global, name);
if (val)
return val;
c = c->parent;
@@ -164,34 +170,35 @@ const char *getenv (const char *name)
}
EXPORT_SYMBOL(getenv);
-static int setenv_raw(struct variable_d *var, const char *name, const char *value)
+static int setenv_raw(struct list_head *l, const char *name, const char *value)
{
- struct variable_d *newvar = NULL;
-
- if (value) {
- newvar = xzalloc(VARIABLE_D_SIZE(name, value));
- strcpy(&newvar->data[0], name);
- strcpy(&newvar->data[strlen(name) + 1], value);
- }
+ struct variable_d *v;
- while (var->next) {
- if (!strcmp(var->next->data, name)) {
+ list_for_each_entry(v, l, list) {
+ if (!strcmp(v->name, name)) {
if (value) {
- newvar->next = var->next->next;
- free(var->next);
- var->next = newvar;
+ free(v->data);
+ v->data = xstrdup(value);
+
return 0;
} else {
- struct variable_d *tmp;
- tmp = var->next;
- var->next = var->next->next;
- free(tmp);
+ list_del(&v->list);
+ free(v->name);
+ free(v->data);
+ free(v);
+
return 0;
}
}
- var = var->next;
}
- var->next = newvar;
+
+ if (value) {
+ v = xzalloc(sizeof(*v));
+ v->name = xstrdup(name);
+ v->data = xstrdup(value);
+ list_add_tail(&v->list, l);
+ }
+
return 0;
}
@@ -199,8 +206,8 @@ int setenv(const char *_name, const char *value)
{
char *name = strdup(_name);
char *par;
- struct variable_d *var;
int ret = 0;
+ struct list_head *list;
if (value && !*value)
value = NULL;
@@ -224,12 +231,12 @@ int setenv(const char *_name, const char *value)
goto out;
}
- if (getenv_raw(context->global, name))
- var = context->global;
+ if (getenv_raw(&context->global, name))
+ list = &context->global;
else
- var = context->local;
+ list = &context->local;
- ret = setenv_raw(var, name, value);
+ ret = setenv_raw(list, name, value);
out:
free(name);
@@ -239,11 +246,11 @@ EXPORT_SYMBOL(setenv);
int export(const char *varname)
{
- const char *val = getenv_raw(context->local, varname);
+ const char *val = getenv_raw(&context->local, varname);
if (val) {
- setenv_raw(context->global, varname, val);
- setenv_raw(context->local, varname, NULL);
+ setenv_raw(&context->global, varname, val);
+ setenv_raw(&context->local, varname, NULL);
}
return 0;
}
diff --git a/common/partitions.c b/common/partitions.c
index 0e42937e4c..24310a3a4f 100644
--- a/common/partitions.c
+++ b/common/partitions.c
@@ -28,6 +28,7 @@
#include <asm/unaligned.h>
#include <disks.h>
#include <dma.h>
+#include <filetype.h>
struct partition {
uint64_t first_sec;
@@ -85,7 +86,7 @@ static void __maybe_unused try_dos_partition(struct block_device *blk,
goto on_error;
}
- if ((buffer[510] != 0x55) || (buffer[511] != 0xAA)) {
+ if (is_fat_or_mbr(buffer, NULL) != filetype_mbr) {
dev_info(blk->dev, "No partition table found\n");
goto on_error;
}
diff --git a/common/resource.c b/common/resource.c
index da631d3997..ea6abe88e3 100644
--- a/common/resource.c
+++ b/common/resource.c
@@ -101,6 +101,8 @@ int release_region(struct resource *res)
struct resource iomem_resource = {
.start = 0,
.end = 0xffffffff,
+ .name = "iomem",
+ .children = LIST_HEAD_INIT(iomem_resource.children),
};
/*
@@ -111,11 +113,3 @@ struct resource *request_iomem_region(const char *name,
{
return request_region(&iomem_resource, name, start, end);
}
-
-static int iomem_init(void)
-{
- init_resource(&iomem_resource, "iomem");
-
- return 0;
-}
-postcore_initcall(iomem_init);
diff --git a/common/startup.c b/common/startup.c
index 78926c9963..7bb3c73c12 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -100,7 +100,9 @@ void start_barebox (void)
initcall < __barebox_initcalls_end; initcall++) {
debug("initcall-> %pS\n", *initcall);
result = (*initcall)();
- debug("initcall<- %pS (%d)\n", *initcall, result);
+ if (result)
+ pr_err("initcall %pS failed: %s\n", *initcall,
+ strerror(-result));
}
debug("initcalls done\n");
diff --git a/common/uimage.c b/common/uimage.c
index 3a9753459a..344bd61c06 100644
--- a/common/uimage.c
+++ b/common/uimage.c
@@ -373,7 +373,7 @@ static int uimage_sdram_flush(void *buf, unsigned int len)
return len;
}
-#define BUFSIZ (PAGE_SIZE * 2)
+#define BUFSIZ (PAGE_SIZE * 32)
struct resource *file_to_sdram(const char *filename, unsigned long adr)
{
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 64fe2894e3..dc2df91522 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -77,6 +77,8 @@ int get_free_deviceid(const char *name_template)
static int match(struct driver_d *drv, struct device_d *dev)
{
+ int ret;
+
if (dev->driver)
return -1;
@@ -84,8 +86,11 @@ static int match(struct driver_d *drv, struct device_d *dev)
if (dev->bus->match(dev, drv))
goto err_out;
- if (dev->bus->probe(dev))
+ ret = dev->bus->probe(dev);
+ if (ret) {
+ dev_err(dev, "probe failed: %s\n", strerror(-ret));
goto err_out;
+ }
list_add(&dev->active, &active);
@@ -247,6 +252,52 @@ void *dev_get_mem_region(struct device_d *dev, int num)
}
EXPORT_SYMBOL(dev_get_mem_region);
+struct resource *dev_get_resource_by_name(struct device_d *dev,
+ const char *name)
+{
+ int i;
+
+ for (i = 0; i < dev->num_resources; i++) {
+ struct resource *res = &dev->resource[i];
+ if (resource_type(res) != IORESOURCE_MEM)
+ continue;
+ if (!res->name)
+ continue;
+ if (!strcmp(name, res->name))
+ return res;
+ }
+
+ return NULL;
+}
+
+void *dev_get_mem_region_by_name(struct device_d *dev, const char *name)
+{
+ struct resource *res;
+
+ res = dev_get_resource_by_name(dev, name);
+ if (!res)
+ return NULL;
+
+ return (void __force *)res->start;
+}
+EXPORT_SYMBOL(dev_get_mem_region_by_name);
+
+void __iomem *dev_request_mem_region_by_name(struct device_d *dev, const char *name)
+{
+ struct resource *res;
+
+ res = dev_get_resource_by_name(dev, name);
+ if (!res)
+ return NULL;
+
+ res = request_iomem_region(dev_name(dev), res->start, res->end);
+ if (!res)
+ return NULL;
+
+ return (void __force __iomem *)res->start;
+}
+EXPORT_SYMBOL(dev_request_mem_region_by_name);
+
void __iomem *dev_request_mem_region(struct device_d *dev, int num)
{
struct resource *res;
@@ -403,7 +454,7 @@ static int do_devinfo(int argc, char *argv[])
printf("\ndrivers:\n");
for_each_driver(drv)
- printf("%10s\n",drv->name);
+ printf("%s\n",drv->name);
} else {
dev = get_device_by_name(argv[1]);
diff --git a/drivers/mtd/nand/nomadik_nand.c b/drivers/mtd/nand/nomadik_nand.c
index 6fc93984c9..b19d6c63c1 100644
--- a/drivers/mtd/nand/nomadik_nand.c
+++ b/drivers/mtd/nand/nomadik_nand.c
@@ -189,8 +189,8 @@ static int nomadik_nand_probe(struct device_d *dev)
goto err;
}
- host->cmd_va = dev_request_mem_region(dev, 1);
- host->addr_va = dev_request_mem_region(dev, 0);
+ host->cmd_va = dev_request_mem_region_by_name(dev, "nand_cmd");
+ host->addr_va = dev_request_mem_region_by_name(dev, "nand_addr");
/* Link all private pointers */
mtd = &host->mtd;
@@ -198,7 +198,7 @@ static int nomadik_nand_probe(struct device_d *dev)
mtd->priv = nand;
nand->priv = host;
- nand->IO_ADDR_W = nand->IO_ADDR_R = dev_request_mem_region(dev, 2);
+ nand->IO_ADDR_W = nand->IO_ADDR_R = dev_request_mem_region_by_name(dev, "nand_data");
nand->cmd_ctrl = nomadik_cmd_ctrl;
nand->ecc.mode = NAND_ECC_HW;
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index dc17eadce5..b00329096d 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -4,10 +4,19 @@ config SPI
bool "Enable SPI driver support"
default y
+if SPI
+
+config DRIVER_SPI_ALTERA
+ bool "Altera SPI Master driver"
+ depends on NIOS2
+
+config DRIVER_SPI_ATMEL
+ bool "Atmel (AT91) SPI Master driver"
+ depends on ARCH_AT91
+
config DRIVER_SPI_IMX
bool "i.MX SPI Master driver"
depends on ARCH_IMX
- depends on SPI
config DRIVER_SPI_IMX_0_0
bool
@@ -24,20 +33,10 @@ config DRIVER_SPI_IMX_2_3
depends on ARCH_IMX51 || ARCH_IMX53 || ARCH_IMX6
default y
-config DRIVER_SPI_ALTERA
- bool "Altera SPI Master driver"
- depends on NIOS2
- depends on SPI
-
-config DRIVER_SPI_ATMEL
- bool "Atmel (AT91) SPI Master driver"
- depends on ARCH_AT91
- depends on SPI
-
-
config DRIVER_SPI_OMAP3
bool "OMAP3 McSPI Master driver"
depends on ARCH_OMAP3
- depends on SPI
+
+endif
endmenu
diff --git a/include/driver.h b/include/driver.h
index 4918054887..f8d815c619 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -193,6 +193,21 @@ static inline const char *dev_name(const struct device_d *dev)
}
/*
+ * get resource base 'name' for a device
+ */
+struct resource *dev_get_resource_by_name(struct device_d *dev,
+ const char *name);
+/*
+ * get register base 'name' for a device
+ */
+void *dev_get_mem_region_by_name(struct device_d *dev, const char *name);
+
+/*
+ * exlusively request register base 'name' for a device
+ */
+void __iomem *dev_request_mem_region_by_name(struct device_d *dev,
+ const char *name);
+/*
* get register base 'num' for a device
*/
void *dev_get_mem_region(struct device_d *dev, int num);
diff --git a/include/environment.h b/include/environment.h
index 95e75e7ec7..4184977009 100644
--- a/include/environment.h
+++ b/include/environment.h
@@ -26,14 +26,15 @@
* Managment of a environment variable
*/
struct variable_d {
- struct variable_d *next; /**< List management */
- char data[0]; /**< variable length data */
+ struct list_head list;
+ char *name;
+ char *data;
};
struct env_context {
- struct env_context *parent; /**< FIXME */
- struct variable_d *local; /**< FIXME */
- struct variable_d *global; /**< FIXME */
+ struct env_context *parent;
+ struct list_head local;
+ struct list_head global;
};
struct env_context *get_current_context(void);
diff --git a/include/param.h b/include/param.h
index a855102d15..21f4f7d832 100644
--- a/include/param.h
+++ b/include/param.h
@@ -30,6 +30,8 @@ int dev_add_param(struct device_d *dev, const char *name,
int dev_add_param_fixed(struct device_d *dev, char *name, char *value);
+void dev_remove_param(struct device_d *dev, char *name);
+
void dev_remove_parameters(struct device_d *dev);
int dev_param_set_generic(struct device_d *dev, struct param_d *p,
@@ -38,8 +40,6 @@ int dev_param_set_generic(struct device_d *dev, struct param_d *p,
/* Convenience functions to handle a parameter as an ip address */
int dev_set_param_ip(struct device_d *dev, char *name, IPaddr_t ip);
IPaddr_t dev_get_param_ip(struct device_d *dev, char *name);
-
-int global_add_parameter(struct param_d *param);
#else
static inline const char *dev_get_param(struct device_d *dev, const char *name)
{
@@ -69,6 +69,8 @@ static inline int dev_add_param_fixed(struct device_d *dev, char *name, char *va
return 0;
}
+static inline void dev_remove_param(struct device_d *dev, char *name) {}
+
static inline void dev_remove_parameters(struct device_d *dev) {}
static inline int dev_param_set_generic(struct device_d *dev, struct param_d *p,
@@ -86,11 +88,6 @@ static inline IPaddr_t dev_get_param_ip(struct device_d *dev, char *name)
{
return 0;
}
-
-static inline int global_add_parameter(struct param_d *param)
-{
- return 0;
-}
#endif
#endif /* PARAM_H */
diff --git a/lib/parameter.c b/lib/parameter.c
index b33ad1745e..c00b82438d 100644
--- a/lib/parameter.c
+++ b/lib/parameter.c
@@ -213,6 +213,24 @@ int dev_add_param_fixed(struct device_d *dev, char *name, char *value)
}
/**
+ * dev_remove_param - remove a parameter from a device and free its
+ * memory
+ * @param dev The device
+ * @param name The name of the parameter
+ */
+void dev_remove_param(struct device_d *dev, char *name)
+{
+ struct param_d *p = get_param_by_name(dev, name);
+
+ if (p) {
+ p->set(dev, p, NULL);
+ list_del(&p->list);
+ free(p->name);
+ free(p);
+ }
+}
+
+/**
* dev_remove_parameters - remove all parameters from a device and free their
* memory
* @param dev The device
diff --git a/lib/show_progress.c b/lib/show_progress.c
index d958a4468f..bc067eac57 100644
--- a/lib/show_progress.c
+++ b/lib/show_progress.c
@@ -20,6 +20,7 @@
#include <common.h>
#include <progress.h>
#include <asm-generic/div64.h>
+#include <linux/stringify.h>
#define HASHES_PER_LINE 65
@@ -56,7 +57,7 @@ void init_progression_bar(int max)
progress_max = max;
spin = 0;
if (progress_max)
- printf("\t[%65s]\r\t[", "");
+ printf("\t[%"__stringify(HASHES_PER_LINE)"s]\r\t[", "");
else
printf("\t");
}
diff --git a/net/eth.c b/net/eth.c
index 2cfdb96f94..0a1850f1c4 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -261,7 +261,7 @@ int eth_register(struct eth_device *edev)
if (edev->parent)
dev_add_child(edev->parent, &edev->dev);
- platform_device_register(&edev->dev);
+ register_device(&edev->dev);
dev_add_param(dev, "ipaddr", eth_set_ipaddr, NULL, 0);
dev_add_param(dev, "ethaddr", eth_set_ethaddr, NULL, 0);