From 50540ed594ab7c7f6c60fd4522f76765da21ff3a Mon Sep 17 00:00:00 2001 From: Aymeric Aillet Date: Mon, 6 Dec 2021 15:59:40 +0100 Subject: [PATCH] driver: i2c: TCA9546A: Rename to TCA954x Prepare the driver to upcoming support of more mux references. Rename all TCA9546A related files to TCA954x. Keep ti,tca9546a and ti,tca9546a-channel compatible for backward compatibility reasons. New tca954x-base binding embedding common properties, tca9546a binding inherits from it and define its own compatibles fields. Signed-off-by: Aymeric Aillet --- CODEOWNERS | 2 +- drivers/i2c/CMakeLists.txt | 2 +- drivers/i2c/Kconfig | 2 +- drivers/i2c/Kconfig.tca9546a | 19 -- drivers/i2c/Kconfig.tca954x | 19 ++ drivers/i2c/i2c_tca9546a.c | 168 ----------------- drivers/i2c/i2c_tca954x.c | 178 ++++++++++++++++++ dts/bindings/i2c/ti,tca9546a.yaml | 42 +---- dts/bindings/i2c/ti,tca954x-base.yaml | 52 +++++ .../CMakeLists.txt | 2 +- .../boards/nrf52840dk_nrf52840.overlay | 6 +- .../{i2c_tca9546a => i2c_tca954x}/prj.conf | 2 +- .../{i2c_tca9546a => i2c_tca954x}/src/main.c | 4 +- .../testcase.yaml | 0 14 files changed, 261 insertions(+), 237 deletions(-) delete mode 100644 drivers/i2c/Kconfig.tca9546a create mode 100644 drivers/i2c/Kconfig.tca954x delete mode 100644 drivers/i2c/i2c_tca9546a.c create mode 100644 drivers/i2c/i2c_tca954x.c create mode 100644 dts/bindings/i2c/ti,tca954x-base.yaml rename tests/drivers/i2c/{i2c_tca9546a => i2c_tca954x}/CMakeLists.txt (90%) rename tests/drivers/i2c/{i2c_tca9546a => i2c_tca954x}/boards/nrf52840dk_nrf52840.overlay (94%) rename tests/drivers/i2c/{i2c_tca9546a => i2c_tca954x}/prj.conf (56%) rename tests/drivers/i2c/{i2c_tca9546a => i2c_tca954x}/src/main.c (94%) rename tests/drivers/i2c/{i2c_tca9546a => i2c_tca954x}/testcase.yaml (100%) diff --git a/CODEOWNERS b/CODEOWNERS index bde68572b59..4042c83460d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -387,7 +387,7 @@ /drivers/i2c/i2c_rv32m1_lpi2c* @henrikbrixandersen /drivers/i2c/*sam0* @Sizurka /drivers/i2c/i2c_dw* @dcpleung -/drivers/i2c/*tca9546a* @kurddt +/drivers/i2c/*tca954x* @kurddt /drivers/*/*xec* @franciscomunoz @albertofloyd @scottwcpg /drivers/watchdog/*gecko* @oanerer /drivers/watchdog/*sifive* @katsuster diff --git a/drivers/i2c/CMakeLists.txt b/drivers/i2c/CMakeLists.txt index 5fc594d0027..5d5cc86a886 100644 --- a/drivers/i2c/CMakeLists.txt +++ b/drivers/i2c/CMakeLists.txt @@ -34,7 +34,7 @@ zephyr_library_sources_ifdef(CONFIG_I2C_NPCX i2c_npcx_controller.c) zephyr_library_sources_ifdef(CONFIG_I2C_NPCX i2c_npcx_port.c) zephyr_library_sources_ifdef(CONFIG_I2C_DW i2c_dw.c) zephyr_library_sources_ifdef(CONFIG_I2C_RCAR i2c_rcar.c) -zephyr_library_sources_ifdef(CONFIG_I2C_TCA9546A i2c_tca9546a.c) +zephyr_library_sources_ifdef(CONFIG_I2C_TCA954X i2c_tca954x.c) zephyr_library_sources_ifdef(CONFIG_I2C_XEC_V2 i2c_mchp_xec_v2.c) zephyr_library_sources_ifdef(CONFIG_I2C_STM32_V1 diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig index b9358f70b4f..339ff07de25 100644 --- a/drivers/i2c/Kconfig +++ b/drivers/i2c/Kconfig @@ -49,7 +49,7 @@ source "drivers/i2c/Kconfig.lpc11u6x" source "drivers/i2c/Kconfig.npcx" source "drivers/i2c/Kconfig.test" source "drivers/i2c/Kconfig.rcar" -source "drivers/i2c/Kconfig.tca9546a" +source "drivers/i2c/Kconfig.tca954x" config I2C_INIT_PRIORITY int "Init priority" diff --git a/drivers/i2c/Kconfig.tca9546a b/drivers/i2c/Kconfig.tca9546a deleted file mode 100644 index b2b26fcf4ff..00000000000 --- a/drivers/i2c/Kconfig.tca9546a +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2020 Innoseis BV -# SPDX-License-Identifier: Apache-2.0 - -menuconfig I2C_TCA9546A - bool "I2C addressable switch" - help - Enable TCA9546A i2C bus switch - -if I2C_TCA9546A - -config I2C_TCA9546_ROOT_INIT_PRIO - int "TCA9546a root driver init priority" - default I2C_INIT_PRIORITY - -config I2C_TCA9546_CHANNEL_INIT_PRIO - int "TCA9546a channel driver init priority" - default I2C_INIT_PRIORITY - -endif diff --git a/drivers/i2c/Kconfig.tca954x b/drivers/i2c/Kconfig.tca954x new file mode 100644 index 00000000000..93d56bc20d5 --- /dev/null +++ b/drivers/i2c/Kconfig.tca954x @@ -0,0 +1,19 @@ +# Copyright (c) 2020 Innoseis BV +# SPDX-License-Identifier: Apache-2.0 + +menuconfig I2C_TCA954X + bool "I2C addressable switch" + help + Enable TCA954x series I2C bus switch + +if I2C_TCA954X + +config I2C_TCA954X_ROOT_INIT_PRIO + int "TCA954x root driver init priority" + default I2C_INIT_PRIORITY + +config I2C_TCA954X_CHANNEL_INIT_PRIO + int "TCA954x channel driver init priority" + default I2C_INIT_PRIORITY + +endif diff --git a/drivers/i2c/i2c_tca9546a.c b/drivers/i2c/i2c_tca9546a.c deleted file mode 100644 index 1f0d6cec9b0..00000000000 --- a/drivers/i2c/i2c_tca9546a.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2020 Innoseis BV - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#define DT_DRV_COMPAT ti_tca9546a - -#include -#include -#include -#include -#include -#include - -LOG_MODULE_REGISTER(tca9546a, CONFIG_I2C_LOG_LEVEL); - -#define MAX_CHANNEL_MASK BIT_MASK(4) - -struct tca9546a_root_config { - const struct device *bus; - uint16_t slave_addr; -}; - -struct tca9546a_root_data { - struct k_mutex lock; - uint8_t selected_chan; -}; - -struct tca9546a_channel_config { - const struct device *root; - uint8_t chan_mask; -}; - -static inline struct tca9546a_root_data * -get_root_data_from_channel(const struct device *dev) -{ - const struct tca9546a_channel_config *channel_config = dev->config; - - return channel_config->root->data; -} - -static inline const struct tca9546a_root_config * -get_root_config_from_channel(const struct device *dev) -{ - const struct tca9546a_channel_config *channel_config = dev->config; - - return channel_config->root->config; -} - -static int tca9546a_configure(const struct device *dev, uint32_t dev_config) -{ - const struct tca9546a_root_config *cfg = get_root_config_from_channel( - dev); - - return i2c_configure(cfg->bus, dev_config); -} - -static int tca9546a_set_channel(const struct device *dev, uint8_t select_mask) -{ - int res = 0; - struct tca9546a_root_data *data = dev->data; - const struct tca9546a_root_config *cfg = dev->config; - - if (data->selected_chan != select_mask) { - res = i2c_write(cfg->bus, &select_mask, 1, cfg->slave_addr); - if (res == 0) { - data->selected_chan = select_mask; - } - } - return res; -} - -static int tca9546a_transfer(const struct device *dev, - struct i2c_msg *msgs, - uint8_t num_msgs, - uint16_t addr) -{ - struct tca9546a_root_data *data = get_root_data_from_channel(dev); - const struct tca9546a_root_config *config = get_root_config_from_channel( - dev); - const struct tca9546a_channel_config *down_cfg = dev->config; - int res; - - res = k_mutex_lock(&data->lock, K_MSEC(5000)); - if (res != 0) { - return res; - } - - res = tca9546a_set_channel(down_cfg->root, down_cfg->chan_mask); - if (res != 0) { - goto end_trans; - } - - res = i2c_transfer(config->bus, msgs, num_msgs, addr); - -end_trans: - k_mutex_unlock(&data->lock); - return res; -} - -static int tca9546_root_init(const struct device *dev) -{ - struct tca9546a_root_data *i2c_tca9546a = dev->data; - const struct tca9546a_root_config *config = dev->config; - - if (!device_is_ready(config->bus)) { - LOG_ERR("I2C bus %s not ready", config->bus->name); - return -ENODEV; - } - - i2c_tca9546a->selected_chan = 0; - - return 0; -} - -static int tca9546a_channel_init(const struct device *dev) -{ - const struct tca9546a_channel_config *cfg = dev->config; - - if (!device_is_ready(cfg->root)) { - LOG_ERR("I2C mux root %s not ready", cfg->root->name); - return -ENODEV; - } - - if (cfg->chan_mask > MAX_CHANNEL_MASK) { - LOG_ERR("Wrong DTS address provided for %s", dev->name); - return -EINVAL; - } - - return 0; -} - -const struct i2c_driver_api tca9546a_api_funcs = { - .configure = tca9546a_configure, - .transfer = tca9546a_transfer, -}; - -#define TCA9546A_CHILD_DEFINE(node_id) \ - static const struct tca9546a_channel_config \ - tca9546a_down_config_##node_id = { \ - .chan_mask = BIT(DT_REG_ADDR(node_id)), \ - .root = DEVICE_DT_GET(DT_PARENT(node_id)), \ - }; \ - DEVICE_DT_DEFINE(node_id, \ - tca9546a_channel_init, \ - NULL, \ - NULL, \ - &tca9546a_down_config_##node_id, \ - POST_KERNEL, CONFIG_I2C_TCA9546_CHANNEL_INIT_PRIO, \ - &tca9546a_api_funcs); - -#define TCA9546A_ROOT_CHILD_DEFINE(inst) \ - static const struct tca9546a_root_config tca9546a_cfg_##inst = { \ - .slave_addr = DT_INST_REG_ADDR(inst), \ - .bus = DEVICE_DT_GET(DT_INST_BUS(inst)) \ - }; \ - static struct tca9546a_root_data tca9546a_data_##inst = { \ - .lock = Z_MUTEX_INITIALIZER(tca9546a_data_##inst.lock), \ - }; \ - I2C_DEVICE_DT_INST_DEFINE(inst, \ - tca9546_root_init, NULL, \ - &tca9546a_data_##inst, &tca9546a_cfg_##inst, \ - POST_KERNEL, CONFIG_I2C_TCA9546_ROOT_INIT_PRIO, \ - NULL); \ - DT_INST_FOREACH_CHILD(inst, TCA9546A_CHILD_DEFINE); - -DT_INST_FOREACH_STATUS_OKAY(TCA9546A_ROOT_CHILD_DEFINE) diff --git a/drivers/i2c/i2c_tca954x.c b/drivers/i2c/i2c_tca954x.c new file mode 100644 index 00000000000..69510dd2b4b --- /dev/null +++ b/drivers/i2c/i2c_tca954x.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2020 Innoseis BV + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include + +LOG_MODULE_REGISTER(tca954x, CONFIG_I2C_LOG_LEVEL); + +struct tca954x_root_config { + const struct device *bus; + uint16_t slave_addr; + uint8_t nchans; +}; + +struct tca954x_root_data { + struct k_mutex lock; + uint8_t selected_chan; +}; + +struct tca954x_channel_config { + const struct device *root; + uint8_t chan_mask; +}; + +static inline struct tca954x_root_data * +get_root_data_from_channel(const struct device *dev) +{ + const struct tca954x_channel_config *channel_config = dev->config; + + return channel_config->root->data; +} + +static inline const struct tca954x_root_config * +get_root_config_from_channel(const struct device *dev) +{ + const struct tca954x_channel_config *channel_config = dev->config; + + return channel_config->root->config; +} + +static int tca954x_configure(const struct device *dev, uint32_t dev_config) +{ + const struct tca954x_root_config *cfg = + get_root_config_from_channel(dev); + + return i2c_configure(cfg->bus, dev_config); +} + +static int tca954x_set_channel(const struct device *dev, uint8_t select_mask) +{ + int res = 0; + struct tca954x_root_data *data = dev->data; + const struct tca954x_root_config *cfg = dev->config; + + /* Only select the channel if its different from the last channel */ + if (data->selected_chan != select_mask) { + res = i2c_write(cfg->bus, &select_mask, 1, cfg->slave_addr); + if (res == 0) { + data->selected_chan = select_mask; + } else { + LOG_DBG("tca954x: failed to set channel"); + } + } + return res; +} + +static int tca954x_transfer(const struct device *dev, + struct i2c_msg *msgs, + uint8_t num_msgs, + uint16_t addr) +{ + struct tca954x_root_data *data = get_root_data_from_channel(dev); + const struct tca954x_root_config *config = + get_root_config_from_channel(dev); + const struct tca954x_channel_config *down_cfg = dev->config; + int res; + + res = k_mutex_lock(&data->lock, K_MSEC(5000)); + if (res != 0) { + return res; + } + + res = tca954x_set_channel(down_cfg->root, down_cfg->chan_mask); + if (res != 0) { + goto end_trans; + } + + res = i2c_transfer(config->bus, msgs, num_msgs, addr); + +end_trans: + k_mutex_unlock(&data->lock); + return res; +} + +static int tca954x_root_init(const struct device *dev) +{ + struct tca954x_root_data *i2c_tca954x = dev->data; + const struct tca954x_root_config *config = dev->config; + + if (!device_is_ready(config->bus)) { + LOG_ERR("I2C bus %s not ready", config->bus->name); + return -ENODEV; + } + + i2c_tca954x->selected_chan = 0; + + return 0; +} + +static int tca954x_channel_init(const struct device *dev) +{ + const struct tca954x_channel_config *chan_cfg = dev->config; + const struct tca954x_root_config *root_cfg = + get_root_config_from_channel(dev); + + if (!device_is_ready(chan_cfg->root)) { + LOG_ERR("I2C mux root %s not ready", chan_cfg->root->name); + return -ENODEV; + } + + if (chan_cfg->chan_mask >= BIT(root_cfg->nchans)) { + LOG_ERR("Wrong DTS address provided for %s", dev->name); + return -EINVAL; + } + + return 0; +} + +const struct i2c_driver_api tca954x_api_funcs = { + .configure = tca954x_configure, + .transfer = tca954x_transfer, +}; + +#define TCA954x_CHILD_DEFINE(node_id, n) \ + static const struct tca954x_channel_config \ + tca##n##a_down_config_##node_id = { \ + .chan_mask = BIT(DT_REG_ADDR(node_id)), \ + .root = DEVICE_DT_GET(DT_PARENT(node_id)), \ + }; \ + DEVICE_DT_DEFINE(node_id, \ + tca954x_channel_init, \ + NULL, \ + NULL, \ + &tca##n##a_down_config_##node_id, \ + POST_KERNEL, CONFIG_I2C_TCA954X_CHANNEL_INIT_PRIO, \ + &tca954x_api_funcs); + +#define TCA954x_ROOT_DEFINE(n, inst, ch) \ + static const struct tca954x_root_config tca##n##a_cfg_##inst = { \ + .slave_addr = DT_REG_ADDR_BY_IDX(DT_INST(inst, ti_tca##n##a), 0), \ + .bus = DEVICE_DT_GET(DT_BUS(DT_INST(inst, ti_tca##n##a))), \ + .nchans = ch, \ + }; \ + static struct tca954x_root_data tca##n##a_data_##inst = { \ + .lock = Z_MUTEX_INITIALIZER(tca##n##a_data_##inst.lock), \ + }; \ + I2C_DEVICE_DT_DEFINE(DT_INST(inst, ti_tca##n##a), \ + tca954x_root_init, NULL, \ + &tca##n##a_data_##inst, &tca##n##a_cfg_##inst, \ + POST_KERNEL, CONFIG_I2C_TCA954X_ROOT_INIT_PRIO, \ + NULL); \ + DT_FOREACH_CHILD_VARGS(DT_INST(inst, ti_tca##n##a), TCA954x_CHILD_DEFINE, n); + +/* + * TCA9546A: 4 channels + */ +#define TCA9546A_INIT(n) TCA954x_ROOT_DEFINE(9546, n, 4) +#undef DT_DRV_COMPAT +#define DT_DRV_COMPAT ti_tca9546a +DT_INST_FOREACH_STATUS_OKAY(TCA9546A_INIT) diff --git a/dts/bindings/i2c/ti,tca9546a.yaml b/dts/bindings/i2c/ti,tca9546a.yaml index f330aaaa258..1e0bb69d5fb 100644 --- a/dts/bindings/i2c/ti,tca9546a.yaml +++ b/dts/bindings/i2c/ti,tca9546a.yaml @@ -1,46 +1,10 @@ -# Copyright (c) 2020, Innoseis BV -# SPDX-License-Identifier: Apache-2.0 +#Binding for TI TCA9546A, compatible with NXP PCA9546A -description: | - TCA9546a I2C switch - - Each channel is represented by a separate devicetree child node - with a "ti,tca9546a-channel" compatible. - The channel node can then be used as a standard i2c bus controller - like in the following simplified example: - - /* The tca9546a node must be a child of an i2c controller */ - mux: tca9546a@77 { - compatible = "ti,tca9546a"; - reg = <0x77>; - - mux_i2c@0 { - compatible = "ti,tca9546a-channel"; - reg = <0>; - - temp_sens_0: tmp116@49 { - compatible = "ti,tmp116"; - reg = <0x49>; - }; - }; - - mux_i2c@1 { - compatible = "ti,tca9546a-channel"; - reg = <1>; - - temp_sens_1: tmp116@49 { - compatible = "ti,tmp116"; - reg = <0x49>; - }; - }; - }; +description: Texas Instruments TCA9546A binding compatible: "ti,tca9546a" -include: [i2c-device.yaml] +include: ti,tca954x-base.yaml child-binding: - description: TCA9546a I2C switch channel node compatible: "ti,tca9546a-channel" - include: [i2c-controller.yaml] - on-bus: i2c diff --git a/dts/bindings/i2c/ti,tca954x-base.yaml b/dts/bindings/i2c/ti,tca954x-base.yaml new file mode 100644 index 00000000000..a6f0f64c7f7 --- /dev/null +++ b/dts/bindings/i2c/ti,tca954x-base.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2020, Innoseis BV +# SPDX-License-Identifier: Apache-2.0 + +# Common fields for TI TCA954X I2C mux family + +description: | + TCA954x I2C switch + + Each channel is represented by a separate devicetree child node. + The channel node can then be used as a standard i2c bus controller + like in the following simplified example: + + /* The tca954x node must be a child of an i2c controller */ + mux: tca9546a@77 { + compatible = "ti,tca9546a"; + reg = <0x77>; + status = "okay"; + label = "i2c_mux"; + #address-cells = <1>; + #size-cells = <0>; + + mux_i2c@0 { + compatible: "ti,tca9546a-channel" + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + temp_sens_0: tmp116@49 { + compatible = "ti,tmp116"; + reg = <0x49>; + }; + }; + + mux_i2c@1 { + compatible: "ti,tca9546a-channel" + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + + temp_sens_1: tmp116@49 { + compatible = "ti,tmp116"; + reg = <0x49>; + }; + }; + }; + +include: [i2c-device.yaml] + +child-binding: + description: TCA954x I2C switch channel node + include: [i2c-controller.yaml] + on-bus: i2c diff --git a/tests/drivers/i2c/i2c_tca9546a/CMakeLists.txt b/tests/drivers/i2c/i2c_tca954x/CMakeLists.txt similarity index 90% rename from tests/drivers/i2c/i2c_tca9546a/CMakeLists.txt rename to tests/drivers/i2c/i2c_tca954x/CMakeLists.txt index 695bfe2eaf0..d6509b51d8b 100644 --- a/tests/drivers/i2c/i2c_tca9546a/CMakeLists.txt +++ b/tests/drivers/i2c/i2c_tca954x/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.20.0) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) -project(i2c_tca9546a) +project(i2c_tca954x) FILE(GLOB app_sources src/*.c) target_sources(app PRIVATE ${app_sources}) diff --git a/tests/drivers/i2c/i2c_tca9546a/boards/nrf52840dk_nrf52840.overlay b/tests/drivers/i2c/i2c_tca954x/boards/nrf52840dk_nrf52840.overlay similarity index 94% rename from tests/drivers/i2c/i2c_tca9546a/boards/nrf52840dk_nrf52840.overlay rename to tests/drivers/i2c/i2c_tca954x/boards/nrf52840dk_nrf52840.overlay index 4ca2f5f7bef..50837878141 100644 --- a/tests/drivers/i2c/i2c_tca9546a/boards/nrf52840dk_nrf52840.overlay +++ b/tests/drivers/i2c/i2c_tca954x/boards/nrf52840dk_nrf52840.overlay @@ -15,21 +15,19 @@ #size-cells = <0>; ch0: mux_i2c@0 { + compatible = "ti,tca9546a-channel"; label = "mux_dw_0"; reg = <0>; - status = "okay"; #address-cells = <1>; #size-cells = <0>; - compatible = "ti,tca9546a-channel"; }; ch1: mux_i2c@1 { + compatible = "ti,tca9546a-channel"; label = "mux_dw_1"; reg = <1>; - status = "okay"; #address-cells = <1>; #size-cells = <0>; - compatible = "ti,tca9546a-channel"; }; }; }; diff --git a/tests/drivers/i2c/i2c_tca9546a/prj.conf b/tests/drivers/i2c/i2c_tca954x/prj.conf similarity index 56% rename from tests/drivers/i2c/i2c_tca9546a/prj.conf rename to tests/drivers/i2c/i2c_tca954x/prj.conf index b5cd44eae2a..092868e9eb7 100644 --- a/tests/drivers/i2c/i2c_tca9546a/prj.conf +++ b/tests/drivers/i2c/i2c_tca954x/prj.conf @@ -1,3 +1,3 @@ CONFIG_ZTEST=y CONFIG_I2C=y -CONFIG_I2C_TCA9546A=y +CONFIG_I2C_TCA954X=y diff --git a/tests/drivers/i2c/i2c_tca9546a/src/main.c b/tests/drivers/i2c/i2c_tca954x/src/main.c similarity index 94% rename from tests/drivers/i2c/i2c_tca9546a/src/main.c rename to tests/drivers/i2c/i2c_tca954x/src/main.c index e9a196fe3e7..850e5822541 100644 --- a/tests/drivers/i2c/i2c_tca9546a/src/main.c +++ b/tests/drivers/i2c/i2c_tca954x/src/main.c @@ -31,7 +31,7 @@ * This test verifies various assert macros provided by ztest. * */ -static void test_tca9546a(void) +static void test_tca954x(void) { uint8_t buff[1]; @@ -48,7 +48,7 @@ static void test_tca9546a(void) void test_main(void) { ztest_test_suite(framework_tests, - ztest_unit_test(test_tca9546a) + ztest_unit_test(test_tca954x) ); ztest_run_test_suite(framework_tests); diff --git a/tests/drivers/i2c/i2c_tca9546a/testcase.yaml b/tests/drivers/i2c/i2c_tca954x/testcase.yaml similarity index 100% rename from tests/drivers/i2c/i2c_tca9546a/testcase.yaml rename to tests/drivers/i2c/i2c_tca954x/testcase.yaml