Skip to content

Commit 64b4a3f

Browse files
ene-stevenfabiobaltieri
authored andcommitted
drivers: pinctrl: initial device driver for ENE KB1200
Add pinctrl driver for ENE KB1200 Signed-off-by: Steven Chang <[email protected]>
1 parent 05276b6 commit 64b4a3f

File tree

6 files changed

+292
-0
lines changed

6 files changed

+292
-0
lines changed

drivers/pinctrl/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ zephyr_library_sources_ifdef(CONFIG_PINCTRL_TI_CC32XX pinctrl_ti_cc32xx.c)
3535
zephyr_library_sources_ifdef(CONFIG_PINCTRL_NUMAKER pinctrl_numaker.c)
3636
zephyr_library_sources_ifdef(CONFIG_PINCTRL_QUICKLOGIC_EOS_S3 pinctrl_eos_s3.c)
3737
zephyr_library_sources_ifdef(CONFIG_PINCTRL_RW pinctrl_rw_iomux.c)
38+
zephyr_library_sources_ifdef(CONFIG_PINCTRL_ENE_KB1200 pinctrl_ene_kb1200.c)
3839
zephyr_library_sources_ifdef(CONFIG_PINCTRL_IMX_SCU pinctrl_imx_scu.c)
3940

4041
add_subdirectory(renesas)

drivers/pinctrl/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ source "drivers/pinctrl/Kconfig.ti_cc32xx"
6363
source "drivers/pinctrl/Kconfig.numaker"
6464
source "drivers/pinctrl/Kconfig.eos_s3"
6565
source "drivers/pinctrl/Kconfig.rw"
66+
source "drivers/pinctrl/Kconfig.ene"
6667
source "drivers/pinctrl/Kconfig.zynqmp"
6768

6869
rsource "renesas/Kconfig"

drivers/pinctrl/Kconfig.ene

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright (c) 2023 ENE Technology Inc.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config PINCTRL_ENE_KB1200
5+
bool "ENE KB1200 Pin controller driver"
6+
default y
7+
depends on DT_HAS_ENE_KB1200_PINCTRL_ENABLED
8+
help
9+
Enable pin controller driver for ENE KB1200 MCUs

drivers/pinctrl/pinctrl_ene_kb1200.c

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
/*
2+
* Copyright (c) ENE Technology Inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#define DT_DRV_COMPAT ene_kb1200_pinctrl
8+
9+
#include <zephyr/devicetree.h>
10+
#include <zephyr/drivers/pinctrl.h>
11+
#include <zephyr/sys/util_macro.h>
12+
#include <zephyr/dt-bindings/pinctrl/ene-kb1200-pinctrl.h>
13+
#include <zephyr/sys/util.h>
14+
#include <reg/gcfg.h>
15+
#include <reg/gpio.h>
16+
17+
/*
18+
* PINMUX_FUNC_A : GPIO Function
19+
* PINMUX_FUNC_B : AltOutput 1 Function
20+
* PINMUX_FUNC_C : AltOutput 2 Function
21+
* PINMUX_FUNC_D : AltOutput 3 Function
22+
* PINMUX_FUNC_E : AltOutput 4 Function
23+
*
24+
* GPIO Alternate Output Function Selection
25+
* (PINMUX_FUNC_A) (PINMUX_FUNC_B) (PINMUX_FUNC_C) (PINMUX_FUNC_D) (PINMUX_FUNC_E)
26+
* GPIO00 PWMLED0 PWM8
27+
* GPIO01 SER_RXD1 UART_SIN SBUD_DAT
28+
* GPIO03 SER_TXD1 UART_SOUT SBUD_CLK
29+
* GPIO22 ESBDAT PWM9
30+
* GPIO28 32KOUT SERCLK2
31+
* GPIO36 UARTSOUT SERTXD2
32+
* GPIO5C KSO6 P80DAT
33+
* GPIO5D KSO7 P80CLK
34+
* GPIO5E KSO8 SERRXD1
35+
* GPIO5F KSO9 SERTXD1
36+
* GPIO71 SDA8 UARTRTS
37+
* GPIO38 SCL4 PWM1
38+
*/
39+
40+
/*
41+
* f is function number
42+
* b[7:5] = pin bank
43+
* b[4:0] = pin position in bank
44+
* b[11:8] = function
45+
*/
46+
47+
#define ENE_KB1200_PINMUX_PIN(p) FIELD_GET(GENMASK(4, 0), p)
48+
#define ENE_KB1200_PINMUX_PORT(p) FIELD_GET(GENMASK(7, 5), p)
49+
#define ENE_KB1200_PINMUX_FUNC(p) FIELD_GET(GENMASK(11, 8), p)
50+
#define ENE_KB1200_PINMUX_PORT_PIN(p) FIELD_GET(GENMASK(7, 0), p)
51+
52+
static const uint32_t gcfg_reg_addr = DT_REG_ADDR(DT_NODELABEL(gcfg));
53+
static const uint32_t gpio_reg_bases[] = {
54+
DT_REG_ADDR(DT_NODELABEL(gpio0x1x)),
55+
DT_REG_ADDR(DT_NODELABEL(gpio2x3x)),
56+
DT_REG_ADDR(DT_NODELABEL(gpio4x5x)),
57+
DT_REG_ADDR(DT_NODELABEL(gpio6x7x)),
58+
};
59+
60+
static int kb1200_config_pin(uint32_t gpio, uint32_t conf, uint32_t func)
61+
{
62+
uint32_t port = ENE_KB1200_PINMUX_PORT(gpio);
63+
uint32_t pin = (uint32_t)ENE_KB1200_PINMUX_PIN(gpio);
64+
struct gpio_regs *gpio_regs = (struct gpio_regs *)gpio_reg_bases[port];
65+
struct gcfg_regs *gcfg_regs = (struct gcfg_regs *)gcfg_reg_addr;
66+
67+
if (port >= NUM_KB1200_GPIO_PORTS) {
68+
return -EINVAL;
69+
}
70+
71+
if (func == PINMUX_FUNC_GPIO) { /* only GPIO function */
72+
WRITE_BIT(gpio_regs->GPIOFS, pin, 0);
73+
} else {
74+
func -= 1; /*for change to GPIOALT setting value*/
75+
switch (gpio) {
76+
case GPIO00_PWMLED0_PWM8:
77+
WRITE_BIT(gcfg_regs->GPIOALT, 0, func);
78+
break;
79+
case GPIO01_SERRXD1_UARTSIN:
80+
gcfg_regs->GPIOMUX = (gcfg_regs->GPIOMUX & ~(3 << 9)) | (func << 9);
81+
break;
82+
case GPIO03_SERTXD1_UARTSOUT:
83+
gcfg_regs->GPIOMUX = (gcfg_regs->GPIOMUX & ~(3 << 9)) | (func << 9);
84+
break;
85+
case GPIO22_ESBDAT_PWM9:
86+
WRITE_BIT(gcfg_regs->GPIOALT, 1, func);
87+
break;
88+
case GPIO28_32KOUT_SERCLK2:
89+
WRITE_BIT(gcfg_regs->GPIOALT, 2, func);
90+
break;
91+
case GPIO36_UARTSOUT_SERTXD2:
92+
WRITE_BIT(gcfg_regs->GPIOALT, 3, func);
93+
break;
94+
case GPIO5C_KSO6_P80DAT:
95+
WRITE_BIT(gcfg_regs->GPIOALT, 4, func);
96+
break;
97+
case GPIO5D_KSO7_P80CLK:
98+
WRITE_BIT(gcfg_regs->GPIOALT, 5, func);
99+
break;
100+
case GPIO5E_KSO8_SERRXD1:
101+
WRITE_BIT(gcfg_regs->GPIOALT, 6, func);
102+
break;
103+
case GPIO5F_KSO9_SERTXD1:
104+
WRITE_BIT(gcfg_regs->GPIOALT, 7, func);
105+
break;
106+
case GPIO71_SDA8_UARTRTS:
107+
WRITE_BIT(gcfg_regs->GPIOALT, 8, func);
108+
break;
109+
case GPIO38_SCL4_PWM1:
110+
WRITE_BIT(gcfg_regs->GPIOALT, 9, func);
111+
break;
112+
}
113+
WRITE_BIT(gpio_regs->GPIOFS, pin, 1);
114+
}
115+
/*Input always enable for loopback*/
116+
WRITE_BIT(gpio_regs->GPIOIE, pin, 1);
117+
118+
if (conf & BIT(ENE_KB1200_NO_PUD_POS)) {
119+
WRITE_BIT(gpio_regs->GPIOPU, pin, 0);
120+
WRITE_BIT(gpio_regs->GPIOPD, pin, 0);
121+
}
122+
if (conf & BIT(ENE_KB1200_PU_POS)) {
123+
WRITE_BIT(gpio_regs->GPIOPU, pin, 1);
124+
}
125+
if (conf & BIT(ENE_KB1200_PD_POS)) {
126+
WRITE_BIT(gpio_regs->GPIOPD, pin, 1);
127+
}
128+
129+
if (conf & BIT(ENE_KB1200_OUT_DIS_POS)) {
130+
WRITE_BIT(gpio_regs->GPIOOE, pin, 0);
131+
}
132+
if (conf & BIT(ENE_KB1200_OUT_EN_POS)) {
133+
WRITE_BIT(gpio_regs->GPIOOE, pin, 1);
134+
}
135+
136+
if (conf & BIT(ENE_KB1200_OUT_LO_POS)) {
137+
WRITE_BIT(gpio_regs->GPIOD, pin, 0);
138+
}
139+
if (conf & BIT(ENE_KB1200_OUT_HI_POS)) {
140+
WRITE_BIT(gpio_regs->GPIOD, pin, 1);
141+
}
142+
143+
if (conf & BIT(ENE_KB1200_PUSH_PULL_POS)) {
144+
WRITE_BIT(gpio_regs->GPIOOD, pin, 0);
145+
}
146+
if (conf & BIT(ENE_KB1200_OPEN_DRAIN_POS)) {
147+
WRITE_BIT(gpio_regs->GPIOOD, pin, 1);
148+
}
149+
150+
if (conf & BIT(ENE_KB1200_PIN_LOW_POWER_POS)) {
151+
WRITE_BIT(gpio_regs->GPIOLV, pin, 1);
152+
}
153+
154+
return 0;
155+
}
156+
157+
int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg)
158+
{
159+
uint32_t portpin, pinmux, func;
160+
int ret;
161+
162+
ARG_UNUSED(reg);
163+
164+
for (uint8_t i = 0U; i < pin_cnt; i++) {
165+
pinmux = pins[i];
166+
167+
func = ENE_KB1200_PINMUX_FUNC(pinmux);
168+
if (func >= PINMUX_FUNC_MAX) {
169+
return -EINVAL;
170+
}
171+
172+
portpin = ENE_KB1200_PINMUX_PORT_PIN(pinmux);
173+
174+
ret = kb1200_config_pin(portpin, pinmux, func);
175+
if (ret < 0) {
176+
return ret;
177+
}
178+
}
179+
180+
return 0;
181+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright (c) ENE Technology Inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_ENE_KB1200_PINCTRL_H_
8+
#define ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_ENE_KB1200_PINCTRL_H_
9+
10+
#include <zephyr/dt-bindings/dt-util.h>
11+
12+
#define PINMUX_FUNC_GPIO 0x00
13+
#define PINMUX_FUNC_A 0x00
14+
#define PINMUX_FUNC_B 0x01
15+
#define PINMUX_FUNC_C 0x02
16+
#define PINMUX_FUNC_D 0x03
17+
#define PINMUX_FUNC_MAX 0x04
18+
19+
#define ENE_KB1200_NO_PUD_POS 12
20+
#define ENE_KB1200_PD_POS 13
21+
#define ENE_KB1200_PU_POS 14
22+
#define ENE_KB1200_PUSH_PULL_POS 15
23+
#define ENE_KB1200_OPEN_DRAIN_POS 16
24+
#define ENE_KB1200_OUT_DIS_POS 17
25+
#define ENE_KB1200_OUT_EN_POS 18
26+
#define ENE_KB1200_OUT_HI_POS 19
27+
#define ENE_KB1200_OUT_LO_POS 20
28+
#define ENE_KB1200_PIN_LOW_POWER_POS 21
29+
30+
#define ENE_KB1200_PINMUX_PORT_POS 5
31+
#define ENE_KB1200_PINMUX_PORT_MSK 0x7
32+
#define ENE_KB1200_PINMUX_PIN_POS 0
33+
#define ENE_KB1200_PINMUX_PIN_MSK 0x1f
34+
#define ENE_KB1200_PINMUX_FUNC_POS 8
35+
#define ENE_KB1200_PINMUX_FUNC_MSK 0xf
36+
37+
/*
38+
* f is function number
39+
* b[7:5] = pin bank
40+
* b[4:0] = pin position in bank
41+
* b[11:8] = function
42+
*/
43+
#define ENE_KB1200_PINMUX(n, f) \
44+
(((((n) >> 5) & ENE_KB1200_PINMUX_PORT_MSK) << ENE_KB1200_PINMUX_PORT_POS) | \
45+
(((n) & ENE_KB1200_PINMUX_PIN_MSK) << ENE_KB1200_PINMUX_PIN_POS) | \
46+
(((f) & ENE_KB1200_PINMUX_FUNC_MSK) << ENE_KB1200_PINMUX_FUNC_POS))
47+
48+
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_ENE_KB1200_PINCTRL_H_ */

soc/ene/kb1200/pinctrl_soc.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright (c) 2023 ENE Technology Inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef ZEPHYR_SOC_ARM_KB1200_PINCTRL_SOC_H_
8+
#define ZEPHYR_SOC_ARM_KB1200_PINCTRL_SOC_H_
9+
10+
#include <zephyr/dt-bindings/pinctrl/ene-kb1200-pinctrl.h>
11+
12+
#ifdef __cplusplus
13+
extern "C" {
14+
#endif
15+
16+
/** @cond INTERNAL_HIDDEN */
17+
18+
typedef uint32_t pinctrl_soc_pin_t;
19+
20+
/* initialize pinmux member fields of pinctrl_pin_t */
21+
#define Z_PINCTRL_ENE_KB1200_PINMUX_INIT(node_id) (uint32_t)(DT_PROP(node_id, pinmux))
22+
23+
#define Z_PINCTRL_STATE_PINCFG_INIT(node_id) \
24+
((DT_PROP(node_id, bias_disable) << ENE_KB1200_NO_PUD_POS) | \
25+
(DT_PROP(node_id, bias_pull_down) << ENE_KB1200_PD_POS) | \
26+
(DT_PROP(node_id, bias_pull_up) << ENE_KB1200_PU_POS) | \
27+
(DT_PROP(node_id, drive_push_pull) << ENE_KB1200_PUSH_PULL_POS) | \
28+
(DT_PROP(node_id, drive_open_drain) << ENE_KB1200_OPEN_DRAIN_POS) | \
29+
(DT_PROP(node_id, output_disable) << ENE_KB1200_OUT_DIS_POS) | \
30+
(DT_PROP(node_id, output_enable) << ENE_KB1200_OUT_EN_POS) | \
31+
(DT_PROP(node_id, output_high) << ENE_KB1200_OUT_HI_POS) | \
32+
(DT_PROP(node_id, output_low) << ENE_KB1200_OUT_LO_POS) | \
33+
(DT_PROP(node_id, low_power_enable) << ENE_KB1200_PIN_LOW_POWER_POS))
34+
35+
/* initialize pin structure members */
36+
#define Z_PINCTRL_STATE_PIN_INIT(node_id, state_prop, idx) \
37+
(Z_PINCTRL_ENE_KB1200_PINMUX_INIT(DT_PROP_BY_IDX(node_id, state_prop, idx)) | \
38+
Z_PINCTRL_STATE_PINCFG_INIT(DT_PROP_BY_IDX(node_id, state_prop, idx))),
39+
40+
/* Use DT FOREACH macro to initialize each used pin */
41+
#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \
42+
{ \
43+
DT_FOREACH_PROP_ELEM(node_id, prop, Z_PINCTRL_STATE_PIN_INIT) \
44+
}
45+
46+
/** @endcond */
47+
48+
#ifdef __cplusplus
49+
}
50+
#endif
51+
52+
#endif /* ZEPHYR_SOC_ARM_KB1200_PINCTRL_SOC_H_ */

0 commit comments

Comments
 (0)