drivers: misc: add Renesas RA ELC driver
Add support for the Renesas RA Event Link Controller, including driver sources, Kconfig, and Devicetree bindings. Signed-off-by: Khanh Nguyen <khanh.nguyen.wz@bp.renesas.com> Signed-off-by: Khoa Nguyen <khoa.nguyen.xh@renesas.com>
This commit is contained in:
parent
4cb73f8209
commit
ed757ca290
11 changed files with 282 additions and 0 deletions
|
@ -14,3 +14,4 @@ add_subdirectory_ifdef(CONFIG_RENESAS_RA_EXTERNAL_INTERRUPT renesas_ra_external_
|
|||
add_subdirectory_ifdef(CONFIG_NXP_RTXXX_DSP_CTRL nxp_rtxxx_dsp_ctrl)
|
||||
|
||||
add_subdirectory(coresight)
|
||||
add_subdirectory(interconn)
|
||||
|
|
|
@ -15,6 +15,7 @@ source "drivers/misc/devmux/Kconfig"
|
|||
source "drivers/misc/nordic_vpr_launcher/Kconfig"
|
||||
source "drivers/misc/mcux_flexio/Kconfig"
|
||||
source "drivers/misc/coresight/Kconfig"
|
||||
source "drivers/misc/interconn/Kconfig"
|
||||
source "drivers/misc/renesas_ra_external_interrupt/Kconfig"
|
||||
source "drivers/misc/nxp_rtxxx_dsp_ctrl/Kconfig"
|
||||
|
||||
|
|
3
drivers/misc/interconn/CMakeLists.txt
Normal file
3
drivers/misc/interconn/CMakeLists.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
add_subdirectory_ifdef(CONFIG_RENESAS_ELC renesas_elc)
|
10
drivers/misc/interconn/Kconfig
Normal file
10
drivers/misc/interconn/Kconfig
Normal file
|
@ -0,0 +1,10 @@
|
|||
# Interconn drivers not exposing Zephyr Device Driver API
|
||||
|
||||
# Copyright (c) 2025 Renesas Electronics Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
menu "Interconn Drivers"
|
||||
|
||||
source "drivers/misc/interconn/renesas_elc/Kconfig"
|
||||
|
||||
endmenu
|
9
drivers/misc/interconn/renesas_elc/CMakeLists.txt
Normal file
9
drivers/misc/interconn/renesas_elc/CMakeLists.txt
Normal file
|
@ -0,0 +1,9 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
zephyr_syscall_header(${ZEPHYR_BASE}/include/zephyr/drivers/misc/interconn/renesas_elc/renesas_elc.h)
|
||||
|
||||
zephyr_library()
|
||||
|
||||
zephyr_library_sources_ifdef(CONFIG_USERSPACE renesas_elc_handlers.c)
|
||||
|
||||
zephyr_library_sources_ifdef(CONFIG_RENESAS_RA_ELC renesas_ra_elc.c)
|
22
drivers/misc/interconn/renesas_elc/Kconfig
Normal file
22
drivers/misc/interconn/renesas_elc/Kconfig
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Copyright (c) 2025 Renesas Electronics Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Renesas Event Link Controller config options
|
||||
|
||||
menuconfig RENESAS_ELC
|
||||
bool "Renesas Event Link Controller Driver"
|
||||
depends on SOC_FAMILY_RENESAS_RA
|
||||
help
|
||||
Enable config options for Renesas Event Link Controller
|
||||
|
||||
if RENESAS_ELC
|
||||
|
||||
config RENESAS_ELC_INIT_PRIORITY
|
||||
int "Renesas Event Link Controller initialization priority"
|
||||
default KERNEL_INIT_PRIORITY_DEVICE
|
||||
help
|
||||
System initialization priority for Renesas Event Link Controller drivers.
|
||||
|
||||
source "drivers/misc/interconn/renesas_elc/Kconfig.renesas_ra_elc"
|
||||
|
||||
endif # RENESAS_ELC
|
12
drivers/misc/interconn/renesas_elc/Kconfig.renesas_ra_elc
Normal file
12
drivers/misc/interconn/renesas_elc/Kconfig.renesas_ra_elc
Normal file
|
@ -0,0 +1,12 @@
|
|||
# Copyright (c) 2025 Renesas Electronics Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Renesas RA Event Link Controller Option
|
||||
|
||||
config RENESAS_RA_ELC
|
||||
bool "Renesas RA Event Link Controller Driver"
|
||||
depends on DT_HAS_RENESAS_RA_ELC_ENABLED
|
||||
select USE_RA_FSP_ELC
|
||||
default y
|
||||
help
|
||||
Enable config options for Renesas RA Event Link Controller
|
45
drivers/misc/interconn/renesas_elc/renesas_elc_handlers.c
Normal file
45
drivers/misc/interconn/renesas_elc/renesas_elc_handlers.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* Copyright (c) 2025 Renesas Electronics Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/drivers/misc/interconn/renesas_elc/renesas_elc.h>
|
||||
#include <zephyr/syscall_handler.h>
|
||||
|
||||
int z_vrfy_renesas_elc_software_event_generate(const struct device *dev,
|
||||
elc_software_event_t sw_event)
|
||||
{
|
||||
K_OOPS(K_SYSCALL_DRIVER_RENESAS_ELC(dev, software_event_generate));
|
||||
return z_impl_renesas_elc_software_event_generate(dev, sw_event);
|
||||
}
|
||||
#include <zephyr/syscalls/renesas_elc_software_event_generate_mrsh.c>
|
||||
|
||||
int z_vrfy_renesas_elc_link_set(const struct device *dev, elc_peripheral_t peripheral,
|
||||
elc_event_t event)
|
||||
{
|
||||
K_OOPS(K_SYSCALL_DRIVER_RENESAS_ELC(dev, link_set));
|
||||
return z_impl_renesas_elc_link_set(dev, peripheral, event);
|
||||
}
|
||||
#include <zephyr/syscalls/renesas_elc_link_set_mrsh.c>
|
||||
|
||||
int z_vrfy_renesas_elc_link_break(const struct device *dev, elc_peripheral_t peripheral)
|
||||
{
|
||||
K_OOPS(K_SYSCALL_DRIVER_RENESAS_ELC(dev, link_break));
|
||||
return z_impl_renesas_elc_link_break(dev, peripheral);
|
||||
}
|
||||
#include <zephyr/syscalls/renesas_elc_link_break_mrsh.c>
|
||||
|
||||
int z_vrfy_renesas_elc_enable(const struct device *dev)
|
||||
{
|
||||
K_OOPS(K_SYSCALL_DRIVER_RENESAS_ELC(dev, enable));
|
||||
return z_impl_renesas_elc_enable(dev);
|
||||
}
|
||||
#include <zephyr/syscalls/renesas_elc_enable_mrsh.c>
|
||||
|
||||
int z_vrfy_renesas_elc_disable(const struct device *dev)
|
||||
{
|
||||
K_OOPS(K_SYSCALL_DRIVER_RENESAS_ELC(dev, disable));
|
||||
return z_impl_renesas_elc_disable(dev);
|
||||
}
|
||||
#include <zephyr/syscalls/renesas_elc_disable_mrsh.c>
|
151
drivers/misc/interconn/renesas_elc/renesas_ra_elc.c
Normal file
151
drivers/misc/interconn/renesas_elc/renesas_ra_elc.c
Normal file
|
@ -0,0 +1,151 @@
|
|||
/*
|
||||
* Copyright (c) 2025 Renesas Electronics Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#define DT_DRV_COMPAT renesas_ra_elc
|
||||
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/sys/util_macro.h>
|
||||
#include <zephyr/drivers/misc/interconn/renesas_elc/renesas_elc.h>
|
||||
#include <zephyr/drivers/clock_control/renesas_ra_cgc.h>
|
||||
#include <soc.h>
|
||||
#include <r_elc.h>
|
||||
|
||||
struct renesas_ra_elc_config {
|
||||
const elc_cfg_t fsp_cfg;
|
||||
const struct device *clock_dev;
|
||||
const struct clock_control_ra_subsys_cfg clock_subsys;
|
||||
};
|
||||
|
||||
struct renesas_ra_elc_data {
|
||||
elc_instance_ctrl_t fsp_ctrl;
|
||||
};
|
||||
|
||||
static int renesas_ra_elc_software_event_generate(const struct device *dev, uint32_t event)
|
||||
{
|
||||
struct renesas_ra_elc_data *data = (struct renesas_ra_elc_data *const)(dev)->data;
|
||||
fsp_err_t err;
|
||||
|
||||
err = R_ELC_SoftwareEventGenerate(&data->fsp_ctrl, event);
|
||||
if (err != FSP_SUCCESS) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int renesas_ra_elc_link_set(const struct device *dev, uint32_t peripheral, uint32_t event)
|
||||
{
|
||||
struct renesas_ra_elc_data *data = (struct renesas_ra_elc_data *const)(dev)->data;
|
||||
fsp_err_t err;
|
||||
|
||||
if (BIT(peripheral) & BSP_ELC_PERIPHERAL_MASK) {
|
||||
err = R_ELC_LinkSet(&data->fsp_ctrl, peripheral, event);
|
||||
if (err != FSP_SUCCESS) {
|
||||
return -EIO;
|
||||
}
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int renesas_ra_elc_link_break(const struct device *dev, uint32_t peripheral)
|
||||
{
|
||||
struct renesas_ra_elc_data *data = (struct renesas_ra_elc_data *const)(dev)->data;
|
||||
fsp_err_t err;
|
||||
|
||||
if (BIT(peripheral) & BSP_ELC_PERIPHERAL_MASK) {
|
||||
err = R_ELC_LinkBreak(&data->fsp_ctrl, peripheral);
|
||||
if (err != FSP_SUCCESS) {
|
||||
return -EIO;
|
||||
}
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int renesas_ra_elc_enable(const struct device *dev)
|
||||
{
|
||||
struct renesas_ra_elc_data *data = (struct renesas_ra_elc_data *const)(dev)->data;
|
||||
fsp_err_t err;
|
||||
|
||||
err = R_ELC_Enable(&data->fsp_ctrl);
|
||||
if (err != FSP_SUCCESS) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int renesas_ra_elc_disable(const struct device *dev)
|
||||
{
|
||||
struct renesas_ra_elc_data *data = (struct renesas_ra_elc_data *const)(dev)->data;
|
||||
fsp_err_t err;
|
||||
|
||||
err = R_ELC_Disable(&data->fsp_ctrl);
|
||||
if (err != FSP_SUCCESS) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int renesas_ra_elc_init(const struct device *dev)
|
||||
{
|
||||
struct renesas_ra_elc_data *data = (struct renesas_ra_elc_data *const)(dev)->data;
|
||||
struct renesas_ra_elc_config *cfg = (struct renesas_ra_elc_config *const)(dev)->config;
|
||||
fsp_err_t err;
|
||||
int ret;
|
||||
|
||||
if (!device_is_ready(cfg->clock_dev)) {
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = clock_control_on(cfg->clock_dev, (clock_control_subsys_t)&cfg->clock_subsys);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
err = R_ELC_Open(&data->fsp_ctrl, &cfg->fsp_cfg);
|
||||
if (err != FSP_SUCCESS) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static DEVICE_API(renesas_elc, renesas_ra_elc_driver_api) = {
|
||||
.software_event_generate = renesas_ra_elc_software_event_generate,
|
||||
.link_set = renesas_ra_elc_link_set,
|
||||
.link_break = renesas_ra_elc_link_break,
|
||||
.enable = renesas_ra_elc_enable,
|
||||
.disable = renesas_ra_elc_disable,
|
||||
};
|
||||
|
||||
#define RA_ELC_INIT(inst) \
|
||||
static const struct renesas_ra_elc_config renesas_ra_elc_config_##inst = { \
|
||||
.fsp_cfg = \
|
||||
{ \
|
||||
.link = {0}, \
|
||||
.p_extend = NULL, \
|
||||
}, \
|
||||
.clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(inst)), \
|
||||
.clock_subsys = \
|
||||
{ \
|
||||
.mstp = (uint32_t)DT_INST_CLOCKS_CELL_BY_IDX(inst, 0, mstp), \
|
||||
.stop_bit = DT_INST_CLOCKS_CELL_BY_IDX(inst, 0, stop_bit), \
|
||||
}, \
|
||||
}; \
|
||||
static struct renesas_ra_elc_data renesas_ra_elc_data_##inst; \
|
||||
DEVICE_DT_INST_DEFINE(inst, renesas_ra_elc_init, NULL, &renesas_ra_elc_data_##inst, \
|
||||
&renesas_ra_elc_config_##inst, PRE_KERNEL_1, \
|
||||
CONFIG_RENESAS_ELC_INIT_PRIORITY, &renesas_ra_elc_driver_api);
|
||||
|
||||
DT_INST_FOREACH_STATUS_OKAY(RA_ELC_INIT)
|
23
dts/bindings/misc/renesas,ra-elc.yaml
Normal file
23
dts/bindings/misc/renesas,ra-elc.yaml
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Copyright (c) 2025 Renesas Electronics Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
description: Renesas RA Event Link Controller
|
||||
|
||||
compatible: "renesas,ra-elc"
|
||||
|
||||
include: [base.yaml]
|
||||
|
||||
properties:
|
||||
reg:
|
||||
required: true
|
||||
|
||||
clocks:
|
||||
required: true
|
||||
|
||||
"#renesas-elc-cells":
|
||||
type: int
|
||||
const: 2
|
||||
|
||||
renesas-elc-cells:
|
||||
- peripheral
|
||||
- event
|
|
@ -186,6 +186,11 @@ config USE_RA_FSP_OSPI_B_NOR_FLASH
|
|||
help
|
||||
Enable RA FSP Octal-SPI driver
|
||||
|
||||
config USE_RA_FSP_ELC
|
||||
bool
|
||||
help
|
||||
Enable RA FSP ELC driver
|
||||
|
||||
endif # HAS_RENESAS_RA_FSP
|
||||
|
||||
if HAS_RENESAS_RZ_FSP
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue