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

For odroid-c2 (arch-meson) for now disable designware eth as meson
now needs to do some harder GPIO work.

Signed-off-by: Tom Rini <trini@konsulko.com>

Conflicts:
	lib/efi_loader/efi_disk.c

Modified:
	configs/odroid-c2_defconfig
This commit is contained in:
Tom Rini
2016-05-27 15:49:43 -04:00
64 changed files with 1277 additions and 515 deletions

View File

@@ -69,7 +69,6 @@
#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME "u-boot.img"
#define CONFIG_SPL_PINCTRL_SUPPORT
#define CONFIG_SPL_GPIO_SUPPORT
#define CONFIG_SPL_RAM_SUPPORT
#define CONFIG_SPL_DRIVERS_MISC_SUPPORT

View File

@@ -106,6 +106,7 @@
#define CONFIG_USB_STORAGE
#define CONFIG_USB_HOST_ETHER
#define CONFIG_USB_ETHER_SMSC95XX
#define CONFIG_TFTP_TSIZE
#define CONFIG_MISC_INIT_R
#define CONFIG_USB_KEYBOARD
#define CONFIG_SYS_USB_EVENT_POLL

View File

@@ -38,6 +38,30 @@ int device_bind(struct udevice *parent, const struct driver *drv,
const char *name, void *platdata, int of_offset,
struct udevice **devp);
/**
* device_bind_with_driver_data() - Create a device and bind it to a driver
*
* Called to set up a new device attached to a driver, in the case where the
* driver was matched to the device by means of a match table that provides
* driver_data.
*
* Once bound a device exists but is not yet active until device_probe() is
* called.
*
* @parent: Pointer to device's parent, under which this driver will exist
* @drv: Device's driver
* @name: Name of device (e.g. device tree node name)
* @driver_data: The driver_data field from the driver's match table.
* @of_offset: Offset of device tree node for this device. This is -1 for
* devices which don't use device tree.
* @devp: if non-NULL, returns a pointer to the bound device
* @return 0 if OK, -ve on error
*/
int device_bind_with_driver_data(struct udevice *parent,
const struct driver *drv, const char *name,
ulong driver_data, int of_offset,
struct udevice **devp);
/**
* device_bind_by_name: Create a device and bind it to a driver
*

View File

@@ -44,6 +44,7 @@ enum uclass_id {
UCLASS_KEYBOARD, /* Keyboard input device */
UCLASS_LED, /* Light-emitting diode (LED) */
UCLASS_LPC, /* x86 'low pin count' interface */
UCLASS_MAILBOX, /* Mailbox controller */
UCLASS_MASS_STORAGE, /* Mass storage device */
UCLASS_MISC, /* Miscellaneous device */
UCLASS_MMC, /* SD / MMC card or chip */
@@ -61,7 +62,6 @@ enum uclass_id {
UCLASS_PWM, /* Pulse-width modulator */
UCLASS_PWRSEQ, /* Power sequence device */
UCLASS_REGULATOR, /* Regulator device */
UCLASS_RESET, /* Reset device */
UCLASS_REMOTEPROC, /* Remote Processor device */
UCLASS_RTC, /* Real time clock device */
UCLASS_SERIAL, /* Serial UART */
@@ -70,6 +70,7 @@ enum uclass_id {
UCLASS_SPI_FLASH, /* SPI flash */
UCLASS_SPI_GENERIC, /* Generic SPI flash target */
UCLASS_SYSCON, /* System configuration device */
UCLASS_SYSRESET, /* System reset device */
UCLASS_THERMAL, /* Thermal sensor */
UCLASS_TIMER, /* Timer device */
UCLASS_TPM, /* Trusted Platform Module TIS interface */

View File

@@ -180,8 +180,9 @@ struct dwmci_host {
* @freq: Frequency the host is trying to achieve
*/
unsigned int (*get_mmc_clk)(struct dwmci_host *host, uint freq);
#ifndef CONFIG_BLK
struct mmc_config cfg;
#endif
/* use fifo mode to read and write data */
bool fifo_mode;
@@ -223,5 +224,9 @@ static inline u8 dwmci_readb(struct dwmci_host *host, int reg)
return readb(host->ioaddr + reg);
}
void dwmci_setup_cfg(struct mmc_config *cfg, const char *name, int buswidth,
uint caps, u32 max_clk, u32 min_clk);
int dwmci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg);
int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk);
#endif /* __DWMMC_HW_H */

View File

@@ -145,7 +145,7 @@ extern void *efi_bounce_buffer;
#endif
/* Convert strings from normal C strings to uEFI strings */
static inline void ascii2unicode(u16 *unicode, char *ascii)
static inline void ascii2unicode(u16 *unicode, const char *ascii)
{
while (*ascii)
*(unicode++) = *(ascii++);

149
include/mailbox_client.h Normal file
View File

@@ -0,0 +1,149 @@
/*
* Copyright (c) 2016, NVIDIA CORPORATION.
*
* SPDX-License-Identifier: GPL-2.0
*/
#ifndef _MAILBOX_CLIENT_H
#define _MAILBOX_CLIENT_H
/**
* A mailbox is a hardware mechanism for transferring small fixed-size messages
* and/or notifications between the CPU on which U-Boot runs and some other
* device such as an auxiliary CPU running firmware or a hardware module.
*
* Data transfer is optional; a mailbox may consist solely of a notification
* mechanism. When data transfer is implemented, it is via HW registers or
* FIFOs, rather than via RAM-based buffers. The mailbox API generally
* implements any communication protocol enforced solely by hardware, and
* leaves any higher-level protocols to other layers.
*
* A mailbox channel is a bi-directional mechanism that can send a message or
* notification to a single specific remote entity, and receive messages or
* notifications from that entity. The size, content, and format of such
* messages is defined by the mailbox implementation, or the remote entity with
* which it communicates; there is no general standard at this API level.
*
* A driver that implements UCLASS_MAILBOX is a mailbox provider. A provider
* will often implement multiple separate mailbox channels, since the hardware
* it manages often has this capability. mailbox_uclass.h describes the
* interface which mailbox providers must implement.
*
* Mailbox consumers/clients generate and send, or receive and process,
* messages. This header file describes the API used by clients.
*/
struct udevice;
/**
* struct mbox_chan - A handle to a single mailbox channel.
*
* Clients provide storage for channels. The content of the channel structure
* is managed solely by the mailbox API and mailbox drivers. A mailbox channel
* is initialized by "get"ing the mailbox. The channel struct is passed to all
* other mailbox APIs to identify which mailbox to operate upon.
*
* @dev: The device which implements the mailbox.
* @id: The mailbox channel ID within the provider.
*
* Currently, the mailbox API assumes that a single integer ID is enough to
* identify and configure any mailbox channel for any mailbox provider. If this
* assumption becomes invalid in the future, the struct could be expanded to
* either (a) add more fields to allow mailbox providers to store additional
* information, or (b) replace the id field with an opaque pointer, which the
* provider would dynamically allocated during its .of_xlate op, and process
* during is .request op. This may require the addition of an extra op to clean
* up the allocation.
*/
struct mbox_chan {
struct udevice *dev;
/*
* Written by of_xlate. We assume a single id is enough for now. In the
* future, we might add more fields here.
*/
unsigned long id;
};
/**
* mbox_get_by_index - Get/request a mailbox by integer index
*
* This looks up and requests a mailbox channel. The index is relative to the
* client device; each device is assumed to have n mailbox channels associated
* with it somehow, and this function finds and requests one of them. The
* mapping of client device channel indices to provider channels may be via
* device-tree properties, board-provided mapping tables, or some other
* mechanism.
*
* @dev: The client device.
* @index: The index of the mailbox channel to request, within the
* client's list of channels.
* @chan A pointer to a channel object to initialize.
* @return 0 if OK, or a negative error code.
*/
int mbox_get_by_index(struct udevice *dev, int index, struct mbox_chan *chan);
/**
* mbox_get_by_name - Get/request a mailbox by name
*
* This looks up and requests a mailbox channel. The name is relative to the
* client device; each device is assumed to have n mailbox channels associated
* with it somehow, and this function finds and requests one of them. The
* mapping of client device channel names to provider channels may be via
* device-tree properties, board-provided mapping tables, or some other
* mechanism.
*
* @dev: The client device.
* @name: The name of the mailbox channel to request, within the client's
* list of channels.
* @chan A pointer to a channel object to initialize.
* @return 0 if OK, or a negative error code.
*/
int mbox_get_by_name(struct udevice *dev, const char *name,
struct mbox_chan *chan);
/**
* mbox_free - Free a previously requested mailbox channel.
*
* @chan: A channel object that was previously successfully requested by
* calling mbox_get_by_*().
* @return 0 if OK, or a negative error code.
*/
int mbox_free(struct mbox_chan *chan);
/**
* mbox_send - Send a message over a mailbox channel
*
* This function will send a message to the remote entity. It may return before
* the remote entity has received and/or processed the message.
*
* @chan: A channel object that was previously successfully requested by
* calling mbox_get_by_*().
* @data: A pointer to the message to transfer. The format and size of
* the memory region pointed at by @data is determined by the
* mailbox provider. Providers that solely transfer notifications
* will ignore this parameter.
* @return 0 if OK, or a negative error code.
*/
int mbox_send(struct mbox_chan *chan, const void *data);
/**
* mbox_recv - Receive any available message from a mailbox channel
*
* This function will wait (up to the specified @timeout_us) for a message to
* be sent by the remote entity, and write the content of any such message
* into a caller-provided buffer.
*
* @chan: A channel object that was previously successfully requested by
* calling mbox_get_by_*().
* @data: A pointer to the buffer to receive the message. The format and
* size of the memory region pointed at by @data is determined by
* the mailbox provider. Providers that solely transfer
* notifications will ignore this parameter.
* @timeout_us: The maximum time to wait for a message to be available, in
* micro-seconds. A value of 0 does not wait at all.
* @return 0 if OK, -ENODATA if no message was available, or a negative error
* code.
*/
int mbox_recv(struct mbox_chan *chan, void *data, ulong timeout_us);
#endif

83
include/mailbox_uclass.h Normal file
View File

@@ -0,0 +1,83 @@
/*
* Copyright (c) 2016, NVIDIA CORPORATION.
*
* SPDX-License-Identifier: GPL-2.0
*/
#ifndef _MAILBOX_UCLASS_H
#define _MAILBOX_UCLASS_H
/* See mailbox_client.h for background documentation. */
#include <mailbox_client.h>
struct udevice;
/**
* struct mbox_ops - The functions that a mailbox driver must implement.
*/
struct mbox_ops {
/**
* of_xlate - Translate a client's device-tree (OF) mailbox specifier.
*
* The mailbox core calls this function as the first step in
* implementing a client's mbox_get_by_*() call.
*
* If this function pointer is set to NULL, the mailbox core will use
* a default implementation, which assumes #mbox-cells = <1>, and that
* the DT cell contains a simple integer channel ID.
*
* At present, the mailbox API solely supports device-tree. If this
* changes, other xxx_xlate() functions may be added to support those
* other mechanisms.
*
* @chan: The channel to hold the translation result.
* @args: The mailbox specifier values from device tree.
* @return 0 if OK, or a negative error code.
*/
int (*of_xlate)(struct mbox_chan *chan,
struct fdtdec_phandle_args *args);
/**
* request - Request a translated channel.
*
* The mailbox core calls this function as the second step in
* implementing a client's mbox_get_by_*() call, following a successful
* xxx_xlate() call.
*
* @chan: The channel to request; this has been filled in by a
* previoux xxx_xlate() function call.
* @return 0 if OK, or a negative error code.
*/
int (*request)(struct mbox_chan *chan);
/**
* free - Free a previously requested channel.
*
* This is the implementation of the client mbox_free() API.
*
* @chan: The channel to free.
* @return 0 if OK, or a negative error code.
*/
int (*free)(struct mbox_chan *chan);
/**
* send - Send a message over a mailbox channel
*
* @chan: The channel to send to the message to.
* @data: A pointer to the message to send.
* @return 0 if OK, or a negative error code.
*/
int (*send)(struct mbox_chan *chan, const void *data);
/**
* recv - Receive any available message from the channel.
*
* This function does not block. If not message is immediately
* available, the function should return an error.
*
* @chan: The channel to receive to the message from.
* @data: A pointer to the buffer to hold the received message.
* @return 0 if OK, -ENODATA if no message was available, or a negative
* error code.
*/
int (*recv)(struct mbox_chan *chan, void *data);
};
#endif

View File

@@ -411,7 +411,6 @@ enum mmc_hwpart_conf_mode {
MMC_HWPART_CONF_COMPLETE,
};
int mmc_register(struct mmc *mmc);
struct mmc *mmc_create(const struct mmc_config *cfg, void *priv);
/**
@@ -492,16 +491,12 @@ int mmc_start_init(struct mmc *mmc);
*/
void mmc_set_preinit(struct mmc *mmc, int preinit);
#ifdef CONFIG_GENERIC_MMC
#ifdef CONFIG_MMC_SPI
#define mmc_host_is_spi(mmc) ((mmc)->cfg->host_caps & MMC_MODE_SPI)
#else
#define mmc_host_is_spi(mmc) 0
#endif
struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode);
#else
int mmc_legacy_init(int verbose);
#endif
void board_mmc_power_init(void);
int board_mmc_init(bd_t *bis);

View File

@@ -1,71 +0,0 @@
/*
* Copyright (c) 2015 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __RESET_H
#define __RESET_H
enum reset_t {
RESET_WARM, /* Reset CPU, keep GPIOs active */
RESET_COLD, /* Reset CPU and GPIOs */
RESET_POWER, /* Reset PMIC (remove and restore power) */
RESET_COUNT,
};
struct reset_ops {
/**
* request() - request a reset of the given type
*
* Note that this function may return before the reset takes effect.
*
* @type: Reset type to request
* @return -EINPROGRESS if the reset has been started and
* will complete soon, -EPROTONOSUPPORT if not supported
* by this device, 0 if the reset has already happened
* (in which case this method will not actually return)
*/
int (*request)(struct udevice *dev, enum reset_t type);
};
#define reset_get_ops(dev) ((struct reset_ops *)(dev)->driver->ops)
/**
* reset_request() - request a reset
*
* @type: Reset type to request
* @return 0 if OK, -EPROTONOSUPPORT if not supported by this device
*/
int reset_request(struct udevice *dev, enum reset_t type);
/**
* reset_walk() - cause a reset
*
* This works through the available reset devices until it finds one that can
* perform a reset. If the provided reset type is not available, the next one
* will be tried.
*
* If this function fails to reset, it will display a message and halt
*
* @type: Reset type to request
* @return -EINPROGRESS if a reset is in progress, -ENOSYS if not available
*/
int reset_walk(enum reset_t type);
/**
* reset_walk_halt() - try to reset, otherwise halt
*
* This calls reset_walk(). If it returns, indicating that reset is not
* supported, it prints a message and halts.
*/
void reset_walk_halt(enum reset_t type);
/**
* reset_cpu() - calls reset_walk(RESET_WARM)
*/
void reset_cpu(ulong addr);
#endif

71
include/sysreset.h Normal file
View File

@@ -0,0 +1,71 @@
/*
* Copyright (c) 2015 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __SYSRESET_H
#define __SYSRESET_H
enum sysreset_t {
SYSRESET_WARM, /* Reset CPU, keep GPIOs active */
SYSRESET_COLD, /* Reset CPU and GPIOs */
SYSRESET_POWER, /* Reset PMIC (remove and restore power) */
SYSRESET_COUNT,
};
struct sysreset_ops {
/**
* request() - request a sysreset of the given type
*
* Note that this function may return before the reset takes effect.
*
* @type: Reset type to request
* @return -EINPROGRESS if the reset has been started and
* will complete soon, -EPROTONOSUPPORT if not supported
* by this device, 0 if the reset has already happened
* (in which case this method will not actually return)
*/
int (*request)(struct udevice *dev, enum sysreset_t type);
};
#define sysreset_get_ops(dev) ((struct sysreset_ops *)(dev)->driver->ops)
/**
* sysreset_request() - request a sysreset
*
* @type: Reset type to request
* @return 0 if OK, -EPROTONOSUPPORT if not supported by this device
*/
int sysreset_request(struct udevice *dev, enum sysreset_t type);
/**
* sysreset_walk() - cause a system reset
*
* This works through the available sysreset devices until it finds one that can
* perform a reset. If the provided sysreset type is not available, the next one
* will be tried.
*
* If this function fails to reset, it will display a message and halt
*
* @type: Reset type to request
* @return -EINPROGRESS if a reset is in progress, -ENOSYS if not available
*/
int sysreset_walk(enum sysreset_t type);
/**
* sysreset_walk_halt() - try to reset, otherwise halt
*
* This calls sysreset_walk(). If it returns, indicating that reset is not
* supported, it prints a message and halts.
*/
void sysreset_walk_halt(enum sysreset_t type);
/**
* reset_cpu() - calls sysreset_walk(SYSRESET_WARM)
*/
void reset_cpu(ulong addr);
#endif