[PATCH 0/6] ti: k3-am642: Add daughtercard support

Hi,
This series adds daughtercard detection support for am642-evm.
NAND card support is added.
cheers, -roger
Roger Quadros (6): board: ti: am64x: Recognize AM64-HSEVM board: ti: am64x: Add HSE NAND card detection support arm: dts: k3-am642: Sync main_i2c0 with kernel arm: dts: k3-am642-r5-evm: Add I2C0 and Card detect GPIOs arm: dts: k3-am642: Add I2C GPIO Expander configs: am64x_evm_a53_defconfig: Enable I2C GPIO drivers
arch/arm/dts/k3-am642-evm-u-boot.dtsi | 15 +- arch/arm/dts/k3-am642-evm.dts | 28 ++++ arch/arm/dts/k3-am642-r5-evm.dts | 19 +++ board/ti/am64x/evm.c | 188 +++++++++++++++++++++++++- configs/am64x_evm_a53_defconfig | 4 + 5 files changed, 238 insertions(+), 16 deletions(-)

use "am64x_evm" board name in environment for both AM64-GPEVM and AM64-HSEVM.
Gets rid of "Unidentified board claims AM64-HSEVM in eeprom header"
Signed-off-by: Roger Quadros rogerq@kernel.org --- board/ti/am64x/evm.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/board/ti/am64x/evm.c b/board/ti/am64x/evm.c index 96f4e3013a..42795cbd22 100644 --- a/board/ti/am64x/evm.c +++ b/board/ti/am64x/evm.c @@ -18,7 +18,8 @@
#include "../common/board_detect.h"
-#define board_is_am64x_gpevm() board_ti_k3_is("AM64-GPEVM") +#define board_is_am64x_evm() (board_ti_k3_is("AM64-GPEVM") || \ + board_ti_k3_is("AM64-HSEVM"))
#define board_is_am64x_skevm() (board_ti_k3_is("AM64-SKEVM") || \ board_ti_k3_is("AM64B-SKEVM")) @@ -57,7 +58,7 @@ int board_fit_config_name_match(const char *name) { bool eeprom_read = board_ti_was_eeprom_read();
- if (!eeprom_read || board_is_am64x_gpevm()) { + if (!eeprom_read || board_is_am64x_evm()) { if (!strcmp(name, "k3-am642-r5-evm") || !strcmp(name, "k3-am642-evm")) return 0; } else if (board_is_am64x_skevm()) { @@ -182,13 +183,13 @@ int checkboard(void) #ifdef CONFIG_BOARD_LATE_INIT static void setup_board_eeprom_env(void) { - char *name = "am64x_gpevm"; + char *name = "am64x_evm";
if (do_board_detect()) goto invalid_eeprom;
- if (board_is_am64x_gpevm()) - name = "am64x_gpevm"; + if (board_is_am64x_evm()) + name = "am64x_evm"; else if (board_is_am64x_skevm()) name = "am64x_skevm"; else

On 04/07/2023 21:10, Roger Quadros wrote:
use "am64x_evm" board name in environment for both AM64-GPEVM and AM64-HSEVM.
Gets rid of "Unidentified board claims AM64-HSEVM in eeprom header"
Signed-off-by: Roger Quadros rogerq@kernel.org
board/ti/am64x/evm.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/board/ti/am64x/evm.c b/board/ti/am64x/evm.c index 96f4e3013a..42795cbd22 100644 --- a/board/ti/am64x/evm.c +++ b/board/ti/am64x/evm.c @@ -18,7 +18,8 @@
#include "../common/board_detect.h"
-#define board_is_am64x_gpevm() board_ti_k3_is("AM64-GPEVM") +#define board_is_am64x_evm() (board_ti_k3_is("AM64-GPEVM") || \
board_ti_k3_is("AM64-HSEVM"))
#define board_is_am64x_skevm() (board_ti_k3_is("AM64-SKEVM") || \ board_ti_k3_is("AM64B-SKEVM")) @@ -57,7 +58,7 @@ int board_fit_config_name_match(const char *name) { bool eeprom_read = board_ti_was_eeprom_read();
- if (!eeprom_read || board_is_am64x_gpevm()) {
- if (!eeprom_read || board_is_am64x_evm()) { if (!strcmp(name, "k3-am642-r5-evm") || !strcmp(name, "k3-am642-evm")) return 0; } else if (board_is_am64x_skevm()) {
@@ -182,13 +183,13 @@ int checkboard(void) #ifdef CONFIG_BOARD_LATE_INIT static void setup_board_eeprom_env(void) {
- char *name = "am64x_gpevm";
char *name = "am64x_evm";
if (do_board_detect()) goto invalid_eeprom;
- if (board_is_am64x_gpevm())
name = "am64x_gpevm";
- if (board_is_am64x_evm())
name = "am64x_evm";
"board/ti/am64x/am64x.env: if test $board_name = am64x_gpevm; then"
So I think it was a bad idea to change the name here. Will revert this change.
else if (board_is_am64x_skevm()) name = "am64x_skevm"; else

Add expansion card detection support. Add NAND card detection support.
am64-sk EVM doesn't support daughtercards so let's restrict daughtercard probing to am64-evm.
Signed-off-by: Roger Quadros rogerq@kernel.org --- board/ti/am64x/evm.c | 177 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+)
diff --git a/board/ti/am64x/evm.c b/board/ti/am64x/evm.c index 42795cbd22..a7ddee9d64 100644 --- a/board/ti/am64x/evm.c +++ b/board/ti/am64x/evm.c @@ -11,8 +11,10 @@ #include <asm/io.h> #include <dm/uclass.h> #include <k3-ddrss.h> +#include <net.h> #include <spl.h> #include <fdt_support.h> +#include <asm/gpio.h> #include <asm/arch/hardware.h> #include <env.h>
@@ -24,6 +26,17 @@ #define board_is_am64x_skevm() (board_ti_k3_is("AM64-SKEVM") || \ board_ti_k3_is("AM64B-SKEVM"))
+#define AM64X_MAX_DAUGHTER_CARDS 8 + +/* Daughter card presence detection signals */ +enum { + AM64X_EVM_HSE_BRD_DET, + AM64X_EVM_BRD_DET_COUNT, +}; + +/* Max number of MAC addresses that are parsed/processed per daughter card */ +#define DAUGHTER_CARD_NO_OF_MAC_ADDR 8 + DECLARE_GLOBAL_DATA_PTR;
int board_init(void) @@ -219,10 +232,170 @@ static void setup_serial(void) snprintf(serial_string, sizeof(serial_string), "%016lx", board_serial); env_set("serial#", serial_string); } + #endif #endif
#ifdef CONFIG_BOARD_LATE_INIT +static const char *k3_dtbo_list[AM64X_MAX_DAUGHTER_CARDS] = {NULL}; + +static int init_daughtercard_det_gpio(char *gpio_name, struct gpio_desc *desc) +{ + int ret; + + memset(desc, 0, sizeof(*desc)); + + ret = dm_gpio_lookup_name(gpio_name, desc); + if (ret < 0) { + pr_err("Failed to lookup gpio %s: %d\n", gpio_name, ret); + return ret; + } + + /* Request GPIO, simply re-using the name as label */ + ret = dm_gpio_request(desc, gpio_name); + if (ret < 0) { + pr_err("Failed to request gpio %s: %d\n", gpio_name, ret); + return ret; + } + + return dm_gpio_set_dir_flags(desc, GPIOD_IS_IN); +} + +static int probe_daughtercards(void) +{ + struct ti_am6_eeprom ep; + struct gpio_desc board_det_gpios[AM64X_EVM_BRD_DET_COUNT]; + char mac_addr[DAUGHTER_CARD_NO_OF_MAC_ADDR][TI_EEPROM_HDR_ETH_ALEN]; + u8 mac_addr_cnt; + char name_overlays[1024] = { 0 }; + int i, nb_dtbos = 0; + int ret; + + /* + * Daughter card presence detection signal name to GPIO (via I2C I/O + * expander @ address 0x38) name and EEPROM I2C address mapping. + */ + const struct { + char *gpio_name; + u8 i2c_addr; + } slot_map[AM64X_EVM_BRD_DET_COUNT] = { + { "gpio@38_0", 0x52, }, /* AM64X_EVM_HSE_BRD_DET */ + }; + + /* Declaration of daughtercards to probe */ + const struct { + u8 slot_index; /* Slot the card is installed */ + char *card_name; /* EEPROM-programmed card name */ + char *dtbo_name; /* Device tree overlay to apply */ + u8 eth_offset; /* ethXaddr MAC address index offset */ + } cards[] = { + { + AM64X_EVM_HSE_BRD_DET, + "TMDS64DC02EVM", + "k3-am642-evm-nand.dtbo", + 0, + }, + }; + + /* + * Initialize GPIO used for daughtercard slot presence detection and + * keep the resulting handles in local array for easier access. + */ + for (i = 0; i < AM64X_EVM_BRD_DET_COUNT; i++) { + ret = init_daughtercard_det_gpio(slot_map[i].gpio_name, + &board_det_gpios[i]); + if (ret < 0) + return ret; + } + + memset(k3_dtbo_list, 0, sizeof(k3_dtbo_list)); + for (i = 0; i < ARRAY_SIZE(cards); i++) { + /* Obtain card-specific slot index and associated I2C address */ + u8 slot_index = cards[i].slot_index; + u8 i2c_addr = slot_map[slot_index].i2c_addr; + const char *dtboname; + + /* + * The presence detection signal is active-low, hence skip + * over this card slot if anything other than 0 is returned. + */ + ret = dm_gpio_get_value(&board_det_gpios[slot_index]); + if (ret < 0) + return ret; + else if (ret) + continue; + + /* Get and parse the daughter card EEPROM record */ + ret = ti_i2c_eeprom_am6_get(CONFIG_EEPROM_BUS_ADDRESS, i2c_addr, + &ep, + (char **)mac_addr, + DAUGHTER_CARD_NO_OF_MAC_ADDR, + &mac_addr_cnt); + if (ret) { + pr_err("Reading daughtercard EEPROM at 0x%02x failed %d\n", + i2c_addr, ret); + /* + * Even this is pretty serious let's just skip over + * this particular daughtercard, rather than ending + * the probing process altogether. + */ + continue; + } + + /* Only process the parsed data if we found a match */ + if (strncmp(ep.name, cards[i].card_name, sizeof(ep.name))) + continue; + + printf("Detected: %s rev %s\n", ep.name, ep.version); + +#ifndef CONFIG_SPL_BUILD + int j; + /* + * Populate any MAC addresses from daughtercard into the U-Boot + * environment, starting with a card-specific offset so we can + * have multiple cards contribute to the MAC pool in a well- + * defined manner. + */ + for (j = 0; j < mac_addr_cnt; j++) { + if (!is_valid_ethaddr((u8 *)mac_addr[j])) + continue; + + eth_env_set_enetaddr_by_index("eth", + cards[i].eth_offset + j, + (uchar *)mac_addr[j]); + } +#endif + + /* Skip if no overlays are to be added */ + if (!strlen(cards[i].dtbo_name)) + continue; + + dtboname = cards[i].dtbo_name; + k3_dtbo_list[nb_dtbos++] = dtboname; + + /* + * Make sure we are not running out of buffer space by checking + * if we can fit the new overlay, a trailing space to be used + * as a separator, plus the terminating zero. + */ + if (strlen(name_overlays) + strlen(dtboname) + 2 > + sizeof(name_overlays)) + return -ENOMEM; + + /* Append to our list of overlays */ + strcat(name_overlays, dtboname); + strcat(name_overlays, " "); + } + +#ifndef CONFIG_SPL_BUILD + /* Apply device tree overlay(s) to the U-Boot environment, if any */ + if (strlen(name_overlays)) + return env_set("name_overlays", name_overlays); +#endif + + return 0; +} + int board_late_init(void) { if (IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT)) { @@ -237,6 +410,10 @@ int board_late_init(void) * an index of 1. */ board_ti_am6_set_ethaddr(1, ep->mac_addr_cnt); + + /* Check for and probe any plugged-in daughtercards */ + if (board_is_am64x_evm()) + probe_daughtercards(); }
return 0;

main_i2c0 and pinmux should be in k3-am642-evm.dts. Also add the I2C EEPROM.
Signed-off-by: Roger Quadros rogerq@kernel.org --- arch/arm/dts/k3-am642-evm-u-boot.dtsi | 11 ----------- arch/arm/dts/k3-am642-evm.dts | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/arch/arm/dts/k3-am642-evm-u-boot.dtsi b/arch/arm/dts/k3-am642-evm-u-boot.dtsi index 64857b0909..80c04d0117 100644 --- a/arch/arm/dts/k3-am642-evm-u-boot.dtsi +++ b/arch/arm/dts/k3-am642-evm-u-boot.dtsi @@ -34,21 +34,10 @@
&main_pmx0 { bootph-pre-ram; - main_i2c0_pins_default: main-i2c0-pins-default { - bootph-pre-ram; - pinctrl-single,pins = < - AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */ - AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */ - >; - }; };
&main_i2c0 { - status = "okay"; bootph-pre-ram; - pinctrl-names = "default"; - pinctrl-0 = <&main_i2c0_pins_default>; - clock-frequency = <400000>; };
&main_uart0 { diff --git a/arch/arm/dts/k3-am642-evm.dts b/arch/arm/dts/k3-am642-evm.dts index 39feea78a0..529eb81538 100644 --- a/arch/arm/dts/k3-am642-evm.dts +++ b/arch/arm/dts/k3-am642-evm.dts @@ -233,6 +233,13 @@ >; };
+ main_i2c0_pins_default: main-i2c0-default-pins { + pinctrl-single,pins = < + AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */ + AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */ + >; + }; + main_i2c1_pins_default: main-i2c1-pins-default { pinctrl-single,pins = < AM64X_IOPAD(0x0268, PIN_INPUT_PULLUP, 0) /* (C18) I2C1_SCL */ @@ -335,6 +342,19 @@ status = "reserved"; };
+&main_i2c0 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&main_i2c0_pins_default>; + clock-frequency = <400000>; + + eeprom@50 { + /* AT24CM01 */ + compatible = "atmel,24c1024"; + reg = <0x50>; + }; +}; + &main_i2c1 { status = "okay"; pinctrl-names = "default";

On 21:10-20230704, Roger Quadros wrote:
main_i2c0 and pinmux should be in k3-am642-evm.dts. Also add the I2C EEPROM.
Signed-off-by: Roger Quadros rogerq@kernel.org
arch/arm/dts/k3-am642-evm-u-boot.dtsi | 11 ----------- arch/arm/dts/k3-am642-evm.dts | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/arch/arm/dts/k3-am642-evm-u-boot.dtsi b/arch/arm/dts/k3-am642-evm-u-boot.dtsi index 64857b0909..80c04d0117 100644 --- a/arch/arm/dts/k3-am642-evm-u-boot.dtsi +++ b/arch/arm/dts/k3-am642-evm-u-boot.dtsi @@ -34,21 +34,10 @@
&main_pmx0 { bootph-pre-ram;
- main_i2c0_pins_default: main-i2c0-pins-default {
bootph-pre-ram;
pinctrl-single,pins = <
AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
>;
- };
};
&main_i2c0 {
- status = "okay"; bootph-pre-ram;
- pinctrl-names = "default";
- pinctrl-0 = <&main_i2c0_pins_default>;
- clock-frequency = <400000>;
};
&main_uart0 { diff --git a/arch/arm/dts/k3-am642-evm.dts b/arch/arm/dts/k3-am642-evm.dts index 39feea78a0..529eb81538 100644 --- a/arch/arm/dts/k3-am642-evm.dts +++ b/arch/arm/dts/k3-am642-evm.dts @@ -233,6 +233,13 @@ >; };
- main_i2c0_pins_default: main-i2c0-default-pins {
pinctrl-single,pins = <
AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
>;
- };
- main_i2c1_pins_default: main-i2c1-pins-default { pinctrl-single,pins = < AM64X_IOPAD(0x0268, PIN_INPUT_PULLUP, 0) /* (C18) I2C1_SCL */
@@ -335,6 +342,19 @@ status = "reserved"; };
+&main_i2c0 {
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&main_i2c0_pins_default>;
- clock-frequency = <400000>;
- eeprom@50 {
/* AT24CM01 */
compatible = "atmel,24c1024";
reg = <0x50>;
- };
+};
&main_i2c1 { status = "okay"; pinctrl-names = "default"; -- 2.34.1
We should be getting this change again as part of sync back from kernel.

Hi Nishanth,
On 06/07/2023 15:38, Nishanth Menon wrote:
On 21:10-20230704, Roger Quadros wrote:
main_i2c0 and pinmux should be in k3-am642-evm.dts. Also add the I2C EEPROM.
Signed-off-by: Roger Quadros rogerq@kernel.org
arch/arm/dts/k3-am642-evm-u-boot.dtsi | 11 ----------- arch/arm/dts/k3-am642-evm.dts | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/arch/arm/dts/k3-am642-evm-u-boot.dtsi b/arch/arm/dts/k3-am642-evm-u-boot.dtsi index 64857b0909..80c04d0117 100644 --- a/arch/arm/dts/k3-am642-evm-u-boot.dtsi +++ b/arch/arm/dts/k3-am642-evm-u-boot.dtsi @@ -34,21 +34,10 @@
&main_pmx0 { bootph-pre-ram;
- main_i2c0_pins_default: main-i2c0-pins-default {
bootph-pre-ram;
pinctrl-single,pins = <
AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
>;
- };
};
&main_i2c0 {
- status = "okay"; bootph-pre-ram;
- pinctrl-names = "default";
- pinctrl-0 = <&main_i2c0_pins_default>;
- clock-frequency = <400000>;
};
&main_uart0 { diff --git a/arch/arm/dts/k3-am642-evm.dts b/arch/arm/dts/k3-am642-evm.dts index 39feea78a0..529eb81538 100644 --- a/arch/arm/dts/k3-am642-evm.dts +++ b/arch/arm/dts/k3-am642-evm.dts @@ -233,6 +233,13 @@ >; };
- main_i2c0_pins_default: main-i2c0-default-pins {
pinctrl-single,pins = <
AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
>;
- };
- main_i2c1_pins_default: main-i2c1-pins-default { pinctrl-single,pins = < AM64X_IOPAD(0x0268, PIN_INPUT_PULLUP, 0) /* (C18) I2C1_SCL */
@@ -335,6 +342,19 @@ status = "reserved"; };
+&main_i2c0 {
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&main_i2c0_pins_default>;
- clock-frequency = <400000>;
- eeprom@50 {
/* AT24CM01 */
compatible = "atmel,24c1024";
reg = <0x50>;
- };
+};
&main_i2c1 { status = "okay"; pinctrl-names = "default"; -- 2.34.1
We should be getting this change again as part of sync back from kernel.
Got it.
Adding the EEPROM node causes I2C timeout error prints like below. Any clue why that would be the case?
Timed out in wait_for_event: status=0000 Check if pads/pull-ups of bus are properly configured EEPROM not available at 0x50, trying to read at 0x51 Timed out in wait_for_event: status=0000 Check if pads/pull-ups of bus are properly configured Reading on-board EEPROM at 0x51 failed -121

On 17:13-20230706, Roger Quadros wrote:
Hi Nishanth,
On 06/07/2023 15:38, Nishanth Menon wrote:
On 21:10-20230704, Roger Quadros wrote:
main_i2c0 and pinmux should be in k3-am642-evm.dts. Also add the I2C EEPROM.
Signed-off-by: Roger Quadros rogerq@kernel.org
arch/arm/dts/k3-am642-evm-u-boot.dtsi | 11 ----------- arch/arm/dts/k3-am642-evm.dts | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/arch/arm/dts/k3-am642-evm-u-boot.dtsi b/arch/arm/dts/k3-am642-evm-u-boot.dtsi index 64857b0909..80c04d0117 100644 --- a/arch/arm/dts/k3-am642-evm-u-boot.dtsi +++ b/arch/arm/dts/k3-am642-evm-u-boot.dtsi @@ -34,21 +34,10 @@
&main_pmx0 { bootph-pre-ram;
- main_i2c0_pins_default: main-i2c0-pins-default {
bootph-pre-ram;
pinctrl-single,pins = <
AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
>;
- };
};
&main_i2c0 {
- status = "okay"; bootph-pre-ram;
- pinctrl-names = "default";
- pinctrl-0 = <&main_i2c0_pins_default>;
- clock-frequency = <400000>;
};
&main_uart0 { diff --git a/arch/arm/dts/k3-am642-evm.dts b/arch/arm/dts/k3-am642-evm.dts index 39feea78a0..529eb81538 100644 --- a/arch/arm/dts/k3-am642-evm.dts +++ b/arch/arm/dts/k3-am642-evm.dts @@ -233,6 +233,13 @@ >; };
- main_i2c0_pins_default: main-i2c0-default-pins {
pinctrl-single,pins = <
AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
>;
- };
- main_i2c1_pins_default: main-i2c1-pins-default { pinctrl-single,pins = < AM64X_IOPAD(0x0268, PIN_INPUT_PULLUP, 0) /* (C18) I2C1_SCL */
@@ -335,6 +342,19 @@ status = "reserved"; };
+&main_i2c0 {
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&main_i2c0_pins_default>;
- clock-frequency = <400000>;
- eeprom@50 {
/* AT24CM01 */
compatible = "atmel,24c1024";
reg = <0x50>;
- };
+};
&main_i2c1 { status = "okay"; pinctrl-names = "default"; -- 2.34.1
We should be getting this change again as part of sync back from kernel.
Got it.
Adding the EEPROM node causes I2C timeout error prints like below. Any clue why that would be the case?
Timed out in wait_for_event: status=0000 Check if pads/pull-ups of bus are properly configured EEPROM not available at 0x50, trying to read at 0x51 Timed out in wait_for_event: status=0000 Check if pads/pull-ups of bus are properly configured Reading on-board EEPROM at 0x51 failed -121
https://lore.kernel.org/all/20230414073328.381336-7-nm@ti.com/ https://gist.github.com/nmenon/6b09f55251225d3f3cce076c32a33bba#file-am64-ev...
Seems to work for me in kernel - u-boot we will need to debug a bit. it has been a massive pain in the backend to deal with the mix of mis-behaving eeproms so far (whack-a-mole).. :(

Card detect GPIOs are on I2C GPIO Expander on I2C0. Enable I2C0 and GPIO Expander for r5-evm.
Signed-off-by: Roger Quadros rogerq@kernel.org --- arch/arm/dts/k3-am642-r5-evm.dts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/arch/arm/dts/k3-am642-r5-evm.dts b/arch/arm/dts/k3-am642-r5-evm.dts index e870492a69..01b4a61852 100644 --- a/arch/arm/dts/k3-am642-r5-evm.dts +++ b/arch/arm/dts/k3-am642-r5-evm.dts @@ -209,6 +209,13 @@ AM64X_IOPAD(0x0144, PIN_OUTPUT, 4) /* (Y11) PRG1_PRU1_GPO15.RGMII2_TX_CTL */ >; }; + + main_i2c0_pins_default: main-i2c0-default-pins { + pinctrl-single,pins = < + AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */ + AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */ + >; + }; };
&dmsc { @@ -267,6 +274,18 @@ /* EEPROM might be read before SYSFW is available */ &main_i2c0 { /delete-property/ power-domains; + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&main_i2c0_pins_default>; + clock-frequency = <400000>; + + tca9554: gpio@38 { + /* TCA9554 */ + compatible = "nxp,pca9554"; + reg = <0x38>; + gpio-controller; + #gpio-cells = <2>; + }; };
&usbss0 {

On 21:10-20230704, Roger Quadros wrote:
Card detect GPIOs are on I2C GPIO Expander on I2C0. Enable I2C0 and GPIO Expander for r5-evm.
Signed-off-by: Roger Quadros rogerq@kernel.org
arch/arm/dts/k3-am642-r5-evm.dts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/arch/arm/dts/k3-am642-r5-evm.dts b/arch/arm/dts/k3-am642-r5-evm.dts index e870492a69..01b4a61852 100644 --- a/arch/arm/dts/k3-am642-r5-evm.dts +++ b/arch/arm/dts/k3-am642-r5-evm.dts @@ -209,6 +209,13 @@ AM64X_IOPAD(0x0144, PIN_OUTPUT, 4) /* (Y11) PRG1_PRU1_GPO15.RGMII2_TX_CTL */ >; };
- main_i2c0_pins_default: main-i2c0-default-pins {
pinctrl-single,pins = <
AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
>;
- };
};
&dmsc { @@ -267,6 +274,18 @@ /* EEPROM might be read before SYSFW is available */ &main_i2c0 { /delete-property/ power-domains;
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&main_i2c0_pins_default>;
- clock-frequency = <400000>;
- tca9554: gpio@38 {
/* TCA9554 */
compatible = "nxp,pca9554";
reg = <0x38>;
gpio-controller;
#gpio-cells = <2>;
};
};
&usbss0 {
2.34.1
NAK - Upstream kernel first please, we should get this change as part of sync from kernel.

The I2C GPIO expander at address 0x38 is used for card detect GPIOs.
Signed-off-by: Roger Quadros rogerq@kernel.org --- arch/arm/dts/k3-am642-evm-u-boot.dtsi | 4 ++++ arch/arm/dts/k3-am642-evm.dts | 8 ++++++++ 2 files changed, 12 insertions(+)
diff --git a/arch/arm/dts/k3-am642-evm-u-boot.dtsi b/arch/arm/dts/k3-am642-evm-u-boot.dtsi index 80c04d0117..f274d11697 100644 --- a/arch/arm/dts/k3-am642-evm-u-boot.dtsi +++ b/arch/arm/dts/k3-am642-evm-u-boot.dtsi @@ -40,6 +40,10 @@ bootph-pre-ram; };
+&tca9554 { + bootph-pre-ram; +}; + &main_uart0 { bootph-pre-ram; }; diff --git a/arch/arm/dts/k3-am642-evm.dts b/arch/arm/dts/k3-am642-evm.dts index 529eb81538..bc7e6f29b0 100644 --- a/arch/arm/dts/k3-am642-evm.dts +++ b/arch/arm/dts/k3-am642-evm.dts @@ -353,6 +353,14 @@ compatible = "atmel,24c1024"; reg = <0x50>; }; + + tca9554: gpio@38 { + /* TCA9554 */ + compatible = "nxp,pca9554"; + reg = <0x38>; + gpio-controller; + #gpio-cells = <2>; + }; };
&main_i2c1 {

We need the I2C GPIO drivers to detect expansion cards.
Signed-off-by: Roger Quadros rogerq@kernel.org --- configs/am64x_evm_a53_defconfig | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/configs/am64x_evm_a53_defconfig b/configs/am64x_evm_a53_defconfig index 4589624e96..3a8d2ed3b6 100644 --- a/configs/am64x_evm_a53_defconfig +++ b/configs/am64x_evm_a53_defconfig @@ -105,7 +105,11 @@ CONFIG_SYS_DFU_MAX_FILE_SIZE=0x800000 CONFIG_DMA_CHANNELS=y CONFIG_TI_K3_NAVSS_UDMA=y CONFIG_TI_SCI_PROTOCOL=y +CONFIG_DM_PCA953X=y +CONFIG_SPL_DM_PCA953X=y CONFIG_DM_I2C=y +CONFIG_I2C_SET_DEFAULT_BUS_NUM=y +CONFIG_DM_I2C_GPIO=y CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y
participants (2)
-
Nishanth Menon
-
Roger Quadros