diff --git a/Makefile b/Makefile index 8df235c..05b8be5 100644 --- a/Makefile +++ b/Makefile @@ -897,7 +897,7 @@ # 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 @@ $(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 7f93ecb..0c85b25 100644 --- a/arch/arm/boards/nhk8815/setup.c +++ b/arch/arm/boards/nhk8815/setup.c @@ -50,14 +50,17 @@ 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 fe68e72..286f8b5 100644 --- a/arch/arm/pbl/Makefile +++ b/arch/arm/pbl/Makefile @@ -14,7 +14,7 @@ $(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 635cb18..67ae9e7 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 b94e074..681944f 100644 --- a/arch/nios2/Makefile +++ b/arch/nios2/Makefile @@ -6,7 +6,7 @@ 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 1336097..5e4db90 100644 --- a/commands/Kconfig +++ b/commands/Kconfig @@ -57,10 +57,6 @@ tristate prompt "readline" -config CMD_LN - tristate - prompt "ln" - config CMD_TRUE tristate default y @@ -216,6 +212,10 @@ 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 @@ 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 53c8c51..db431d3 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -78,3 +78,4 @@ 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 72b0bef..a12d9c3 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 0000000..3a9ac45 --- /dev/null +++ b/commands/miitool.c @@ -0,0 +1,268 @@ +/* + * Copyright (C) 2012 Antony Pavlov + * + * 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 + * + * + * mii-diag is written/copyright 1997-2000 by Donald Becker + * + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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] \n") +BAREBOX_CMD_HELP_SHORT("view status for MII .\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 b18c7a1..10e882a 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 @@ 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 32d0d19..9206ef0 100644 --- a/common/complete.c +++ b/common/complete.c @@ -208,7 +208,7 @@ { 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 @@ 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 1b2a7c2..33a871f 100644 --- a/common/env.c +++ b/common/env.c @@ -30,23 +30,36 @@ #include #include -#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 @@ /** - * 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 @@ 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 @@ 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 @@ */ char *var_val(struct variable_d *var) { - return &var->data[strlen(var->data) + 1]; + return var->data; } /** @@ -115,16 +119,18 @@ */ 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 @@ 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 @@ } 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; + struct variable_d *v; - if (value) { - newvar = xzalloc(VARIABLE_D_SIZE(name, value)); - strcpy(&newvar->data[0], name); - strcpy(&newvar->data[strlen(name) + 1], value); - } - - 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 @@ { 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 @@ 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 @@ 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 0e42937..24310a3 100644 --- a/common/partitions.c +++ b/common/partitions.c @@ -28,6 +28,7 @@ #include #include #include +#include struct partition { uint64_t first_sec; @@ -85,7 +86,7 @@ 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 da631d3..ea6abe8 100644 --- a/common/resource.c +++ b/common/resource.c @@ -101,6 +101,8 @@ struct resource iomem_resource = { .start = 0, .end = 0xffffffff, + .name = "iomem", + .children = LIST_HEAD_INIT(iomem_resource.children), }; /* @@ -111,11 +113,3 @@ { 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 78926c9..7bb3c73 100644 --- a/common/startup.c +++ b/common/startup.c @@ -100,7 +100,9 @@ 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 3a97534..344bd61 100644 --- a/common/uimage.c +++ b/common/uimage.c @@ -373,7 +373,7 @@ 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 64fe289..dc2df91 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c @@ -77,6 +77,8 @@ static int match(struct driver_d *drv, struct device_d *dev) { + int ret; + if (dev->driver) return -1; @@ -84,8 +86,11 @@ 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 @@ } 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 @@ 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 6fc9398..b19d6c6 100644 --- a/drivers/mtd/nand/nomadik_nand.c +++ b/drivers/mtd/nand/nomadik_nand.c @@ -189,8 +189,8 @@ 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 @@ 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 dc17ead..b003290 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -4,10 +4,19 @@ 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 @@ 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 4918054..f8d815c 100644 --- a/include/driver.h +++ b/include/driver.h @@ -193,6 +193,21 @@ } /* + * 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 95e75e7..4184977 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 a855102..21f4f7d 100644 --- a/include/param.h +++ b/include/param.h @@ -30,6 +30,8 @@ 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 @@ /* 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 @@ 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 @@ { 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 b33ad17..c00b824 100644 --- a/lib/parameter.c +++ b/lib/parameter.c @@ -213,6 +213,24 @@ } /** + * 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 d958a44..bc067ea 100644 --- a/lib/show_progress.c +++ b/lib/show_progress.c @@ -20,6 +20,7 @@ #include #include #include +#include #define HASHES_PER_LINE 65 @@ -56,7 +57,7 @@ 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 2cfdb96..0a1850f 100644 --- a/net/eth.c +++ b/net/eth.c @@ -261,7 +261,7 @@ 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);