drivers: pinctrl: Support pinctrl driver for Renesas RX

Intial support of pinctrl driver for Renesas RX MCU
family.
This support base on using Renesas RX driver package in
hal_renesas layer

Signed-off-by: Duy Nguyen <duy.nguyen.xa@renesas.com>
Signed-off-by: Phi Tran <phi.tran.jg@bp.renesas.com>
This commit is contained in:
Duy Nguyen 2024-11-04 15:22:45 +07:00 committed by Benjamin Cabé
commit 2aa071c7ad
9 changed files with 788 additions and 0 deletions

View file

@ -3,6 +3,7 @@
# SPDX-License-Identifier: Apache-2.0
zephyr_library_sources_ifdef(CONFIG_PINCTRL_RENESAS_RA_PFS ra/pinctrl_ra.c)
zephyr_library_sources_ifdef(CONFIG_PINCTRL_RENESAS_RX rx/pinctrl_renesas_rx.c)
zephyr_library_sources_ifdef(CONFIG_PINCTRL_RZT2M rz/pinctrl_rzt2m.c)
zephyr_library_sources_ifdef(CONFIG_PINCTRL_SMARTBOND smartbond/pinctrl_smartbond.c)
zephyr_library_sources_ifdef(CONFIG_PINCTRL_RENESAS_RZ rz/pinctrl_renesas_rz.c)

View file

@ -0,0 +1,11 @@
# Copyright (c) 2024 Renesas Electronics Corporation
# SPDX-License-Identifier: Apache-2.0
config PINCTRL_RENESAS_RX
bool "Renesas RX series pin controller driver"
default y
depends on DT_HAS_RENESAS_RX_PINCTRL_ENABLED
select USE_RX_RDP_MPC
select USE_RX_RDP_GPIO
help
Enable Renesas RX series pin controller driver.

View file

@ -0,0 +1,153 @@
/*
* Copyright (c) 2024 Renesas Electronics Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/drivers/pinctrl.h>
#include <soc.h>
/* Renesas FIT module for iodefine.h data structures */
#include "platform.h"
#include "r_gpio_rx_if.h"
#include "r_mpc_rx_if.h"
#define PORT_POS (8)
extern const uint8_t g_gpio_open_drain_n_support[];
extern const uint8_t g_gpio_pull_up_support[];
extern const uint8_t g_gpio_dscr_support[];
static bool gpio_pin_function_check(uint8_t const *check_array, uint8_t port_number,
uint8_t pin_number)
{
if ((check_array[port_number] & (1 << pin_number)) != 0) {
return true;
} else {
return false;
}
}
static int pinctrl_configure_pullup(const pinctrl_soc_pin_t *pin, uint32_t value)
{
gpio_port_pin_t port_pin;
bool pin_check;
int ret = 0;
port_pin = (pin->port_num << PORT_POS) | pin->pin_num;
pin_check = gpio_pin_function_check(g_gpio_pull_up_support, pin->port_num, pin->pin_num);
if (pin_check) {
ret = R_GPIO_PinControl(port_pin, (value ? GPIO_CMD_IN_PULL_UP_ENABLE
: GPIO_CMD_IN_PULL_UP_DISABLE));
}
return ret;
}
static int pinctrl_configure_dscr(const pinctrl_soc_pin_t *pin, uint32_t value)
{
gpio_port_pin_t port_pin;
bool pin_check;
int ret = 0;
port_pin = (pin->port_num << PORT_POS) | pin->pin_num;
pin_check = gpio_pin_function_check(g_gpio_dscr_support, pin->port_num, pin->pin_num);
if (pin_check) {
ret = R_GPIO_PinControl(port_pin,
(value ? GPIO_CMD_DSCR_ENABLE : GPIO_CMD_DSCR_DISABLE));
}
return ret;
}
static int pinctrl_configure_opendrain(const pinctrl_soc_pin_t *pin, uint32_t value)
{
gpio_port_pin_t port_pin;
bool pin_check;
int ret = 0;
port_pin = (pin->port_num << PORT_POS) | pin->pin_num;
pin_check =
gpio_pin_function_check(g_gpio_open_drain_n_support, pin->port_num, pin->pin_num);
if (pin_check) {
ret = R_GPIO_PinControl(
port_pin, (value ? GPIO_CMD_OUT_OPEN_DRAIN_N_CHAN : GPIO_CMD_OUT_CMOS));
}
return ret;
}
int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg)
{
gpio_port_pin_t port_pin;
mpc_config_t pconfig = {
.pin_function = 0x0,
.irq_enable = false,
.analog_enable = false,
};
int ret;
for (uint8_t i = 0U; i < pin_cnt; i++) {
const pinctrl_soc_pin_t *pin = &pins[i];
port_pin = (pin->port_num << PORT_POS) | pin->pin_num;
/* Set PMR register to 0 before setting pin control register */
ret = R_GPIO_PinControl(port_pin, GPIO_CMD_ASSIGN_TO_GPIO);
if (ret != 0) {
return -EINVAL;
}
/* Set output high */
if (pin->cfg.output_high) {
R_GPIO_PinWrite(port_pin, GPIO_LEVEL_HIGH);
}
/* Set port direction */
if (pin->cfg.output_enable) {
R_GPIO_PinDirectionSet(port_pin, GPIO_DIRECTION_OUTPUT);
}
/* Set pull-up */
ret = pinctrl_configure_pullup(pin, pin->cfg.bias_pull_up);
if (ret != 0) {
return -EINVAL;
}
/* Set open-drain */
ret = pinctrl_configure_opendrain(pin, pin->cfg.drive_open_drain);
if (ret != 0) {
return -EINVAL;
}
/* Set drive-strength */
ret = pinctrl_configure_dscr(pin, pin->cfg.drive_strength);
if (ret != 0) {
return -EINVAL;
}
/* Set pin function */
pconfig.analog_enable = pin->cfg.analog_enable;
pconfig.pin_function = pin->cfg.psels;
ret = R_MPC_Write(port_pin, &pconfig);
if (ret != 0) {
return -EINVAL;
}
/* Set MODE */
if (pin->cfg.pin_mode) {
ret = R_GPIO_PinControl(port_pin, GPIO_CMD_ASSIGN_TO_PERIPHERAL);
if (ret != 0) {
return -EINVAL;
}
}
}
return 0;
}

View file

@ -0,0 +1,105 @@
# Copyright (c) 2024 Renesas Electronics Corporation
# SPDX-License-Identifier: Apache-2.0
description: |
description: |
The Renesas RX pin controller is a node responsible for controlling
pin function selection and pin properties
The node has the 'pinctrl' node label set in your SoC's devicetree,
so you can modify it like this:
&pinctrl {
/* your modifications go here */
};
All device pin configurations should be placed in child nodes of the
'pinctrl' node, as shown in this example:
/* You can put this in places like a board-pinctrl.dtsi file in
* your board directory, or a devicetree overlay in your application.
*/
/* include pre-defined combinations for the SoC variant used by the board */
#include <dt-bindings/pinctrl/renesas/rx-pinctrl.h>
&pinctrl {
sci1_default: sci1_default {
group1 {
psels = <RX_PSEL(RX_PSEL_SCI_1, 2, 6)>; /* TX */
drive-strength = "medium";
};
group2 {
psels = <RX_PSEL(RX_PSEL_SCI_1, 3, 0)>; /* RX */
drive-strength = "medium";
};
};
};
The 'sci1_default' child node encodes the pin configurations for a
particular state of a device; in this case, the default (that is, active)
state.
As shown, pin configurations are organized in groups within each child node.
Each group can specify a list of pin function selections in the 'psels'
property.
A group can also specify shared pin properties common to all the specified
pins, such as the 'input-enable' property in group 2. Here is a list of
supported standard pin properties:
- bias-disable: Disable pull-up/down (default, not required).
- bias-pull-up: Enable pull-up resistor.
- input-enable: Enable input from the pin.
- drive-strength: Set the drive strength of the pin. Possible
values are: normal, high.
To link pin configurations with a device, use a pinctrl-N property for some
number N, like this example you could place in your board's DTS file:
#include "board-pinctrl.dtsi"
&sci1 {
pinctrl-0 = <&uart0_default>;
pinctrl-1 = <&uart0_sleep>;
pinctrl-names = "default", "sleep";
};
compatible: "renesas,rx-pinctrl"
include: base.yaml
child-binding:
description: |
Definitions for a pinctrl state.
child-binding:
include:
- name: pincfg-node.yaml
property-allowlist:
- bias-disable
- bias-pull-up
- input-enable
- output-enable
- output-high
- drive-open-drain
properties:
psels:
required: true
type: array
description: |
An array of pins sharing the same group properties. Each
element of the array is an integer constructed from the
pin number and the alternative function of the pin.
drive-strength:
type: string
enum:
- "normal"
- "high"
default: "normal"
description: |
The drive strength of a pin. The default value is normal, as this
is the power on reset value.
renesas,analog-enable:
type: boolean
description: enable analog input

View file

@ -0,0 +1,25 @@
# Copyright (c) 2024 Renesas Electronics Corporation
# SPDX-License-Identifier: Apache-2.0
description: Rensas RX Pinmux (Multi Function Pin Controller, MPC)
compatible: "renesas,rx-pinmux"
include: base.yaml
properties:
reg:
required: true
"#pinmux-cells":
type: int
required: true
const: 2
description: number of items in a pinmux specifier
pinmux-cells:
- pin
- function
child-binding:
include: pincfg-node.yaml

View file

@ -10,6 +10,7 @@
#include <mem.h>
#include <zephyr/dt-bindings/clock/rx_clock.h>
#include <zephyr/dt-bindings/pinctrl/renesas/pinctrl-rx.h>
/ {
#address-cells = <1>;

View file

@ -0,0 +1,397 @@
/*
* Copyright (c) 2024 Renesas Electronics Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_PINCTRL_RX_H_
#define ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_PINCTRL_RX_H_
#define RX_PORT_NUM_POS 0
#define RX_PORT_NUM_MASK 0x1f
#define RX_PIN_NUM_POS 5
#define RX_PIN_NUM_MASK 0xf
#define RX_PSEL_MASK 0x1f
#define RX_PSEL_POS 9
#define RX_PSEL_SCI_1 0xA
#define RX_PSEL_SCI_6 0xB
#define RX_PSEL_TMR 0x5
#define RX_PSEL_POE 0x7
/* P0nPFS */
#define RX_PSEL_P0nPFS_HIZ 0x0
#define RX_PSEL_P0nPFS_ADTRG0 0x1
/* P1nPFS */
#define RX_PSEL_P1nPFS_MTIOC0B 0x01
#define RX_PSEL_P1nPFS_MTIOC3A 0x01
#define RX_PSEL_P1nPFS_MTIOC3C 0x01
#define RX_PSEL_P1nPFS_MTCLKA 0x02
#define RX_PSEL_P1nPFS_MTCLKB 0x02
#define RX_PSEL_P1nPFS_MTIOC3B 0x02
#define RX_PSEL_P1nPFS_MTIOC3D 0x02
#define RX_PSEL_P1nPFS_TMCI1 0x5
#define RX_PSEL_P1nPFS_TMO1 0x5
#define RX_PSEL_P1nPFS_TMCI2 0x5
#define RX_PSEL_P1nPFS_TMO2 0x5
#define RX_PSEL_P1nPFS_TMRI2 0x5
#define RX_PSEL_P1nPFS_TMO3 0x5
#define RX_PSEL_P1nPFS_RTCOUT 0x7
#define RX_PSEL_P1nPFS_POE8 0x7
#define RX_PSEL_P1nPFS_ADTRG0 0x9
#define RX_PSEL_P1nPFS_RXD1 0xA
#define RX_PSEL_P1nPFS_SMISO1 0xA
#define RX_PSEL_P1nPFS_SSCL1 0xA
#define RX_PSEL_P1nPFS_TXD1 0xA
#define RX_PSEL_P1nPFS_SMOSI1 0xA
#define RX_PSEL_P1nPFS_SSDA1 0xA
#define RX_PSEL_P1nPFS_CTS1 0xB
#define RX_PSEL_P1nPFS_RTS1 0xB
#define RX_PSEL_P1nPFS_SS1 0xB
#define RX_PSEL_P1nPFS_MOSIA 0xD
#define RX_PSEL_P1nPFS_MISOA 0xD
#define RX_PSEL_P1nPFS_SCL 0xF
#define RX_PSEL_P1nPFS_SDA 0xF
#define RX_PSEL_P1nPFS_TS5 0x19
#define RX_PSEL_P1nPFS_TS6 0x19
/* P2nPFS */
#define RX_PSEL_P2nPFS_MTIOC1A 0x01
#define RX_PSEL_P2nPFS_MTIOC1B 0x01
#define RX_PSEL_P2nPFS_MTIOC2A 0x01
#define RX_PSEL_P2nPFS_MTIOC2B 0x01
#define RX_PSEL_P2nPFS_MTIOC3B 0x01
#define RX_PSEL_P2nPFS_MTIOC3D 0x01
#define RX_PSEL_P2nPFS_MTIOC4A 0x01
#define RX_PSEL_P2nPFS_MTIOC4C 0x01
#define RX_PSEL_P2nPFS_MTCLKA 0x02
#define RX_PSEL_P2nPFS_MTCLKB 0x02
#define RX_PSEL_P2nPFS_MTCLKC 0x02
#define RX_PSEL_P2nPFS_MTCLKD 0x02
#define RX_PSEL_P2nPFS_TMCI0 0x5
#define RX_PSEL_P2nPFS_TMO0 0x5
#define RX_PSEL_P2nPFS_TMRI0 0x5
#define RX_PSEL_P2nPFS_TMO1 0x5
#define RX_PSEL_P2nPFS_TMRI1 0x5
#define RX_PSEL_P2nPFS_TMCI3 0x5
#define RX_PSEL_P2nPFS_ADTRG0 0x9
#define RX_PSEL_P2nPFS_RXD0 0xA
#define RX_PSEL_P2nPFS_SMISO0 0xA
#define RX_PSEL_P2nPFS_SSCL0 0xA
#define RX_PSEL_P2nPFS_TXD0 0xA
#define RX_PSEL_P2nPFS_SMOSI0 0xA
#define RX_PSEL_P2nPFS_SSDA0 0xA
#define RX_PSEL_P2nPFS_SCK0 0xA
#define RX_PSEL_P2nPFS_TXD1 0xA
#define RX_PSEL_P2nPFS_SMOSI1 0xA
#define RX_PSEL_P2nPFS_SSDA1 0xA
#define RX_PSEL_P2nPFS_SCK1 0xA
#define RX_PSEL_P2nPFS_CTS0 0xB
#define RX_PSEL_P2nPFS_RTS0 0xB
#define RX_PSEL_P2nPFS_SS0 0xB
#define RX_PSEL_P2nPFS_TS3 0x19
#define RX_PSEL_P2nPFS_TS4 0x19
/* P3nPFS */
#define RX_PSEL_P3nPFS_MTIOC0A 0x01
#define RX_PSEL_P3nPFS_MTIOC0C 0x01
#define RX_PSEL_P3nPFS_MTIOC0D 0x01
#define RX_PSEL_P3nPFS_MTIOC4B 0x01
#define RX_PSEL_P3nPFS_MTIOC4D 0x01
#define RX_PSEL_P3nPFS_TMCI2 0x5
#define RX_PSEL_P3nPFS_TMO3 0x5
#define RX_PSEL_P3nPFS_TMRI3 0x5
#define RX_PSEL_P3nPFS_TMCI3 0x5
#define RX_PSEL_P3nPFS_RTCOUT 0x7
#define RX_PSEL_P3nPFS_POE2 0x7
#define RX_PSEL_P3nPFS_POE3 0x7
#define RX_PSEL_P3nPFS_POE8 0x7
#define RX_PSEL_P3nPFS_RXD1 0xA
#define RX_PSEL_P3nPFS_SMISO1 0xA
#define RX_PSEL_P3nPFS_SSCL1 0xA
#define RX_PSEL_P3nPFS_CTS1 0xB
#define RX_PSEL_P3nPFS_RTS1 0xB
#define RX_PSEL_P3nPFS_SS1 0xB
#define RX_PSEL_P3nPFS_RXD6 0xB
#define RX_PSEL_P3nPFS_SMISO6 0xB
#define RX_PSEL_P3nPFS_SSCL6 0xB
#define RX_PSEL_P3nPFS_TXD6 0xB
#define RX_PSEL_P3nPFS_SMOSI6 0xB
#define RX_PSEL_P3nPFS_SSDA6 0xB
#define RX_PSEL_P3nPFS_SCK6 0xB
#define RX_PSEL_P3nPFS_TS0 0x19
#define RX_PSEL_P3nPFS_TS1 0x19
#define RX_PSEL_P3nPFS_TS2 0x19
/* P5nPFS */
#define RX_PSEL_P5nPFS_MTIOC4B 0x01
#define RX_PSEL_P5nPFS_MTIOC4D 0x01
#define RX_PSEL_P5nPFS_TMCI1 0x5
#define RX_PSEL_P5nPFS_TMO3 0x5
#define RX_PSEL_P5nPFS_TS11 0x19
#define RX_PSEL_P5nPFS_TS12 0x19
#define RX_PSEL_P5nPFS_PMC0 0x19
#define RX_PSEL_P5nPFS_PMC1 0x19
/* PAnPFS */
#define RX_PSEL_PAnPFS_MTIOC4A 0x01
#define RX_PSEL_PAnPFS_MTIOC0B 0x01
#define RX_PSEL_PAnPFS_MTIOC0D 0x01
#define RX_PSEL_PAnPFS_MTIOC5U 0x01
#define RX_PSEL_PAnPFS_MTIOC5V 0x01
#define RX_PSEL_PAnPFS_MTCLKA 0x02
#define RX_PSEL_PAnPFS_MTCLKB 0x02
#define RX_PSEL_PAnPFS_MTCLKC 0x02
#define RX_PSEL_PAnPFS_MTCLKD 0x02
#define RX_PSEL_PAnPFS_TMRI0 0x5
#define RX_PSEL_PAnPFS_TMCI3 0x5
#define RX_PSEL_PAnPFS_POE2 0x7
#define RX_PSEL_PAnPFS_CACREF 0x7
#define RX_PSEL_PAnPFS_RXD5 0xA
#define RX_PSEL_PAnPFS_SMISO5 0xA
#define RX_PSEL_PAnPFS_SSCL5 0xA
#define RX_PSEL_PAnPFS_TXD5 0xA
#define RX_PSEL_PAnPFS_SMOSI5 0xA
#define RX_PSEL_PAnPFS_SSDA5 0xA
#define RX_PSEL_PAnPFS_SCK5 0xA
#define RX_PSEL_PAnPFS_CTS5 0xB
#define RX_PSEL_PAnPFS_RTS5 0xB
#define RX_PSEL_PAnPFS_SS5 0xB
#define RX_PSEL_PAnPFS_SSLA0 0xD
#define RX_PSEL_PAnPFS_SSLA1 0xD
#define RX_PSEL_PAnPFS_SSLA2 0xD
#define RX_PSEL_PAnPFS_SSLA3 0xD
#define RX_PSEL_PAnPFS_RSPCKA 0xD
#define RX_PSEL_PAnPFS_MOSIA 0xD
#define RX_PSEL_PAnPFS_MISOA 0xD
#define RX_PSEL_PAnPFS_TS26 0x19
#define RX_PSEL_PAnPFS_TS27 0x19
#define RX_PSEL_PAnPFS_TS28 0x19
#define RX_PSEL_PAnPFS_TS29 0x19
#define RX_PSEL_PAnPFS_TS30 0x19
#define RX_PSEL_PAnPFS_TS31 0x19
#define RX_PSEL_PAnPFS_TS32 0x19
/* PBnPFS */
#define RX_PSEL_PBnPFS_MTIOC0A 0x01
#define RX_PSEL_PBnPFS_MTIOC0C 0x01
#define RX_PSEL_PBnPFS_MTIOC2A 0x01
#define RX_PSEL_PBnPFS_MTIOC3B 0x01
#define RX_PSEL_PBnPFS_MTIOC3D 0x01
#define RX_PSEL_PBnPFS_MTIOC5W 0x01
#define RX_PSEL_PBnPFS_MTIOC1B 0x02
#define RX_PSEL_PBnPFS_MTIOC4A 0x02
#define RX_PSEL_PBnPFS_MTIOC4C 0x02
#define RX_PSEL_PBnPFS_TMO0 0x5
#define RX_PSEL_PBnPFS_TMRI1 0x5
#define RX_PSEL_PBnPFS_TMCI0 0x5
#define RX_PSEL_PBnPFS_POE1 0x7
#define RX_PSEL_PBnPFS_POE3 0x7
#define RX_PSEL_PBnPFS_RXD9 0xA
#define RX_PSEL_PBnPFS_SMISO9 0xA
#define RX_PSEL_PBnPFS_SSCL9 0xA
#define RX_PSEL_PBnPFS_TXD9 0xA
#define RX_PSEL_PBnPFS_SMOSI9 0xA
#define RX_PSEL_PBnPFS_SSDA9 0xA
#define RX_PSEL_PBnPFS_SCK9 0xA
#define RX_PSEL_PBnPFS_CTS6 0xB
#define RX_PSEL_PBnPFS_RTS6 0xB
#define RX_PSEL_PBnPFS_SS6 0xB
#define RX_PSEL_PBnPFS_CTS9 0xB
#define RX_PSEL_PBnPFS_RTS9 0xB
#define RX_PSEL_PBnPFS_SS9 0xB
#define RX_PSEL_PBnPFS_RXD6 0xB
#define RX_PSEL_PBnPFS_SMISO6 0xB
#define RX_PSEL_PBnPFS_SSCL6 0xB
#define RX_PSEL_PBnPFS_TXD6 0xB
#define RX_PSEL_PBnPFS_SMOSI6 0xB
#define RX_PSEL_PBnPFS_SSDA6 0xB
#define RX_PSEL_PBnPFS_SCK6 0xB
#define RX_PSEL_PBnPFS_RSPCKA 0xD
#define RX_PSEL_PBnPFS_CMPOB1 0x10
#define RX_PSEL_PBnPFS_TS18 0x19
#define RX_PSEL_PBnPFS_TS19 0x19
#define RX_PSEL_PBnPFS_TS20 0x19
#define RX_PSEL_PBnPFS_TS21 0x19
#define RX_PSEL_PBnPFS_TS22 0x19
#define RX_PSEL_PBnPFS_TS23 0x19
#define RX_PSEL_PBnPFS_TS24 0x19
#define RX_PSEL_PBnPFS_TS25 0x19
/* PCnPFS */
#define RX_PSEL_PCnPFS_MTIOC3A 0x01
#define RX_PSEL_PCnPFS_MTIOC3B 0x01
#define RX_PSEL_PCnPFS_MTIOC3C 0x01
#define RX_PSEL_PCnPFS_MTIOC3D 0x01
#define RX_PSEL_PCnPFS_MTIOC4B 0x01
#define RX_PSEL_PCnPFS_MTIOC4D 0x01
#define RX_PSEL_PCnPFS_MTCLKA 0x02
#define RX_PSEL_PCnPFS_MTCLKB 0x02
#define RX_PSEL_PCnPFS_MTCLKC 0x02
#define RX_PSEL_PCnPFS_MTCLKD 0x02
#define RX_PSEL_PCnPFS_TMCI1 0x5
#define RX_PSEL_PCnPFS_TMO2 0x5
#define RX_PSEL_PCnPFS_TMRI2 0x5
#define RX_PSEL_PCnPFS_TMCI2 0x5
#define RX_PSEL_PCnPFS_POE0 0x7
#define RX_PSEL_PCnPFS_CACREF 0x7
#define RX_PSEL_PCnPFS_RXD5 0xA
#define RX_PSEL_PCnPFS_SMISO5 0xA
#define RX_PSEL_PCnPFS_SSCL5 0xA
#define RX_PSEL_PCnPFS_TXD5 0xA
#define RX_PSEL_PCnPFS_SMOSI5 0xA
#define RX_PSEL_PCnPFS_SSDA5 0xA
#define RX_PSEL_PCnPFS_SCK5 0xA
#define RX_PSEL_PCnPFS_RXD8 0xA
#define RX_PSEL_PCnPFS_SMISO8 0xA
#define RX_PSEL_PCnPFS_SSCL8 0xA
#define RX_PSEL_PCnPFS_TXD8 0xA
#define RX_PSEL_PCnPFS_SMOSI8 0xA
#define RX_PSEL_PCnPFS_SSDA8 0xA
#define RX_PSEL_PCnPFS_SCK8 0xA
#define RX_PSEL_PCnPFS_CTS5 0xB
#define RX_PSEL_PCnPFS_RTS5 0xB
#define RX_PSEL_PCnPFS_SS5 0xB
#define RX_PSEL_PCnPFS_CTS8 0xB
#define RX_PSEL_PCnPFS_RTS8 0xB
#define RX_PSEL_PCnPFS_SS8 0xB
#define RX_PSEL_PCnPFS_SSLA0 0xD
#define RX_PSEL_PCnPFS_SSLA1 0xD
#define RX_PSEL_PCnPFS_SSLA2 0xD
#define RX_PSEL_PCnPFS_SSLA3 0xD
#define RX_PSEL_PCnPFS_RSPCKA 0xD
#define RX_PSEL_PCnPFS_MOSIA 0xD
#define RX_PSEL_PCnPFS_MISOA 0xD
#define RX_PSEL_PCnPFS_TS13 0x19
#define RX_PSEL_PCnPFS_TS14 0x19
#define RX_PSEL_PCnPFS_TS15 0x19
#define RX_PSEL_PCnPFS_TS16 0x19
#define RX_PSEL_PCnPFS_TS17 0x19
#define RX_PSEL_PCnPFS_TSCAP 0x19
/* PDnPFS */
#define RX_PSEL_PDnPFS_MTIOC4B 0x01
#define RX_PSEL_PDnPFS_MTIOC4D 0x01
#define RX_PSEL_PDnPFS_MTIOC5W 0x01
#define RX_PSEL_PDnPFS_MTIOC5V 0x01
#define RX_PSEL_PDnPFS_MTIOC5U 0x01
#define RX_PSEL_PDnPFS_POE0 0x7
#define RX_PSEL_PDnPFS_POE1 0x7
#define RX_PSEL_PDnPFS_POE2 0x7
#define RX_PSEL_PDnPFS_POE3 0x7
#define RX_PSEL_PDnPFS_POE8 0x7
#define RX_PSEL_PDnPFS_RXD6 0xB
#define RX_PSEL_PDnPFS_SMISO6 0xB
#define RX_PSEL_PDnPFS_SSCL6 0xB
#define RX_PSEL_PDnPFS_TXD6 0xB
#define RX_PSEL_PDnPFS_SMOSI6 0xB
#define RX_PSEL_PDnPFS_SSDA6 0xB
#define RX_PSEL_PDnPFS_SCK6 0xB
/* PEnPFS */
#define RX_PSEL_PEnPFS_MTIOC4A 0x01
#define RX_PSEL_PEnPFS_MTIOC4B 0x01
#define RX_PSEL_PEnPFS_MTIOC4C 0x01
#define RX_PSEL_PEnPFS_MTIOC4D 0x01
#define RX_PSEL_PEnPFS_MTIOC1A 0x02
#define RX_PSEL_PEnPFS_MTIOC2B 0x02
#define RX_PSEL_PEnPFS_POE8 0x7
#define RX_PSEL_PEnPFS_CLKOUT 0x9
#define RX_PSEL_PEnPFS_RXD12 0xC
#define RX_PSEL_PEnPFS_SMISO12 0xC
#define RX_PSEL_PEnPFS_SSCL12 0xC
#define RX_PSEL_PEnPFS_TXD12 0xC
#define RX_PSEL_PEnPFS_SMOSI12 0xC
#define RX_PSEL_PEnPFS_SSDA12 0xC
#define RX_PSEL_PEnPFS_SCK12 0xC
#define RX_PSEL_PEnPFS_TXDX12 0xC
#define RX_PSEL_PEnPFS_RXDX12 0xC
#define RX_PSEL_PEnPFS_SIOX12 0xC
#define RX_PSEL_PEnPFS_CTS12 0xC
#define RX_PSEL_PEnPFS_RTS12 0xC
#define RX_PSEL_PEnPFS_SS12 0xC
#define RX_PSEL_PEnPFS_CMPOB0 0X10
#define RX_PSEL_PEnPFS_TS33 0X19
#define RX_PSEL_PEnPFS_TS34 0x19
#define RX_PSEL_PEnPFS_TS35 0x19
/* PHnPFS */
#define RX_PSEL_PHnPFS_TMO0 0x05
#define RX_PSEL_PHnPFS_TMRI0 0x05
#define RX_PSEL_PHnPFS_TMCI0 0x05
#define RX_PSEL_PHnPFS_CACREF 0x7
#define RX_PSEL_PHnPFS_TS7 0x19
#define RX_PSEL_PHnPFS_TS8 0x19
#define RX_PSEL_PHnPFS_TS9 0x19
#define RX_PSEL_PHnPFS_TS10 0x19
/* PJnPFS */
#define RX_PSEL_PJnPFS_MTIOC3A 0x01
#define RX_PSEL_PJnPFS_MTIOC3C 0x01
#define RX_PSEL_PJnPFS_CTS6 0xB
#define RX_PSEL_PJnPFS_TTS6 0xB
#define RX_PSEL_PJnPFS_SS6 0xB
#define RX_PSEL(psel, port_num, pin_num) \
(psel << RX_PSEL_POS | pin_num << RX_PIN_NUM_POS | port_num << RX_PORT_NUM_POS)
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_SOC_RX_COMMON_H_ */

View file

@ -249,4 +249,14 @@ config HAS_RENESAS_RX_RDP
if HAS_RENESAS_RX_RDP
config USE_RX_RDP_MPC
bool
help
Enable RX RDP MPC driver
config USE_RX_RDP_GPIO
bool
help
Enable RX RDP MPC driver
endif # HAS_RENESAS_RX_RDP

View file

@ -0,0 +1,85 @@
/*
* Copyright (c) 2024 Renesas Electronics Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_SOC_RENESAS_RX_COMMON_PINCTRL_SOC_H_
#define ZEPHYR_SOC_RENESAS_RX_COMMON_PINCTRL_SOC_H_
#include <stdbool.h>
#include <zephyr/devicetree.h>
#include <zephyr/types.h>
#include <zephyr/dt-bindings/pinctrl/renesas/pinctrl-rx.h>
#define PORT_POS (8)
#define PIN_MODE_GPIO (0)
#define PIN_MODE_PERIPHERAL (1)
struct rx_pin_config {
bool pin_mode;
bool analog_enable;
bool output_enable;
bool output_high;
bool bias_pull_up;
bool drive_open_drain;
uint8_t drive_strength;
uint8_t psels;
};
/**
* @brief Type to hold a renesas ra pin's pinctrl configuration.
*/
struct rx_pinctrl_soc_pin {
/** Port number 0..5, A..E, H, J */
uint32_t port_num: 5;
/** Pin number 0..7 */
uint32_t pin_num: 4;
/** config pin */
struct rx_pin_config cfg;
};
typedef struct rx_pinctrl_soc_pin pinctrl_soc_pin_t;
/**
* @brief Utility macro to initialize each pin.
*
* @param node_id Node identifier.
* @param prop Property name.
* @param idx Property entry index.
*/
#define Z_PINCTRL_STATE_PIN_INIT(node_id, prop, idx) \
{ \
.port_num = RX_GET_PORT_NUM(DT_PROP_BY_IDX(node_id, prop, idx)), \
.pin_num = RX_GET_PIN_NUM(DT_PROP_BY_IDX(node_id, prop, idx)), \
.cfg = \
{ \
.pin_mode = PIN_MODE_PERIPHERAL, \
.analog_enable = DT_PROP(node_id, renesas_analog_enable), \
.output_enable = DT_PROP(node_id, output_enable), \
.output_high = DT_PROP(node_id, output_high), \
.bias_pull_up = DT_PROP(node_id, bias_pull_up), \
.drive_open_drain = DT_PROP(node_id, drive_open_drain), \
.drive_strength = DT_ENUM_IDX(node_id, drive_strength), \
.psels = RX_GET_PSEL(DT_PROP_BY_IDX(node_id, prop, idx)), \
}, \
},
/**
* @brief Utility macro to initialize state pins contained in a given property.
*
* @param node_id Node identifier.
* @param prop Property name describing state pins.
*/
#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \
{DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), DT_FOREACH_PROP_ELEM, psels, \
Z_PINCTRL_STATE_PIN_INIT)}
#define RX_GET_PORT_NUM(pinctrl) (((pinctrl) >> RX_PORT_NUM_POS) & RX_PORT_NUM_MASK)
#define RX_GET_PIN_NUM(pinctrl) (((pinctrl) >> RX_PIN_NUM_POS) & RX_PIN_NUM_MASK)
#define RX_GET_PSEL(pinctrl) (((pinctrl) >> RX_PSEL_POS) & RX_PSEL_MASK)
#endif /* ZEPHYR_SOC_RENESAS_RX_COMMON_PINCTRL_SOC_H_ */