From f9705969b7e97cf5edf260f66a4e0499142e76b8 Mon Sep 17 00:00:00 2001 From: Duy Nguyen Date: Fri, 25 Oct 2024 11:47:59 +0700 Subject: [PATCH] drivers: mdio: Initial support for renesas RA mdio driver Add support for mdio driver for Renesas RA MCU series This support utilize the r_ether_phy driver in hal renesas to support mdio write and read function Signed-off-by: Duy Nguyen --- drivers/mdio/CMakeLists.txt | 1 + drivers/mdio/Kconfig | 1 + drivers/mdio/Kconfig.renesas_ra | 11 +++ drivers/mdio/mdio_renesas_ra.c | 123 +++++++++++++++++++++++++ dts/bindings/mdio/renesas,ra-mdio.yaml | 15 +++ modules/Kconfig.renesas_fsp | 5 + 6 files changed, 156 insertions(+) create mode 100644 drivers/mdio/Kconfig.renesas_ra create mode 100644 drivers/mdio/mdio_renesas_ra.c create mode 100644 dts/bindings/mdio/renesas,ra-mdio.yaml diff --git a/drivers/mdio/CMakeLists.txt b/drivers/mdio/CMakeLists.txt index 640919c1037..779ba7ed5ef 100644 --- a/drivers/mdio/CMakeLists.txt +++ b/drivers/mdio/CMakeLists.txt @@ -16,3 +16,4 @@ zephyr_library_sources_ifdef(CONFIG_MDIO_ST_STM32_HAL mdio_stm32_hal.c) zephyr_library_sources_ifdef(CONFIG_MDIO_INFINEON_XMC4XXX mdio_xmc4xxx.c) zephyr_library_sources_ifdef(CONFIG_MDIO_NXP_ENET_QOS mdio_nxp_enet_qos.c) zephyr_library_sources_ifdef(CONFIG_MDIO_DWCXGMAC mdio_dwcxgmac.c) +zephyr_library_sources_ifdef(CONFIG_MDIO_RENESAS_RA mdio_renesas_ra.c) diff --git a/drivers/mdio/Kconfig b/drivers/mdio/Kconfig index 3c001237a8f..77dc4d34111 100644 --- a/drivers/mdio/Kconfig +++ b/drivers/mdio/Kconfig @@ -37,6 +37,7 @@ source "drivers/mdio/Kconfig.stm32_hal" source "drivers/mdio/Kconfig.xmc4xxx" source "drivers/mdio/Kconfig.nxp_enet_qos" source "drivers/mdio/Kconfig.dwcxgmac" +source "drivers/mdio/Kconfig.renesas_ra" config MDIO_INIT_PRIORITY int "Init priority" diff --git a/drivers/mdio/Kconfig.renesas_ra b/drivers/mdio/Kconfig.renesas_ra new file mode 100644 index 00000000000..9702bf9b2b4 --- /dev/null +++ b/drivers/mdio/Kconfig.renesas_ra @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +config MDIO_RENESAS_RA + bool "RENESAS MDIO controller driver" + default y + depends on DT_HAS_RENESAS_RA_MDIO_ENABLED + select PINCTRL + select USE_RA_FSP_ETHER_PHY + help + Enable RENESAS MDIO support. diff --git a/drivers/mdio/mdio_renesas_ra.c b/drivers/mdio/mdio_renesas_ra.c new file mode 100644 index 00000000000..e32443a29ea --- /dev/null +++ b/drivers/mdio/mdio_renesas_ra.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2024 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "r_ether_phy.h" + +#include + +LOG_MODULE_REGISTER(renesas_ra_mdio, CONFIG_MDIO_LOG_LEVEL); + +#define DT_DRV_COMPAT renesas_ra_mdio + +struct renesas_ra_mdio_config { + const struct pinctrl_dev_config *pincfg; + uint8_t instance; +}; + +struct renesas_ra_mdio_data { + struct k_mutex rw_mutex; + struct st_ether_phy_cfg ether_phy_cfg; + struct st_ether_phy_instance_ctrl ether_phy_ctrl; +}; + +static int renesas_ra_mdio_read(const struct device *dev, uint8_t prtad, uint8_t regad, + uint16_t *data) +{ + struct renesas_ra_mdio_data *dev_data = dev->data; + uint32_t read; + fsp_err_t err; + + dev_data->ether_phy_ctrl.phy_lsi_address = prtad; + + k_mutex_lock(&dev_data->rw_mutex, K_FOREVER); + + err = R_ETHER_PHY_Read(&dev_data->ether_phy_ctrl, regad, &read); + + k_mutex_unlock(&dev_data->rw_mutex); + + if (err != FSP_SUCCESS) { + return -EIO; + } + + *data = read & UINT16_MAX; + + return 0; +} + +static int renesas_ra_mdio_write(const struct device *dev, uint8_t prtad, uint8_t regad, + uint16_t data) +{ + struct renesas_ra_mdio_data *dev_data = dev->data; + fsp_err_t err; + + dev_data->ether_phy_ctrl.phy_lsi_address = prtad; + + k_mutex_lock(&dev_data->rw_mutex, K_FOREVER); + + err = R_ETHER_PHY_Write(&dev_data->ether_phy_ctrl, regad, data); + + k_mutex_unlock(&dev_data->rw_mutex); + + if (err != FSP_SUCCESS) { + return -EIO; + } + + return 0; +} + +static int renesas_ra_mdio_initialize(const struct device *dev) +{ + struct renesas_ra_mdio_data *data = dev->data; + const struct renesas_ra_mdio_config *cfg = dev->config; + int err; + fsp_err_t fsp_err; + + err = pinctrl_apply_state(cfg->pincfg, PINCTRL_STATE_DEFAULT); + if (err != 0) { + return err; + } + + fsp_err = R_ETHER_PHY_Open(&data->ether_phy_ctrl, &data->ether_phy_cfg); + + if (fsp_err != FSP_SUCCESS) { + LOG_ERR("Failed to init mdio driver - R_ETHER_PHY_Open fail"); + } + + k_mutex_init(&data->rw_mutex); + + return 0; +} + +static DEVICE_API(mdio, renesas_ra_mdio_api) = { + .read = renesas_ra_mdio_read, + .write = renesas_ra_mdio_write, +}; + +#define RENSAS_RA_MDIO_INSTANCE_DEFINE(node) \ + PINCTRL_DT_INST_DEFINE(node); \ + static struct renesas_ra_mdio_data renesas_ra_mdio##node##_data = { \ + .ether_phy_cfg = { \ + .channel = 0, \ + .phy_reset_wait_time = 0x00020000, \ + .mii_bit_access_wait_time = 8, \ + .phy_lsi_type = ETHER_PHY_LSI_TYPE_CUSTOM, \ + .flow_control = ETHER_PHY_FLOW_CONTROL_DISABLE, \ + }}; \ + static const struct renesas_ra_mdio_config renesas_ra_mdio##node##_cfg = { \ + .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(node)}; \ + DEVICE_DT_INST_DEFINE(node, &renesas_ra_mdio_initialize, NULL, \ + &renesas_ra_mdio##node##_data, &renesas_ra_mdio##node##_cfg, \ + POST_KERNEL, CONFIG_MDIO_INIT_PRIORITY, &renesas_ra_mdio_api); + +DT_INST_FOREACH_STATUS_OKAY(RENSAS_RA_MDIO_INSTANCE_DEFINE) diff --git a/dts/bindings/mdio/renesas,ra-mdio.yaml b/dts/bindings/mdio/renesas,ra-mdio.yaml new file mode 100644 index 00000000000..51971c9e8a9 --- /dev/null +++ b/dts/bindings/mdio/renesas,ra-mdio.yaml @@ -0,0 +1,15 @@ +# Copyright (c) 2024 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +description: Renesas RA External MDIO controller + +compatible: "renesas,ra-mdio" + +include: [mdio-controller.yaml, pinctrl-device.yaml] + +properties: + pinctrl-0: + required: true + + pinctrl-names: + required: true diff --git a/modules/Kconfig.renesas_fsp b/modules/Kconfig.renesas_fsp index 9a1f7969385..1800ee52d52 100644 --- a/modules/Kconfig.renesas_fsp +++ b/modules/Kconfig.renesas_fsp @@ -81,4 +81,9 @@ config USE_RA_FSP_CANFD help Enable RA FSP CANFD driver +config USE_RA_FSP_ETHER_PHY + bool + help + Enable RA FSP Ethernet phy driver + endif # HAS_RENESAS_RA_FSP