Skip to content

Commit fe29929

Browse files
spectrum70aescolar
authored andcommitted
drivers: mdio: add stm32 mdio support
MDIO is part of the ETH IP, but some phy chip may need a specific phy driver to set up certain vendor registers enabling particular features. Add support for stm32 mdio access. Signed-off-by: Angelo Dureghello <adureghello@baylibre.com>
1 parent b2f4321 commit fe29929

File tree

5 files changed

+160
-0
lines changed

5 files changed

+160
-0
lines changed

drivers/mdio/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ zephyr_library_sources_ifdef(CONFIG_MDIO_NXP_S32_GMAC mdio_nxp_s32_gmac.c)
1010
zephyr_library_sources_ifdef(CONFIG_MDIO_ADIN2111 mdio_adin2111.c)
1111
zephyr_library_sources_ifdef(CONFIG_MDIO_GPIO mdio_gpio.c)
1212
zephyr_library_sources_ifdef(CONFIG_MDIO_NXP_ENET mdio_nxp_enet.c)
13+
zephyr_library_sources_ifdef(CONFIG_MDIO_ST_STM32_HAL mdio_stm32_hal.c)
1314
zephyr_library_sources_ifdef(CONFIG_MDIO_INFINEON_XMC4XXX mdio_xmc4xxx.c)
1415
zephyr_library_sources_ifdef(CONFIG_MDIO_NXP_ENET_QOS mdio_nxp_enet_qos.c)

drivers/mdio/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ source "drivers/mdio/Kconfig.nxp_s32_gmac"
3131
source "drivers/mdio/Kconfig.adin2111"
3232
source "drivers/mdio/Kconfig.gpio"
3333
source "drivers/mdio/Kconfig.nxp_enet"
34+
source "drivers/mdio/Kconfig.stm32_hal"
3435
source "drivers/mdio/Kconfig.xmc4xxx"
3536
source "drivers/mdio/Kconfig.nxp_enet_qos"
3637

drivers/mdio/Kconfig.stm32_hal

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Copyright (c) 2024 BayLibre, SAS
2+
# Copyright (c) 2024 Analog Devices Inc.
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
config MDIO_ST_STM32_HAL
6+
bool "STM32 MDIO controller driver"
7+
default y
8+
depends on ETH_STM32_HAL_API_V2
9+
depends on DT_HAS_ST_STM32_MDIO_ENABLED
10+
help
11+
Enable STM32 MDIO support.

drivers/mdio/mdio_stm32_hal.c

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
* Copyright (c) 2024 BayLibre, SAS
3+
* Copyright (c) 2024 Analog Devices Inc.
4+
*
5+
* SPDX-License-Identifier: Apache-2.0
6+
*/
7+
8+
#include <stdint.h>
9+
#include <errno.h>
10+
#include <zephyr/device.h>
11+
#include <zephyr/kernel.h>
12+
#include <zephyr/drivers/pinctrl.h>
13+
#include <zephyr/drivers/mdio.h>
14+
#include <zephyr/net/ethernet.h>
15+
#include <zephyr/net/mdio.h>
16+
17+
#include <zephyr/logging/log.h>
18+
LOG_MODULE_REGISTER(mdio_stm32_hal, CONFIG_MDIO_LOG_LEVEL);
19+
20+
#define DT_DRV_COMPAT st_stm32_mdio
21+
22+
#define ADIN1100_REG_VALUE_MASK GENMASK(15, 0)
23+
24+
struct mdio_stm32_data {
25+
struct k_sem sem;
26+
ETH_HandleTypeDef heth;
27+
};
28+
29+
struct mdio_stm32_config {
30+
const struct pinctrl_dev_config *pincfg;
31+
};
32+
33+
static int mdio_stm32_read(const struct device *dev, uint8_t prtad,
34+
uint8_t regad, uint16_t *data)
35+
{
36+
struct mdio_stm32_data *const dev_data = dev->data;
37+
ETH_HandleTypeDef *heth = &dev_data->heth;
38+
uint32_t read;
39+
int ret;
40+
41+
k_sem_take(&dev_data->sem, K_FOREVER);
42+
43+
ret = HAL_ETH_ReadPHYRegister(heth, prtad, regad, &read);
44+
45+
k_sem_give(&dev_data->sem);
46+
47+
if (ret != HAL_OK) {
48+
return -EIO;
49+
}
50+
51+
*data = read & ADIN1100_REG_VALUE_MASK;
52+
53+
return ret;
54+
}
55+
56+
static int mdio_stm32_write(const struct device *dev, uint8_t prtad,
57+
uint8_t regad, uint16_t data)
58+
{
59+
struct mdio_stm32_data *const dev_data = dev->data;
60+
ETH_HandleTypeDef *heth = &dev_data->heth;
61+
int ret;
62+
63+
k_sem_take(&dev_data->sem, K_FOREVER);
64+
65+
ret = HAL_ETH_WritePHYRegister(heth, prtad, regad, data);
66+
67+
k_sem_give(&dev_data->sem);
68+
69+
if (ret != HAL_OK) {
70+
return -EIO;
71+
}
72+
73+
return ret;
74+
}
75+
76+
static void mdio_stm32_bus_enable(const struct device *dev)
77+
{
78+
ARG_UNUSED(dev);
79+
}
80+
81+
static void mdio_stm32_bus_disable(const struct device *dev)
82+
{
83+
ARG_UNUSED(dev);
84+
}
85+
86+
static int mdio_stm32_init(const struct device *dev)
87+
{
88+
struct mdio_stm32_data *const dev_data = dev->data;
89+
const struct mdio_stm32_config *const config = dev->config;
90+
int ret;
91+
92+
ret = pinctrl_apply_state(config->pincfg, PINCTRL_STATE_DEFAULT);
93+
if (ret < 0) {
94+
return ret;
95+
}
96+
97+
k_sem_init(&dev_data->sem, 1, 1);
98+
99+
return 0;
100+
}
101+
102+
static const struct mdio_driver_api mdio_stm32_api = {
103+
.read = mdio_stm32_read,
104+
.write = mdio_stm32_write,
105+
.bus_enable = mdio_stm32_bus_enable,
106+
.bus_disable = mdio_stm32_bus_disable,
107+
};
108+
109+
#define MDIO_STM32_HAL_DEVICE(inst) \
110+
PINCTRL_DT_INST_DEFINE(inst); \
111+
\
112+
static struct mdio_stm32_data mdio_stm32_data_##inst = { \
113+
.heth = {.Instance = (ETH_TypeDef *)DT_REG_ADDR(DT_INST_PARENT(inst))}, \
114+
}; \
115+
static struct mdio_stm32_config mdio_stm32_config_##inst = { \
116+
.pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(inst), \
117+
}; \
118+
DEVICE_DT_INST_DEFINE(inst, &mdio_stm32_init, NULL, \
119+
&mdio_stm32_data_##inst, &mdio_stm32_config_##inst, \
120+
POST_KERNEL, CONFIG_ETH_INIT_PRIORITY, \
121+
&mdio_stm32_api);
122+
123+
DT_INST_FOREACH_STATUS_OKAY(MDIO_STM32_HAL_DEVICE)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Copyright (c) 2024 BayLibre, SAS
2+
# Copyright (c) 2024 Analog Devices Inc.
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
description: ST MDIO Features
6+
7+
compatible: "st,stm32-mdio"
8+
9+
include: [mdio-controller.yaml, pinctrl-device.yaml]
10+
11+
properties:
12+
"#address-cells":
13+
required: true
14+
const: 1
15+
16+
"#size-cells":
17+
required: true
18+
const: 0
19+
20+
pinctrl-0:
21+
required: true
22+
23+
pinctrl-names:
24+
required: true

0 commit comments

Comments
 (0)