Skip to content

Commit dfb890c

Browse files
RtkFPcaiyi_zhong
authored andcommitted
drivers: pinctrl: add pinctrl driver for RTS5817
Add pin controller driver for RTS5817 Signed-off-by: Darcy Lu <darcy_lu@realsil.com.cn>
1 parent a366e4f commit dfb890c

File tree

7 files changed

+607
-0
lines changed

7 files changed

+607
-0
lines changed

drivers/pinctrl/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,6 @@ zephyr_library_sources_ifdef(CONFIG_PINCTRL_SY1XX pinctrl_sy1xx.c)
5555
zephyr_library_sources_ifdef(CONFIG_PINCTRL_REALTEK_RTS5912 pinctrl_realtek_rts5912.c)
5656
zephyr_library_sources_ifdef(CONFIG_PINCTRL_WCH_20X_30X_AFIO pinctrl_wch_20x_30x_afio.c)
5757
zephyr_library_sources_ifdef(CONFIG_PINCTRL_WCH_00X_AFIO pinctrl_wch_00x_afio.c)
58+
zephyr_library_sources_ifdef(CONFIG_PINCTRL_RTS5817 pinctrl_rts5817.c)
5859

5960
add_subdirectory(renesas)

drivers/pinctrl/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ source "drivers/pinctrl/Kconfig.sy1xx"
8181
source "drivers/pinctrl/Kconfig.realtek_rts5912"
8282
source "drivers/pinctrl/Kconfig.wch_20x_30x_afio"
8383
source "drivers/pinctrl/Kconfig.wch_00x_afio"
84+
source "drivers/pinctrl/Kconfig.rts5817"
8485

8586
rsource "renesas/Kconfig"
8687

drivers/pinctrl/Kconfig.rts5817

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright (c) 2024 Realtek Semiconductor, Inc.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config PINCTRL_RTS5817
5+
bool "RTS5817 pin controller driver"
6+
default y
7+
depends on DT_HAS_REALTEK_RTS5817_PINCTRL_ENABLED
8+
help
9+
Enable driver for RTS5817 pin controller.

drivers/pinctrl/pinctrl_rts5817.c

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* Copyright (c) 2024 Realtek Semiconductor, Inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/kernel.h>
8+
#include <zephyr/drivers/pinctrl.h>
9+
#include <zephyr/dt-bindings/pinctrl/rts5817_pinctrl.h>
10+
#include "pinctrl_rts5817.h"
11+
12+
#define PAD_CFG_SIZE 0x40
13+
14+
static void pinctrl_configure_pin(pinctrl_soc_pin_t pincfg)
15+
{
16+
uint32_t base;
17+
uint32_t value;
18+
uint8_t h3l1 = pincfg.power_source & BIT(0);
19+
uint8_t iev18 = (pincfg.power_source & BIT(1)) >> 1;
20+
21+
if (pincfg.pin >= RTS_FP_PIN_AL0 && pincfg.pin <= RTS_FP_PIN_AL2) {
22+
base = DT_REG_ADDR_BY_IDX(DT_NODELABEL(pinctrl), 1);
23+
24+
value = sys_read32(base);
25+
26+
value &= ~((0x1 << (pincfg.pin - RTS_FP_PIN_AL0 + AL_GPIO_PU_CTRL_OFFSET)) |
27+
(0x1 << (pincfg.pin - RTS_FP_PIN_AL0 + AL_GPIO_PD_CTRL_OFFSET)) |
28+
(0x1 << (pincfg.pin - RTS_FP_PIN_AL0 + AL_GPIO_SEL_OFFSET)));
29+
30+
if (pincfg.pin == RTS_FP_PIN_AL0) {
31+
value &= ~(1 << CS1_BRIDGE_EN_OFFSET);
32+
}
33+
34+
if (pincfg.pin == RTS_FP_PIN_AL0 && pincfg.func == RTS_FP_PIN_FUNC2) {
35+
value |= (1 << CS1_BRIDGE_EN_OFFSET);
36+
} else {
37+
value |=
38+
(pincfg.func << (pincfg.pin - RTS_FP_PIN_AL0 + AL_GPIO_SEL_OFFSET));
39+
}
40+
41+
value |= (pincfg.pulldown
42+
<< (pincfg.pin - RTS_FP_PIN_AL0 + AL_GPIO_PD_CTRL_OFFSET)) |
43+
(pincfg.pullup << (pincfg.pin - RTS_FP_PIN_AL0 + AL_GPIO_PU_CTRL_OFFSET));
44+
45+
sys_write32(value, base);
46+
} else if (pincfg.pin >= RTS_FP_PIN_SNR_RST && pincfg.pin <= RTS_FP_PIN_SNR_CS) {
47+
base = DT_REG_ADDR_BY_IDX(DT_NODELABEL(pinctrl), 2) +
48+
(pincfg.pin - RTS_FP_PIN_SNR_RST) * 0x4;
49+
50+
value = sys_read32(base);
51+
52+
value &= ~(SENSOR_SCS_N_SEL_MASK | SENSOR_SCS_N_PDE_MASK | SENSOR_SCS_N_PUE_MASK |
53+
SENSOR_SCS_N_H3L1_MASK | SENSOR_SCS_N_IEV18_MASK);
54+
55+
value |= (pincfg.func << SENSOR_SCS_N_SEL_OFFSET) |
56+
(pincfg.pulldown << SENSOR_SCS_N_PDE_OFFSET) |
57+
(pincfg.pullup << SENSOR_SCS_N_PUE_OFFSET) |
58+
(h3l1 << SENSOR_SCS_N_H3L1_OFFSET) | (iev18 << SENSOR_SCS_N_IEV18_OFFSET);
59+
60+
sys_write32(value, base);
61+
} else if (pincfg.pin == RTS_FP_PIN_SNR_GPIO) {
62+
base = DT_REG_ADDR_BY_IDX(DT_NODELABEL(pinctrl), 2) + 0xC;
63+
64+
value = sys_read32(base);
65+
66+
value &= ~(GPIO_SVIO_PULLCTL_MASK | GPIO_SVIO_IEV18_MASK | GPIO_SVIO_H3L1_MASK);
67+
68+
value |= (pincfg.pulldown << GPIO_SVIO_PULLCTL_OFFSET) |
69+
(pincfg.pullup << (GPIO_SVIO_PULLCTL_OFFSET + 1)) |
70+
(iev18 << GPIO_SVIO_IEV18_OFFSET) | (h3l1 << GPIO_SVIO_H3L1_OFFSET);
71+
72+
sys_write32(value, base);
73+
} else {
74+
base = DT_REG_ADDR(DT_NODELABEL(pinctrl)) + pincfg.pin * PAD_CFG_SIZE;
75+
76+
value = sys_read32(base + PAD_CFG);
77+
value &= ~(GPIO_FUNCTION_SEL_MASK | IEV18_MASK | H3L1_MASK | PU_MASK | PD_MASK);
78+
value |= (((1 << pincfg.func) << GPIO_FUNCTION_SEL_OFFSET) |
79+
(pincfg.pulldown << PD_OFFSET) | (pincfg.pullup << PU_OFFSET) |
80+
(iev18 << IEV18_OFFSET) | (h3l1 << H3L1_OFFSET));
81+
82+
if (pincfg.pin == RTS_FP_PIN_CACHE_CS2) {
83+
sys_write32(0x1, base + PAD_GPIO_INC);
84+
}
85+
86+
sys_write32(value, base);
87+
}
88+
}
89+
90+
int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg)
91+
{
92+
ARG_UNUSED(reg);
93+
94+
for (int i = 0; i < pin_cnt; i++) {
95+
pinctrl_configure_pin(pins[i]);
96+
}
97+
98+
return 0;
99+
}

0 commit comments

Comments
 (0)