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

This commit is contained in:
Tom Rini
2015-08-06 19:56:03 -04:00
124 changed files with 5743 additions and 2291 deletions

View File

@@ -13,6 +13,7 @@
"fdtfile=exynos5250-arndale.dtb\0"
#include "exynos5250-common.h"
#include <configs/exynos5-common.h>
/* SD/MMC configuration */
#define CONFIG_SUPPORT_EMMC_BOOT
@@ -20,15 +21,6 @@
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE
/* USB */
#define CONFIG_USB_EHCI
#define CONFIG_USB_EHCI_EXYNOS
#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 3
#define CONFIG_USB_HOST_ETHER
#define CONFIG_USB_ETHER_ASIX
#define CONFIG_USB_ETHER_ASIX88179
/* MMC SPL */
#define CONFIG_EXYNOS_SPL
@@ -36,9 +28,6 @@
#define CONFIG_SYS_PROMPT "ARNDALE # "
#define CONFIG_DEFAULT_CONSOLE "console=ttySAC2,115200n8\0"
#define CONFIG_NR_DRAM_BANKS 8
#define SDRAM_BANK_SIZE (256UL << 20UL) /* 256 MB */
#define CONFIG_IDENT_STRING " for ARNDALE"
#define CONFIG_ENV_IS_IN_MMC
@@ -49,6 +38,7 @@
#define CONFIG_SYS_INIT_SP_ADDR CONFIG_IRAM_STACK
/* PMIC */
#define CONFIG_POWER
#define CONFIG_PMIC
#define CONFIG_POWER_I2C
@@ -60,4 +50,8 @@
/* The PERIPHBASE in the CBAR register is wrong on the Arndale, so override it */
#define CONFIG_ARM_GIC_BASE_ADDRESS 0x10480000
/* Power */
#define CONFIG_POWER
#define CONFIG_POWER_I2C
#endif /* __CONFIG_H */

View File

@@ -67,6 +67,8 @@
#define CONFIG_SPL_LIBCOMMON_SUPPORT
#define CONFIG_SPL_GPIO_SUPPORT
#define CONFIG_SPL_SERIAL_SUPPORT
#define CONFIG_SPL_LIBGENERIC_SUPPORT
/* specific .lds file */
#define CONFIG_SPL_LDSCRIPT "board/samsung/common/exynos-uboot-spl.lds"
@@ -126,10 +128,6 @@
#define SPI_FLASH_UBOOT_POS (CONFIG_SEC_FW_SIZE + CONFIG_BL1_SIZE)
/* I2C */
/* TODO(sjg@chromium.org): Move these two options to Kconfig */
#define CONFIG_DM_I2C
#define CONFIG_DM_I2C_COMPAT
#define CONFIG_CMD_I2C
#define CONFIG_SYS_I2C_S3C24X0
#define CONFIG_SYS_I2C_S3C24X0_SPEED 100000 /* 100 Kbps */
@@ -145,14 +143,8 @@
#define CONFIG_SPI_FLASH_GIGADEVICE
#define CONFIG_SF_DEFAULT_MODE SPI_MODE_0
#define CONFIG_SF_DEFAULT_SPEED 50000000
#define EXYNOS5_SPI_NUM_CONTROLLERS 5
#define CONFIG_OF_SPI
#endif
/* Power */
#define CONFIG_POWER
#define CONFIG_POWER_I2C
#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SPI_MODE SPI_MODE_0
#define CONFIG_ENV_SECT_SIZE CONFIG_ENV_SIZE
@@ -200,7 +192,6 @@
#define CONFIG_FIT
#define CONFIG_FIT_BEST_MATCH
#define BOOT_TARGET_DEVICES(func) \
func(MMC, mmc, 1) \
func(MMC, mmc, 0) \

View File

@@ -16,12 +16,23 @@
"stdout=serial,lcd\0" \
"stderr=serial,lcd\0"
#include "exynos5-common.h"
#define CONFIG_EXYNOS5_DT
/* PMIC */
#define CONFIG_POWER
#define CONFIG_POWER_I2C
#define CONFIG_POWER_TPS65090
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SPI_BASE 0x12D30000
#define FLASH_SIZE (4 << 20)
#define CONFIG_ENV_OFFSET (FLASH_SIZE - CONFIG_ENV_SECT_SIZE)
#define CONFIG_SPI_BOOTING
#define CONFIG_BOARD_COMMON
/* Display */
#define CONFIG_LCD
#ifdef CONFIG_LCD
#define CONFIG_EXYNOS_FB
#define CONFIG_EXYNOS_DP
#define LCD_BPP LCD_COLOR16
#endif
/* Enable keyboard */
#define CONFIG_KEYBOARD

View File

@@ -10,7 +10,6 @@
#ifndef __CONFIG_5250_H
#define __CONFIG_5250_H
#include <configs/exynos5-common.h>
#define CONFIG_EXYNOS5250
#define CONFIG_SYS_SDRAM_BASE 0x40000000
@@ -28,16 +27,13 @@
#define CONFIG_SYS_INIT_SP_ADDR CONFIG_IRAM_STACK
/* I2C */
#define CONFIG_MAX_I2C_NUM 8
/* USB */
#define CONFIG_USB_EHCI
#define CONFIG_USB_EHCI_EXYNOS
/* Display */
#define CONFIG_LCD
#ifdef CONFIG_LCD
#define CONFIG_EXYNOS_FB
#define CONFIG_EXYNOS_DP
#define LCD_BPP LCD_COLOR16
#endif
#define CONFIG_USB_HOST_ETHER
#define CONFIG_USB_ETHER_ASIX
#define CONFIG_USB_ETHER_ASIX88179
/* DRAM Memory Banks */
#define CONFIG_NR_DRAM_BANKS 8

View File

@@ -13,7 +13,7 @@
/* A variant of Exynos5420 (Exynos5 Family) */
#define CONFIG_EXYNOS5800
#include <configs/exynos5-common.h>
#define CONFIG_EXYNOS5_DT
#define MACH_TYPE_SMDK5420 8002
#define CONFIG_MACH_TYPE MACH_TYPE_SMDK5420
@@ -32,10 +32,6 @@
#define CONFIG_DEVICE_TREE_LIST "exynos5800-peach-pi" \
"exynos5420-peach-pit exynos5420-smdk5420"
#define CONFIG_MAX_I2C_NUM 11
#define CONFIG_BOARD_REV_GPIO_COUNT 2
#define CONFIG_PHY_IRAM_BASE 0x02020000
/* Address for relocating helper code (Last 4 KB of IRAM) */
@@ -52,4 +48,7 @@
*/
#define CONFIG_CORE_COUNT 0x8
#define CONFIG_USB_XHCI
#define CONFIG_USB_XHCI_EXYNOS
#endif /* __CONFIG_EXYNOS5420_H */

View File

@@ -9,7 +9,9 @@
#define __CONFIG_ODROID_XU3_H
#include "exynos5420-common.h"
#include <configs/exynos5-common.h>
#undef CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_SYS_PROMPT "ODROID-XU3 # "
#define CONFIG_IDENT_STRING " for ODROID-XU3"

View File

@@ -9,12 +9,6 @@
#ifndef __CONFIG_PEACH_PI_H
#define __CONFIG_PEACH_PI_H
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SPI_BASE 0x12D30000
#define FLASH_SIZE (0x4 << 20)
#define CONFIG_ENV_OFFSET (FLASH_SIZE - CONFIG_BL2_SIZE)
#define CONFIG_SPI_BOOTING
#define MEM_LAYOUT_ENV_SETTINGS \
"bootm_size=0x10000000\0" \
"kernel_addr_r=0x22000000\0" \
@@ -25,8 +19,7 @@
#include <configs/exynos5420-common.h>
#include <configs/exynos5-dt-common.h>
#define CONFIG_BOARD_COMMON
#include <configs/exynos5-common.h>
#define CONFIG_SYS_SDRAM_BASE 0x20000000
#define CONFIG_SYS_TEXT_BASE 0x23E00000
@@ -39,8 +32,6 @@
#define CONFIG_SYS_PROMPT "Peach-Pi # "
#define CONFIG_IDENT_STRING " for Peach-Pi"
#define CONFIG_VIDEO_PARADE
/* Display */
#define CONFIG_LCD
#ifdef CONFIG_LCD
@@ -51,9 +42,6 @@
#define CONFIG_POWER_TPS65090_EC
#define CONFIG_USB_XHCI
#define CONFIG_USB_XHCI_EXYNOS
/* DRAM Memory Banks */
#define CONFIG_NR_DRAM_BANKS 7
#define SDRAM_BANK_SIZE (512UL << 20UL) /* 512 MB */

View File

@@ -9,12 +9,6 @@
#ifndef __CONFIG_PEACH_PIT_H
#define __CONFIG_PEACH_PIT_H
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SPI_BASE 0x12D30000
#define FLASH_SIZE (0x4 << 20)
#define CONFIG_ENV_OFFSET (FLASH_SIZE - CONFIG_BL2_SIZE)
#define CONFIG_SPI_BOOTING
#define MEM_LAYOUT_ENV_SETTINGS \
"bootm_size=0x10000000\0" \
"kernel_addr_r=0x22000000\0" \
@@ -25,8 +19,7 @@
#include <configs/exynos5420-common.h>
#include <configs/exynos5-dt-common.h>
#define CONFIG_BOARD_COMMON
#include <configs/exynos5-common.h>
#define CONFIG_SYS_SDRAM_BASE 0x20000000
#define CONFIG_SYS_TEXT_BASE 0x23E00000
@@ -39,21 +32,6 @@
#define CONFIG_SYS_PROMPT "Peach-Pit # "
#define CONFIG_IDENT_STRING " for Peach-Pit"
#define CONFIG_VIDEO_PARADE
/* Display */
#define CONFIG_LCD
#ifdef CONFIG_LCD
#define CONFIG_EXYNOS_FB
#define CONFIG_EXYNOS_DP
#define LCD_BPP LCD_COLOR16
#endif
#define CONFIG_POWER_TPS65090_EC
#define CONFIG_USB_XHCI
#define CONFIG_USB_XHCI_EXYNOS
/* DRAM Memory Banks */
#define CONFIG_NR_DRAM_BANKS 4
#define SDRAM_BANK_SIZE (512UL << 20UL) /* 512 MB */

View File

@@ -9,26 +9,16 @@
#ifndef __CONFIG_SMDK_H
#define __CONFIG_SMDK_H
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SPI_BASE 0x12D30000
#define FLASH_SIZE (0x4 << 20)
#define CONFIG_ENV_OFFSET (FLASH_SIZE - CONFIG_BL2_SIZE)
#define CONFIG_SPI_BOOTING
#include <configs/exynos5250-common.h>
#include <configs/exynos5-dt-common.h>
#include <configs/exynos5-common.h>
/* PMIC */
#define CONFIG_POWER_MAX77686
#undef CONFIG_KEYBOARD
#define CONFIG_BOARD_COMMON
#define CONFIG_USB_XHCI
#define CONFIG_USB_XHCI_EXYNOS
#define CONFIG_SYS_PROMPT "SMDK5250 # "
#define CONFIG_IDENT_STRING " for SMDK5250"
/* Miscellaneous configurable options */
#define CONFIG_DEFAULT_CONSOLE "console=ttySAC1,115200n8\0"
#endif /* __CONFIG_SMDK_H */

View File

@@ -9,13 +9,11 @@
#ifndef __CONFIG_SMDK5420_H
#define __CONFIG_SMDK5420_H
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SPI_BASE 0x12D30000
#define FLASH_SIZE (0x4 << 20)
#define CONFIG_ENV_OFFSET (FLASH_SIZE - CONFIG_BL2_SIZE)
#define CONFIG_SPI_BOOTING
#include <configs/exynos5420-common.h>
#include <configs/exynos5-dt-common.h>
#include <configs/exynos5-common.h>
#undef CONFIG_KEYBOARD
#define CONFIG_BOARD_COMMON

View File

@@ -9,25 +9,12 @@
#ifndef __CONFIG_SNOW_H
#define __CONFIG_SNOW_H
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SPI_BASE 0x12D30000
#define FLASH_SIZE (0x4 << 20)
#define CONFIG_ENV_OFFSET (FLASH_SIZE - CONFIG_BL2_SIZE)
#define CONFIG_SPI_BOOTING
#include <configs/exynos5250-common.h>
#include <configs/exynos5-dt-common.h>
#define CONFIG_POWER_TPS65090_I2C
#include <configs/exynos5-common.h>
#define CONFIG_BOARD_COMMON
#define CONFIG_USB_XHCI
#define CONFIG_USB_EHCI
#define CONFIG_USB_XHCI_EXYNOS
#define CONFIG_USB_EHCI_EXYNOS
#define CONFIG_SYS_PROMPT "snow # "
#define CONFIG_IDENT_STRING " for snow"
#define CONFIG_DEFAULT_CONSOLE "console=ttySAC1,115200n8\0"

20
include/configs/spring.h Normal file
View File

@@ -0,0 +1,20 @@
/*
* Copyright (c) 2015 Google, Inc
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __CONFIG_SPRING_H
#define __CONFIG_SPRING_H
#include <configs/exynos5250-common.h>
#include <configs/exynos5-dt-common.h>
#include <configs/exynos5-common.h>
#define CONFIG_BOARD_COMMON
#define CONFIG_SYS_PROMPT "spring # "
#define CONFIG_IDENT_STRING " for spring"
#define CONFIG_DEFAULT_CONSOLE "console=ttySAC1,115200n8\0"
#endif /* __CONFIG_SPRING_H */

View File

@@ -350,7 +350,7 @@ int cros_ec_read_build_info(struct cros_ec_dev *dev, char **strp);
* @param state new state of the LDO/FET : EC_LDO_STATE_ON|OFF
* @return 0 if ok, -1 on error
*/
int cros_ec_set_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t state);
int cros_ec_set_ldo(struct udevice *dev, uint8_t index, uint8_t state);
/**
* Read back a LDO / FET current state.
@@ -360,7 +360,7 @@ int cros_ec_set_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t state);
* @param state current state of the LDO/FET : EC_LDO_STATE_ON|OFF
* @return 0 if ok, -1 on error
*/
int cros_ec_get_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t *state);
int cros_ec_get_ldo(struct udevice *dev, uint8_t index, uint8_t *state);
/**
* Get access to the error reported when cros_ec_board_init() was called
@@ -390,18 +390,14 @@ int cros_ec_decode_ec_flash(const void *blob, int node,
*/
void cros_ec_check_keyboard(struct cros_ec_dev *dev);
struct i2c_msg;
/*
* Tunnel an I2C transfer to the EC
*
* @param dev CROS-EC device
* @param chip Chip address (7-bit I2C address)
* @param addr Register address to read/write
* @param alen Length of register address in bytes
* @param buffer Buffer containing data to read/write
* @param len Length of buffer
* @param is_read 1 if this is a read, 0 if this is a write
* @param msg List of messages to transfer
* @param nmsgs Number of messages to transfer
*/
int cros_ec_i2c_xfer(struct cros_ec_dev *dev, uchar chip, uint addr,
int alen, uchar *buffer, int len, int is_read);
int cros_ec_i2c_tunnel(struct udevice *dev, struct i2c_msg *msg, int nmsgs);
#endif

View File

@@ -139,8 +139,52 @@ void device_free(struct udevice *dev);
static inline void device_free(struct udevice *dev) {}
#endif
/**
* simple_bus_translate() - translate a bus address to a system address
*
* This handles the 'ranges' property in a simple bus. It translates the
* device address @addr to a system address using this property.
*
* @dev: Simple bus device (parent of target device)
* @addr: Address to translate
* @return new address
*/
fdt_addr_t simple_bus_translate(struct udevice *dev, fdt_addr_t addr);
/* Cast away any volatile pointer */
#define DM_ROOT_NON_CONST (((gd_t *)gd)->dm_root)
#define DM_UCLASS_ROOT_NON_CONST (((gd_t *)gd)->uclass_root)
/* device resource management */
#ifdef CONFIG_DEVRES
/**
* devres_release_probe - Release managed resources allocated after probing
* @dev: Device to release resources for
*
* Release all resources allocated for @dev when it was probed or later.
* This function is called on driver removal.
*/
void devres_release_probe(struct udevice *dev);
/**
* devres_release_all - Release all managed resources
* @dev: Device to release resources for
*
* Release all resources associated with @dev. This function is
* called on driver unbinding.
*/
void devres_release_all(struct udevice *dev);
#else /* ! CONFIG_DEVRES */
static inline void devres_release_probe(struct udevice *dev)
{
}
static inline void devres_release_all(struct udevice *dev)
{
}
#endif /* ! CONFIG_DEVRES */
#endif

View File

@@ -14,6 +14,8 @@
#include <dm/uclass-id.h>
#include <fdtdec.h>
#include <linker_lists.h>
#include <linux/compat.h>
#include <linux/kernel.h>
#include <linux/list.h>
struct driver_info;
@@ -36,6 +38,9 @@ struct driver_info;
/* Allocate driver private data on a DMA boundary */
#define DM_FLAG_ALLOC_PRIV_DMA (1 << 5)
/* Device is bound */
#define DM_FLAG_BOUND (1 << 6)
/**
* struct udevice - An instance of a driver
*
@@ -93,6 +98,9 @@ struct udevice {
uint32_t flags;
int req_seq;
int seq;
#ifdef CONFIG_DEVRES
struct list_head devres_head;
#endif
};
/* Maximum sequence number supported */
@@ -462,4 +470,280 @@ bool device_has_active_children(struct udevice *dev);
*/
bool device_is_last_sibling(struct udevice *dev);
/**
* device_set_name() - set the name of a device
*
* This must be called in the device's bind() method and no later. Normally
* this is unnecessary but for probed devices which don't get a useful name
* this function can be helpful.
*
* @dev: Device to update
* @name: New name (this string is allocated new memory and attached to
* the device)
* @return 0 if OK, -ENOMEM if there is not enough memory to allocate the
* string
*/
int device_set_name(struct udevice *dev, const char *name);
/* device resource management */
typedef void (*dr_release_t)(struct udevice *dev, void *res);
typedef int (*dr_match_t)(struct udevice *dev, void *res, void *match_data);
#ifdef CONFIG_DEVRES
#ifdef CONFIG_DEBUG_DEVRES
void *__devres_alloc(dr_release_t release, size_t size, gfp_t gfp,
const char *name);
#define _devres_alloc(release, size, gfp) \
__devres_alloc(release, size, gfp, #release)
#else
void *_devres_alloc(dr_release_t release, size_t size, gfp_t gfp);
#endif
/**
* devres_alloc - Allocate device resource data
* @release: Release function devres will be associated with
* @size: Allocation size
* @gfp: Allocation flags
*
* Allocate devres of @size bytes. The allocated area is associated
* with @release. The returned pointer can be passed to
* other devres_*() functions.
*
* RETURNS:
* Pointer to allocated devres on success, NULL on failure.
*/
#define devres_alloc(release, size, gfp) \
_devres_alloc(release, size, gfp | __GFP_ZERO)
/**
* devres_free - Free device resource data
* @res: Pointer to devres data to free
*
* Free devres created with devres_alloc().
*/
void devres_free(void *res);
/**
* devres_add - Register device resource
* @dev: Device to add resource to
* @res: Resource to register
*
* Register devres @res to @dev. @res should have been allocated
* using devres_alloc(). On driver detach, the associated release
* function will be invoked and devres will be freed automatically.
*/
void devres_add(struct udevice *dev, void *res);
/**
* devres_find - Find device resource
* @dev: Device to lookup resource from
* @release: Look for resources associated with this release function
* @match: Match function (optional)
* @match_data: Data for the match function
*
* Find the latest devres of @dev which is associated with @release
* and for which @match returns 1. If @match is NULL, it's considered
* to match all.
*
* RETURNS:
* Pointer to found devres, NULL if not found.
*/
void *devres_find(struct udevice *dev, dr_release_t release,
dr_match_t match, void *match_data);
/**
* devres_get - Find devres, if non-existent, add one atomically
* @dev: Device to lookup or add devres for
* @new_res: Pointer to new initialized devres to add if not found
* @match: Match function (optional)
* @match_data: Data for the match function
*
* Find the latest devres of @dev which has the same release function
* as @new_res and for which @match return 1. If found, @new_res is
* freed; otherwise, @new_res is added atomically.
*
* RETURNS:
* Pointer to found or added devres.
*/
void *devres_get(struct udevice *dev, void *new_res,
dr_match_t match, void *match_data);
/**
* devres_remove - Find a device resource and remove it
* @dev: Device to find resource from
* @release: Look for resources associated with this release function
* @match: Match function (optional)
* @match_data: Data for the match function
*
* Find the latest devres of @dev associated with @release and for
* which @match returns 1. If @match is NULL, it's considered to
* match all. If found, the resource is removed atomically and
* returned.
*
* RETURNS:
* Pointer to removed devres on success, NULL if not found.
*/
void *devres_remove(struct udevice *dev, dr_release_t release,
dr_match_t match, void *match_data);
/**
* devres_destroy - Find a device resource and destroy it
* @dev: Device to find resource from
* @release: Look for resources associated with this release function
* @match: Match function (optional)
* @match_data: Data for the match function
*
* Find the latest devres of @dev associated with @release and for
* which @match returns 1. If @match is NULL, it's considered to
* match all. If found, the resource is removed atomically and freed.
*
* Note that the release function for the resource will not be called,
* only the devres-allocated data will be freed. The caller becomes
* responsible for freeing any other data.
*
* RETURNS:
* 0 if devres is found and freed, -ENOENT if not found.
*/
int devres_destroy(struct udevice *dev, dr_release_t release,
dr_match_t match, void *match_data);
/**
* devres_release - Find a device resource and destroy it, calling release
* @dev: Device to find resource from
* @release: Look for resources associated with this release function
* @match: Match function (optional)
* @match_data: Data for the match function
*
* Find the latest devres of @dev associated with @release and for
* which @match returns 1. If @match is NULL, it's considered to
* match all. If found, the resource is removed atomically, the
* release function called and the resource freed.
*
* RETURNS:
* 0 if devres is found and freed, -ENOENT if not found.
*/
int devres_release(struct udevice *dev, dr_release_t release,
dr_match_t match, void *match_data);
/* managed devm_k.alloc/kfree for device drivers */
/**
* devm_kmalloc - Resource-managed kmalloc
* @dev: Device to allocate memory for
* @size: Allocation size
* @gfp: Allocation gfp flags
*
* Managed kmalloc. Memory allocated with this function is
* automatically freed on driver detach. Like all other devres
* resources, guaranteed alignment is unsigned long long.
*
* RETURNS:
* Pointer to allocated memory on success, NULL on failure.
*/
void *devm_kmalloc(struct udevice *dev, size_t size, gfp_t gfp);
static inline void *devm_kzalloc(struct udevice *dev, size_t size, gfp_t gfp)
{
return devm_kmalloc(dev, size, gfp | __GFP_ZERO);
}
static inline void *devm_kmalloc_array(struct udevice *dev,
size_t n, size_t size, gfp_t flags)
{
if (size != 0 && n > SIZE_MAX / size)
return NULL;
return devm_kmalloc(dev, n * size, flags);
}
static inline void *devm_kcalloc(struct udevice *dev,
size_t n, size_t size, gfp_t flags)
{
return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO);
}
/**
* devm_kfree - Resource-managed kfree
* @dev: Device this memory belongs to
* @p: Memory to free
*
* Free memory allocated with devm_kmalloc().
*/
void devm_kfree(struct udevice *dev, void *p);
#else /* ! CONFIG_DEVRES */
static inline void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp)
{
return kzalloc(size, gfp);
}
static inline void devres_free(void *res)
{
kfree(res);
}
static inline void devres_add(struct udevice *dev, void *res)
{
}
static inline void *devres_find(struct udevice *dev, dr_release_t release,
dr_match_t match, void *match_data)
{
return NULL;
}
static inline void *devres_get(struct udevice *dev, void *new_res,
dr_match_t match, void *match_data)
{
return NULL;
}
static inline void *devres_remove(struct udevice *dev, dr_release_t release,
dr_match_t match, void *match_data)
{
return NULL;
}
static inline int devres_destroy(struct udevice *dev, dr_release_t release,
dr_match_t match, void *match_data)
{
return 0;
}
static inline int devres_release(struct udevice *dev, dr_release_t release,
dr_match_t match, void *match_data)
{
return 0;
}
static inline void *devm_kmalloc(struct udevice *dev, size_t size, gfp_t gfp)
{
return kmalloc(size, gfp);
}
static inline void *devm_kzalloc(struct udevice *dev, size_t size, gfp_t gfp)
{
return kzalloc(size, gfp);
}
static inline void *devm_kmaloc_array(struct udevice *dev,
size_t n, size_t size, gfp_t flags)
{
/* TODO: add kmalloc_array() to linux/compat.h */
if (size != 0 && n > SIZE_MAX / size)
return NULL;
return kmalloc(n * size, flags);
}
static inline void *devm_kcalloc(struct udevice *dev,
size_t n, size_t size, gfp_t flags)
{
/* TODO: add kcalloc() to linux/compat.h */
return kmalloc(n * size, flags | __GFP_ZERO);
}
static inline void devm_kfree(struct udevice *dev, void *p)
{
kfree(p);
}
#endif /* ! CONFIG_DEVRES */
#endif

View File

@@ -35,6 +35,7 @@ enum uclass_id {
UCLASS_I2C, /* I2C bus */
UCLASS_I2C_EEPROM, /* I2C EEPROM device */
UCLASS_I2C_GENERIC, /* Generic I2C device */
UCLASS_I2C_MUX, /* I2C multiplexer */
UCLASS_LED, /* Light-emitting diode (LED) */
UCLASS_LPC, /* x86 'low pin count' interface */
UCLASS_MASS_STORAGE, /* Mass storage device */
@@ -56,6 +57,7 @@ enum uclass_id {
UCLASS_USB, /* USB bus */
UCLASS_USB_DEV_GENERIC, /* USB generic device */
UCLASS_USB_HUB, /* USB hub */
UCLASS_VIDEO_BRIDGE, /* Video bridge, e.g. DisplayPort to LVDS */
UCLASS_COUNT,
UCLASS_INVALID = -1,

View File

@@ -130,7 +130,7 @@ int uclass_get(enum uclass_id key, struct uclass **ucp);
int uclass_get_device(enum uclass_id id, int index, struct udevice **devp);
/**
* uclass_get_device_by_name() - Get a uclass device by it's name
* uclass_get_device_by_name() - Get a uclass device by its name
*
* This searches the devices in the uclass for one with the exactly given name.
*
@@ -176,6 +176,23 @@ int uclass_get_device_by_seq(enum uclass_id id, int seq, struct udevice **devp);
int uclass_get_device_by_of_offset(enum uclass_id id, int node,
struct udevice **devp);
/**
* uclass_get_device_by_phandle() - Get a uclass device by phandle
*
* This searches the devices in the uclass for one with the given phandle.
*
* The device is probed to activate it ready for use.
*
* @id: uclass ID to look up
* @parent: Parent device containing the phandle pointer
* @name: Name of property in the parent device node
* @devp: Returns pointer to device (there is only one for each node)
* @return 0 if OK, -ENOENT if there is no @name present in the node, other
* -ve on error
*/
int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent,
const char *name, struct udevice **devp);
/**
* uclass_first_device() - Get the first device in a uclass
*

View File

@@ -39,4 +39,13 @@ void dm_dump_all(void);
/* Dump out a list of uclasses and their devices */
void dm_dump_uclass(void);
#ifdef CONFIG_DEBUG_DEVRES
/* Dump out a list of device resources */
void dm_dump_devres(void);
#else
static inline void dm_dump_devres(void)
{
}
#endif
#endif

View File

@@ -21,15 +21,13 @@
* A typedef for a physical address. Note that fdt data is always big
* endian even on a litle endian machine.
*/
typedef phys_addr_t fdt_addr_t;
typedef phys_size_t fdt_size_t;
#ifdef CONFIG_PHYS_64BIT
typedef u64 fdt_addr_t;
typedef u64 fdt_size_t;
#define FDT_ADDR_T_NONE (-1ULL)
#define fdt_addr_to_cpu(reg) be64_to_cpu(reg)
#define fdt_size_to_cpu(reg) be64_to_cpu(reg)
#else
typedef u32 fdt_addr_t;
typedef u32 fdt_size_t;
#define FDT_ADDR_T_NONE (-1U)
#define fdt_addr_to_cpu(reg) be32_to_cpu(reg)
#define fdt_size_to_cpu(reg) be32_to_cpu(reg)
@@ -170,10 +168,7 @@ enum fdt_compat_id {
COMPAT_INFINEON_SLB9645_TPM, /* Infineon SLB9645 TPM */
COMPAT_SAMSUNG_EXYNOS5_I2C, /* Exynos5 High Speed I2C Controller */
COMPAT_SANDBOX_LCD_SDL, /* Sandbox LCD emulation with SDL */
COMPAT_TI_TPS65090, /* Texas Instrument TPS65090 */
COMPAT_NXP_PTN3460, /* NXP PTN3460 DP/LVDS bridge */
COMPAT_SAMSUNG_EXYNOS_SYSMMU, /* Exynos sysmmu */
COMPAT_PARADE_PS8625, /* Parade PS8622 EDP->LVDS bridge */
COMPAT_INTEL_MICROCODE, /* Intel microcode update */
COMPAT_MEMORY_SPD, /* Memory SPD information */
COMPAT_INTEL_PANTHERPOINT_AHCI, /* Intel Pantherpoint AHCI */

View File

@@ -74,6 +74,49 @@ struct dm_i2c_bus {
int speed_hz;
};
/*
* Not all of these flags are implemented in the U-Boot API
*/
enum dm_i2c_msg_flags {
I2C_M_TEN = 0x0010, /* ten-bit chip address */
I2C_M_RD = 0x0001, /* read data, from slave to master */
I2C_M_STOP = 0x8000, /* send stop after this message */
I2C_M_NOSTART = 0x4000, /* no start before this message */
I2C_M_REV_DIR_ADDR = 0x2000, /* invert polarity of R/W bit */
I2C_M_IGNORE_NAK = 0x1000, /* continue after NAK */
I2C_M_NO_RD_ACK = 0x0800, /* skip the Ack bit on reads */
I2C_M_RECV_LEN = 0x0400, /* length is first received byte */
};
/**
* struct i2c_msg - an I2C message
*
* @addr: Slave address
* @flags: Flags (see enum dm_i2c_msg_flags)
* @len: Length of buffer in bytes, may be 0 for a probe
* @buf: Buffer to send/receive, or NULL if no data
*/
struct i2c_msg {
uint addr;
uint flags;
uint len;
u8 *buf;
};
/**
* struct i2c_msg_list - a list of I2C messages
*
* This is called i2c_rdwr_ioctl_data in Linux but the name does not seem
* appropriate in U-Boot.
*
* @msg: Pointer to i2c_msg array
* @nmsgs: Number of elements in the array
*/
struct i2c_msg_list {
struct i2c_msg *msgs;
uint nmsgs;
};
/**
* dm_i2c_read() - read bytes from an I2C chip
*
@@ -129,6 +172,7 @@ int dm_i2c_probe(struct udevice *bus, uint chip_addr, uint chip_flags,
*
* This reads a single value from the given address in an I2C chip
*
* @dev: Device to use for transfer
* @addr: Address to read from
* @return value read, or -ve on error
*/
@@ -139,12 +183,26 @@ int dm_i2c_reg_read(struct udevice *dev, uint offset);
*
* This writes a single value to the given address in an I2C chip
*
* @dev: Device to use for transfer
* @addr: Address to write to
* @val: Value to write (normally a byte)
* @return 0 on success, -ve on error
*/
int dm_i2c_reg_write(struct udevice *dev, uint offset, unsigned int val);
/**
* dm_i2c_xfer() - Transfer messages over I2C
*
* This transfers a raw message. It is best to use dm_i2c_reg_read/write()
* instead.
*
* @dev: Device to use for transfer
* @msg: List of messages to transfer
* @nmsgs: Number of messages to transfer
* @return 0 on success, -ve on error
*/
int dm_i2c_xfer(struct udevice *dev, struct i2c_msg *msg, int nmsgs);
/**
* dm_i2c_set_bus_speed() - set the speed of a bus
*
@@ -292,49 +350,6 @@ void i2c_reg_write(uint8_t addr, uint8_t reg, uint8_t val);
#endif
/*
* Not all of these flags are implemented in the U-Boot API
*/
enum dm_i2c_msg_flags {
I2C_M_TEN = 0x0010, /* ten-bit chip address */
I2C_M_RD = 0x0001, /* read data, from slave to master */
I2C_M_STOP = 0x8000, /* send stop after this message */
I2C_M_NOSTART = 0x4000, /* no start before this message */
I2C_M_REV_DIR_ADDR = 0x2000, /* invert polarity of R/W bit */
I2C_M_IGNORE_NAK = 0x1000, /* continue after NAK */
I2C_M_NO_RD_ACK = 0x0800, /* skip the Ack bit on reads */
I2C_M_RECV_LEN = 0x0400, /* length is first received byte */
};
/**
* struct i2c_msg - an I2C message
*
* @addr: Slave address
* @flags: Flags (see enum dm_i2c_msg_flags)
* @len: Length of buffer in bytes, may be 0 for a probe
* @buf: Buffer to send/receive, or NULL if no data
*/
struct i2c_msg {
uint addr;
uint flags;
uint len;
u8 *buf;
};
/**
* struct i2c_msg_list - a list of I2C messages
*
* This is called i2c_rdwr_ioctl_data in Linux but the name does not seem
* appropriate in U-Boot.
*
* @msg: Pointer to i2c_msg array
* @nmsgs: Number of elements in the array
*/
struct i2c_msg_list {
struct i2c_msg *msgs;
uint nmsgs;
};
/**
* struct dm_i2c_ops - driver operations for I2C uclass
*
@@ -429,6 +444,45 @@ struct dm_i2c_ops {
#define i2c_get_ops(dev) ((struct dm_i2c_ops *)(dev)->driver->ops)
/**
* struct i2c_mux_ops - operations for an I2C mux
*
* The current mux state is expected to be stored in the mux itself since
* it is the only thing that knows how to make things work. The mux can
* record the current state and then avoid switching unless it is necessary.
* So select() can be skipped if the mux is already in the correct state.
* Also deselect() can be made a nop if required.
*/
struct i2c_mux_ops {
/**
* select() - select one of of I2C buses attached to a mux
*
* This will be called when there is no bus currently selected by the
* mux. This method does not need to deselect the old bus since
* deselect() will be already have been called if necessary.
*
* @mux: Mux device
* @bus: I2C bus to select
* @channel: Channel number correponding to the bus to select
* @return 0 if OK, -ve on error
*/
int (*select)(struct udevice *mux, struct udevice *bus, uint channel);
/**
* deselect() - select one of of I2C buses attached to a mux
*
* This is used to deselect the currently selected I2C bus.
*
* @mux: Mux device
* @bus: I2C bus to deselect
* @channel: Channel number correponding to the bus to deselect
* @return 0 if OK, -ve on error
*/
int (*deselect)(struct udevice *mux, struct udevice *bus, uint channel);
};
#define i2c_mux_get_ops(dev) ((struct i2c_mux_ops *)(dev)->driver->ops)
/**
* i2c_get_chip() - get a device to use to access a chip on a bus
*
@@ -473,6 +527,16 @@ int i2c_get_chip_for_busnum(int busnum, int chip_addr, uint offset_len,
int i2c_chip_ofdata_to_platdata(const void *blob, int node,
struct dm_i2c_chip *chip);
/**
* i2c_dump_msgs() - Dump a list of I2C messages
*
* This may be useful for debugging.
*
* @msg: Message list to dump
* @nmsgs: Number of messages
*/
void i2c_dump_msgs(struct i2c_msg *msg, int nmsgs);
#ifndef CONFIG_DM_I2C
/*

View File

@@ -1,18 +0,0 @@
/*
* (C) Copyright 2012 Samsung Electronics
* Donghwa Lee <dh09.lee@samsung.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __PARADE_H__
#define __PARADE_H__
/* Initialize the Parade dP<->LVDS bridge if present */
#ifdef CONFIG_VIDEO_PARADE
int parade_init(const void *blob);
#else
static inline int parade_init(const void *blob) { return -1; }
#endif
#endif /* __PARADE_H__ */

85
include/power/s5m8767.h Normal file
View File

@@ -0,0 +1,85 @@
/*
* Copyright (c) 2015 Google, Inc
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __S5M8767_H_
#define __S5M8767_H_
enum s5m8767_regnum {
S5M8767_BUCK1 = 0,
S5M8767_BUCK2,
S5M8767_BUCK3,
S5M8767_BUCK4,
S5M8767_BUCK5,
S5M8767_BUCK6,
S5M8767_BUCK7,
S5M8767_BUCK8,
S5M8767_BUCK9,
S5M8767_LDO1,
S5M8767_LDO2,
S5M8767_LDO3,
S5M8767_LDO4,
S5M8767_LDO5,
S5M8767_LDO6,
S5M8767_LDO7,
S5M8767_LDO8,
S5M8767_LDO9,
S5M8767_LDO10,
S5M8767_LDO11,
S5M8767_LDO12,
S5M8767_LDO13,
S5M8767_LDO14,
S5M8767_LDO15,
S5M8767_LDO16,
S5M8767_LDO17,
S5M8767_LDO18,
S5M8767_LDO19,
S5M8767_LDO20,
S5M8767_LDO21,
S5M8767_LDO22,
S5M8767_LDO23,
S5M8767_LDO24,
S5M8767_LDO25,
S5M8767_LDO26,
S5M8767_LDO27,
S5M8767_LDO28,
S5M8767_EN32KHZ_CP,
S5M8767_NUM_OF_REGS,
};
struct sec_voltage_desc {
int max;
int min;
int step;
};
/**
* struct s5m8767_para - s5m8767 register parameters
* @param vol_addr i2c address of the given buck/ldo register
* @param vol_bitpos bit position to be set or clear within register
* @param vol_bitmask bit mask value
* @param reg_enaddr control register address, which enable the given
* given buck/ldo.
* @param reg_enbiton value to be written to buck/ldo to make it ON
* @param vol Voltage information
*/
struct s5m8767_para {
enum s5m8767_regnum regnum;
u8 vol_addr;
u8 vol_bitpos;
u8 vol_bitmask;
u8 reg_enaddr;
u8 reg_enbiton;
const struct sec_voltage_desc *vol;
};
/* Drivers name */
#define S5M8767_LDO_DRIVER "s5m8767_ldo"
#define S5M8767_BUCK_DRIVER "s5m8767_buck"
int s5m8767_enable_32khz_cp(struct udevice *dev);
#endif /* __S5M8767_PMIC_H_ */

56
include/power/tps65090.h Normal file
View File

@@ -0,0 +1,56 @@
/*
* Copyright (c) 2015 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __TPS65090_PMIC_H_
#define __TPS65090_PMIC_H_
/* I2C device address for TPS65090 PMU */
#define TPS65090_I2C_ADDR 0x48
/* TPS65090 register addresses */
enum {
REG_IRQ1 = 0,
REG_CG_CTRL0 = 4,
REG_CG_STATUS1 = 0xa,
REG_FET_BASE = 0xe, /* Not a real register, FETs count from here */
REG_FET1_CTRL,
REG_FET2_CTRL,
REG_FET3_CTRL,
REG_FET4_CTRL,
REG_FET5_CTRL,
REG_FET6_CTRL,
REG_FET7_CTRL,
TPS65090_NUM_REGS,
};
enum {
IRQ1_VBATG = 1 << 3,
CG_CTRL0_ENC_MASK = 0x01,
MAX_FET_NUM = 7,
MAX_CTRL_READ_TRIES = 5,
/* TPS65090 FET_CTRL register values */
FET_CTRL_TOFET = 1 << 7, /* Timeout, startup, overload */
FET_CTRL_PGFET = 1 << 4, /* Power good for FET status */
FET_CTRL_WAIT = 3 << 2, /* Overcurrent timeout max */
FET_CTRL_ADENFET = 1 << 1, /* Enable output auto discharge */
FET_CTRL_ENFET = 1 << 0, /* Enable FET */
};
enum {
/* Status register fields */
TPS65090_ST1_OTC = 1 << 0,
TPS65090_ST1_OCC = 1 << 1,
TPS65090_ST1_STATE_SHIFT = 4,
TPS65090_ST1_STATE_MASK = 0xf << TPS65090_ST1_STATE_SHIFT,
};
/* Drivers name */
#define TPS65090_FET_DRIVER "tps65090_fet"
#endif /* __TPS65090_PMIC_H_ */

View File

@@ -1,73 +0,0 @@
/*
* Copyright (c) 2012 The Chromium OS Authors.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __TPS65090_PMIC_H_
#define __TPS65090_PMIC_H_
/* I2C device address for TPS65090 PMU */
#define TPS65090_I2C_ADDR 0x48
enum {
/* Status register fields */
TPS65090_ST1_OTC = 1 << 0,
TPS65090_ST1_OCC = 1 << 1,
TPS65090_ST1_STATE_SHIFT = 4,
TPS65090_ST1_STATE_MASK = 0xf << TPS65090_ST1_STATE_SHIFT,
};
/**
* Enable FET
*
* @param fet_id FET ID, value between 1 and 7
* @return 0 on success, non-0 on failure
*/
int tps65090_fet_enable(unsigned int fet_id);
/**
* Disable FET
*
* @param fet_id FET ID, value between 1 and 7
* @return 0 on success, non-0 on failure
*/
int tps65090_fet_disable(unsigned int fet_id);
/**
* Is FET enabled?
*
* @param fet_id FET ID, value between 1 and 7
* @return 1 enabled, 0 disabled, negative value on failure
*/
int tps65090_fet_is_enabled(unsigned int fet_id);
/**
* Enable / disable the battery charger
*
* @param enable 0 to disable charging, non-zero to enable
*/
int tps65090_set_charge_enable(int enable);
/**
* Check whether we have enabled battery charging
*
* @return 1 if enabled, 0 if disabled
*/
int tps65090_get_charging(void);
/**
* Return the value of the status register
*
* @return status register value, or -1 on error
*/
int tps65090_get_status(void);
/**
* Initialize the TPS65090 PMU.
*
* @return 0 on success, non-0 on failure
*/
int tps65090_init(void);
#endif /* __TPS65090_PMIC_H_ */

92
include/video_bridge.h Normal file
View File

@@ -0,0 +1,92 @@
/*
* Copyright (C) 2015 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __VIDEO_BRIDGE
#define __VIDEO_BRIDGE
#include <asm/gpio.h>
/**
* struct video_bridge_priv - uclass information for video bridges
*
* @sleep: GPIO to assert to power down the bridge
* @reset: GPIO to assert to reset the bridge
* @hotplug: Optional GPIO to check if bridge is connected
*/
struct video_bridge_priv {
struct gpio_desc sleep;
struct gpio_desc reset;
struct gpio_desc hotplug;
};
/**
* Operations for video bridges
*/
struct video_bridge_ops {
/**
* attach() - attach a video bridge
*
* @return 0 if OK, -ve on error
*/
int (*attach)(struct udevice *dev);
/**
* check_attached() - check if a bridge is correctly attached
*
* This method is optional - if not provided then the hotplug GPIO
* will be checked instead.
*
* @dev: Device to check
* @return 0 if attached, -EENOTCONN if not, or other -ve error
*/
int (*check_attached)(struct udevice *dev);
/**
* set_backlight() - Set the backlight brightness
*
* @dev: device to adjust
* @percent: brightness percentage (0=off, 100=full brightness)
* @return 0 if OK, -ve on error
*/
int (*set_backlight)(struct udevice *dev, int percent);
};
#define video_bridge_get_ops(dev) \
((struct video_bridge_ops *)(dev)->driver->ops)
/**
* video_bridge_attach() - attach a video bridge
*
* @return 0 if OK, -ve on error
*/
int video_bridge_attach(struct udevice *dev);
/**
* video_bridge_set_backlight() - Set the backlight brightness
*
* @percent: brightness percentage (0=off, 100=full brightness)
* @return 0 if OK, -ve on error
*/
int video_bridge_set_backlight(struct udevice *dev, int percent);
/**
* video_bridge_set_active() - take the bridge in/out of reset/powerdown
*
* @dev: Device to adjust
* @active: true to power up and reset, false to power down
*/
int video_bridge_set_active(struct udevice *dev, bool active);
/**
* check_attached() - check if a bridge is correctly attached
*
* @dev: Device to check
* @return 0 if attached, -EENOTCONN if not, or other -ve error
*/
int video_bridge_check_attached(struct udevice *dev);
#endif