Merge branch 'for-next/misc'
Conflicts: commands/Makefile Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
commit
856f60dbd1
6
Makefile
6
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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
121
common/env.c
121
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;
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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]);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue