Merge branch 'master' of git://www.denx.de/git/u-boot-dm

This commit is contained in:
Tom Rini 2016-12-03 19:43:51 -05:00
commit 73eed452b9
45 changed files with 790 additions and 160 deletions

View File

@ -299,9 +299,8 @@ config SYS_CLK_FREQ
help
TODO: Move CONFIG_SYS_CLK_FREQ for all the architecture
config ARCH_FIXUP_FDT
bool "Enable arch_fixup_fdt() call"
depends on ARM || MIPS
config ARCH_FIXUP_FDT_MEMORY
bool "Enable arch_fixup_memory_banks() call"
default y
help
Enable FDT memory map syncup before OS boot. This feature can be

View File

@ -821,6 +821,8 @@ append = cat $(filter-out $< $(PHONY), $^) >> $@
quiet_cmd_pad_cat = CAT $@
cmd_pad_cat = $(cmd_objcopy) && $(append) || rm -f $@
cfg: u-boot.cfg
all: $(ALL-y)
ifeq ($(CONFIG_DM_I2C_COMPAT)$(CONFIG_SANDBOX),y)
@echo "===================== WARNING ======================"
@ -1527,6 +1529,7 @@ help:
@echo ' cscope - Generate cscope index'
@echo ' ubootrelease - Output the release version string (use with make -s)'
@echo ' ubootversion - Output the version stored in Makefile (use with make -s)'
@echo " cfg - Don't build, just create the .cfg files"
@echo ''
@echo 'Static analysers'
@echo ' checkstack - Generate a list of stack hogs'

View File

@ -37,6 +37,11 @@ void arch_lmb_reserve(struct lmb *lmb)
lmb_reserve(lmb, sp, (CONFIG_SYS_SDRAM_BASE + gd->ram_size - sp));
}
int arch_fixup_fdt(void *blob)
{
return 0;
}
static int cleanup_before_linux(void)
{
disable_interrupts();

View File

@ -7,7 +7,7 @@
#ifndef __ASM_ARCH_OMAP3_MUSB_H
#define __ASM_ARCH_OMAP3_MUSB_H
extern void am35x_musb_reset(void);
extern void am35x_musb_phy_power(u8 on);
extern void am35x_musb_clear_irq(void);
void am35x_musb_reset(struct udevice *dev);
void am35x_musb_phy_power(struct udevice *dev, u8 on);
void am35x_musb_clear_irq(struct udevice *dev);
#endif

View File

@ -15,9 +15,10 @@ extern const struct musb_platform_ops omap2430_ops;
struct omap_musb_board_data {
u8 interface_type;
void (*set_phy_power)(u8 on);
void (*clear_irq)(void);
void (*reset)(void);
struct udevice *dev;
void (*set_phy_power)(struct udevice *dev, u8 on);
void (*clear_irq)(struct udevice *dev);
void (*reset)(struct udevice *dev);
};
enum musb_interface {MUSB_INTERFACE_ULPI, MUSB_INTERFACE_UTMI};

View File

@ -25,7 +25,6 @@
DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_ARCH_FIXUP_FDT
int arch_fixup_fdt(void *blob)
{
bd_t *bd = gd->bd;
@ -61,4 +60,3 @@ int arch_fixup_fdt(void *blob)
return 0;
}
#endif

View File

@ -414,10 +414,8 @@ void boot_prep_vxworks(bootm_headers_t *images)
if (images->ft_addr) {
off = fdt_path_offset(images->ft_addr, "/memory");
if (off < 0) {
#ifdef CONFIG_ARCH_FIXUP_FDT
if (arch_fixup_fdt(images->ft_addr))
puts("## WARNING: fixup memory failed!\n");
#endif
}
}
#endif

View File

@ -120,7 +120,8 @@ int cpu_mmc_init(bd_t *bis)
/* AM33XX has two MUSB controllers which can be host or gadget */
#if (defined(CONFIG_USB_MUSB_GADGET) || defined(CONFIG_USB_MUSB_HOST)) && \
(defined(CONFIG_AM335X_USB0) || defined(CONFIG_AM335X_USB1))
(defined(CONFIG_AM335X_USB0) || defined(CONFIG_AM335X_USB1)) && \
(!defined(CONFIG_DM_USB))
static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
/* USB 2.0 PHY Control */
@ -147,7 +148,7 @@ static struct musb_hdrc_config musb_config = {
};
#ifdef CONFIG_AM335X_USB0
static void am33xx_otg0_set_phy_power(u8 on)
static void am33xx_otg0_set_phy_power(struct udevice *dev, u8 on)
{
am33xx_usb_set_phy_power(on, &cdev->usb_ctrl0);
}
@ -166,7 +167,7 @@ static struct musb_hdrc_platform_data otg0_plat = {
#endif
#ifdef CONFIG_AM335X_USB1
static void am33xx_otg1_set_phy_power(u8 on)
static void am33xx_otg1_set_phy_power(struct udevice *dev, u8 on)
{
am33xx_usb_set_phy_power(on, &cdev->usb_ctrl1);
}
@ -187,6 +188,7 @@ static struct musb_hdrc_platform_data otg1_plat = {
int arch_misc_init(void)
{
#ifndef CONFIG_DM_USB
#ifdef CONFIG_AM335X_USB0
musb_register(&otg0_plat, &otg0_board_data,
(void *)USB0_OTG_BASE);
@ -194,6 +196,14 @@ int arch_misc_init(void)
#ifdef CONFIG_AM335X_USB1
musb_register(&otg1_plat, &otg1_board_data,
(void *)USB1_OTG_BASE);
#endif
#else
struct udevice *dev;
int ret;
ret = uclass_first_device(UCLASS_MISC, &dev);
if (ret || !dev)
return ret;
#endif
return 0;
}

View File

@ -13,7 +13,7 @@
#include <asm/io.h>
#include <asm/arch/am35x_def.h>
void am35x_musb_reset(void)
void am35x_musb_reset(struct udevice *dev)
{
/* Reset the musb interface */
clrsetbits_le32(&am35x_scm_general_regs->ip_sw_reset,
@ -22,7 +22,7 @@ void am35x_musb_reset(void)
USBOTGSS_SW_RST, 0);
}
void am35x_musb_phy_power(u8 on)
void am35x_musb_phy_power(struct udevice *dev, u8 on)
{
unsigned long start = get_timer(0);
@ -53,7 +53,7 @@ void am35x_musb_phy_power(u8 on)
}
}
void am35x_musb_clear_irq(void)
void am35x_musb_clear_irq(struct udevice *dev)
{
clrsetbits_le32(&am35x_scm_general_regs->lvl_intr_clr,
0, USBOTGSS_INT_CLR);

View File

@ -17,6 +17,11 @@
DECLARE_GLOBAL_DATA_PTR;
int arch_fixup_fdt(void *blob)
{
return 0;
}
int do_bootm_linux(int flag, int argc, char * const argv[],
bootm_headers_t *images)
{

View File

@ -253,7 +253,6 @@ static int boot_reloc_fdt(bootm_headers_t *images)
#endif
}
#ifdef CONFIG_ARCH_FIXUP_FDT
int arch_fixup_fdt(void *blob)
{
#if CONFIG_IS_ENABLED(MIPS_BOOT_FDT) && CONFIG_IS_ENABLED(OF_LIBFDT)
@ -265,7 +264,6 @@ int arch_fixup_fdt(void *blob)
return 0;
#endif
}
#endif
static int boot_setup_fdt(bootm_headers_t *images)
{

View File

@ -38,6 +38,11 @@ static void set_clocks_in_mhz (bd_t *kbd);
#define CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE (768*1024*1024)
#endif
int arch_fixup_fdt(void *blob)
{
return 0;
}
static void boot_jump_linux(bootm_headers_t *images)
{
void (*kernel)(bd_t *, ulong r4, ulong r5, ulong r6,

View File

@ -50,6 +50,11 @@ int bootz_setup(ulong image, ulong *start, ulong *end)
return ret;
}
int arch_fixup_fdt(void *blob)
{
return 0;
}
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{
if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) {

View File

@ -26,6 +26,11 @@ DECLARE_GLOBAL_DATA_PTR;
#define COMMAND_LINE_OFFSET 0x9000
int arch_fixup_fdt(void *blob)
{
return 0;
}
__weak void board_quiesce_devices(void)
{
}

View File

@ -19,6 +19,29 @@ static const char * const ec_current_image_name[] = {"unknown", "RO", "RW"};
DECLARE_GLOBAL_DATA_PTR;
/**
* Decode a flash region parameter
*
* @param argc Number of params remaining
* @param argv List of remaining parameters
* @return flash region (EC_FLASH_REGION_...) or -1 on error
*/
static int cros_ec_decode_region(int argc, char * const argv[])
{
if (argc > 0) {
if (0 == strcmp(*argv, "rw"))
return EC_FLASH_REGION_RW;
else if (0 == strcmp(*argv, "ro"))
return EC_FLASH_REGION_RO;
debug("%s: Invalid region '%s'\n", __func__, *argv);
} else {
debug("%s: Missing region parameter\n", __func__);
}
return -1;
}
/**
* Perform a flash read or write command
*

View File

@ -206,7 +206,17 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 1;
}
working_fdt = newaddr;
#ifdef CONFIG_OF_SYSTEM_SETUP
/* Call the board-specific fixup routine */
} else if (strncmp(argv[1], "sys", 3) == 0) {
int err = ft_system_setup(working_fdt, gd->bd);
if (err) {
printf("Failed to add system information to FDT: %s\n",
fdt_strerror(err));
return CMD_RET_FAILURE;
}
#endif
/*
* Make a new node
*/
@ -576,18 +586,6 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return CMD_RET_FAILURE;
}
}
#endif
#ifdef CONFIG_OF_SYSTEM_SETUP
/* Call the board-specific fixup routine */
else if (strncmp(argv[1], "sys", 3) == 0) {
int err = ft_system_setup(working_fdt, gd->bd);
if (err) {
printf("Failed to add system information to FDT: %s\n",
fdt_strerror(err));
return CMD_RET_FAILURE;
}
}
#endif
/* Create a chosen node */
else if (strncmp(argv[1], "cho", 3) == 0) {

View File

@ -532,15 +532,15 @@ static cmd_tbl_t cmd_cros_tpm_sub[] = {
static int do_tpmtest(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
cmd_tbl_t *c;
int i;
printf("argc = %d, argv = ", argc);
do {
int i = 0;
for (i = 0; i < argc; i++)
printf(" %s", argv[i]);
printf("\n------\n");
} while (0);
for (i = 0; i < argc; i++)
printf(" %s", argv[i]);
printf("\n------\n");
argc--;
argv++;
c = find_cmd_tbl(argv[0], cmd_cros_tpm_sub,

View File

@ -381,6 +381,7 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,
do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create);
}
#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY
/*
* fdt_pack_reg - pack address and size array into the "reg"-suitable stream
*/
@ -459,6 +460,7 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
}
return 0;
}
#endif
int fdt_fixup_memory(void *blob, u64 start, u64 size)
{

View File

@ -474,12 +474,10 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
printf("ERROR: /chosen node create failed\n");
goto err;
}
#ifdef CONFIG_ARCH_FIXUP_FDT
if (arch_fixup_fdt(blob) < 0) {
printf("ERROR: arch-specific fdt fixup failed\n");
goto err;
}
#endif
if (IMAGE_OF_BOARD_SETUP) {
fdt_ret = ft_board_setup(blob, gd->bd);
if (fdt_ret) {

View File

@ -513,6 +513,9 @@ ulong spl_relocate_stack_gd(void)
ptr = CONFIG_SPL_STACK_R_ADDR - roundup(sizeof(gd_t),16);
new_gd = (gd_t *)ptr;
memcpy(new_gd, (void *)gd, sizeof(gd_t));
#if CONFIG_IS_ENABLED(DM)
dm_fixup_for_gd_move(new_gd);
#endif
#if !defined(CONFIG_ARM)
gd = new_gd;
#endif

View File

@ -156,6 +156,8 @@ static int get_desc(enum if_type if_type, int devnum, struct blk_desc **descp)
if (ret)
return ret;
*descp = desc;
return 0;
} else if (desc->devnum > devnum) {
found_more = true;
}

View File

@ -693,6 +693,28 @@ fdt_addr_t dev_get_addr_index(struct udevice *dev, int index)
#endif
}
fdt_addr_t dev_get_addr_size_index(struct udevice *dev, int index,
fdt_size_t *size)
{
#if CONFIG_IS_ENABLED(OF_CONTROL)
/*
* Only get the size in this first call. We'll get the addr in the
* next call to the exisiting dev_get_xxx function which handles
* all config options.
*/
fdtdec_get_addr_size_auto_noparent(gd->fdt_blob, dev->of_offset,
"reg", index, size, false);
/*
* Get the base address via the existing function which handles
* all Kconfig cases
*/
return dev_get_addr_index(dev, index);
#else
return FDT_ADDR_T_NONE;
#endif
}
fdt_addr_t dev_get_addr_name(struct udevice *dev, const char *name)
{
#if CONFIG_IS_ENABLED(OF_CONTROL)

View File

@ -41,6 +41,13 @@ struct udevice *dm_root(void)
return gd->dm_root;
}
void dm_fixup_for_gd_move(struct global_data *new_gd)
{
/* The sentinel node has moved, so update things that point to it */
new_gd->uclass_root.next->prev = &new_gd->uclass_root;
new_gd->uclass_root.prev->next = &new_gd->uclass_root;
}
fdt_addr_t dm_get_translation_offset(void)
{
struct udevice *root = dm_root();

View File

@ -1024,22 +1024,6 @@ int cros_ec_register(struct udevice *dev)
return 0;
}
int cros_ec_decode_region(int argc, char * const argv[])
{
if (argc > 0) {
if (0 == strcmp(*argv, "rw"))
return EC_FLASH_REGION_RW;
else if (0 == strcmp(*argv, "ro"))
return EC_FLASH_REGION_RO;
debug("%s: Invalid region '%s'\n", __func__, *argv);
} else {
debug("%s: Missing region parameter\n", __func__);
}
return -1;
}
int cros_ec_decode_ec_flash(const void *blob, int node,
struct fdt_cros_ec *config)
{

View File

@ -13,4 +13,10 @@ config DM_RTC
drivers to perform the actual functions. See rtc.h for a
description of the API.
config RTC_PCF2127
bool "Enable PCF2127 driver"
depends on DM_RTC
help
Enable pcf2127 driver which provides rtc get and set function
endmenu

View File

@ -45,6 +45,7 @@ obj-$(CONFIG_RTC_MV) += mvrtc.o
obj-$(CONFIG_RTC_MX27) += mx27rtc.o
obj-$(CONFIG_RTC_MXS) += mxsrtc.o
obj-$(CONFIG_RTC_PCF8563) += pcf8563.o
obj-$(CONFIG_RTC_PCF2127) += pcf2127.o
obj-$(CONFIG_RTC_PL031) += pl031.o
obj-$(CONFIG_RTC_PT7C4338) += pt7c4338.o
obj-$(CONFIG_RTC_RS5C372A) += rs5c372.o

107
drivers/rtc/pcf2127.c Normal file
View File

@ -0,0 +1,107 @@
/*
* Copyright (C) 2016 by NXP Semiconductors Inc.
* Date & Time support for PCF2127 RTC
*/
/* #define DEBUG */
#include <common.h>
#include <command.h>
#include <dm.h>
#include <i2c.h>
#include <rtc.h>
#define PCF2127_REG_CTRL1 (0x00)
#define PCF2127_REG_CTRL2 (0x01)
#define PCF2127_REG_CTRL3 (0x02)
#define PCF2127_REG_SC (0x03) /* datetime */
#define PCF2127_REG_MN (0x04)
#define PCF2127_REG_HR (0x05)
#define PCF2127_REG_DM (0x06)
#define PCF2127_REG_DW (0x07)
#define PCF2127_REG_MO (0x08)
#define PCF2127_REG_YR (0x09)
static int pcf2127_rtc_set(struct udevice *dev, const struct rtc_time *tm)
{
uchar buf[8];
int i = 0;
/* start register address */
buf[i++] = PCF2127_REG_SC;
/* hours, minutes and seconds */
buf[i++] = bin2bcd(tm->tm_sec);
buf[i++] = bin2bcd(tm->tm_min);
buf[i++] = bin2bcd(tm->tm_hour);
buf[i++] = bin2bcd(tm->tm_mday);
buf[i++] = tm->tm_wday & 0x07;
/* month, 1 - 12 */
buf[i++] = bin2bcd(tm->tm_mon + 1);
/* year */
buf[i++] = bin2bcd(tm->tm_year % 100);
/* write register's data */
if (dm_i2c_write(dev, PCF2127_REG_CTRL1, buf, sizeof(buf)) < 0)
return -1;
return 0;
}
static int pcf2127_rtc_get(struct udevice *dev, struct rtc_time *tm)
{
int rel = 0;
uchar buf[10] = { PCF2127_REG_CTRL1 };
if (dm_i2c_write(dev, PCF2127_REG_CTRL1, buf, 1) < 0)
return -1;
if (dm_i2c_read(dev, PCF2127_REG_CTRL1, buf, sizeof(buf)) < 0)
return -1;
if (buf[PCF2127_REG_CTRL3] & 0x04)
puts("### Warning: RTC Low Voltage - date/time not reliable\n");
tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F);
tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F);
tm->tm_hour = bcd2bin(buf[PCF2127_REG_HR] & 0x3F);
tm->tm_mday = bcd2bin(buf[PCF2127_REG_DM] & 0x3F);
tm->tm_mon = bcd2bin(buf[PCF2127_REG_MO] & 0x1F) - 1;
tm->tm_year = bcd2bin(buf[PCF2127_REG_YR]) + 1900;
if (tm->tm_year < 1970)
tm->tm_year += 100; /* assume we are in 1970...2069 */
tm->tm_wday = buf[PCF2127_REG_DW] & 0x07;
tm->tm_yday = 0;
tm->tm_isdst = 0;
debug("Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
tm->tm_hour, tm->tm_min, tm->tm_sec);
return rel;
}
static int pcf2127_rtc_reset(struct udevice *dev)
{
/*Doing nothing here*/
return 0;
}
static const struct rtc_ops pcf2127_rtc_ops = {
.get = pcf2127_rtc_get,
.set = pcf2127_rtc_set,
.reset = pcf2127_rtc_reset,
};
static const struct udevice_id pcf2127_rtc_ids[] = {
{ .compatible = "pcf2127-rtc" },
{ }
};
U_BOOT_DRIVER(rtc_pcf2127) = {
.name = "rtc-pcf2127",
.id = UCLASS_RTC,
.of_match = pcf2127_rtc_ids,
.ops = &pcf2127_rtc_ops,
};

View File

@ -21,6 +21,21 @@
#define PREFIX "lpc_tpm: "
enum i2c_chip_type {
SLB9635,
AT97SC3204,
};
static const char * const chip_name[] = {
[SLB9635] = "Infineon SLB9635 TT 1.2",
[AT97SC3204] = "Atmel AT97SC3204",
};
static const u32 chip_didvid[] = {
[SLB9635] = 0xb15d1,
[AT97SC3204] = 0x32041114,
};
struct tpm_locality {
u32 access;
u8 padding0[4];
@ -146,9 +161,9 @@ static int tis_wait_reg(struct tpm_tis_lpc_priv *priv, u32 *reg, u8 mask,
static int tpm_tis_lpc_probe(struct udevice *dev)
{
struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
u32 vid, did;
fdt_addr_t addr;
u32 didvid;
ulong chip_type = dev_get_driver_data(dev);
addr = dev_get_addr(dev);
if (addr == FDT_ADDR_T_NONE)
@ -156,14 +171,15 @@ static int tpm_tis_lpc_probe(struct udevice *dev)
priv->regs = map_sysmem(addr, 0);
didvid = tpm_read_word(priv, &priv->regs[0].did_vid);
vid = didvid & 0xffff;
did = (didvid >> 16) & 0xffff;
if (vid != 0x15d1 || did != 0xb) {
if (didvid != chip_didvid[chip_type]) {
u32 vid, did;
vid = didvid & 0xffff;
did = (didvid >> 16) & 0xffff;
debug("Invalid vendor/device ID %04x/%04x\n", vid, did);
return -ENOSYS;
return -ENODEV;
}
debug("Found TPM %s by %s\n", "SLB9635 TT 1.2", "Infineon");
debug("Found TPM: %s\n", chip_name[chip_type]);
return 0;
}
@ -421,11 +437,13 @@ static int tpm_tis_lpc_close(struct udevice *dev)
static int tpm_tis_get_desc(struct udevice *dev, char *buf, int size)
{
ulong chip_type = dev_get_driver_data(dev);
if (size < 50)
return -ENOSPC;
return snprintf(buf, size, "1.2 TPM (vendor %s, chip %s)",
"Infineon", "SLB9635 TT 1.2");
return snprintf(buf, size, "1.2 TPM (%s)",
chip_name[chip_type]);
}
@ -438,7 +456,8 @@ static const struct tpm_ops tpm_tis_lpc_ops = {
};
static const struct udevice_id tpm_tis_lpc_ids[] = {
{ .compatible = "infineon,slb9635lpc" },
{ .compatible = "infineon,slb9635lpc", .data = SLB9635 },
{ .compatible = "atmel,at97sc3204", .data = AT97SC3204 },
{ }
};

View File

@ -24,6 +24,10 @@
#include "gadget_chips.h"
#include "rndis.h"
#include <dm.h>
#include <dm/uclass-internal.h>
#include <dm/device-internal.h>
#define USB_NET_NAME "usb_ether"
#define atomic_read
@ -101,6 +105,9 @@ struct eth_dev {
struct usb_gadget *gadget;
struct usb_request *req; /* for control responses */
struct usb_request *stat_req; /* for cdc & rndis status */
#ifdef CONFIG_DM_USB
struct udevice *usb_udev;
#endif
u8 config;
struct usb_ep *in_ep, *out_ep, *status_ep;
@ -134,9 +141,14 @@ struct eth_dev {
*/
/*-------------------------------------------------------------------------*/
static struct eth_dev l_ethdev;
static struct eth_device l_netdev;
static struct usb_gadget_driver eth_driver;
struct ether_priv {
struct eth_dev ethdev;
struct eth_device netdev;
struct usb_gadget_driver eth_driver;
};
struct ether_priv eth_priv;
struct ether_priv *l_priv = &eth_priv;
/*-------------------------------------------------------------------------*/
@ -1135,7 +1147,7 @@ static void eth_status_complete(struct usb_ep *ep, struct usb_request *req)
event->bNotificationType, value);
if (event->bNotificationType ==
USB_CDC_NOTIFY_SPEED_CHANGE) {
l_ethdev.network_started = 1;
dev->network_started = 1;
printf("USB network up!\n");
}
}
@ -1323,7 +1335,7 @@ eth_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
* that network is working. So we signalize it
* here.
*/
l_ethdev.network_started = 1;
dev->network_started = 1;
debug("USB network up!\n");
goto done_set_intf;
}
@ -1823,10 +1835,10 @@ static void rndis_control_ack_complete(struct usb_ep *ep,
debug("rndis control ack complete --> %d, %d/%d\n",
req->status, req->actual, req->length);
if (!l_ethdev.network_started) {
if (!dev->network_started) {
if (rndis_get_state(dev->rndis_config)
== RNDIS_DATA_INITIALIZED) {
l_ethdev.network_started = 1;
dev->network_started = 1;
printf("USB RNDIS network up!\n");
}
}
@ -1841,7 +1853,8 @@ static char rndis_resp_buf[8] __attribute__((aligned(sizeof(__le32))));
static int rndis_control_ack(struct eth_device *net)
{
struct eth_dev *dev = &l_ethdev;
struct ether_priv *priv = (struct ether_priv *)net->priv;
struct eth_dev *dev = &priv->ethdev;
int length;
struct usb_request *resp = dev->stat_req;
@ -1982,7 +1995,7 @@ static int get_ether_addr(const char *str, u8 *dev_addr)
static int eth_bind(struct usb_gadget *gadget)
{
struct eth_dev *dev = &l_ethdev;
struct eth_dev *dev = &l_priv->ethdev;
u8 cdc = 1, zlp = 1, rndis = 1;
struct usb_ep *in_ep, *out_ep, *status_ep = NULL;
int status = -ENOMEM;
@ -2175,7 +2188,7 @@ autoconf_fail:
/* network device setup */
dev->net = &l_netdev;
dev->net = &l_priv->netdev;
dev->cdc = cdc;
dev->zlp = zlp;
@ -2303,19 +2316,39 @@ fail:
/*-------------------------------------------------------------------------*/
static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
#ifdef CONFIG_DM_USB
int dm_usb_init(struct eth_dev *e_dev)
{
struct eth_dev *dev = &l_ethdev;
struct udevice *dev = NULL;
int ret;
ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
if (!dev || ret) {
error("No USB device found\n");
return -ENODEV;
}
e_dev->usb_udev = dev;
return ret;
}
#endif
static int _usb_eth_init(struct ether_priv *priv)
{
struct eth_dev *dev = &priv->ethdev;
struct usb_gadget *gadget;
unsigned long ts;
unsigned long timeout = USB_CONNECT_TIMEOUT;
if (!netdev) {
error("received NULL ptr");
goto fail;
#ifdef CONFIG_DM_USB
if (dm_usb_init(dev)) {
error("USB ether not found\n");
return -ENODEV;
}
#else
board_usb_init(0, USB_INIT_DEVICE);
#endif
/* Configure default mac-addresses for the USB ethernet device */
#ifdef CONFIG_USBNET_DEV_ADDR
@ -2342,7 +2375,15 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
goto fail;
}
if (usb_gadget_register_driver(&eth_driver) < 0)
priv->eth_driver.speed = DEVSPEED;
priv->eth_driver.bind = eth_bind;
priv->eth_driver.unbind = eth_unbind;
priv->eth_driver.setup = eth_setup;
priv->eth_driver.reset = eth_disconnect;
priv->eth_driver.disconnect = eth_disconnect;
priv->eth_driver.suspend = eth_suspend;
priv->eth_driver.resume = eth_resume;
if (usb_gadget_register_driver(&priv->eth_driver) < 0)
goto fail;
dev->network_started = 0;
@ -2357,7 +2398,7 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
timeout = simple_strtoul(getenv("cdc_connect_timeout"),
NULL, 10) * CONFIG_SYS_HZ;
ts = get_timer(0);
while (!l_ethdev.network_started) {
while (!dev->network_started) {
/* Handle control-c and timeouts */
if (ctrlc() || (get_timer(ts) > timeout)) {
error("The remote end did not respond in time.");
@ -2373,11 +2414,11 @@ fail:
return -1;
}
static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
static int _usb_eth_send(struct ether_priv *priv, void *packet, int length)
{
int retval;
void *rndis_pkt = NULL;
struct eth_dev *dev = &l_ethdev;
struct eth_dev *dev = &priv->ethdev;
struct usb_request *req = dev->tx_req;
unsigned long ts;
unsigned long timeout = USB_CONNECT_TIMEOUT;
@ -2442,34 +2483,16 @@ drop:
return -ENOMEM;
}
static int usb_eth_recv(struct eth_device *netdev)
static int _usb_eth_recv(struct ether_priv *priv)
{
struct eth_dev *dev = &l_ethdev;
usb_gadget_handle_interrupts(0);
if (packet_received) {
debug("%s: packet received\n", __func__);
if (dev->rx_req) {
net_process_received_packet(net_rx_packets[0],
dev->rx_req->length);
packet_received = 0;
rx_submit(dev, dev->rx_req, 0);
} else
error("dev->rx_req invalid");
}
return 0;
}
void usb_eth_halt(struct eth_device *netdev)
void _usb_eth_halt(struct ether_priv *priv)
{
struct eth_dev *dev = &l_ethdev;
if (!netdev) {
error("received NULL ptr");
return;
}
struct eth_dev *dev = &priv->ethdev;
/* If the gadget not registered, simple return */
if (!dev->gadget)
@ -2496,27 +2519,65 @@ void usb_eth_halt(struct eth_device *netdev)
dev->network_started = 0;
}
usb_gadget_unregister_driver(&eth_driver);
usb_gadget_unregister_driver(&priv->eth_driver);
#ifdef CONFIG_DM_USB
device_remove(dev->usb_udev);
#else
board_usb_cleanup(0, USB_INIT_DEVICE);
#endif
}
static struct usb_gadget_driver eth_driver = {
.speed = DEVSPEED,
static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
{
struct ether_priv *priv = (struct ether_priv *)netdev->priv;
.bind = eth_bind,
.unbind = eth_unbind,
return _usb_eth_init(priv);
}
.setup = eth_setup,
.reset = eth_disconnect,
.disconnect = eth_disconnect,
static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
{
struct ether_priv *priv = (struct ether_priv *)netdev->priv;
.suspend = eth_suspend,
.resume = eth_resume,
};
return _usb_eth_send(priv, packet, length);
}
static int usb_eth_recv(struct eth_device *netdev)
{
struct ether_priv *priv = (struct ether_priv *)netdev->priv;
struct eth_dev *dev = &priv->ethdev;
int ret;
ret = _usb_eth_recv(priv);
if (ret) {
error("error packet receive\n");
return ret;
}
if (!packet_received)
return 0;
if (dev->rx_req) {
net_process_received_packet(net_rx_packets[0],
dev->rx_req->length);
} else {
error("dev->rx_req invalid");
}
packet_received = 0;
rx_submit(dev, dev->rx_req, 0);
return 0;
}
void usb_eth_halt(struct eth_device *netdev)
{
struct ether_priv *priv = (struct ether_priv *)netdev->priv;
_usb_eth_halt(priv);
}
int usb_eth_initialize(bd_t *bi)
{
struct eth_device *netdev = &l_netdev;
struct eth_device *netdev = &l_priv->netdev;
strlcpy(netdev->name, USB_NET_NAME, sizeof(netdev->name));
@ -2524,6 +2585,7 @@ int usb_eth_initialize(bd_t *bi)
netdev->send = usb_eth_send;
netdev->recv = usb_eth_recv;
netdev->halt = usb_eth_halt;
netdev->priv = l_priv;
#ifdef CONFIG_MCAST_TFTP
#error not supported

View File

@ -14,6 +14,15 @@ config USB_MUSB_GADGET
help
Enables the MUSB USB dual-role controller in gadget mode.
config USB_MUSB_TI
bool "Enable TI OTG USB controller"
depends on DM_USB
default n
help
Say y here to enable support for the dual role high
speed USB controller based on the Mentor Graphics
silicon IP.
if USB_MUSB_HOST || USB_MUSB_GADGET
config USB_MUSB_PIC32

View File

@ -12,6 +12,7 @@ obj-$(CONFIG_USB_MUSB_AM35X) += am35x.o
obj-$(CONFIG_USB_MUSB_OMAP2PLUS) += omap2430.o
obj-$(CONFIG_USB_MUSB_PIC32) += pic32.o
obj-$(CONFIG_USB_MUSB_SUNXI) += sunxi.o
obj-$(CONFIG_USB_MUSB_TI) += ti-musb.o
ccflags-y := $(call cc-option,-Wno-unused-variable) \
$(call cc-option,-Wno-unused-but-set-variable) \

View File

@ -336,7 +336,7 @@ eoi:
if (ret == IRQ_HANDLED || epintr || usbintr) {
/* clear level interrupt */
if (data->clear_irq)
data->clear_irq();
data->clear_irq(data->dev);
/* write EOI */
musb_writel(reg_base, USB_END_OF_INTR_REG, 0);
}
@ -401,14 +401,14 @@ static int am35x_musb_init(struct musb *musb)
/* Reset the musb */
if (data->reset)
data->reset();
data->reset(data->dev);
/* Reset the controller */
musb_writel(reg_base, USB_CTRL_REG, AM35X_SOFT_RESET_MASK);
/* Start the on-chip PHY and its PLL. */
if (data->set_phy_power)
data->set_phy_power(1);
data->set_phy_power(data->dev, 1);
msleep(5);
@ -416,7 +416,7 @@ static int am35x_musb_init(struct musb *musb)
/* clear level interrupt */
if (data->clear_irq)
data->clear_irq();
data->clear_irq(data->dev);
return 0;
}
@ -439,7 +439,7 @@ static int am35x_musb_exit(struct musb *musb)
/* Shutdown the on-chip PHY and its PLL. */
if (data->set_phy_power)
data->set_phy_power(0);
data->set_phy_power(data->dev, 0);
#ifndef __UBOOT__
usb_put_phy(musb->xceiv);
@ -630,7 +630,7 @@ static int am35x_suspend(struct device *dev)
/* Shutdown the on-chip PHY and its PLL. */
if (data->set_phy_power)
data->set_phy_power(0);
data->set_phy_power(data->dev, 0);
clk_disable(glue->phy_clk);
clk_disable(glue->clk);
@ -647,7 +647,7 @@ static int am35x_resume(struct device *dev)
/* Start the on-chip PHY and its PLL. */
if (data->set_phy_power)
data->set_phy_power(1);
data->set_phy_power(data->dev, 1);
ret = clk_enable(glue->phy_clk);
if (ret) {

View File

@ -452,7 +452,7 @@ static int dsps_musb_init(struct musb *musb)
/* Start the on-chip PHY and its PLL. */
if (data->set_phy_power)
data->set_phy_power(1);
data->set_phy_power(data->dev, 1);
musb->isr = dsps_interrupt;
@ -493,7 +493,7 @@ static int dsps_musb_exit(struct musb *musb)
/* Shutdown the on-chip PHY and its PLL. */
if (data->set_phy_power)
data->set_phy_power(0);
data->set_phy_power(data->dev, 0);
#ifndef __UBOOT__
/* NOP driver needs change if supporting dual instance */
@ -693,7 +693,7 @@ static int dsps_suspend(struct device *dev)
/* Shutdown the on-chip PHY and its PLL. */
if (data->set_phy_power)
data->set_phy_power(0);
data->set_phy_power(data->dev, 0);
return 0;
}
@ -705,7 +705,7 @@ static int dsps_resume(struct device *dev)
/* Start the on-chip PHY and its PLL. */
if (data->set_phy_power)
data->set_phy_power(1);
data->set_phy_power(data->dev, 1);
return 0;
}

View File

@ -0,0 +1,255 @@
/*
* MISC driver for TI MUSB Glue.
*
* (C) Copyright 2016
* Texas Instruments Incorporated, <www.ti.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <command.h>
#include <console.h>
#include <dm.h>
#include <linux/usb/otg.h>
#include <dm/device-internal.h>
#include <dm/lists.h>
#include <asm/io.h>
#include <asm/omap_musb.h>
#include "musb_uboot.h"
DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_DM_USB
/* USB 2.0 PHY Control */
#define CM_PHY_PWRDN (1 << 0)
#define CM_PHY_OTG_PWRDN (1 << 1)
#define OTGVDET_EN (1 << 19)
#define OTGSESSENDEN (1 << 20)
#define AM335X_USB1_CTRL 0x8
struct ti_musb_platdata {
void *base;
void *ctrl_mod_base;
struct musb_hdrc_platform_data plat;
struct musb_hdrc_config musb_config;
struct omap_musb_board_data otg_board_data;
};
static int ti_musb_get_usb_index(int node)
{
const void *fdt = gd->fdt_blob;
int i = 0;
char path[64];
const char *alias_path;
char alias[16];
fdt_get_path(fdt, node, path, sizeof(path));
do {
snprintf(alias, sizeof(alias), "usb%d", i);
alias_path = fdt_get_alias(fdt, alias);
if (alias_path == NULL) {
debug("USB index not found\n");
return -ENOENT;
}
if (!strcmp(path, alias_path))
return i;
i++;
} while (alias_path);
return -ENOENT;
}
static void ti_musb_set_phy_power(struct udevice *dev, u8 on)
{
struct ti_musb_platdata *platdata = dev_get_platdata(dev);
if (on) {
clrsetbits_le32(platdata->ctrl_mod_base,
CM_PHY_PWRDN | CM_PHY_OTG_PWRDN,
OTGVDET_EN | OTGSESSENDEN);
} else {
clrsetbits_le32(platdata->ctrl_mod_base, 0,
CM_PHY_PWRDN | CM_PHY_OTG_PWRDN);
}
}
static int ti_musb_ofdata_to_platdata(struct udevice *dev)
{
struct ti_musb_platdata *platdata = dev_get_platdata(dev);
const void *fdt = gd->fdt_blob;
int node = dev->of_offset;
int phys;
int ctrl_mod;
int usb_index;
platdata->base = (void *)dev_get_addr_index(dev, 1);
phys = fdtdec_lookup_phandle(fdt, node, "phys");
ctrl_mod = fdtdec_lookup_phandle(fdt, phys, "ti,ctrl_mod");
platdata->ctrl_mod_base = (void *)fdtdec_get_addr(fdt, ctrl_mod, "reg");
usb_index = ti_musb_get_usb_index(node);
switch (usb_index) {
case 1:
platdata->ctrl_mod_base += AM335X_USB1_CTRL;
case 0:
default:
break;
}
platdata->musb_config.multipoint = fdtdec_get_int(fdt, node,
"mentor,multipoint",
-1);
if (platdata->musb_config.multipoint < 0) {
error("MUSB multipoint DT entry missing\n");
return -ENOENT;
}
platdata->musb_config.dyn_fifo = 1;
platdata->musb_config.num_eps = fdtdec_get_int(fdt, node,
"mentor,num-eps", -1);
if (platdata->musb_config.num_eps < 0) {
error("MUSB num-eps DT entry missing\n");
return -ENOENT;
}
platdata->musb_config.ram_bits = fdtdec_get_int(fdt, node,
"mentor,ram-bits", -1);
if (platdata->musb_config.ram_bits < 0) {
error("MUSB ram-bits DT entry missing\n");
return -ENOENT;
}
platdata->otg_board_data.set_phy_power = ti_musb_set_phy_power;
platdata->otg_board_data.dev = dev;
platdata->plat.config = &platdata->musb_config;
platdata->plat.power = fdtdec_get_int(fdt, node, "mentor,power", -1);
if (platdata->plat.power < 0) {
error("MUSB mentor,power DT entry missing\n");
return -ENOENT;
}
platdata->plat.platform_ops = &musb_dsps_ops;
platdata->plat.board_data = &platdata->otg_board_data;
return 0;
}
static int ti_musb_host_probe(struct udevice *dev)
{
struct musb_host_data *host = dev_get_priv(dev);
struct ti_musb_platdata *platdata = dev_get_platdata(dev);
struct usb_bus_priv *priv = dev_get_uclass_priv(dev);
struct omap_musb_board_data *otg_board_data;
int ret;
priv->desc_before_addr = true;
otg_board_data = &platdata->otg_board_data;
host->host = musb_init_controller(&platdata->plat,
(struct device *)otg_board_data,
platdata->base);
if (!host->host)
return -EIO;
ret = musb_lowlevel_init(host);
return ret;
}
static int ti_musb_host_remove(struct udevice *dev)
{
struct musb_host_data *host = dev_get_priv(dev);
musb_stop(host->host);
return 0;
}
static int ti_musb_host_ofdata_to_platdata(struct udevice *dev)
{
struct ti_musb_platdata *platdata = dev_get_platdata(dev);
const void *fdt = gd->fdt_blob;
int node = dev->of_offset;
int ret;
ret = ti_musb_ofdata_to_platdata(dev);
if (ret) {
error("platdata dt parse error\n");
return ret;
}
platdata->plat.mode = MUSB_HOST;
return 0;
}
U_BOOT_DRIVER(ti_musb_host) = {
.name = "ti-musb-host",
.id = UCLASS_USB,
.ofdata_to_platdata = ti_musb_host_ofdata_to_platdata,
.probe = ti_musb_host_probe,
.remove = ti_musb_host_remove,
.ops = &musb_usb_ops,
.platdata_auto_alloc_size = sizeof(struct ti_musb_platdata),
.priv_auto_alloc_size = sizeof(struct musb_host_data),
};
static int ti_musb_wrapper_bind(struct udevice *parent)
{
const void *fdt = gd->fdt_blob;
int node;
int ret;
for (node = fdt_first_subnode(fdt, parent->of_offset); node > 0;
node = fdt_next_subnode(fdt, node)) {
struct udevice *dev;
const char *name = fdt_get_name(fdt, node, NULL);
enum usb_dr_mode dr_mode;
struct driver *drv;
if (strncmp(name, "usb@", 4))
continue;
dr_mode = usb_get_dr_mode(node);
switch (dr_mode) {
case USB_DR_MODE_PERIPHERAL:
/* Bind MUSB device */
break;
case USB_DR_MODE_HOST:
/* Bind MUSB host */
ret = device_bind_driver_to_node(parent, "ti-musb-host",
name, node, &dev);
if (ret) {
error("musb - not able to bind usb host node\n");
return ret;
}
break;
default:
break;
};
}
return 0;
}
static const struct udevice_id ti_musb_ids[] = {
{ .compatible = "ti,am33xx-usb" },
{ }
};
U_BOOT_DRIVER(ti_musb_wrapper) = {
.name = "ti-musb-wrapper",
.id = UCLASS_MISC,
.of_match = ti_musb_ids,
.bind = ti_musb_wrapper_bind,
};
#endif /* CONFIG_DM_USB */

View File

@ -88,15 +88,16 @@ int sandbox_fs_ls(const char *dirname)
ret = os_dirent_ls(dirname, &head);
if (ret)
return ret;
goto out;
for (node = head; node; node = node->next) {
printf("%s %10lu %s\n", os_dirent_get_typename(node->type),
node->size, node->name);
}
out:
os_dirent_free(head);
return 0;
return ret;
}
int sandbox_fs_exists(const char *filename)

View File

@ -296,6 +296,7 @@
#ifdef CONFIG_SPL_BUILD
#undef CONFIG_DM_MMC
#undef CONFIG_TIMER
#undef CONFIG_DM_USB
#endif
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_USBETH_SUPPORT)

View File

@ -250,15 +250,6 @@ void cros_ec_dump_data(const char *name, int cmd, const uint8_t *data, int len);
*/
int cros_ec_calc_checksum(const uint8_t *data, int size);
/**
* Decode a flash region parameter
*
* @param argc Number of params remaining
* @param argv List of remaining parameters
* @return flash region (EC_FLASH_REGION_...) or -1 on error
*/
int cros_ec_decode_region(int argc, char * const argv[]);
int cros_ec_flash_erase(struct cros_ec_dev *dev, uint32_t offset,
uint32_t size);

View File

@ -496,6 +496,22 @@ void *dev_map_physmem(struct udevice *dev, unsigned long size);
*/
fdt_addr_t dev_get_addr_index(struct udevice *dev, int index);
/**
* dev_get_addr_size_index() - Get the indexed reg property of a device
*
* Returns the address and size specified in the 'reg' property of a device.
*
* @dev: Pointer to a device
* @index: the 'reg' property can hold a list of <addr, size> pairs
* and @index is used to select which one is required
* @size: Pointer to size varible - this function returns the size
* specified in the 'reg' property here
*
* @return addr
*/
fdt_addr_t dev_get_addr_size_index(struct udevice *dev, int index,
fdt_size_t *size);
/**
* dev_get_addr_name() - Get the reg property of a device, indexed by name
*

View File

@ -21,6 +21,16 @@ struct udevice;
*/
struct udevice *dm_root(void);
struct global_data;
/**
* dm_fixup_for_gd_move() - Handle global_data moving to a new place
*
* The uclass list is part of global_data. Due to the way lists work, moving
* the list will cause it to become invalid. This function fixes that up so
* that the uclass list will work correctly.
*/
void dm_fixup_for_gd_move(struct global_data *new_gd);
/**
* dm_scan_platdata() - Scan all platform data and bind drivers
*

View File

@ -93,7 +93,15 @@ int fdt_fixup_memory(void *blob, u64 start, u64 size);
* property will be left untouched.
* @return 0 if ok, or -1 or -FDT_ERR_... on error
*/
#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY
int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks);
#else
static inline int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[],
int banks)
{
return 0;
}
#endif
void fdt_fixup_ethernet(void *fdt);
int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,

View File

@ -968,6 +968,55 @@ of the source tree, thus allowing rapid tested evolution of the code.
SOURCE_DATE_EPOCH=0 ./tools/buildman/buildman -I -P tegra
Checking configuration
======================
A common requirement when converting CONFIG options to Kconfig is to check
that the effective configuration has not changed due to the conversion.
Buildman supports this with the -K option, used after a build. This shows
differences in effective configuration between one commit and the next.
For example:
$ buildman -b kc4 -sK
...
43: Convert CONFIG_SPL_USBETH_SUPPORT to Kconfig
arm:
+ u-boot.cfg: CONFIG_SPL_ENV_SUPPORT=1 CONFIG_SPL_NET_SUPPORT=1
+ u-boot-spl.cfg: CONFIG_SPL_MMC_SUPPORT=1 CONFIG_SPL_NAND_SUPPORT=1
+ all: CONFIG_SPL_ENV_SUPPORT=1 CONFIG_SPL_MMC_SUPPORT=1 CONFIG_SPL_NAND_SUPPORT=1 CONFIG_SPL_NET_SUPPORT=1
am335x_evm_usbspl :
+ u-boot.cfg: CONFIG_SPL_ENV_SUPPORT=1 CONFIG_SPL_NET_SUPPORT=1
+ u-boot-spl.cfg: CONFIG_SPL_MMC_SUPPORT=1 CONFIG_SPL_NAND_SUPPORT=1
+ all: CONFIG_SPL_ENV_SUPPORT=1 CONFIG_SPL_MMC_SUPPORT=1 CONFIG_SPL_NAND_SUPPORT=1 CONFIG_SPL_NET_SUPPORT=1
44: Convert CONFIG_SPL_USB_HOST_SUPPORT to Kconfig
...
This shows that commit 44 enabled three new options for the board
am335x_evm_usbspl which were not enabled in commit 43. There is also a
summary for 'arm' showing all the changes detected for that architecture.
In this case there is only one board with changes, so 'arm' output is the
same as 'am335x_evm_usbspl'/
The -K option uses the u-boot.cfg, spl/u-boot-spl.cfg and tpl/u-boot-tpl.cfg
files which are produced by a build. If all you want is to check the
configuration you can in fact avoid doing a full build, using -D. This tells
buildman to configuration U-Boot and create the .cfg files, but not actually
build the source. This is 5-10 times faster than doing a full build.
By default buildman considers the follow two configuration methods
equivalent:
#define CONFIG_SOME_OPTION
CONFIG_SOME_OPTION=y
The former would appear in a header filer and the latter in a defconfig
file. The achieve this, buildman considers 'y' to be '1' in configuration
variables. This avoids lots of useless output when converting a CONFIG
option to Kconfig. To disable this behaviour, use --squash-config-y.
Other options
=============

View File

@ -98,19 +98,22 @@ OUTCOME_OK, OUTCOME_WARNING, OUTCOME_ERROR, OUTCOME_UNKNOWN = range(4)
# Translate a commit subject into a valid filename
trans_valid_chars = string.maketrans("/: ", "---")
CONFIG_FILENAMES = [
BASE_CONFIG_FILENAMES = [
'u-boot.cfg', 'u-boot-spl.cfg', 'u-boot-tpl.cfg'
]
EXTRA_CONFIG_FILENAMES = [
'.config', '.config-spl', '.config-tpl',
'autoconf.mk', 'autoconf-spl.mk', 'autoconf-tpl.mk',
'autoconf.h', 'autoconf-spl.h','autoconf-tpl.h',
'u-boot.cfg', 'u-boot-spl.cfg', 'u-boot-tpl.cfg'
]
class Config:
"""Holds information about configuration settings for a board."""
def __init__(self, target):
def __init__(self, config_filename, target):
self.target = target
self.config = {}
for fname in CONFIG_FILENAMES:
for fname in config_filename:
self.config[fname] = {}
def Add(self, fname, key, value):
@ -207,7 +210,8 @@ class Builder:
def __init__(self, toolchains, base_dir, git_dir, num_threads, num_jobs,
gnu_make='make', checkout=True, show_unknown=True, step=1,
no_subdirs=False, full_path=False, verbose_build=False,
incremental=False, per_board_out_dir=False):
incremental=False, per_board_out_dir=False,
config_only=False, squash_config_y=False):
"""Create a new Builder object
Args:
@ -230,6 +234,8 @@ class Builder:
mrproper when configuring
per_board_out_dir: Build in a separate persistent directory per
board rather than a thread-specific directory
config_only: Only configure each build, don't build it
squash_config_y: Convert CONFIG options with the value 'y' to '1'
"""
self.toolchains = toolchains
self.base_dir = base_dir
@ -257,6 +263,11 @@ class Builder:
self.no_subdirs = no_subdirs
self.full_path = full_path
self.verbose_build = verbose_build
self.config_only = config_only
self.squash_config_y = squash_config_y
self.config_filenames = BASE_CONFIG_FILENAMES
if not self.squash_config_y:
self.config_filenames += EXTRA_CONFIG_FILENAMES
self.col = terminal.Color()
@ -432,7 +443,7 @@ class Builder:
name += target
Print(line + name, newline=False)
length = 14 + len(name)
length = 16 + len(name)
self.ClearLine(length)
def _GetOutputDir(self, commit_upto):
@ -583,13 +594,15 @@ class Builder:
key, value = values
else:
key = values[0]
value = ''
value = '1' if self.squash_config_y else ''
if not key.startswith('CONFIG_'):
continue
elif not line or line[0] in ['#', '*', '/']:
continue
else:
key, value = line.split('=', 1)
if self.squash_config_y and value == 'y':
value = '1'
config[key] = value
return config
@ -656,7 +669,7 @@ class Builder:
if read_config:
output_dir = self.GetBuildDir(commit_upto, target)
for name in CONFIG_FILENAMES:
for name in self.config_filenames:
fname = os.path.join(output_dir, name)
config[name] = self._ProcessConfig(fname)
@ -733,8 +746,8 @@ class Builder:
line, board)
last_was_warning = is_warning
last_func = None
tconfig = Config(board.target)
for fname in CONFIG_FILENAMES:
tconfig = Config(self.config_filenames, board.target)
for fname in self.config_filenames:
if outcome.config:
for key, value in outcome.config[fname].iteritems():
tconfig.Add(fname, key, value)
@ -1190,7 +1203,7 @@ class Builder:
arch_config_plus[arch] = {}
arch_config_minus[arch] = {}
arch_config_change[arch] = {}
for name in CONFIG_FILENAMES:
for name in self.config_filenames:
arch_config_plus[arch][name] = {}
arch_config_minus[arch][name] = {}
arch_config_change[arch][name] = {}
@ -1207,7 +1220,7 @@ class Builder:
tbase = self._base_config[target]
tconfig = config[target]
lines = []
for name in CONFIG_FILENAMES:
for name in self.config_filenames:
if not tconfig.config[name]:
continue
config_plus = {}
@ -1251,7 +1264,7 @@ class Builder:
all_plus = {}
all_minus = {}
all_change = {}
for name in CONFIG_FILENAMES:
for name in self.config_filenames:
all_plus.update(arch_config_plus[arch][name])
all_minus.update(arch_config_minus[arch][name])
all_change.update(arch_config_change[arch][name])

View File

@ -110,8 +110,8 @@ class BuilderThread(threading.Thread):
return self.builder.do_make(commit, brd, stage, cwd, *args,
**kwargs)
def RunCommit(self, commit_upto, brd, work_dir, do_config, force_build,
force_build_failures):
def RunCommit(self, commit_upto, brd, work_dir, do_config, config_only,
force_build, force_build_failures):
"""Build a particular commit.
If the build is already done, and we are not forcing a build, we skip
@ -122,6 +122,7 @@ class BuilderThread(threading.Thread):
brd: Board object to build
work_dir: Directory to which the source will be checked out
do_config: True to run a make <board>_defconfig on the source
config_only: Only configure the source, do not build it
force_build: Force a build even if one was previously done
force_build_failures: Force a bulid if the previous result showed
failure
@ -231,6 +232,8 @@ class BuilderThread(threading.Thread):
config_out += result.combined
do_config = False # No need to configure next time
if result.return_code == 0:
if config_only:
args.append('cfg')
result = self.Make(commit, brd, 'build', cwd, *args,
env=env)
result.stderr = result.stderr.replace(src_dir + '/', '')
@ -401,7 +404,7 @@ class BuilderThread(threading.Thread):
force_build = False
for commit_upto in range(0, len(job.commits), job.step):
result, request_config = self.RunCommit(commit_upto, brd,
work_dir, do_config,
work_dir, do_config, self.builder.config_only,
force_build or self.builder.force_build,
self.builder.force_build_failures)
failed = result.return_code or result.stderr
@ -411,7 +414,7 @@ class BuilderThread(threading.Thread):
# with a reconfig.
if self.builder.force_config_on_failure:
result, request_config = self.RunCommit(commit_upto,
brd, work_dir, True, True, False)
brd, work_dir, True, False, True, False)
did_config = True
if not self.builder.force_reconfig:
do_config = request_config
@ -455,7 +458,8 @@ class BuilderThread(threading.Thread):
else:
# Just build the currently checked-out build
result, request_config = self.RunCommit(None, brd, work_dir, True,
True, self.builder.force_build_failures)
self.builder.config_only, True,
self.builder.force_build_failures)
result.commit_upto = 0
self._WriteResult(result, job.keep_outputs)
self.builder.out_queue.put(result)

View File

@ -28,6 +28,8 @@ def ParseArgs():
parser.add_option('-d', '--detail', dest='show_detail',
action='store_true', default=False,
help='Show detailed information for each board in summary')
parser.add_option('-D', '--config-only', action='store_true', default=False,
help="Don't build, just configure each commit")
parser.add_option('-e', '--show_errors', action='store_true',
default=False, help='Show errors and warnings')
parser.add_option('-f', '--force-build', dest='force_build',
@ -57,6 +59,8 @@ def ParseArgs():
default=False, help='Keep all build output files (e.g. binaries)')
parser.add_option('-K', '--show-config', action='store_true',
default=False, help='Show configuration changes in summary (both board config files and Kconfig)')
parser.add_option('--preserve-config-y', action='store_true',
default=False, help="Don't convert y to 1 in configs")
parser.add_option('-l', '--list-error-boards', action='store_true',
default=False, help='Show a list of boards next to each error/warning')
parser.add_option('--list-tool-chains', action='store_true', default=False,

View File

@ -258,7 +258,9 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
no_subdirs=options.no_subdirs, full_path=options.full_path,
verbose_build=options.verbose_build,
incremental=options.incremental,
per_board_out_dir=options.per_board_out_dir,)
per_board_out_dir=options.per_board_out_dir,
config_only=options.config_only,
squash_config_y=not options.preserve_config_y)
builder.force_config_on_failure = not options.quick
if make_func:
builder.do_make = make_func