drivers: dai: Enable Zephyr runtime power mgmt in Intel SSP driver
Enable Zephyr device runtime power management mechanisms in Intel SSP driver. This allows Zephyr to track usage reference for power domain gating. Signed-off-by: Krzysztof Frydryk <krzysztofx.frydryk@intel.com>
This commit is contained in:
parent
078de4e021
commit
8dd57467cc
5 changed files with 41 additions and 36 deletions
|
@ -10,6 +10,8 @@
|
|||
#include <stdint.h>
|
||||
#include <zephyr/spinlock.h>
|
||||
#include <zephyr/devicetree.h>
|
||||
#include <zephyr/pm/device.h>
|
||||
#include <zephyr/pm/device_runtime.h>
|
||||
#define LOG_DOMAIN dai_intel_ssp
|
||||
#include <zephyr/logging/log.h>
|
||||
LOG_MODULE_REGISTER(LOG_DOMAIN);
|
||||
|
@ -1928,52 +1930,39 @@ static int dai_ssp_remove(struct dai_intel_ssp *dp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dai_ssp_probe_wrapper(const struct device *dev)
|
||||
static int ssp_pm_action(const struct device *dev, enum pm_device_action action)
|
||||
{
|
||||
struct dai_intel_ssp *dp = (struct dai_intel_ssp *)dev->data;
|
||||
k_spinlock_key_t key;
|
||||
int ret = 0;
|
||||
|
||||
key = k_spin_lock(&dp->lock);
|
||||
|
||||
if (dp->sref == 0) {
|
||||
ret = dai_ssp_probe(dp);
|
||||
switch (action) {
|
||||
case PM_DEVICE_ACTION_SUSPEND:
|
||||
dai_ssp_remove(dp);
|
||||
break;
|
||||
case PM_DEVICE_ACTION_RESUME:
|
||||
dai_ssp_probe(dp);
|
||||
break;
|
||||
case PM_DEVICE_ACTION_TURN_OFF:
|
||||
case PM_DEVICE_ACTION_TURN_ON:
|
||||
/* All device pm is handled during resume and suspend */
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
dp->sref++;
|
||||
}
|
||||
|
||||
k_spin_unlock(&dp->lock, key);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int dai_ssp_remove_wrapper(const struct device *dev)
|
||||
{
|
||||
struct dai_intel_ssp *dp = (struct dai_intel_ssp *)dev->data;
|
||||
k_spinlock_key_t key;
|
||||
int ret = 0;
|
||||
|
||||
key = k_spin_lock(&dp->lock);
|
||||
|
||||
if (--dp->sref == 0) {
|
||||
ret = dai_ssp_remove(dp);
|
||||
}
|
||||
|
||||
k_spin_unlock(&dp->lock, key);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ssp_init(const struct device *dev)
|
||||
{
|
||||
return 0;
|
||||
int ret;
|
||||
|
||||
pm_device_init_suspended(dev);
|
||||
ret = pm_device_runtime_enable(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct dai_driver_api dai_intel_ssp_api_funcs = {
|
||||
.probe = dai_ssp_probe_wrapper,
|
||||
.remove = dai_ssp_remove_wrapper,
|
||||
.probe = pm_device_runtime_get,
|
||||
.remove = pm_device_runtime_put,
|
||||
.config_set = dai_ssp_config_set,
|
||||
.config_get = dai_ssp_config_get,
|
||||
.trigger = dai_ssp_trigger,
|
||||
|
@ -2026,8 +2015,10 @@ static const char irq_name_level5_z[] = "level5";
|
|||
}, \
|
||||
}; \
|
||||
\
|
||||
PM_DEVICE_DT_INST_DEFINE(n, ssp_pm_action); \
|
||||
\
|
||||
DEVICE_DT_INST_DEFINE(n, \
|
||||
ssp_init, NULL, \
|
||||
ssp_init, PM_DEVICE_DT_INST_GET(n), \
|
||||
&dai_intel_ssp_data_##n, \
|
||||
&dai_intel_ssp_config_##n, \
|
||||
POST_KERNEL, 32, \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue