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:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
149
include/mailbox_client.h
Normal 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
83
include/mailbox_uclass.h
Normal 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
|
||||
@@ -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);
|
||||
|
||||
@@ -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
71
include/sysreset.h
Normal 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
|
||||
Reference in New Issue
Block a user