diff --git a/drivers/clock_control/clock_control_nrfs_audiopll.c b/drivers/clock_control/clock_control_nrfs_audiopll.c index c4df962144a0..fe18182af5a1 100644 --- a/drivers/clock_control/clock_control_nrfs_audiopll.c +++ b/drivers/clock_control/clock_control_nrfs_audiopll.c @@ -147,6 +147,22 @@ static int shim_nrfs_request_freq_sync(const struct device *dev, uint16_t freq_f return dev_data->evt == NRFS_AUDIOPLL_EVT_FREQ_CONFIRMED ? 0 : -EIO; } +static int shim_nrfs_request_disable_sync(const struct device *dev) +{ + struct shim_data *dev_data = dev->data; + nrfs_err_t err; + + LOG_DBG("send disable request"); + + err = nrfs_audiopll_disable_request(dev_data); + if (err != NRFS_SUCCESS) { + return -EIO; + } + + k_sem_take(&dev_data->evt_sem, K_FOREVER); + return dev_data->evt == NRFS_AUDIOPLL_EVT_DISABLED ? 0 : -EIO; +} + static int shim_nrfs_request_prescaler_sync(const struct device *dev, enum audiopll_prescaler_div div) { @@ -274,6 +290,13 @@ static int shim_init(const struct device *dev) return ret; } + /* Requesting freq or prescaler automatically enables clock, disable it */ + ret = shim_nrfs_request_disable_sync(dev); + if (ret) { + LOG_ERR("failed to disable clock"); + return ret; + } + nrfs_audiopll_uninit(); ret = onoff_manager_init(&dev_data->mgr, &shim_mgr_transitions);