drivers: watchdog: Driver for Infineon watchdog

Initial version of the driver for Infineon CAT1 devices

Signed-off-by: Sreeram Tatapudi <sreeram.praveen@infineon.com>
This commit is contained in:
Sreeram Tatapudi 2023-05-05 16:57:21 -07:00 committed by Anas Nashif
parent 8d8e90b28f
commit d9e4f8fa1d
14 changed files with 201 additions and 1 deletions

View file

@ -474,6 +474,7 @@
/drivers/watchdog/wdt_counter.c @nordic-krch
/drivers/watchdog/*rpi_pico* @thedjnK
/drivers/watchdog/*dw* @softwarecki
/drivers/watchdog/*ifx* @sreeramIfx
/drivers/wifi/ @rlubos @tbursztyka
/drivers/wifi/esp_at/ @mniestroj
/drivers/wifi/eswifi/ @loicpoulain @nandojve

View file

@ -16,6 +16,7 @@
aliases {
uart-5 = &uart5;
i2c-0 = &i2c3;
watchdog0 = &watchdog0;
};
chosen {
@ -102,3 +103,7 @@ i2c3: &scb3 {
pinctrl-0 = <&p6_0_scb3_i2c_scl &p6_1_scb3_i2c_sda>;
pinctrl-names = "default";
};
&watchdog0 {
status = "okay";
};

View file

@ -18,6 +18,7 @@
uart-5 = &uart5;
led0 = &user_led;
sw0 = &user_bt;
watchdog0 = &watchdog0;
};
chosen {
@ -120,3 +121,7 @@ uart5: &scb5 {
&bluetooth {
status = "okay";
};
&watchdog0 {
status = "okay";
};

View file

@ -17,3 +17,4 @@ supported:
- gpio
- uart
- i2c
- watchdog

View file

@ -33,6 +33,7 @@ zephyr_library_sources_ifdef(CONFIG_WDT_NXP_S32 wdt_nxp_s32.c)
zephyr_library_sources_ifdef(CONFIG_WDT_SMARTBOND wdt_smartbond.c)
zephyr_library_sources_ifdef(CONFIG_WDT_TI_TPS382X wdt_ti_tps382x.c)
zephyr_library_sources_ifdef(CONFIG_WDT_XILINX_AXI wdt_xilinx_axi.c)
zephyr_library_sources_ifdef(CONFIG_WDT_INFINEON_CAT1 wdt_ifx_cat1.c)
zephyr_library_sources_ifdef(CONFIG_WDT_DW wdt_dw.c wdt_dw_common.c)
zephyr_library_sources_ifdef(CONFIG_WDT_INTEL_ADSP wdt_intel_adsp.c wdt_dw_common.c)

View file

@ -106,4 +106,6 @@ source "drivers/watchdog/Kconfig.tco"
source "drivers/watchdog/Kconfig.xlnx"
source "drivers/watchdog/Kconfig.ifx_cat1"
endif # WATCHDOG

View file

@ -0,0 +1,14 @@
# Infineon CAT1 Watchdog configuration options
# Copyright (c) 2023 Cypress Semiconductor Corporation (an Infineon company) or
# an affiliate of Cypress Semiconductor Corporation
#
# SPDX-License-Identifier: Apache-2.0
config WDT_INFINEON_CAT1
bool "Infineon CAT1 Watchdog Driver"
default y
depends on DT_HAS_INFINEON_CAT1_WATCHDOG_ENABLED
select USE_INFINEON_WDT
help
Enable Watchdog driver for Infineon CAT1 devices.

View file

@ -0,0 +1,142 @@
/*
* Copyright 2023 Cypress Semiconductor Corporation (an Infineon company) or
* an affiliate of Cypress Semiconductor Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#define DT_DRV_COMPAT infineon_cat1_watchdog
#include "cyhal_wdt.h"
#include <zephyr/devicetree.h>
#include <zephyr/drivers/watchdog.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(wdt_infineon_cat1, CONFIG_WDT_LOG_LEVEL);
#define IFX_CAT1_WDT_IS_IRQ_EN DT_NODE_HAS_PROP(DT_DRV_INST(0), interrupts)
struct ifx_cat1_wdt_data {
cyhal_wdt_t obj;
#ifdef IFX_CAT1_WDT_IS_IRQ_EN
wdt_callback_t callback;
#endif /* IFX_CAT1_WDT_IS_IRQ_EN */
uint32_t timeout;
bool timeout_installed;
};
struct ifx_cat1_wdt_data wdt_data;
#ifdef IFX_CAT1_WDT_IS_IRQ_EN
static void ifx_cat1_wdt_isr_handler(const struct device *dev)
{
struct ifx_cat1_wdt_data *dev_data = dev->data;
if (dev_data->callback) {
dev_data->callback(dev, 0);
}
}
#endif /* IFX_CAT1_WDT_IS_IRQ_EN */
static int ifx_cat1_wdt_setup(const struct device *dev, uint8_t options)
{
cy_rslt_t result;
struct ifx_cat1_wdt_data *dev_data = dev->data;
/* Initialize the WDT */
result = cyhal_wdt_init(&dev_data->obj, dev_data->timeout);
if (result != CY_RSLT_SUCCESS) {
LOG_ERR("Initialization failure : 0x%x", result);
return -ENOMSG;
}
#ifdef IFX_CAT1_WDT_IS_IRQ_EN
if (dev_data->callback) {
Cy_WDT_UnmaskInterrupt();
irq_enable(DT_INST_IRQN(0));
}
#endif /* IFX_CAT1_WDT_IS_IRQ_EN */
return 0;
}
static int ifx_cat1_wdt_disable(const struct device *dev)
{
struct ifx_cat1_wdt_data *dev_data = dev->data;
#ifdef IFX_CAT1_WDT_IS_IRQ_EN
Cy_WDT_MaskInterrupt();
irq_disable(DT_INST_IRQN(0));
#endif /* IFX_CAT1_WDT_IS_IRQ_EN */
cyhal_wdt_free(&dev_data->obj);
return 0;
}
static int ifx_cat1_wdt_install_timeout(const struct device *dev, const struct wdt_timeout_cfg *cfg)
{
struct ifx_cat1_wdt_data *dev_data = dev->data;
if (dev_data->timeout_installed) {
LOG_ERR("No more timeouts can be installed");
return -ENOMEM;
}
if (cfg->flags) {
LOG_WRN("Watchdog behavior is not configurable.");
}
if (cfg->callback) {
#ifndef IFX_CAT1_WDT_IS_IRQ_EN
LOG_WRN("Interrupt is not configured, can't set a callback.");
#else
dev_data->callback = cfg->callback;
#endif /* IFX_CAT1_WDT_IS_IRQ_EN */
}
/* window watchdog not supported */
if (cfg->window.min != 0U || cfg->window.max == 0U) {
return -EINVAL;
}
dev_data->timeout = cfg->window.max;
return 0;
}
static int ifx_cat1_wdt_feed(const struct device *dev, int channel_id)
{
struct ifx_cat1_wdt_data *data = dev->data;
/* Only channel 0 is supported */
if (channel_id) {
return -EINVAL;
}
cyhal_wdt_kick(&data->obj);
return 0;
}
static int ifx_cat1_wdt_init(const struct device *dev)
{
#ifdef IFX_CAT1_WDT_IS_IRQ_EN
/* Connect WDT interrupt to ISR */
IRQ_CONNECT(DT_INST_IRQN(0), DT_INST_IRQ(0, priority), ifx_cat1_wdt_isr_handler,
DEVICE_DT_INST_GET(0), 0);
#endif /* IFX_CAT1_WDT_IS_IRQ_EN */
return 0;
}
static const struct wdt_driver_api ifx_cat1_wdt_api = {
.setup = ifx_cat1_wdt_setup,
.disable = ifx_cat1_wdt_disable,
.install_timeout = ifx_cat1_wdt_install_timeout,
.feed = ifx_cat1_wdt_feed,
};
DEVICE_DT_INST_DEFINE(0, ifx_cat1_wdt_init, NULL, &wdt_data, NULL, POST_KERNEL,
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &ifx_cat1_wdt_api);

View file

@ -299,7 +299,7 @@
status = "disabled";
};
watchdog@40260180 {
watchdog0: watchdog@40260180 {
compatible = "infineon,cat1-watchdog";
reg = <0x40260180 0xc>;
interrupts = <22 6>;

View file

@ -310,5 +310,12 @@
status = "disabled";
#io-channel-cells = <1>;
};
watchdog0: watchdog@40260180 {
compatible = "infineon,cat1-watchdog";
reg = <0x40260180 0xc>;
interrupts = <22 6>;
status = "disabled";
};
};
};

View file

@ -0,0 +1,14 @@
# Copyright (c) 2023 Cypress Semiconductor Corporation (an Infineon company) or
# an affiliate of Cypress Semiconductor Corporation
#
# SPDX-License-Identifier: Apache-2.0
description: Infineon CAT1 Watchdog
compatible: "infineon,cat1-watchdog"
include: base.yaml
properties:
reg:
required: true

View file

@ -60,6 +60,12 @@ config USE_INFINEON_PWM
Enable Pulse Width Modulator (PWM) HAL module
driver for Infineon devices
config USE_INFINEON_WDT
bool
help
Enable WATCHDOG TIMER (WDT) HAL module
driver for Infineon devices
config ABSTRACTION_RTOS_COMPONENT_ZEPHYR
bool "Abstraction RTOS component (Zephyr support)"
default n

View file

@ -78,6 +78,7 @@ zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_SPI ${hal_psoc6_dir}/source
zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_TIMER ${hal_psoc6_dir}/source/cyhal_timer.c)
zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_TRNG ${hal_psoc6_dir}/source/cyhal_trng.c)
zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_UART ${hal_psoc6_dir}/source/cyhal_uart.c)
zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_WDT ${hal_psoc6_dir}/source/cyhal_wdt.c)
if(CONFIG_USE_INFINEON_ADC)

View file

@ -36,6 +36,7 @@ zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_SPI ${pdl_drv_dir}/source/
zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_TIMER ${pdl_drv_dir}/source/cy_tcpwm_counter.c)
zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_UART ${pdl_drv_dir}/source/cy_scb_uart.c)
zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_FLASH ${pdl_drv_dir}/source/cy_flash.c)
zephyr_library_sources_ifdef(CONFIG_USE_INFINEON_WDT ${pdl_drv_dir}/source/cy_wdt.c)
if(CONFIG_USE_INFINEON_TRNG)
zephyr_library_sources(${pdl_drv_dir}/source/cy_crypto.c)