static inline int stm32_clock_control_off(struct device *dev, clock_control_subsys_t sub_system) { struct stm32_pclken *pclken = (struct stm32_pclken *)(sub_system); ARG_UNUSED(dev); switch (pclken->bus) { case STM32_CLOCK_BUS_AHB1: LL_AHB1_GRP1_DisableClock(pclken->enr); break; #if defined(CONFIG_SOC_SERIES_STM32L4X) || defined(CONFIG_SOC_SERIES_STM32F4X) case STM32_CLOCK_BUS_AHB2: LL_AHB2_GRP1_DisableClock(pclken->enr); break; #endif /* CONFIG_SOC_SERIES_STM32L4X || CONFIG_SOC_SERIES_STM32F4X */ case STM32_CLOCK_BUS_APB1: LL_APB1_GRP1_DisableClock(pclken->enr); break; #if defined(CONFIG_SOC_SERIES_STM32L4X) || defined(CONFIG_SOC_SERIES_STM32F0X) case STM32_CLOCK_BUS_APB1_2: LL_APB1_GRP2_DisableClock(pclken->enr); break; #endif /* CONFIG_SOC_SERIES_STM32L4X || CONFIG_SOC_SERIES_STM32F0X */ #ifndef CONFIG_SOC_SERIES_STM32F0X case STM32_CLOCK_BUS_APB2: LL_APB2_GRP1_DisableClock(pclken->enr); break; #endif /* CONFIG_SOC_SERIES_STM32F0X */ } return 0; }
/** * @brief De-initialize the UCPD registers to their default reset values. * @param UCPDx ucpd Instance * @retval An ErrorStatus enumeration value: * - SUCCESS: ucpd registers are de-initialized * - ERROR: ucpd registers are not de-initialized */ ErrorStatus LL_UCPD_DeInit(UCPD_TypeDef *UCPDx) { ErrorStatus status = ERROR; /* Check the parameters */ assert_param(IS_UCPD_ALL_INSTANCE(UCPDx)); LL_UCPD_Disable(UCPDx); if (UCPD1 == UCPDx) { /* Force reset of ucpd clock */ LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UCPD1); /* Release reset of ucpd clock */ LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UCPD1); /* Disbale ucpd clock */ LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_UCPD1); status = SUCCESS; } if (UCPD2 == UCPDx) { /* Force reset of ucpd clock */ LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UCPD2); /* Release reset of ucpd clock */ LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UCPD2); /* Disbale ucpd clock */ LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_UCPD2); status = SUCCESS; } return status; }
int usb_dc_attach(void) { int ret; LOG_DBG(""); /* * For STM32F0 series SoCs on QFN28 and TSSOP20 packages enable PIN * pair PA11/12 mapped instead of PA9/10 (e.g. stm32f070x6) */ #if defined(DT_USB_ENABLE_PIN_REMAP) if (LL_APB1_GRP2_IsEnabledClock(LL_APB1_GRP2_PERIPH_SYSCFG)) { LL_SYSCFG_EnablePinRemap(); } else { LOG_ERR("System Configuration Controller clock is " "disable. Unable to enable pin remapping." } #endif ret = usb_dc_stm32_clock_enable(); if (ret) { return ret; } ret = usb_dc_stm32_init(); if (ret) { return ret; } /* * Required for at least STM32L4 devices as they electrically * isolate USB features from VDDUSB. It must be enabled before * USB can function. Refer to section 5.1.3 in DM00083560 or * DM00310109. */ #ifdef PWR_CR2_USV if (LL_APB1_GRP1_IsEnabledClock(LL_APB1_GRP1_PERIPH_PWR)) { LL_PWR_EnableVddUSB(); } else { LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); LL_PWR_EnableVddUSB(); LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_PWR); } #endif /* PWR_CR2_USV */ return 0; }