/* * Copyright (c) 2016 BayLibre, SAS * Copyright (c) 2017 Linaro Ltd * Copyright (c) 2024 Intel Corporation * Copyright (c) 2025 STMicroelectronics * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #define LOG_LEVEL CONFIG_I2C_LOG_LEVEL #include LOG_MODULE_REGISTER(i2c_ll_stm32_common); #include "i2c_ll_stm32.h" #ifdef CONFIG_I2C_STM32_COMBINED_INTERRUPT void i2c_stm32_combined_isr(void *arg) { const struct device *dev = (const struct device *) arg; if (i2c_stm32_error(dev)) { return; } i2c_stm32_event(dev); } #else void i2c_stm32_event_isr(void *arg) { const struct device *dev = (const struct device *) arg; i2c_stm32_event(dev); } void i2c_stm32_error_isr(void *arg) { const struct device *dev = (const struct device *) arg; (void)i2c_stm32_error(dev); } #endif int i2c_stm32_activate(const struct device *dev) { int ret; const struct i2c_stm32_config *cfg = dev->config; const struct device *const clk = DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE); /* Move pins to active/default state */ ret = pinctrl_apply_state(cfg->pcfg, PINCTRL_STATE_DEFAULT); if (ret < 0) { LOG_ERR("I2C pinctrl setup failed (%d)", ret); return ret; } /* Enable device clock. */ if (clock_control_on(clk, (clock_control_subsys_t) &cfg->pclken[0]) != 0) { LOG_ERR("i2c: failure enabling clock"); return -EIO; } return 0; } #ifdef CONFIG_PM_DEVICE int i2c_stm32_suspend(const struct device *dev) { int ret; const struct i2c_stm32_config *cfg = dev->config; const struct device *const clk = DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE); /* Disable device clock. */ ret = clock_control_off(clk, (clock_control_subsys_t)&cfg->pclken[0]); if (ret < 0) { LOG_ERR("failure disabling I2C clock"); return ret; } /* Move pins to sleep state */ ret = pinctrl_apply_state(cfg->pcfg, PINCTRL_STATE_SLEEP); if (ret == -ENOENT) { /* Warn but don't block suspend */ LOG_WRN("I2C pinctrl sleep state not available "); } else if (ret < 0) { return ret; } return 0; } int i2c_stm32_pm_action(const struct device *dev, enum pm_device_action action) { int err; switch (action) { case PM_DEVICE_ACTION_RESUME: err = i2c_stm32_activate(dev); break; case PM_DEVICE_ACTION_SUSPEND: err = i2c_stm32_suspend(dev); break; default: return -ENOTSUP; } return err; } #endif