Merge git://git.denx.de/u-boot-dm

master
Tom Rini 7 years ago
commit de2ad2c40d
  1. 8
      arch/arm/mach-tegra/xusb-padctl-common.c
  2. 22
      arch/sandbox/Kconfig
  3. 10
      arch/sandbox/dts/test.dts
  4. 7
      board/sandbox/README.sandbox
  5. 3
      doc/bounces
  6. 8
      drivers/block/blk-uclass.c
  7. 2
      drivers/block/sandbox.c
  8. 8
      drivers/core/dump.c
  9. 9
      drivers/core/ofnode.c
  10. 34
      drivers/core/root.c
  11. 3
      drivers/misc/cros_ec.c
  12. 4
      drivers/power/pmic/pmic-uclass.c
  13. 2
      drivers/scsi/scsi.c
  14. 8
      include/blk.h
  15. 24
      include/dm/ofnode.h
  16. 14
      include/dm/root.h
  17. 2
      lib/libfdt/pylibfdt/libfdt.i
  18. 1
      scripts/config_whitelist.txt
  19. 6
      test/dm/blk.c
  20. 2
      test/dm/test-main.c
  21. 22
      tools/buildman/kconfiglib.py
  22. 7
      tools/genboardscfg.py
  23. 6
      tools/moveconfig.py
  24. 12
      tools/patman/README
  25. 5
      tools/patman/series.py
  26. 18
      tools/patman/settings.py

@ -224,9 +224,7 @@ tegra_xusb_padctl_config_parse_dt(struct tegra_xusb_padctl *padctl,
config->name = ofnode_get_name(node);
for (subnode = ofnode_first_subnode(node);
ofnode_valid(subnode);
subnode = ofnode_next_subnode(subnode)) {
ofnode_for_each_subnode(subnode, node) {
struct tegra_xusb_padctl_group *group;
int err;
@ -256,9 +254,7 @@ static int tegra_xusb_padctl_parse_dt(struct tegra_xusb_padctl *padctl,
return err;
}
for (subnode = ofnode_first_subnode(node);
ofnode_valid(subnode);
subnode = ofnode_next_subnode(subnode)) {
ofnode_for_each_subnode(subnode, node) {
struct tegra_xusb_padctl_config *config = &padctl->config;
debug("%s: subnode=%s\n", __func__, ofnode_get_name(subnode));

@ -18,4 +18,26 @@ config SYS_CONFIG_NAME
default "sandbox_spl" if SANDBOX_SPL
default "sandbox" if !SANDBOX_SPL
choice
prompt "Run sandbox on 32/64-bit host"
default SANDBOX_64BIT
help
Sandbox can be built on 32-bit and 64-bit hosts.
The default is to build on a 64-bit host and run
on a 64-bit host. If you want to run sandbox on
a 32-bit host, change it here.
config SANDBOX_32BIT
bool "32-bit host"
config SANDBOX_64BIT
bool "64-bit host"
endchoice
config SANDBOX_BITS_PER_LONG
int
default 32 if SANDBOX_32BIT
default 64 if SANDBOX_64BIT
endmenu

@ -127,10 +127,12 @@
compatible = "denx,u-boot-fdt-test";
};
clk_fixed: clk-fixed {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <1234>;
clocks {
clk_fixed: clk-fixed {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <1234>;
};
};
clk_sandbox: clk-sbox {

@ -24,6 +24,9 @@ single board in board/sandbox.
CONFIG_SANDBOX_BIG_ENDIAN should be defined when running on big-endian
machines.
By default sandbox builds and runs on 64-bit hosts. If you are going to build
and run sandbox on a 32-bit host, select CONFIG_SANDBOX_32BIT.
Note that standalone/API support is not available at present.
@ -44,10 +47,6 @@ Note:
make sandbox_defconfig all NO_SDL=1
./u-boot
If you are building on a 32-bit machine you may get errors from __ffs.h
about shifting more than the machine word size. Edit the config file
include/configs/sandbox.h and change CONFIG_SANDBOX_BITS_PER_LONG to 32.
U-Boot will start on your computer, showing a sandbox emulation of the serial
console:

@ -0,0 +1,3 @@
# List of addresses picked up by patman/get_maintainer.pl that are known to
# bounce. Addresses are listed one per line and need to match the author
# information recorded in git.

@ -546,7 +546,7 @@ static int blk_claim_devnum(enum if_type if_type, int devnum)
int blk_create_device(struct udevice *parent, const char *drv_name,
const char *name, int if_type, int devnum, int blksz,
lbaint_t size, struct udevice **devp)
lbaint_t lba, struct udevice **devp)
{
struct blk_desc *desc;
struct udevice *dev;
@ -567,7 +567,7 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
desc = dev_get_uclass_platdata(dev);
desc->if_type = if_type;
desc->blksz = blksz;
desc->lba = size / blksz;
desc->lba = lba;
desc->part_type = PART_TYPE_UNKNOWN;
desc->bdev = dev;
desc->devnum = devnum;
@ -578,7 +578,7 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
int blk_create_devicef(struct udevice *parent, const char *drv_name,
const char *name, int if_type, int devnum, int blksz,
lbaint_t size, struct udevice **devp)
lbaint_t lba, struct udevice **devp)
{
char dev_name[30], *str;
int ret;
@ -589,7 +589,7 @@ int blk_create_devicef(struct udevice *parent, const char *drv_name,
return -ENOMEM;
ret = blk_create_device(parent, drv_name, str, if_type, devnum,
blksz, size, devp);
blksz, lba, devp);
if (ret) {
free(str);
return ret;

@ -129,7 +129,7 @@ int host_dev_bind(int devnum, char *filename)
}
ret = blk_create_device(gd->dm_root, "sandbox_host_blk", str,
IF_TYPE_HOST, devnum, 512,
os_lseek(fd, 0, OS_SEEK_END), &dev);
os_lseek(fd, 0, OS_SEEK_END) / 512, &dev);
if (ret)
goto err_file;
ret = device_probe(dev);

@ -14,12 +14,10 @@ static void show_devices(struct udevice *dev, int depth, int last_flag)
{
int i, is_last;
struct udevice *child;
char class_name[12];
/* print the first 11 characters to not break the tree-format. */
strlcpy(class_name, dev->uclass->uc_drv->name, sizeof(class_name));
printf(" %-11s [ %c ] ", class_name,
dev->flags & DM_FLAG_ACTIVATED ? '+' : ' ');
printf(" %-10.10s [ %c ] %-10.10s ", dev->uclass->uc_drv->name,
dev->flags & DM_FLAG_ACTIVATED ? '+' : ' ', dev->driver->name);
for (i = depth; i >= 0; i--) {
is_last = (last_flag >> i) & 1;
@ -50,7 +48,7 @@ void dm_dump_all(void)
root = dm_root();
if (root) {
printf(" Class Probed Name\n");
printf(" Class Probed Driver Name\n");
printf("----------------------------------------\n");
show_devices(root, -1, 0);
}

@ -390,10 +390,11 @@ int ofnode_decode_display_timing(ofnode parent, int index,
if (!ofnode_valid(timings))
return -EINVAL;
for (i = 0, node = ofnode_first_subnode(timings);
ofnode_valid(node) && i != index;
node = ofnode_first_subnode(node))
i++;
i = 0;
ofnode_for_each_subnode(node, timings) {
if (i++ == index)
break;
}
if (!ofnode_valid(node))
return -EINVAL;

@ -312,8 +312,38 @@ int dm_scan_fdt(const void *blob, bool pre_reloc_only)
#endif
return dm_scan_fdt_node(gd->dm_root, blob, 0, pre_reloc_only);
}
#else
static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
int offset, bool pre_reloc_only)
{
return 0;
}
#endif
int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only)
{
int node, ret;
ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
if (ret) {
debug("dm_scan_fdt() failed: %d\n", ret);
return ret;
}
/* bind fixed-clock */
node = ofnode_to_offset(ofnode_path("/clocks"));
/* if no DT "clocks" node, no need to go further */
if (node < 0)
return ret;
ret = dm_scan_fdt_node(gd->dm_root, gd->fdt_blob, node,
pre_reloc_only);
if (ret)
debug("dm_scan_fdt_node() failed: %d\n", ret);
return ret;
}
__weak int dm_scan_other(bool pre_reloc_only)
{
return 0;
@ -335,9 +365,9 @@ int dm_init_and_scan(bool pre_reloc_only)
}
if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
ret = dm_extended_scan_fdt(gd->fdt_blob, pre_reloc_only);
if (ret) {
debug("dm_scan_fdt() failed: %d\n", ret);
debug("dm_extended_scan_dt() failed: %d\n", ret);
return ret;
}
}

@ -1038,8 +1038,7 @@ int cros_ec_decode_ec_flash(struct udevice *dev, struct fdt_cros_ec *config)
config->flash_erase_value = ofnode_read_s32_default(flash_node,
"erase-value", -1);
for (node = ofnode_first_subnode(flash_node); ofnode_valid(node);
node = ofnode_next_subnode(node)) {
ofnode_for_each_subnode(node, flash_node) {
const char *name = ofnode_get_name(node);
enum ec_flash_region region;

@ -34,9 +34,7 @@ int pmic_bind_children(struct udevice *pmic, ofnode parent,
debug("%s for '%s' at node offset: %d\n", __func__, pmic->name,
dev_of_offset(pmic));
for (node = ofnode_first_subnode(parent);
ofnode_valid(node);
node = ofnode_next_subnode(node)) {
ofnode_for_each_subnode(node, parent) {
node_name = ofnode_get_name(node);
debug("* Found child node: '%s'\n", node_name);

@ -580,7 +580,7 @@ static int do_scsi_scan_one(struct udevice *dev, int id, int lun, bool verbose)
*/
snprintf(str, sizeof(str), "id%dlun%d", id, lun);
ret = blk_create_devicef(dev, "scsi_blk", str, IF_TYPE_SCSI, -1,
bd.blksz, bd.blksz * bd.lba, &bdev);
bd.blksz, bd.lba, &bdev);
if (ret) {
debug("Can't create device\n");
return ret;

@ -315,12 +315,12 @@ int blk_next_device(struct udevice **devp);
* @devnum: Device number, specific to the interface type, or -1 to
* allocate the next available number
* @blksz: Block size of the device in bytes (typically 512)
* @size: Total size of the device in bytes
* @lba: Total number of blocks of the device
* @devp: the new device (which has not been probed)
*/
int blk_create_device(struct udevice *parent, const char *drv_name,
const char *name, int if_type, int devnum, int blksz,
lbaint_t size, struct udevice **devp);
lbaint_t lba, struct udevice **devp);
/**
* blk_create_devicef() - Create a new named block device
@ -332,12 +332,12 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
* @devnum: Device number, specific to the interface type, or -1 to
* allocate the next available number
* @blksz: Block size of the device in bytes (typically 512)
* @size: Total size of the device in bytes
* @lba: Total number of blocks of the device
* @devp: the new device (which has not been probed)
*/
int blk_create_devicef(struct udevice *parent, const char *drv_name,
const char *name, int if_type, int devnum, int blksz,
lbaint_t size, struct udevice **devp);
lbaint_t lba, struct udevice **devp);
/**
* blk_prepare_device() - Prepare a block device for use

@ -628,4 +628,28 @@ int ofnode_read_resource(ofnode node, uint index, struct resource *res);
int ofnode_read_resource_byname(ofnode node, const char *name,
struct resource *res);
/**
* ofnode_for_each_subnode() - iterate over all subnodes of a parent
*
* @node: child node (ofnode, lvalue)
* @parent: parent node (ofnode)
*
* This is a wrapper around a for loop and is used like so:
*
* ofnode node;
*
* ofnode_for_each_subnode(node, parent) {
* Use node
* ...
* }
*
* Note that this is implemented as a macro and @node is used as
* iterator in the loop. The parent variable can be a constant or even a
* literal.
*/
#define ofnode_for_each_subnode(node, parent) \
for (node = ofnode_first_subnode(parent); \
ofnode_valid(node); \
node = ofnode_next_subnode(node))
#endif

@ -56,6 +56,20 @@ int dm_scan_platdata(bool pre_reloc_only);
int dm_scan_fdt(const void *blob, bool pre_reloc_only);
/**
* dm_extended_scan_fdt() - Scan the device tree and bind drivers
*
* This calls dm_scna_dft() which scans the device tree and creates a driver
* for each node. the top-level subnodes are examined and also all sub-nodes
* of "clocks" node.
*
* @blob: Pointer to device tree blob
* @pre_reloc_only: If true, bind only drivers with the DM_FLAG_PRE_RELOC
* flag. If false bind all drivers.
* @return 0 if OK, -ve on error
*/
int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only);
/**
* dm_scan_other() - Scan for other devices
*
* Some devices may not be visible to Driver Model. This weak function can

@ -8,6 +8,8 @@
%module libfdt
%include <stdint.i>
%{
#define SWIG_FILE_WITH_INIT
#include "libfdt.h"

@ -1950,7 +1950,6 @@ CONFIG_SAMSUNG
CONFIG_SAMSUNG_ONENAND
CONFIG_SANDBOX_ARCH
CONFIG_SANDBOX_BIG_ENDIAN
CONFIG_SANDBOX_BITS_PER_LONG
CONFIG_SANDBOX_SDL
CONFIG_SANDBOX_SPI_MAX_BUS
CONFIG_SANDBOX_SPI_MAX_CS

@ -23,9 +23,9 @@ static int dm_test_blk_base(struct unit_test_state *uts)
/* Create two, one the parent of the other */
ut_assertok(blk_create_device(gd->dm_root, "sandbox_host_blk", "test",
IF_TYPE_HOST, 1, 512, 1024, &blk));
IF_TYPE_HOST, 1, 512, 2, &blk));
ut_assertok(blk_create_device(blk, "usb_storage_blk", "test",
IF_TYPE_USB, 3, 512, 1024, &usb_blk));
IF_TYPE_USB, 3, 512, 2, &usb_blk));
/* Check we can find them */
ut_asserteq(-ENODEV, blk_get_device(IF_TYPE_HOST, 0, &dev));
@ -101,7 +101,7 @@ static int dm_test_blk_find(struct unit_test_state *uts)
struct udevice *blk, *dev;
ut_assertok(blk_create_device(gd->dm_root, "sandbox_host_blk", "test",
IF_TYPE_HOST, 1, 512, 1024, &blk));
IF_TYPE_HOST, 1, 512, 2, &blk));
ut_asserteq(-ENODEV, blk_find_device(IF_TYPE_HOST, 0, &dev));
ut_assertok(blk_find_device(IF_TYPE_HOST, 1, &dev));
ut_asserteq_ptr(blk, dev);

@ -92,7 +92,7 @@ static int dm_do_test(struct unit_test_state *uts, struct unit_test *test,
if (test->flags & DM_TESTF_PROBE_TEST)
ut_assertok(do_autoprobe(uts));
if (test->flags & DM_TESTF_SCAN_FDT)
ut_assertok(dm_scan_fdt(gd->fdt_blob, false));
ut_assertok(dm_extended_scan_fdt(gd->fdt_blob, false));
/*
* Silence the console and rely on console reocrding to get

@ -204,6 +204,7 @@ class Config(object):
self.print_warnings = print_warnings
self.print_undef_assign = print_undef_assign
self._warnings = []
# For parsing routines that stop when finding a line belonging to a
# different construct, these holds that line and the tokenized version
@ -398,8 +399,12 @@ class Config(object):
need to refer to the top-level kernel directory with "$srctree".
replace (default: True): True if the configuration should replace the
old configuration; False if it should add to it."""
old configuration; False if it should add to it.
Returns a list or warnings (hopefully empty)
"""
self._warnings = []
# Put this first so that a missing file doesn't screw up our state
filename = os.path.expandvars(filename)
line_feeder = _FileFeed(filename)
@ -449,7 +454,7 @@ class Config(object):
while 1:
line = line_feeder.get_next()
if line is None:
return
return self._warnings
line = line.rstrip()
@ -1763,8 +1768,10 @@ class Config(object):
def _warn(self, msg, filename=None, linenr=None):
"""For printing warnings to stderr."""
msg = _build_msg("warning: " + msg, filename, linenr)
if self.print_warnings:
_stderr_msg("warning: " + msg, filename, linenr)
sys.stderr.write(msg + "\n")
self._warnings.append(msg)
class Item(object):
@ -3369,10 +3376,13 @@ def _clean_up_path(path):
path = path[2:]
return path.rstrip("/")
def _stderr_msg(msg, filename, linenr):
def _build_msg(msg, filename, linenr):
if filename is not None:
sys.stderr.write("{0}:{1}: ".format(_clean_up_path(filename), linenr))
sys.stderr.write(msg + "\n")
msg = "{0}:{1}: ".format(_clean_up_path(filename), linenr) + msg
return msg
def _stderr_msg(msg, filename, linenr):
sys.stderr.write(_build_msg(msg, filename, linenr) + "\n")
def _tokenization_error(s, filename, linenr):
loc = "" if filename is None else "{0}:{1}: ".format(filename, linenr)

@ -124,7 +124,7 @@ class KconfigScanner:
os.environ['srctree'] = os.getcwd()
os.environ['UBOOTVERSION'] = 'dummy'
os.environ['KCONFIG_OBJDIR'] = ''
self._conf = kconfiglib.Config()
self._conf = kconfiglib.Config(print_warnings=False)
def __del__(self):
"""Delete a leftover temporary file before exit.
@ -166,7 +166,10 @@ class KconfigScanner:
else:
f.write(line[colon + 1:])
self._conf.load_config(self._tmpfile)
warnings = self._conf.load_config(self._tmpfile)
if warnings:
for warning in warnings:
print '%s: %s' % (defconfig, warning)
try_remove(self._tmpfile)
self._tmpfile = None

@ -1877,10 +1877,10 @@ def main():
if options.build_db:
with open(CONFIG_DATABASE, 'w') as fd:
for defconfig, configs in config_db.iteritems():
print >>fd, '%s' % defconfig
fd.write('%s\n' % defconfig)
for config in sorted(configs.keys()):
print >>fd, ' %s=%s' % (config, configs[config])
print >>fd
fd.write(' %s=%s\n' % (config, configs[config]))
fd.write('\n')
if __name__ == '__main__':
main()

@ -84,6 +84,18 @@ Aliases are recursive.
The checkpatch.pl in the U-Boot tools/ subdirectory will be located and
used. Failing that you can put it into your path or ~/bin/checkpatch.pl
If you want to avoid sending patches to email addresses that are picked up
by patman but are known to bounce you can add a [bounces] section to your
.patman file. Unlike the [alias] section these are simple key: value pairs
that are not recursive.
>>>
[bounces]
gonefishing: Fred Bloggs <f.bloggs@napier.net>
<<<
If you want to change the defaults for patman's command-line arguments,
you can add a [settings] section to your .patman file. This can be used

@ -10,6 +10,7 @@ import os
import get_maintainer
import gitutil
import settings
import terminal
# Series-xxx tags that we understand
@ -218,6 +219,7 @@ class Series(dict):
Return:
Filename of temp file created
"""
col = terminal.Color()
# Look for commit tags (of the form 'xxx:' at the start of the subject)
fname = '/tmp/patman.%d' % os.getpid()
fd = open(fname, 'w')
@ -233,6 +235,9 @@ class Series(dict):
cc += add_maintainers
elif add_maintainers:
cc += get_maintainer.GetMaintainer(commit.patch)
for x in set(cc) & set(settings.bounces):
print(col.Color(col.YELLOW, 'Skipping "%s"' % x))
cc = set(cc) - set(settings.bounces)
cc = [m.encode('utf-8') if type(m) != str else m for m in cc]
all_ccs += cc
print(commit.patch, ', '.join(set(cc)), file=fd)

@ -269,6 +269,19 @@ def _ReadAliasFile(fname):
if bad_line:
print(bad_line)
def _ReadBouncesFile(fname):
"""Read in the bounces file if it exists
Args:
fname: Filename to read.
"""
if os.path.exists(fname):
with open(fname) as fd:
for line in fd:
if line.startswith('#'):
continue
bounces.add(line.strip())
def Setup(parser, project_name, config_fname=''):
"""Set up the settings module by reading config files.
@ -293,10 +306,15 @@ def Setup(parser, project_name, config_fname=''):
for name, value in config.items('alias'):
alias[name] = value.split(',')
_ReadBouncesFile('doc/bounces')
for name, value in config.items('bounces'):
bounces.add(value)
_UpdateDefaults(parser, config)
# These are the aliases we understand, indexed by alias. Each member is a list.
alias = {}
bounces = set()
if __name__ == "__main__":
import doctest

Loading…
Cancel
Save