Skip to content

Commit

Permalink
drivers: watchdog: Driver for Infineon watchdog
Browse files Browse the repository at this point in the history
Initial version of the driver for Infineon CAT1 devices

Signed-off-by: Sreeram Tatapudi <[email protected]>
  • Loading branch information
sreeramIfx authored and nashif committed May 24, 2023
1 parent 8d8e90b commit d9e4f8f
Show file tree
Hide file tree
Showing 14 changed files with 201 additions and 1 deletion.
1 change: 1 addition & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions boards/arm/cy8cproto_062_4343w/cy8cproto_062_4343w.dts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
aliases {
uart-5 = &uart5;
i2c-0 = &i2c3;
watchdog0 = &watchdog0;
};

chosen {
Expand Down Expand Up @@ -102,3 +103,7 @@ i2c3: &scb3 {
pinctrl-0 = <&p6_0_scb3_i2c_scl &p6_1_scb3_i2c_sda>;
pinctrl-names = "default";
};

&watchdog0 {
status = "okay";
};
5 changes: 5 additions & 0 deletions boards/arm/cy8cproto_063_ble/cy8cproto_063_ble.dts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
uart-5 = &uart5;
led0 = &user_led;
sw0 = &user_bt;
watchdog0 = &watchdog0;
};

chosen {
Expand Down Expand Up @@ -120,3 +121,7 @@ uart5: &scb5 {
&bluetooth {
status = "okay";
};

&watchdog0 {
status = "okay";
};
1 change: 1 addition & 0 deletions boards/arm/cy8cproto_063_ble/cy8cproto_063_ble.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ supported:
- gpio
- uart
- i2c
- watchdog
1 change: 1 addition & 0 deletions drivers/watchdog/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions drivers/watchdog/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,6 @@ source "drivers/watchdog/Kconfig.tco"

source "drivers/watchdog/Kconfig.xlnx"

source "drivers/watchdog/Kconfig.ifx_cat1"

endif # WATCHDOG
14 changes: 14 additions & 0 deletions drivers/watchdog/Kconfig.ifx_cat1
Original file line number Diff line number Diff line change
@@ -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.
142 changes: 142 additions & 0 deletions drivers/watchdog/wdt_ifx_cat1.c
Original file line number Diff line number Diff line change
@@ -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);
2 changes: 1 addition & 1 deletion dts/arm/infineon/psoc6/psoc6_01/psoc6_01.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@
status = "disabled";
};

watchdog@40260180 {
watchdog0: watchdog@40260180 {
compatible = "infineon,cat1-watchdog";
reg = <0x40260180 0xc>;
interrupts = <22 6>;
Expand Down
7 changes: 7 additions & 0 deletions dts/arm/infineon/psoc6/psoc6_02/psoc6_02.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -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";
};
};
};
14 changes: 14 additions & 0 deletions dts/bindings/watchdog/infineon,cat1-watchdog.yaml
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions modules/hal_infineon/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions modules/hal_infineon/mtb-hal-cat1/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions modules/hal_infineon/mtb-pdl-cat1/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit d9e4f8f

Please sign in to comment.