diff --git a/drivers/dai/intel/hda/hda.c b/drivers/dai/intel/hda/hda.c index 45c803e59c1..c057466b5a6 100644 --- a/drivers/dai/intel/hda/hda.c +++ b/drivers/dai/intel/hda/hda.c @@ -8,7 +8,10 @@ #include #include #include +#include #include +#include +#include #include #define DT_DRV_COMPAT intel_hda_dai @@ -103,9 +106,35 @@ static int dai_hda_remove(const struct device *dev) return 0; } +static int hda_pm_action(const struct device *dev, enum pm_device_action action) +{ + switch (action) { + case PM_DEVICE_ACTION_SUSPEND: + dai_hda_remove(dev); + break; + case PM_DEVICE_ACTION_RESUME: + dai_hda_probe(dev); + 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; + } + + return 0; +} + +static int hda_init(const struct device *dev) +{ + LOG_DBG("%s", __func__); + return pm_device_driver_init(dev, hda_pm_action); +} + static DEVICE_API(dai, dai_intel_hda_api_funcs) = { - .probe = dai_hda_probe, - .remove = dai_hda_remove, + .probe = pm_device_runtime_get, + .remove = pm_device_runtime_put, .config_set = dai_hda_config_set, .config_get = dai_hda_config_get, .trigger = dai_hda_trigger, @@ -122,11 +151,14 @@ static DEVICE_API(dai, dai_intel_hda_api_funcs) = { \ }; \ \ + PM_DEVICE_DT_INST_DEFINE(n, hda_pm_action); \ + \ DEVICE_DT_INST_DEFINE(n, \ - NULL, NULL, \ + hda_init, PM_DEVICE_DT_INST_GET(n), \ &dai_intel_hda_data_##n, \ &dai_intel_hda_config_##n, \ - POST_KERNEL, 32, \ + POST_KERNEL, \ + CONFIG_DAI_INIT_PRIORITY, \ &dai_intel_hda_api_funcs); DT_INST_FOREACH_STATUS_OKAY(DAI_INTEL_HDA_DEVICE_INIT) diff --git a/dts/xtensa/intel/intel_adsp_ace15_mtpm.dtsi b/dts/xtensa/intel/intel_adsp_ace15_mtpm.dtsi index da00cf53a4e..a151392ead9 100644 --- a/dts/xtensa/intel/intel_adsp_ace15_mtpm.dtsi +++ b/dts/xtensa/intel/intel_adsp_ace15_mtpm.dtsi @@ -612,96 +612,134 @@ hda0: hda@0 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0>; }; hda1: hda@1 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <1>; }; hda2: hda@2 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <2>; }; hda3: hda@3 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <3>; }; hda4: hda@4 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <4>; }; hda5: hda@5 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <5>; }; hda6: hda@6 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <6>; }; hda7: hda@7 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <7>; }; hda8: hda@8 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <8>; }; hda9: hda@9 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <9>; }; hda10: hda@a { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0a>; }; hda11: hda@b { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0b>; }; hda12: hda@c { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0c>; }; hda13: hda@d { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0d>; }; hda14: hda@e { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0e>; }; hda15: hda@f { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0f>; }; hda16: hda@10 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x10>; }; hda17: hda@11 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x11>; }; hda18: hda@12 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x12>; }; diff --git a/dts/xtensa/intel/intel_adsp_ace20_lnl.dtsi b/dts/xtensa/intel/intel_adsp_ace20_lnl.dtsi index 66a57841850..39106ac155e 100644 --- a/dts/xtensa/intel/intel_adsp_ace20_lnl.dtsi +++ b/dts/xtensa/intel/intel_adsp_ace20_lnl.dtsi @@ -466,96 +466,134 @@ hda0: hda@0 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0>; }; hda1: hda@1 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <1>; }; hda2: hda@2 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <2>; }; hda3: hda@3 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <3>; }; hda4: hda@4 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <4>; }; hda5: hda@5 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <5>; }; hda6: hda@6 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <6>; }; hda7: hda@7 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <7>; }; hda8: hda@8 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <8>; }; hda9: hda@9 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <9>; }; hda10: hda@a { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0a>; }; hda11: hda@b { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0b>; }; hda12: hda@c { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0c>; }; hda13: hda@d { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0d>; }; hda14: hda@e { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0e>; }; hda15: hda@f { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0f>; }; hda16: hda@10 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x10>; }; hda17: hda@11 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x11>; }; hda18: hda@12 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x12>; }; diff --git a/dts/xtensa/intel/intel_adsp_ace30.dtsi b/dts/xtensa/intel/intel_adsp_ace30.dtsi index 26ae1c47f56..008abe6d63e 100644 --- a/dts/xtensa/intel/intel_adsp_ace30.dtsi +++ b/dts/xtensa/intel/intel_adsp_ace30.dtsi @@ -591,96 +591,134 @@ hda0: hda@0 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0>; }; hda1: hda@1 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <1>; }; hda2: hda@2 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <2>; }; hda3: hda@3 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <3>; }; hda4: hda@4 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <4>; }; hda5: hda@5 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <5>; }; hda6: hda@6 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <6>; }; hda7: hda@7 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <7>; }; hda8: hda@8 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <8>; }; hda9: hda@9 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <9>; }; hda10: hda@a { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0a>; }; hda11: hda@b { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0b>; }; hda12: hda@c { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0c>; }; hda13: hda@d { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0d>; }; hda14: hda@e { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0e>; }; hda15: hda@f { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0f>; }; hda16: hda@10 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x10>; }; hda17: hda@11 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x11>; }; hda18: hda@12 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x12>; }; diff --git a/dts/xtensa/intel/intel_adsp_ace30_ptl.dtsi b/dts/xtensa/intel/intel_adsp_ace30_ptl.dtsi index a7c39cceac9..c16ef03e5fe 100644 --- a/dts/xtensa/intel/intel_adsp_ace30_ptl.dtsi +++ b/dts/xtensa/intel/intel_adsp_ace30_ptl.dtsi @@ -596,96 +596,134 @@ hda0: hda@0 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0>; }; hda1: hda@1 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <1>; }; hda2: hda@2 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <2>; }; hda3: hda@3 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <3>; }; hda4: hda@4 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <4>; }; hda5: hda@5 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <5>; }; hda6: hda@6 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <6>; }; hda7: hda@7 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <7>; }; hda8: hda@8 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <8>; }; hda9: hda@9 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <9>; }; hda10: hda@a { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0a>; }; hda11: hda@b { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0b>; }; hda12: hda@c { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0c>; }; hda13: hda@d { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0d>; }; hda14: hda@e { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0e>; }; hda15: hda@f { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x0f>; }; hda16: hda@10 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x10>; }; hda17: hda@11 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x11>; }; hda18: hda@12 { compatible = "intel,hda-dai"; + power-domains = <&io0_domain>; + zephyr,pm-device-runtime-auto; status = "okay"; reg = <0x12>; };