[U-Boot] [PATCH 0/3] cm-fx6 updates for Utilite

This series provides a fix necessary for early models of Utilite, a miniature desktop based on CM-FX6. It implements a dynamic modification to the device tree that is necessary for mmc boot.
Cc: Stefano Babic sbabic@denx.de Cc: Igor Grinberg grinberg@compulab.co.il
Nikita Kiryanov (3): compulab: eeprom: select i2c bus when querying for board rev compulab: eeprom: add support for obtaining product name arm: mx6: cm-fx6: modify device tree for old revisions of utilite
board/compulab/cm_fx6/cm_fx6.c | 18 +++++++++++++++++- board/compulab/cm_t35/cm_t35.c | 2 +- board/compulab/common/eeprom.c | 23 +++++++++++++++++++++-- board/compulab/common/eeprom.h | 9 +++++++-- 4 files changed, 46 insertions(+), 6 deletions(-)

Add support for selecting which eeprom is queried for board revision by extending cl_eeprom_get_board_rev() to accept an i2c bus number.
Cc: Stefano Babic sbabic@denx.de Cc: Igor Grinberg grinberg@compulab.co.il Signed-off-by: Nikita Kiryanov nikita@compulab.co.il --- board/compulab/cm_fx6/cm_fx6.c | 2 +- board/compulab/cm_t35/cm_t35.c | 2 +- board/compulab/common/eeprom.c | 4 ++-- board/compulab/common/eeprom.h | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/board/compulab/cm_fx6/cm_fx6.c b/board/compulab/cm_fx6/cm_fx6.c index 3ad1216..572111d 100644 --- a/board/compulab/cm_fx6/cm_fx6.c +++ b/board/compulab/cm_fx6/cm_fx6.c @@ -708,7 +708,7 @@ int dram_init(void)
u32 get_board_rev(void) { - return cl_eeprom_get_board_rev(); + return cl_eeprom_get_board_rev(CONFIG_SYS_I2C_EEPROM_BUS); }
static struct mxc_serial_platdata cm_fx6_mxc_serial_plat = { diff --git a/board/compulab/cm_t35/cm_t35.c b/board/compulab/cm_t35/cm_t35.c index 398c573..26c6a81 100644 --- a/board/compulab/cm_t35/cm_t35.c +++ b/board/compulab/cm_t35/cm_t35.c @@ -105,7 +105,7 @@ int board_init(void) */ u32 get_board_rev(void) { - return cl_eeprom_get_board_rev(); + return cl_eeprom_get_board_rev(CONFIG_SYS_I2C_EEPROM_BUS); };
int misc_init_r(void) diff --git a/board/compulab/common/eeprom.c b/board/compulab/common/eeprom.c index 77bcea4..aaacd2e 100644 --- a/board/compulab/common/eeprom.c +++ b/board/compulab/common/eeprom.c @@ -121,7 +121,7 @@ static u32 board_rev; * Routine: cl_eeprom_get_board_rev * Description: read system revision from eeprom */ -u32 cl_eeprom_get_board_rev(void) +u32 cl_eeprom_get_board_rev(uint eeprom_bus) { char str[5]; /* Legacy representation can contain at most 4 digits */ uint offset = BOARD_REV_OFFSET_LEGACY; @@ -129,7 +129,7 @@ u32 cl_eeprom_get_board_rev(void) if (board_rev) return board_rev;
- if (cl_eeprom_setup(CONFIG_SYS_I2C_EEPROM_BUS)) + if (cl_eeprom_setup(eeprom_bus)) return 0;
if (cl_eeprom_layout != LAYOUT_LEGACY) diff --git a/board/compulab/common/eeprom.h b/board/compulab/common/eeprom.h index 50c6b02..e74c379 100644 --- a/board/compulab/common/eeprom.h +++ b/board/compulab/common/eeprom.h @@ -12,13 +12,13 @@
#ifdef CONFIG_SYS_I2C int cl_eeprom_read_mac_addr(uchar *buf, uint eeprom_bus); -u32 cl_eeprom_get_board_rev(void); +u32 cl_eeprom_get_board_rev(uint eeprom_bus); #else static inline int cl_eeprom_read_mac_addr(uchar *buf, uint eeprom_bus) { return 1; } -static inline u32 cl_eeprom_get_board_rev(void) +static inline u32 cl_eeprom_get_board_rev(uint eeprom_bus) { return 0; }

Hi Nikita,
On 09/02/15 19:05, Nikita Kiryanov wrote:
Add support for selecting which eeprom is queried for board revision by extending cl_eeprom_get_board_rev() to accept an i2c bus number.
Cc: Stefano Babic sbabic@denx.de Cc: Igor Grinberg grinberg@compulab.co.il Signed-off-by: Nikita Kiryanov nikita@compulab.co.il
Acked-by: Igor Grinberg grinberg@compulab.co.il
board/compulab/cm_fx6/cm_fx6.c | 2 +- board/compulab/cm_t35/cm_t35.c | 2 +- board/compulab/common/eeprom.c | 4 ++-- board/compulab/common/eeprom.h | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/board/compulab/cm_fx6/cm_fx6.c b/board/compulab/cm_fx6/cm_fx6.c index 3ad1216..572111d 100644 --- a/board/compulab/cm_fx6/cm_fx6.c +++ b/board/compulab/cm_fx6/cm_fx6.c @@ -708,7 +708,7 @@ int dram_init(void)
u32 get_board_rev(void) {
- return cl_eeprom_get_board_rev();
- return cl_eeprom_get_board_rev(CONFIG_SYS_I2C_EEPROM_BUS);
}
static struct mxc_serial_platdata cm_fx6_mxc_serial_plat = { diff --git a/board/compulab/cm_t35/cm_t35.c b/board/compulab/cm_t35/cm_t35.c index 398c573..26c6a81 100644 --- a/board/compulab/cm_t35/cm_t35.c +++ b/board/compulab/cm_t35/cm_t35.c @@ -105,7 +105,7 @@ int board_init(void) */ u32 get_board_rev(void) {
- return cl_eeprom_get_board_rev();
- return cl_eeprom_get_board_rev(CONFIG_SYS_I2C_EEPROM_BUS);
};
int misc_init_r(void) diff --git a/board/compulab/common/eeprom.c b/board/compulab/common/eeprom.c index 77bcea4..aaacd2e 100644 --- a/board/compulab/common/eeprom.c +++ b/board/compulab/common/eeprom.c @@ -121,7 +121,7 @@ static u32 board_rev;
- Routine: cl_eeprom_get_board_rev
- Description: read system revision from eeprom
*/ -u32 cl_eeprom_get_board_rev(void) +u32 cl_eeprom_get_board_rev(uint eeprom_bus) { char str[5]; /* Legacy representation can contain at most 4 digits */ uint offset = BOARD_REV_OFFSET_LEGACY; @@ -129,7 +129,7 @@ u32 cl_eeprom_get_board_rev(void) if (board_rev) return board_rev;
- if (cl_eeprom_setup(CONFIG_SYS_I2C_EEPROM_BUS))
if (cl_eeprom_setup(eeprom_bus)) return 0;
if (cl_eeprom_layout != LAYOUT_LEGACY)
diff --git a/board/compulab/common/eeprom.h b/board/compulab/common/eeprom.h index 50c6b02..e74c379 100644 --- a/board/compulab/common/eeprom.h +++ b/board/compulab/common/eeprom.h @@ -12,13 +12,13 @@
#ifdef CONFIG_SYS_I2C int cl_eeprom_read_mac_addr(uchar *buf, uint eeprom_bus); -u32 cl_eeprom_get_board_rev(void); +u32 cl_eeprom_get_board_rev(uint eeprom_bus); #else static inline int cl_eeprom_read_mac_addr(uchar *buf, uint eeprom_bus) { return 1; } -static inline u32 cl_eeprom_get_board_rev(void) +static inline u32 cl_eeprom_get_board_rev(uint eeprom_bus) { return 0; }

Introduce cl_eeprom_get_product_name() for obtaining product name from the eeprom.
Cc: Stefano Babic sbabic@denx.de Cc: Igor Grinberg grinberg@compulab.co.il Signed-off-by: Nikita Kiryanov nikita@compulab.co.il --- board/compulab/common/eeprom.c | 19 +++++++++++++++++++ board/compulab/common/eeprom.h | 5 +++++ 2 files changed, 24 insertions(+)
diff --git a/board/compulab/common/eeprom.c b/board/compulab/common/eeprom.c index aaacd2e..a48da93 100644 --- a/board/compulab/common/eeprom.c +++ b/board/compulab/common/eeprom.c @@ -25,6 +25,8 @@ #define BOARD_REV_OFFSET 0 #define BOARD_REV_OFFSET_LEGACY 6 #define BOARD_REV_SIZE 2 +#define BOARD_PRODUCT_NAME_OFFSET 128 +#define BOARD_PRODUCT_NAME_SIZE 16 #define MAC_ADDR_OFFSET 4 #define MAC_ADDR_OFFSET_LEGACY 0
@@ -149,3 +151,20 @@ u32 cl_eeprom_get_board_rev(uint eeprom_bus)
return board_rev; }; + +static char product_name[BOARD_PRODUCT_NAME_SIZE]; +char *cl_eeprom_get_product_name(uint eeprom_bus) +{ + if (cl_eeprom_setup(eeprom_bus)) + return NULL; + + if (cl_eeprom_read(BOARD_PRODUCT_NAME_OFFSET, + (uchar *)product_name, BOARD_PRODUCT_NAME_SIZE)) { + return NULL; + } + + /* Protect ourselves from invalid data (unterminated string) */ + product_name[BOARD_PRODUCT_NAME_SIZE - 1] = '\0'; + + return product_name; +} diff --git a/board/compulab/common/eeprom.h b/board/compulab/common/eeprom.h index e74c379..fceb5df 100644 --- a/board/compulab/common/eeprom.h +++ b/board/compulab/common/eeprom.h @@ -13,6 +13,7 @@ #ifdef CONFIG_SYS_I2C int cl_eeprom_read_mac_addr(uchar *buf, uint eeprom_bus); u32 cl_eeprom_get_board_rev(uint eeprom_bus); +char *cl_eeprom_get_product_name(uint eeprom_bus); #else static inline int cl_eeprom_read_mac_addr(uchar *buf, uint eeprom_bus) { @@ -22,6 +23,10 @@ static inline u32 cl_eeprom_get_board_rev(uint eeprom_bus) { return 0; } +static inline char *cl_eeprom_get_product_name(uint eeprom_bus) +{ + return NULL; +} #endif
#endif

Hi Nikita,
On 09/02/15 19:05, Nikita Kiryanov wrote:
Introduce cl_eeprom_get_product_name() for obtaining product name from the eeprom.
Cc: Stefano Babic sbabic@denx.de Cc: Igor Grinberg grinberg@compulab.co.il Signed-off-by: Nikita Kiryanov nikita@compulab.co.il
board/compulab/common/eeprom.c | 19 +++++++++++++++++++ board/compulab/common/eeprom.h | 5 +++++ 2 files changed, 24 insertions(+)
diff --git a/board/compulab/common/eeprom.c b/board/compulab/common/eeprom.c index aaacd2e..a48da93 100644 --- a/board/compulab/common/eeprom.c +++ b/board/compulab/common/eeprom.c @@ -25,6 +25,8 @@ #define BOARD_REV_OFFSET 0 #define BOARD_REV_OFFSET_LEGACY 6 #define BOARD_REV_SIZE 2 +#define BOARD_PRODUCT_NAME_OFFSET 128 +#define BOARD_PRODUCT_NAME_SIZE 16
Please, can we make it shorter like with the MAC_ADDR? e.g. PRODUCT_NAME_*
#define MAC_ADDR_OFFSET 4 #define MAC_ADDR_OFFSET_LEGACY 0
@@ -149,3 +151,20 @@ u32 cl_eeprom_get_board_rev(uint eeprom_bus)
return board_rev; };
+static char product_name[BOARD_PRODUCT_NAME_SIZE];
That variable does not serve any good purpose...
+char *cl_eeprom_get_product_name(uint eeprom_bus) +{
- if (cl_eeprom_setup(eeprom_bus))
return NULL;
- if (cl_eeprom_read(BOARD_PRODUCT_NAME_OFFSET,
(uchar *)product_name, BOARD_PRODUCT_NAME_SIZE)) {
return NULL;
- }
- /* Protect ourselves from invalid data (unterminated string) */
- product_name[BOARD_PRODUCT_NAME_SIZE - 1] = '\0';
- return product_name;
+}
I'd like to see this function implemented as the cl_eeprom_read_mac_addr() function is.
diff --git a/board/compulab/common/eeprom.h b/board/compulab/common/eeprom.h index e74c379..fceb5df 100644 --- a/board/compulab/common/eeprom.h +++ b/board/compulab/common/eeprom.h @@ -13,6 +13,7 @@ #ifdef CONFIG_SYS_I2C int cl_eeprom_read_mac_addr(uchar *buf, uint eeprom_bus); u32 cl_eeprom_get_board_rev(uint eeprom_bus); +char *cl_eeprom_get_product_name(uint eeprom_bus); #else static inline int cl_eeprom_read_mac_addr(uchar *buf, uint eeprom_bus) { @@ -22,6 +23,10 @@ static inline u32 cl_eeprom_get_board_rev(uint eeprom_bus) { return 0; } +static inline char *cl_eeprom_get_product_name(uint eeprom_bus) +{
- return NULL;
+} #endif
#endif

Old revisions of Utilite (a miniature PC based on cm-fx6) do not have a card detect for mmc, and thus the kernel needs to be told that there's a persistent storage on usdhc3 to force it to probe the mmc card.
Check the baseboard revision and modify the device tree accordingly if needed.
Cc: Stefano Babic sbabic@denx.de Cc: Igor Grinberg grinberg@compulab.co.il Signed-off-by: Nikita Kiryanov nikita@compulab.co.il --- board/compulab/cm_fx6/cm_fx6.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
diff --git a/board/compulab/cm_fx6/cm_fx6.c b/board/compulab/cm_fx6/cm_fx6.c index 572111d..c8e980d 100644 --- a/board/compulab/cm_fx6/cm_fx6.c +++ b/board/compulab/cm_fx6/cm_fx6.c @@ -582,6 +582,10 @@ int cm_fx6_setup_ecspi(void) { return 0; } #ifdef CONFIG_OF_BOARD_SETUP int ft_board_setup(void *blob, bd_t *bd) { + u32 baseboard_rev; + int nodeoffset; + const char *usdhc3_path = "/soc/aips-bus@02100000/usdhc@02198000/"; + char *baseboard_name; uint8_t enetaddr[6];
/* MAC addr */ @@ -596,6 +600,18 @@ int ft_board_setup(void *blob, bd_t *bd) enetaddr, 6, 1); }
+ baseboard_name = cl_eeprom_get_product_name(0); + baseboard_rev = cl_eeprom_get_board_rev(0); + if (!strncmp("SB-FX6m", baseboard_name, 7) && baseboard_rev <= 120) { + fdt_shrink_to_minimum(blob); /* Make room for new properties */ + nodeoffset = fdt_path_offset(blob, usdhc3_path); + fdt_delprop(blob, nodeoffset, "cd-gpios"); + fdt_find_and_setprop(blob, usdhc3_path, "non-removable", + NULL, 0, 1); + fdt_find_and_setprop(blob, usdhc3_path, "keep-power-in-suspend", + NULL, 0, 1); + } + return 0; } #endif

On 09/02/15 19:05, Nikita Kiryanov wrote:
Old revisions of Utilite (a miniature PC based on cm-fx6) do not have a card detect for mmc, and thus the kernel needs to be told that there's a persistent storage on usdhc3 to force it to probe the mmc card.
Check the baseboard revision and modify the device tree accordingly if needed.
Cc: Stefano Babic sbabic@denx.de Cc: Igor Grinberg grinberg@compulab.co.il Signed-off-by: Nikita Kiryanov nikita@compulab.co.il
board/compulab/cm_fx6/cm_fx6.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
diff --git a/board/compulab/cm_fx6/cm_fx6.c b/board/compulab/cm_fx6/cm_fx6.c index 572111d..c8e980d 100644 --- a/board/compulab/cm_fx6/cm_fx6.c +++ b/board/compulab/cm_fx6/cm_fx6.c @@ -582,6 +582,10 @@ int cm_fx6_setup_ecspi(void) { return 0; } #ifdef CONFIG_OF_BOARD_SETUP int ft_board_setup(void *blob, bd_t *bd) {
- u32 baseboard_rev;
- int nodeoffset;
- const char *usdhc3_path = "/soc/aips-bus@02100000/usdhc@02198000/";
I would really like to see this path discovered dynamically... Is it possible? If not, then may be define?
char *baseboard_name; uint8_t enetaddr[6];
/* MAC addr */
@@ -596,6 +600,18 @@ int ft_board_setup(void *blob, bd_t *bd) enetaddr, 6, 1); }
- baseboard_name = cl_eeprom_get_product_name(0);
Once you will change the patch 2/3, this will also need to be changed.
- baseboard_rev = cl_eeprom_get_board_rev(0);
- if (!strncmp("SB-FX6m", baseboard_name, 7) && baseboard_rev <= 120) {
fdt_shrink_to_minimum(blob); /* Make room for new properties */
nodeoffset = fdt_path_offset(blob, usdhc3_path);
fdt_delprop(blob, nodeoffset, "cd-gpios");
fdt_find_and_setprop(blob, usdhc3_path, "non-removable",
NULL, 0, 1);
fdt_find_and_setprop(blob, usdhc3_path, "keep-power-in-suspend",
NULL, 0, 1);
- }
- return 0;
} #endif
participants (2)
-
Igor Grinberg
-
Nikita Kiryanov