i2c: common changes for multibus/multiadapter support
Signed-off-by: Heiko Schocher <hs@denx.de> Signed-off-by: Simon Glass <sjg@chromium.org> Cc: Henrik Nordström <henrik@henriknordstrom.net>
This commit is contained in:
parent
385c9ef5a7
commit
3f4978c713
72
README
72
README
|
@ -1944,9 +1944,77 @@ CBFS (Coreboot Filesystem) support
|
||||||
on those systems that support this (optional)
|
on those systems that support this (optional)
|
||||||
feature, like the TQM8xxL modules.
|
feature, like the TQM8xxL modules.
|
||||||
|
|
||||||
- I2C Support: CONFIG_HARD_I2C | CONFIG_SOFT_I2C
|
- I2C Support: CONFIG_SYS_I2C
|
||||||
|
|
||||||
These enable I2C serial bus commands. Defining either of
|
This enable the NEW i2c subsystem, and will allow you to use
|
||||||
|
i2c commands at the u-boot command line (as long as you set
|
||||||
|
CONFIG_CMD_I2C in CONFIG_COMMANDS) and communicate with i2c
|
||||||
|
based realtime clock chips or other i2c devices. See
|
||||||
|
common/cmd_i2c.c for a description of the command line
|
||||||
|
interface.
|
||||||
|
|
||||||
|
ported i2c driver to the new framework:
|
||||||
|
|
||||||
|
additional defines:
|
||||||
|
|
||||||
|
CONFIG_SYS_NUM_I2C_BUSES
|
||||||
|
Hold the number of i2c busses you want to use. If you
|
||||||
|
don't use/have i2c muxes on your i2c bus, this
|
||||||
|
is equal to CONFIG_SYS_NUM_I2C_ADAPTERS, and you can
|
||||||
|
omit this define.
|
||||||
|
|
||||||
|
CONFIG_SYS_I2C_DIRECT_BUS
|
||||||
|
define this, if you don't use i2c muxes on your hardware.
|
||||||
|
if CONFIG_SYS_I2C_MAX_HOPS is not defined or == 0 you can
|
||||||
|
omit this define.
|
||||||
|
|
||||||
|
CONFIG_SYS_I2C_MAX_HOPS
|
||||||
|
define how many muxes are maximal consecutively connected
|
||||||
|
on one i2c bus. If you not use i2c muxes, omit this
|
||||||
|
define.
|
||||||
|
|
||||||
|
CONFIG_SYS_I2C_BUSES
|
||||||
|
hold a list of busses you want to use, only used if
|
||||||
|
CONFIG_SYS_I2C_DIRECT_BUS is not defined, for example
|
||||||
|
a board with CONFIG_SYS_I2C_MAX_HOPS = 1 and
|
||||||
|
CONFIG_SYS_NUM_I2C_BUSES = 9:
|
||||||
|
|
||||||
|
CONFIG_SYS_I2C_BUSES {{0, {I2C_NULL_HOP}}, \
|
||||||
|
{0, {{I2C_MUX_PCA9547, 0x70, 1}}}, \
|
||||||
|
{0, {{I2C_MUX_PCA9547, 0x70, 2}}}, \
|
||||||
|
{0, {{I2C_MUX_PCA9547, 0x70, 3}}}, \
|
||||||
|
{0, {{I2C_MUX_PCA9547, 0x70, 4}}}, \
|
||||||
|
{0, {{I2C_MUX_PCA9547, 0x70, 5}}}, \
|
||||||
|
{1, {I2C_NULL_HOP}}, \
|
||||||
|
{1, {{I2C_MUX_PCA9544, 0x72, 1}}}, \
|
||||||
|
{1, {{I2C_MUX_PCA9544, 0x72, 2}}}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
which defines
|
||||||
|
bus 0 on adapter 0 without a mux
|
||||||
|
bus 1 on adapter 0 without a PCA9547 on address 0x70 port 1
|
||||||
|
bus 2 on adapter 0 without a PCA9547 on address 0x70 port 2
|
||||||
|
bus 3 on adapter 0 without a PCA9547 on address 0x70 port 3
|
||||||
|
bus 4 on adapter 0 without a PCA9547 on address 0x70 port 4
|
||||||
|
bus 5 on adapter 0 without a PCA9547 on address 0x70 port 5
|
||||||
|
bus 6 on adapter 1 without a mux
|
||||||
|
bus 7 on adapter 1 without a PCA9544 on address 0x72 port 1
|
||||||
|
bus 8 on adapter 1 without a PCA9544 on address 0x72 port 2
|
||||||
|
|
||||||
|
If you do not have i2c muxes on your board, omit this define.
|
||||||
|
|
||||||
|
- Legacy I2C Support: CONFIG_HARD_I2C | CONFIG_SOFT_I2C
|
||||||
|
|
||||||
|
NOTE: It is intended to move drivers to CONFIG_SYS_I2C which
|
||||||
|
provides the following compelling advantages:
|
||||||
|
|
||||||
|
- more than one i2c adapter is usable
|
||||||
|
- approved multibus support
|
||||||
|
- better i2c mux support
|
||||||
|
|
||||||
|
** Please consider updating your I2C driver now. **
|
||||||
|
|
||||||
|
These enable legacy I2C serial bus commands. Defining either of
|
||||||
(but not both of) CONFIG_HARD_I2C or CONFIG_SOFT_I2C will
|
(but not both of) CONFIG_HARD_I2C or CONFIG_SOFT_I2C will
|
||||||
include the appropriate I2C driver for the selected CPU.
|
include the appropriate I2C driver for the selected CPU.
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,8 @@ extern void dataflash_print_info(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_HARD_I2C) || \
|
#if defined(CONFIG_HARD_I2C) || \
|
||||||
defined(CONFIG_SOFT_I2C)
|
defined(CONFIG_SOFT_I2C) || \
|
||||||
|
defined(CONFIG_SYS_I2C)
|
||||||
#include <i2c.h>
|
#include <i2c.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -169,7 +170,11 @@ static int display_dram_config(void)
|
||||||
static int init_func_i2c(void)
|
static int init_func_i2c(void)
|
||||||
{
|
{
|
||||||
puts("I2C: ");
|
puts("I2C: ");
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
i2c_init_all();
|
||||||
|
#else
|
||||||
i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
||||||
|
#endif
|
||||||
puts("ready\n");
|
puts("ready\n");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,10 @@
|
||||||
int post_flag;
|
int post_flag;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
#include <i2c.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
|
@ -387,6 +391,9 @@ void board_init_r(gd_t * id, ulong dest_addr)
|
||||||
mmc_initialize(bd);
|
mmc_initialize(bd);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
i2c_reloc_fixup();
|
||||||
|
#endif
|
||||||
/* relocate environment function pointers etc. */
|
/* relocate environment function pointers etc. */
|
||||||
env_relocate();
|
env_relocate();
|
||||||
|
|
||||||
|
|
|
@ -142,11 +142,16 @@ static int init_func_ram (void)
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \
|
||||||
|
defined(CONFIG_SYS_I2C)
|
||||||
static int init_func_i2c (void)
|
static int init_func_i2c (void)
|
||||||
{
|
{
|
||||||
puts ("I2C: ");
|
puts ("I2C: ");
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
i2c_init_all();
|
||||||
|
#else
|
||||||
i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
||||||
|
#endif
|
||||||
puts ("ready\n");
|
puts ("ready\n");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -178,7 +183,8 @@ init_fnc_t *init_sequence[] = {
|
||||||
display_options,
|
display_options,
|
||||||
checkcpu,
|
checkcpu,
|
||||||
checkboard,
|
checkboard,
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \
|
||||||
|
defined(CONFIG_SYS_I2C)
|
||||||
init_func_i2c,
|
init_func_i2c,
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_HARD_SPI)
|
#if defined(CONFIG_HARD_SPI)
|
||||||
|
@ -501,6 +507,11 @@ void board_init_r (gd_t *id, ulong dest_addr)
|
||||||
spi_init_r ();
|
spi_init_r ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
/* Adjust I2C subsystem pointers after relocation */
|
||||||
|
i2c_reloc_fixup();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* relocate environment function pointers etc. */
|
/* relocate environment function pointers etc. */
|
||||||
env_relocate ();
|
env_relocate ();
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,10 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
#include <i2c.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
ulong monitor_flash_len;
|
ulong monitor_flash_len;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -173,7 +177,7 @@ init_fnc_t *init_sequence[] = {
|
||||||
#if defined(CONFIG_DISPLAY_BOARDINFO)
|
#if defined(CONFIG_DISPLAY_BOARDINFO)
|
||||||
checkboard, /* display board info */
|
checkboard, /* display board info */
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
|
||||||
init_func_i2c,
|
init_func_i2c,
|
||||||
#endif
|
#endif
|
||||||
dram_init, /* configure available RAM banks */
|
dram_init, /* configure available RAM banks */
|
||||||
|
@ -347,6 +351,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
|
||||||
mmc_initialize(gd->bd);
|
mmc_initialize(gd->bd);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_I2C_ADAPTERS)
|
||||||
|
i2c_reloc_fixup();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* initialize environment */
|
/* initialize environment */
|
||||||
env_relocate();
|
env_relocate();
|
||||||
|
|
||||||
|
|
|
@ -809,7 +809,11 @@ static void video_encoder_init (void)
|
||||||
|
|
||||||
/* Initialize the I2C */
|
/* Initialize the I2C */
|
||||||
debug ("[VIDEO ENCODER] Initializing I2C bus...\n");
|
debug ("[VIDEO ENCODER] Initializing I2C bus...\n");
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
i2c_init_all();
|
||||||
|
#else
|
||||||
i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_FADS
|
#ifdef CONFIG_FADS
|
||||||
/* Reset ADV7176 chip */
|
/* Reset ADV7176 chip */
|
||||||
|
|
|
@ -214,11 +214,16 @@ static int init_func_ram(void)
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \
|
||||||
|
defined(CONFIG_SYS_I2C)
|
||||||
static int init_func_i2c(void)
|
static int init_func_i2c(void)
|
||||||
{
|
{
|
||||||
puts("I2C: ");
|
puts("I2C: ");
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
i2c_init_all();
|
||||||
|
#else
|
||||||
i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
||||||
|
#endif
|
||||||
puts("ready\n");
|
puts("ready\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -307,7 +312,8 @@ static init_fnc_t *init_sequence[] = {
|
||||||
misc_init_f,
|
misc_init_f,
|
||||||
#endif
|
#endif
|
||||||
INIT_FUNC_WATCHDOG_RESET
|
INIT_FUNC_WATCHDOG_RESET
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \
|
||||||
|
defined(CONFIG_SYS_I2C)
|
||||||
init_func_i2c,
|
init_func_i2c,
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_HARD_SPI)
|
#if defined(CONFIG_HARD_SPI)
|
||||||
|
|
|
@ -261,7 +261,8 @@ void __dram_init_banksize(void)
|
||||||
void dram_init_banksize(void)
|
void dram_init_banksize(void)
|
||||||
__attribute__((weak, alias("__dram_init_banksize")));
|
__attribute__((weak, alias("__dram_init_banksize")));
|
||||||
|
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \
|
||||||
|
defined(CONFIG_SYS_I2C)
|
||||||
static int init_func_i2c(void)
|
static int init_func_i2c(void)
|
||||||
{
|
{
|
||||||
puts("I2C: ");
|
puts("I2C: ");
|
||||||
|
@ -919,7 +920,8 @@ static init_fnc_t init_sequence_f[] = {
|
||||||
misc_init_f,
|
misc_init_f,
|
||||||
#endif
|
#endif
|
||||||
INIT_FUNC_WATCHDOG_RESET
|
INIT_FUNC_WATCHDOG_RESET
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \
|
||||||
|
defined(CONFIG_SYS_I2C)
|
||||||
init_func_i2c,
|
init_func_i2c,
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_HARD_SPI)
|
#if defined(CONFIG_HARD_SPI)
|
||||||
|
|
|
@ -50,8 +50,13 @@ static int do_date(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
int old_bus;
|
int old_bus;
|
||||||
|
|
||||||
/* switch to correct I2C bus */
|
/* switch to correct I2C bus */
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
old_bus = i2c_get_bus_num();
|
||||||
|
i2c_set_bus_num(CONFIG_SYS_RTC_BUS_NUM);
|
||||||
|
#else
|
||||||
old_bus = I2C_GET_BUS();
|
old_bus = I2C_GET_BUS();
|
||||||
I2C_SET_BUS(CONFIG_SYS_RTC_BUS_NUM);
|
I2C_SET_BUS(CONFIG_SYS_RTC_BUS_NUM);
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (argc) {
|
switch (argc) {
|
||||||
case 2: /* set date & time */
|
case 2: /* set date & time */
|
||||||
|
@ -97,7 +102,11 @@ static int do_date(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
/* switch back to original I2C bus */
|
/* switch back to original I2C bus */
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
i2c_set_bus_num(old_bus);
|
||||||
|
#else
|
||||||
I2C_SET_BUS(old_bus);
|
I2C_SET_BUS(old_bus);
|
||||||
|
#endif
|
||||||
|
|
||||||
return rcode;
|
return rcode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,8 +73,13 @@ int dtt_i2c(void)
|
||||||
/* Force a compilation error, if there are more then 32 sensors */
|
/* Force a compilation error, if there are more then 32 sensors */
|
||||||
BUILD_BUG_ON(sizeof(sensors) > 32);
|
BUILD_BUG_ON(sizeof(sensors) > 32);
|
||||||
/* switch to correct I2C bus */
|
/* switch to correct I2C bus */
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
old_bus = i2c_get_bus_num();
|
||||||
|
i2c_set_bus_num(CONFIG_SYS_DTT_BUS_NUM);
|
||||||
|
#else
|
||||||
old_bus = I2C_GET_BUS();
|
old_bus = I2C_GET_BUS();
|
||||||
I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM);
|
I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM);
|
||||||
|
#endif
|
||||||
|
|
||||||
_initialize_dtt();
|
_initialize_dtt();
|
||||||
|
|
||||||
|
@ -86,7 +91,11 @@ int dtt_i2c(void)
|
||||||
printf("DTT%d: %i C\n", i + 1, dtt_get_temp(sensors[i]));
|
printf("DTT%d: %i C\n", i + 1, dtt_get_temp(sensors[i]));
|
||||||
|
|
||||||
/* switch back to original I2C bus */
|
/* switch back to original I2C bus */
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
i2c_set_bus_num(old_bus);
|
||||||
|
#else
|
||||||
I2C_SET_BUS(old_bus);
|
I2C_SET_BUS(old_bus);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
121
common/cmd_i2c.c
121
common/cmd_i2c.c
|
@ -1,4 +1,9 @@
|
||||||
/*
|
/*
|
||||||
|
* (C) Copyright 2009
|
||||||
|
* Sergey Kubushyn, himself, ksi@koi8.net
|
||||||
|
*
|
||||||
|
* Changes for unified multibus/multiadapter I2C support.
|
||||||
|
*
|
||||||
* (C) Copyright 2001
|
* (C) Copyright 2001
|
||||||
* Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
|
* Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
|
||||||
*
|
*
|
||||||
|
@ -85,6 +90,8 @@
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
/* Display values from last command.
|
/* Display values from last command.
|
||||||
* Memory modify remembered values are different from display memory.
|
* Memory modify remembered values are different from display memory.
|
||||||
*/
|
*/
|
||||||
|
@ -103,7 +110,8 @@ static uint i2c_mm_last_alen;
|
||||||
* pairs. The following macros take care of this */
|
* pairs. The following macros take care of this */
|
||||||
|
|
||||||
#if defined(CONFIG_SYS_I2C_NOPROBES)
|
#if defined(CONFIG_SYS_I2C_NOPROBES)
|
||||||
#if defined(CONFIG_I2C_MULTI_BUS)
|
#if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MUX) || \
|
||||||
|
defined(CONFIG_I2C_MULTI_BUS)
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
uchar bus;
|
uchar bus;
|
||||||
|
@ -119,7 +127,7 @@ static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
|
||||||
#define COMPARE_BUS(b,i) ((b) == 0) /* Make compiler happy */
|
#define COMPARE_BUS(b,i) ((b) == 0) /* Make compiler happy */
|
||||||
#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)] == (a))
|
#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)] == (a))
|
||||||
#define NO_PROBE_ADDR(i) i2c_no_probes[(i)]
|
#define NO_PROBE_ADDR(i) i2c_no_probes[(i)]
|
||||||
#endif /* CONFIG_MULTI_BUS */
|
#endif /* defined(CONFIG_SYS_I2C) */
|
||||||
|
|
||||||
#define NUM_ELEMENTS_NOPROBE (sizeof(i2c_no_probes)/sizeof(i2c_no_probes[0]))
|
#define NUM_ELEMENTS_NOPROBE (sizeof(i2c_no_probes)/sizeof(i2c_no_probes[0]))
|
||||||
#endif
|
#endif
|
||||||
|
@ -127,9 +135,6 @@ static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
|
||||||
#if defined(CONFIG_I2C_MUX)
|
#if defined(CONFIG_I2C_MUX)
|
||||||
static I2C_MUX_DEVICE *i2c_mux_devices = NULL;
|
static I2C_MUX_DEVICE *i2c_mux_devices = NULL;
|
||||||
static int i2c_mux_busid = CONFIG_SYS_MAX_I2C_BUS;
|
static int i2c_mux_busid = CONFIG_SYS_MAX_I2C_BUS;
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DISP_LINE_LEN 16
|
#define DISP_LINE_LEN 16
|
||||||
|
@ -144,7 +149,6 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
__weak
|
__weak
|
||||||
void i2c_init_board(void)
|
void i2c_init_board(void)
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Implement architecture-specific get/set functions */
|
/* TODO: Implement architecture-specific get/set functions */
|
||||||
|
@ -161,6 +165,11 @@ void i2c_init_board(void)
|
||||||
*
|
*
|
||||||
* Returns I2C bus speed in Hz.
|
* Returns I2C bus speed in Hz.
|
||||||
*/
|
*/
|
||||||
|
#if !defined(CONFIG_SYS_I2C)
|
||||||
|
/*
|
||||||
|
* TODO: Implement architecture-specific get/set functions
|
||||||
|
* Should go away, if we switched completely to new multibus support
|
||||||
|
*/
|
||||||
__weak
|
__weak
|
||||||
unsigned int i2c_get_bus_speed(void)
|
unsigned int i2c_get_bus_speed(void)
|
||||||
{
|
{
|
||||||
|
@ -188,6 +197,7 @@ int i2c_set_bus_speed(unsigned int speed)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_alen() - Small parser helper function to get address length
|
* get_alen() - Small parser helper function to get address length
|
||||||
|
@ -700,7 +710,7 @@ static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
|
||||||
int found = 0;
|
int found = 0;
|
||||||
#if defined(CONFIG_SYS_I2C_NOPROBES)
|
#if defined(CONFIG_SYS_I2C_NOPROBES)
|
||||||
int k, skip;
|
int k, skip;
|
||||||
uchar bus = GET_BUS_NUM;
|
unsigned int bus = GET_BUS_NUM;
|
||||||
#endif /* NOPROBES */
|
#endif /* NOPROBES */
|
||||||
|
|
||||||
if (argc == 2)
|
if (argc == 2)
|
||||||
|
@ -1373,9 +1383,8 @@ int do_edid(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_I2C_EDID */
|
#endif /* CONFIG_I2C_EDID */
|
||||||
|
|
||||||
#if defined(CONFIG_I2C_MUX)
|
|
||||||
/**
|
/**
|
||||||
* do_i2c_add_bus() - Handle the "i2c bus" command-line command
|
* do_i2c_show_bus() - Handle the "i2c bus" command-line command
|
||||||
* @cmdtp: Command data struct pointer
|
* @cmdtp: Command data struct pointer
|
||||||
* @flag: Command flag
|
* @flag: Command flag
|
||||||
* @argc: Command-line argument count
|
* @argc: Command-line argument count
|
||||||
|
@ -1383,35 +1392,55 @@ int do_edid(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
||||||
*
|
*
|
||||||
* Returns zero always.
|
* Returns zero always.
|
||||||
*/
|
*/
|
||||||
static int do_i2c_add_bus(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
int do_i2c_show_bus(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
int ret=0;
|
int i;
|
||||||
|
#ifndef CONFIG_SYS_I2C_DIRECT_BUS
|
||||||
|
int j;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
/* show all busses */
|
/* show all busses */
|
||||||
I2C_MUX *mux;
|
for (i = 0; i < CONFIG_SYS_NUM_I2C_BUSES; i++) {
|
||||||
I2C_MUX_DEVICE *device = i2c_mux_devices;
|
printf("Bus %d:\t%s", i, I2C_ADAP_NR(i)->name);
|
||||||
|
#ifndef CONFIG_SYS_I2C_DIRECT_BUS
|
||||||
printf ("Busses reached over muxes:\n");
|
for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) {
|
||||||
while (device != NULL) {
|
if (i2c_bus[i].next_hop[j].chip == 0)
|
||||||
printf ("Bus ID: %x\n", device->busid);
|
break;
|
||||||
printf (" reached over Mux(es):\n");
|
printf("->%s@0x%2x:%d",
|
||||||
mux = device->mux;
|
i2c_bus[i].next_hop[j].mux.name,
|
||||||
while (mux != NULL) {
|
i2c_bus[i].next_hop[j].chip,
|
||||||
printf (" %s@%x ch: %x\n", mux->name, mux->chip, mux->channel);
|
i2c_bus[i].next_hop[j].channel);
|
||||||
mux = mux->next;
|
|
||||||
}
|
}
|
||||||
device = device->next;
|
#endif
|
||||||
|
printf("\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
(void)i2c_mux_ident_muxstring ((uchar *)argv[1]);
|
/* show specific bus */
|
||||||
ret = 0;
|
i = simple_strtoul(argv[1], NULL, 10);
|
||||||
|
if (i >= CONFIG_SYS_NUM_I2C_BUSES) {
|
||||||
|
printf("Invalid bus %d\n", i);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
return ret;
|
printf("Bus %d:\t%s", i, I2C_ADAP_NR(i)->name);
|
||||||
|
#ifndef CONFIG_SYS_I2C_DIRECT_BUS
|
||||||
|
for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) {
|
||||||
|
if (i2c_bus[i].next_hop[j].chip == 0)
|
||||||
|
break;
|
||||||
|
printf("->%s@0x%2x:%d",
|
||||||
|
i2c_bus[i].next_hop[j].mux.name,
|
||||||
|
i2c_bus[i].next_hop[j].chip,
|
||||||
|
i2c_bus[i].next_hop[j].channel);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
printf("\n");
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_I2C_MUX */
|
|
||||||
|
|
||||||
#if defined(CONFIG_I2C_MULTI_BUS)
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* do_i2c_bus_num() - Handle the "i2c dev" command-line command
|
* do_i2c_bus_num() - Handle the "i2c dev" command-line command
|
||||||
* @cmdtp: Command data struct pointer
|
* @cmdtp: Command data struct pointer
|
||||||
|
@ -1422,23 +1451,29 @@ static int do_i2c_add_bus(cmd_tbl_t * cmdtp, int flag, int argc, char * const ar
|
||||||
* Returns zero on success, CMD_RET_USAGE in case of misuse and negative
|
* Returns zero on success, CMD_RET_USAGE in case of misuse and negative
|
||||||
* on error.
|
* on error.
|
||||||
*/
|
*/
|
||||||
static int do_i2c_bus_num(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
#if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MULTI_BUS)
|
||||||
|
int do_i2c_bus_num(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
int bus_idx, ret=0;
|
int ret = 0;
|
||||||
|
unsigned int bus_no;
|
||||||
|
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
/* querying current setting */
|
/* querying current setting */
|
||||||
printf("Current bus is %d\n", i2c_get_bus_num());
|
printf("Current bus is %d\n", i2c_get_bus_num());
|
||||||
else {
|
else {
|
||||||
bus_idx = simple_strtoul(argv[1], NULL, 10);
|
bus_no = simple_strtoul(argv[1], NULL, 10);
|
||||||
printf("Setting bus to %d\n", bus_idx);
|
if (bus_no >= CONFIG_SYS_NUM_I2C_BUSES) {
|
||||||
ret = i2c_set_bus_num(bus_idx);
|
printf("Invalid bus %d\n", bus_no);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
printf("Setting bus to %d\n", bus_no);
|
||||||
|
ret = i2c_set_bus_num(bus_no);
|
||||||
if (ret)
|
if (ret)
|
||||||
printf("Failure changing bus number (%d)\n", ret);
|
printf("Failure changing bus number (%d)\n", ret);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_I2C_MULTI_BUS */
|
#endif /* defined(CONFIG_SYS_I2C) */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* do_i2c_bus_speed() - Handle the "i2c speed" command-line command
|
* do_i2c_bus_speed() - Handle the "i2c speed" command-line command
|
||||||
|
@ -1508,16 +1543,21 @@ static int do_i2c_nm(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
||||||
*/
|
*/
|
||||||
static int do_i2c_reset(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
static int do_i2c_reset(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
i2c_init(I2C_ADAP->speed, I2C_ADAP->slaveaddr);
|
||||||
|
#else
|
||||||
i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cmd_tbl_t cmd_i2c_sub[] = {
|
static cmd_tbl_t cmd_i2c_sub[] = {
|
||||||
#if defined(CONFIG_I2C_MUX)
|
#if defined(CONFIG_SYS_I2C)
|
||||||
U_BOOT_CMD_MKENT(bus, 1, 1, do_i2c_add_bus, "", ""),
|
U_BOOT_CMD_MKENT(bus, 1, 1, do_i2c_show_bus, "", ""),
|
||||||
#endif /* CONFIG_I2C_MUX */
|
#endif /* CONFIG_I2C_MUX */
|
||||||
U_BOOT_CMD_MKENT(crc32, 3, 1, do_i2c_crc, "", ""),
|
U_BOOT_CMD_MKENT(crc32, 3, 1, do_i2c_crc, "", ""),
|
||||||
#if defined(CONFIG_I2C_MULTI_BUS)
|
#if defined(CONFIG_SYS_I2C) || \
|
||||||
|
defined(CONFIG_I2C_MULTI_BUS)
|
||||||
U_BOOT_CMD_MKENT(dev, 1, 1, do_i2c_bus_num, "", ""),
|
U_BOOT_CMD_MKENT(dev, 1, 1, do_i2c_bus_num, "", ""),
|
||||||
#endif /* CONFIG_I2C_MULTI_BUS */
|
#endif /* CONFIG_I2C_MULTI_BUS */
|
||||||
#if defined(CONFIG_I2C_EDID)
|
#if defined(CONFIG_I2C_EDID)
|
||||||
|
@ -1576,11 +1616,12 @@ static int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
||||||
/***************************************************/
|
/***************************************************/
|
||||||
#ifdef CONFIG_SYS_LONGHELP
|
#ifdef CONFIG_SYS_LONGHELP
|
||||||
static char i2c_help_text[] =
|
static char i2c_help_text[] =
|
||||||
#if defined(CONFIG_I2C_MUX)
|
#if defined(CONFIG_SYS_I2C)
|
||||||
"bus [muxtype:muxaddr:muxchannel] - add a new bus reached over muxes\ni2c "
|
"bus [muxtype:muxaddr:muxchannel] - show I2C bus info\n"
|
||||||
#endif /* CONFIG_I2C_MUX */
|
#endif /* CONFIG_I2C_MUX */
|
||||||
"crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
|
"crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
|
||||||
#if defined(CONFIG_I2C_MULTI_BUS)
|
#if defined(CONFIG_SYS_I2C) || \
|
||||||
|
defined(CONFIG_I2C_MULTI_BUS)
|
||||||
"i2c dev [dev] - show or set current I2C bus\n"
|
"i2c dev [dev] - show or set current I2C bus\n"
|
||||||
#endif /* CONFIG_I2C_MULTI_BUS */
|
#endif /* CONFIG_I2C_MULTI_BUS */
|
||||||
#if defined(CONFIG_I2C_EDID)
|
#if defined(CONFIG_I2C_EDID)
|
||||||
|
|
|
@ -49,6 +49,10 @@ static int eeprom_bus_read(unsigned dev_addr, unsigned offset,
|
||||||
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
||||||
int old_bus = i2c_get_bus_num();
|
int old_bus = i2c_get_bus_num();
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS)
|
||||||
|
i2c_set_bus_num(CONFIG_I2C_ENV_EEPROM_BUS);
|
||||||
|
#else
|
||||||
if (gd->flags & GD_FLG_RELOC) {
|
if (gd->flags & GD_FLG_RELOC) {
|
||||||
if (env_eeprom_bus == -1) {
|
if (env_eeprom_bus == -1) {
|
||||||
I2C_MUX_DEVICE *dev = NULL;
|
I2C_MUX_DEVICE *dev = NULL;
|
||||||
|
@ -67,12 +71,17 @@ static int eeprom_bus_read(unsigned dev_addr, unsigned offset,
|
||||||
rcode = i2c_mux_ident_muxstring_f(
|
rcode = i2c_mux_ident_muxstring_f(
|
||||||
(uchar *)CONFIG_I2C_ENV_EEPROM_BUS);
|
(uchar *)CONFIG_I2C_ENV_EEPROM_BUS);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rcode = eeprom_read(dev_addr, offset, buffer, cnt);
|
rcode = eeprom_read(dev_addr, offset, buffer, cnt);
|
||||||
|
|
||||||
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
||||||
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS)
|
||||||
|
#else
|
||||||
if (old_bus != env_eeprom_bus)
|
if (old_bus != env_eeprom_bus)
|
||||||
|
#endif
|
||||||
i2c_set_bus_num(old_bus);
|
i2c_set_bus_num(old_bus);
|
||||||
#endif
|
#endif
|
||||||
return rcode;
|
return rcode;
|
||||||
|
@ -85,7 +94,12 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset,
|
||||||
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
||||||
int old_bus = i2c_get_bus_num();
|
int old_bus = i2c_get_bus_num();
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_I2C)
|
||||||
|
if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS)
|
||||||
|
i2c_set_bus_num(CONFIG_I2C_ENV_EEPROM_BUS);
|
||||||
|
#else
|
||||||
rcode = i2c_mux_ident_muxstring_f((uchar *)CONFIG_I2C_ENV_EEPROM_BUS);
|
rcode = i2c_mux_ident_muxstring_f((uchar *)CONFIG_I2C_ENV_EEPROM_BUS);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
rcode = eeprom_write(dev_addr, offset, buffer, cnt);
|
rcode = eeprom_write(dev_addr, offset, buffer, cnt);
|
||||||
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
/*
|
/*
|
||||||
|
* Copyright (C) 2009 Sergey Kubushyn <ksi@koi8.net>
|
||||||
|
*
|
||||||
|
* Changes for multibus/multiadapter I2C support.
|
||||||
|
*
|
||||||
* (C) Copyright 2000
|
* (C) Copyright 2000
|
||||||
* Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
|
* Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
|
||||||
*
|
*
|
||||||
|
@ -30,7 +34,8 @@
|
||||||
#ifdef CONFIG_LOGBUFFER
|
#ifdef CONFIG_LOGBUFFER
|
||||||
#include <logbuff.h>
|
#include <logbuff.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \
|
||||||
|
defined(CONFIG_SYS_I2C_ADAPTERS)
|
||||||
#include <i2c.h>
|
#include <i2c.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -210,9 +215,15 @@ int stdio_init (void)
|
||||||
#ifdef CONFIG_ARM_DCC
|
#ifdef CONFIG_ARM_DCC
|
||||||
drv_arm_dcc_init ();
|
drv_arm_dcc_init ();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_SYS_I2C
|
||||||
|
#ifdef CONFIG_SYS_I2C_ADAPTERS
|
||||||
|
i2c_init_all();
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
|
||||||
i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_LCD
|
#ifdef CONFIG_LCD
|
||||||
drv_lcd_init ();
|
drv_lcd_init ();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -219,15 +219,6 @@ int i2c_mux_ident_muxstring_f (uchar *buf);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_I2C
|
#ifdef CONFIG_SYS_I2C
|
||||||
/*
|
|
||||||
* Initialization, must be called once on start up, may be called
|
|
||||||
* repeatedly to change the speed and slave addresses.
|
|
||||||
*/
|
|
||||||
void i2c_init(unsigned int speed, int slaveaddr);
|
|
||||||
#ifdef CONFIG_SYS_I2C_INIT_BOARD
|
|
||||||
void i2c_init_board(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* i2c_get_bus_num:
|
* i2c_get_bus_num:
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue