Merge branch 'master' of git://www.denx.de/git/u-boot-dm
authorTom Rini <trini@konsulko.com>
Sun, 4 Dec 2016 00:43:51 +0000 (19:43 -0500)
committerTom Rini <trini@konsulko.com>
Sun, 4 Dec 2016 00:43:51 +0000 (19:43 -0500)
45 files changed:
Kconfig
Makefile
arch/arc/lib/bootm.c
arch/arm/include/asm/arch-omap3/musb.h
arch/arm/include/asm/omap_musb.h
arch/arm/lib/bootm-fdt.c
arch/arm/lib/bootm.c
arch/arm/mach-omap2/am33xx/board.c
arch/arm/mach-omap2/omap3/am35x_musb.c
arch/microblaze/lib/bootm.c
arch/mips/lib/bootm.c
arch/powerpc/lib/bootm.c
arch/sandbox/lib/bootm.c
arch/x86/lib/bootm.c
cmd/cros_ec.c
cmd/fdt.c
cmd/tpm_test.c
common/fdt_support.c
common/image-fdt.c
common/spl/spl.c
drivers/block/blk-uclass.c
drivers/core/device.c
drivers/core/root.c
drivers/misc/cros_ec.c
drivers/rtc/Kconfig
drivers/rtc/Makefile
drivers/rtc/pcf2127.c [new file with mode: 0644]
drivers/tpm/tpm_tis_lpc.c
drivers/usb/gadget/ether.c
drivers/usb/musb-new/Kconfig
drivers/usb/musb-new/Makefile
drivers/usb/musb-new/am35x.c
drivers/usb/musb-new/musb_dsps.c
drivers/usb/musb-new/ti-musb.c [new file with mode: 0644]
fs/sandbox/sandboxfs.c
include/configs/am335x_evm.h
include/cros_ec.h
include/dm/device.h
include/dm/root.h
include/fdt_support.h
tools/buildman/README
tools/buildman/builder.py
tools/buildman/builderthread.py
tools/buildman/cmdline.py
tools/buildman/control.py

diff --git a/Kconfig b/Kconfig
index 26fd917759ed1e293678fb1ea879280ab17e576f..a44ac9149c5d51033d759cf050b60cbe2f3537de 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -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
index 96ddc59ca668f455c5de64a9306d9dca4db51683..153e076480ee10cc76bfbb1db19e15b8d1a2016a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -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'
index 04d9d9cce574cf0c98306f959bf1fedfb730a699..57981490467a817c64f1bd75dc77cf4a9c85c6b7 100644 (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();
index cee4ed311e2f811400c8636fa44b7d959eb40191..d06a758f1b07b5b67eda90f2f81f10f8938863f0 100644 (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
index 8b9cb0eb8f6134ef087a4929f711e52d542bc8a7..7c5fb4077443a8f84e4e610ea89c27247f4a03cb 100644 (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};
index a51755070bc93bad6cb4e05618613afb07c58d9c..4481f9e2fa9ceb26f2f54f21e67f6b825c016601 100644 (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
index 35e6b06733b8f8c9e00060d0e1efb4b98f25df77..4eee13a59c4be22269751a2bc0e4278379f451d1 100644 (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
index 5ebeac0ee1e194775e145deb1921f61df9256ab4..581c0ab518b2f88bf86a914e0c3202d63c376db5 100644 (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;
 }
index 74dd105eb6f59cc320cb010b231ec832e4de938e..d542699ab001540862f08b471e61970d8d6f24c2 100644 (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);
index 3eb3440be841c42096063246131d1d9b7c3cc4ba..2732203b93e7f30489aa97b3d31f401ad28ee045 100644 (file)
 
 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)
 {
index 9fec4ad43860717263ea04d1981d0711d3c44502..be877625a8ecaf9d7fa9c8ec826b169597432f8b 100644 (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)
 {
index ef15e7ac92f292dd482cf65cf7bf9d2c05da91dc..17c5ed173cb229db521adb8259c637d624d959ad 100644 (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,
index 0c9a7979d23142fbc3d96d1722c7d8cd4d6b3c09..4cdd18fe14b28cb102eb625b78412613d58e76b0 100644 (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)) {
index 80fadef34e99c44b6080bcb2f49e257393f00759..e5e63f6888e3975993a03b78fff3199609bb65f5 100644 (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)
 {
 }
index abf11f07b277b16d0cd654e1fb0b7f77aeb13221..9d42f870dc9a4e3ea61a7d267591a73a38b3135b 100644 (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
  *
index b503357dc3a8cf26ca80dd3edfbde628c8cb86b7..8bd345afa8a17c0cff355dcd6ea22fed98cfd60e 100644 (file)
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -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) {
index 65332d11177791a7796e6bec5c38b20aa8728b6c..330640594879d138a2d4b279f77d07c016d03b00 100644 (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,
index 0609470dfb8bbaddcd4d8a2fab178d1b2fb481c6..c9f7019e38e8de1469f506cdd57353fd27d8e134 100644 (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)
 {
index 5454227fc9963213b18fe799e337333e95fee228..e7540be8d631c4a1cbe08e2fb7ed70306dfa61a9 100644 (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) {
index 32b9f1e95cd06e153b7aab21a8b4be81364d9a7a..9bcbd09ff380516f0a5ad042f68c8b47e3670f8d 100644 (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
index 6ba1026f5818efc61f69182112a79fd60d75fa1a..2e041c2b3dc7006f11273dd695d6fc602fd66708 100644 (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;
                        }
index dcf5d9df7ddcbbcc25ac9754d976f95c8a1972dd..ed553d70a6bc0d62e22513f68fb8d2f9419c0075 100644 (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)
index 33dc9c0b2db5acd8b2a7c1bd4be1b762eab70e48..9edfc1efb661bddb6bff7ba2af604123f4657819 100644 (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();
index 807373053c411ecbc21b654f60e136398ebf57c4..759bb46c57b2ec7555c152394956505d18716a1d 100644 (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)
 {
index b5d9048ad6a54424ba2b898219bece4191fbf8d4..57af1b56cbf665ae968706a1bee284956697d9d4 100644 (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
index fc38a3f3098a60f114dd05dd1b4043886adf2faf..c9194270851da8ac97e2f5185eee3366e4f7499c 100644 (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
diff --git a/drivers/rtc/pcf2127.c b/drivers/rtc/pcf2127.c
new file mode 100644 (file)
index 0000000..bc59c6c
--- /dev/null
@@ -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,
+};
index b4efbb5033f24b3ef38745bfedcc94de14d212c2..d2b37836733b75f82f7921c5f98723d1edb58a4a 100644 (file)
 
 #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 },
        { }
 };
 
index 497b981129b5d9bcfba34a3407baf6068ff4219d..046ad8ca2bf85afecb37b392da9cd4a61f266600 100644 (file)
 #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 int usb_eth_init(struct eth_device *netdev, bd_t *bd)
+{
+       struct ether_priv *priv = (struct ether_priv *)netdev->priv;
+
+       return _usb_eth_init(priv);
 }
 
-static struct usb_gadget_driver eth_driver = {
-       .speed          = DEVSPEED,
+static int usb_eth_send(struct eth_device *netdev, void *packet, int length)
+{
+       struct ether_priv       *priv = (struct ether_priv *)netdev->priv;
 
-       .bind           = eth_bind,
-       .unbind         = eth_unbind,
+       return _usb_eth_send(priv, packet, length);
+}
 
-       .setup          = eth_setup,
-       .reset          = eth_disconnect,
-       .disconnect     = eth_disconnect,
+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;
+       }
 
-       .suspend        = eth_suspend,
-       .resume         = eth_resume,
-};
+       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
index c264859b6c0ce17baa8a75c464ab411d667111df..caba42c26fc1d509b0e95be0996ff40748178ab9 100644 (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
index df1c3c8a45b1c7088e9315d940f610fcb8274060..296f230fbf376160a0408d4a8201d0a8c10e89e1 100644 (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) \
index b8791ddd5c1dc28a6dfd384ec787ddfdc51c4269..0167ea77970c043905fc6cb4e16cf9d63415d30f 100644 (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) {
index a71db76d7c7c4b44c073dda60ddfaa13c82951ad..399b85bbce814c1ea865d8afa4eab9c4e33d0c4b 100644 (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;
 }
diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c
new file mode 100644 (file)
index 0000000..1c15aa2
--- /dev/null
@@ -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 */
index cd10fd6845fbe46ee6802fff801342e6cdf814cf..ca8026133708d2e7083a004e92a952f19c6a66f9 100644 (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)
index 22caed9901d98f5b7440c0f6a95f9538c17ed7bb..49c14df8add2fb20b7a2a97cbfe9351d91d2df7c 100644 (file)
 #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)
index ec7517c5ae27adf2423a13f5acddf9a80b125810..0271f2b827cd4bfbe0c8d1174c2f46e1138846d7 100644 (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);
 
index babf8ac8f078c97e7f9e6c081dc7f1a68214dc36..9948bd49fa53b86b54ea0b2775f27b9cf5577b1f 100644 (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
  *
index c7f0c1d5ca302acd8bd89887b5bc8c53119af4dd..3cf730dcee1cb50e9aa5ba3376ae48fc97603cdb 100644 (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
  *
index 506bc5a9f690b0bb6c8ad108feb3e87056bbda04..955c1217133117668acdb9ee4cf3ad7fbaecde03 100644 (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,
index 514bebc9f815b206b1c80c9918872d651277c98c..62ab7b7441c4b330a773bf8cf72c8536c30006a3 100644 (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
 =============
 
index e27a28577c2547a134acf65f392b05668137d0da..236e0617ac42ac6d9d1c7e872fcbe1b606b2e68b 100644 (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])
index 8974351225ce6ace5f6082901da3bdd005681118..f2b2acd1eba98b955d53e06dc8b97f0ad775feac 100644 (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)
index 3e3bd63e32c771e6439faa803ad0e7dc9cb520f8..0060e0317c754aa6c8ae5665c8382e59490af15c 100644 (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,
index 0b6ab03b4c3ad270cd5f5efd521c916d18fa1148..545c2cb44a134cbb5ef916498c919b480548b2b9 100644 (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