9
0
Fork 0

Merge branch 'for-next/misc'

Conflicts:
	commands/Makefile

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2012-11-16 14:01:34 +01:00
commit 856f60dbd1
25 changed files with 501 additions and 131 deletions

View File

@ -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

View File

@ -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,

View File

@ -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)

View File

@ -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; }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

268
commands/miitool.c Normal file
View File

@ -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

View File

@ -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;
}

View File

@ -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) {

View File

@ -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;
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 @@ 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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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");

View File

@ -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)
{

View File

@ -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]);

View File

@ -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;

View File

@ -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

View File

@ -192,6 +192,21 @@ static inline const char *dev_name(const struct device_d *dev)
return dev_id(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
*/

View File

@ -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);

View File

@ -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 */

View File

@ -212,6 +212,24 @@ int dev_add_param_fixed(struct device_d *dev, char *name, char *value)
return 0;
}
/**
* 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

View File

@ -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");
}

View File

@ -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);