Skip to content

Commit 2e12ac6

Browse files
committed
Signed-off-by: JairGudino <ramonjair.gudino@nxp.com>
drivers: actuator: dac_mcux_gau: Add PM3 support PM3 support to the rw61x in the dac driver added
1 parent cfb0a80 commit 2e12ac6

File tree

2 files changed

+85
-23
lines changed

2 files changed

+85
-23
lines changed

drivers/dac/dac_mcux_gau.c

Lines changed: 84 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,37 @@
11
/*
2-
* Copyright 2023 NXP
2+
* Copyright 2023, 2025 NXP
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

77
#define DT_DRV_COMPAT nxp_gau_dac
88

99
#include <zephyr/drivers/dac.h>
10-
1110
#include <fsl_dac.h>
12-
11+
#include "fsl_clock.h"
1312
#define LOG_LEVEL CONFIG_DAC_LOG_LEVEL
1413
#include <zephyr/logging/log.h>
1514
#include <zephyr/irq.h>
15+
#include <zephyr/pm/policy.h>
16+
#include <zephyr/pm/device.h>
1617
LOG_MODULE_REGISTER(nxp_gau_dac);
17-
18+
19+
#define ZEPHYR_USER_NODE_RESTORE DT_PATH(zephyr_user)
20+
#if (DT_NODE_HAS_PROP(ZEPHYR_USER_NODE_RESTORE, dac) && \
21+
DT_NODE_HAS_PROP(ZEPHYR_USER_NODE_RESTORE, dac_channel_id) && \
22+
DT_NODE_HAS_PROP(ZEPHYR_USER_NODE_RESTORE, dac_resolution))
23+
#define DAC_NODE DT_PHANDLE(ZEPHYR_USER_NODE_RESTORE, dac)
24+
#define DAC_CHANNEL_ID_RESTORE DT_PROP(ZEPHYR_USER_NODE_RESTORE, dac_channel_id)
25+
#define DAC_RESOLUTION_RESTORE DT_PROP(ZEPHYR_USER_NODE_RESTORE, dac_resolution)
26+
#endif
27+
1828
struct nxp_gau_dac_config {
1929
DAC_Type *base;
2030
dac_conversion_rate_t conversion_rate : 2;
2131
dac_reference_voltage_source_t voltage_ref : 1;
2232
dac_output_voltage_range_t output_range : 2;
2333
};
24-
34+
2535
static inline dac_channel_id_t convert_channel_id(uint8_t channel_id)
2636
{
2737
switch (channel_id) {
@@ -32,19 +42,21 @@ static inline dac_channel_id_t convert_channel_id(uint8_t channel_id)
3242
return -EINVAL;
3343
};
3444
}
35-
45+
3646
static int nxp_gau_dac_channel_setup(const struct device *dev,
3747
const struct dac_channel_cfg *channel_cfg)
3848
{
3949
const struct nxp_gau_dac_config *config = dev->config;
4050
dac_channel_config_t dac_channel_config = {0};
4151
bool use_internal = true;
4252

53+
pm_policy_device_power_lock_get(dev);/*Lock the PM states*/
54+
4355
if (channel_cfg->resolution != 10) {
4456
LOG_ERR("DAC only support 10 bit resolution");
4557
return -EINVAL;
4658
}
47-
59+
4860
if (channel_cfg->internal && channel_cfg->buffered) {
4961
LOG_ERR("DAC output can not be buffered and internal");
5062
return -EINVAL;
@@ -53,69 +65,118 @@ static int nxp_gau_dac_channel_setup(const struct device *dev,
5365
LOG_WRN("Note: buffering DAC output to pad disconnects internal output");
5466
use_internal = false;
5567
}
56-
68+
5769
dac_channel_config.waveType = kDAC_WaveNormal;
5870
dac_channel_config.outMode =
5971
use_internal ? kDAC_ChannelOutputInternal : kDAC_ChannelOutputPAD;
6072
dac_channel_config.timingMode = kDAC_NonTimingCorrelated;
6173
dac_channel_config.enableTrigger = false;
6274
dac_channel_config.enableDMA = false;
6375
dac_channel_config.enableConversion = true;
64-
76+
77+
6578
DAC_SetChannelConfig(config->base,
6679
(uint32_t)convert_channel_id(channel_cfg->channel_id),
6780
&dac_channel_config);
68-
81+
6982
return 0;
7083
};
71-
84+
7285
static int nxp_gau_dac_write_value(const struct device *dev,
7386
uint8_t channel, uint32_t value)
7487
{
7588
const struct nxp_gau_dac_config *config = dev->config;
76-
89+
7790
DAC_SetChannelData(config->base,
7891
(uint32_t)convert_channel_id(channel),
7992
(uint16_t)value);
8093
return 0;
8194
};
82-
95+
8396
static DEVICE_API(dac, nxp_gau_dac_driver_api) = {
8497
.channel_setup = nxp_gau_dac_channel_setup,
8598
.write_value = nxp_gau_dac_write_value,
8699
};
87-
100+
88101
static int nxp_gau_dac_init(const struct device *dev)
89102
{
90103
const struct nxp_gau_dac_config *config = dev->config;
91104
dac_config_t dac_cfg;
92-
93105
DAC_GetDefaultConfig(&dac_cfg);
94-
106+
95107
dac_cfg.conversionRate = config->conversion_rate;
96108
dac_cfg.refSource = config->voltage_ref;
97109
dac_cfg.rangeSelect = config->output_range;
98-
110+
99111
DAC_Init(config->base, &dac_cfg);
100-
112+
101113
return 0;
102114
};
115+
116+
static int nxp_gau_dac_init_common(const struct device *dev)
117+
{
118+
const struct nxp_gau_dac_config *config = dev->config;
119+
dac_config_t dac_cfg;
103120

121+
DAC_GetDefaultConfig(&dac_cfg);
122+
123+
dac_cfg.conversionRate = config->conversion_rate;
124+
dac_cfg.refSource = config->voltage_ref;
125+
dac_cfg.rangeSelect = config->output_range;
126+
127+
DAC_Init(config->base, &dac_cfg);
128+
129+
/* Attack clock for GAU and reset */
130+
CLOCK_AttachClk(kMAIN_CLK_to_GAU_CLK);
131+
CLOCK_SetClkDiv(kCLOCK_DivGauClk, 1U);
132+
CLOCK_EnableClock(kCLOCK_Gau);
133+
RESET_PeripheralReset(kGAU_RST_SHIFT_RSTn);
134+
135+
POWER_PowerOnGau();
136+
137+
return 0;
138+
};
139+
140+
int nxp_gau_deinit(const struct device *dev){
141+
const struct nxp_gau_dac_config *config = dev->config;
142+
DAC_Deinit(config->base);
143+
144+
pm_policy_device_power_lock_put(dev); /*Free the PM states*/
145+
return 0;
146+
}
147+
148+
static int dac_mcux_pm_action(const struct device *dev, enum pm_device_action action)
149+
{
150+
switch (action) {
151+
case PM_DEVICE_ACTION_RESUME:
152+
case PM_DEVICE_ACTION_SUSPEND:
153+
case PM_DEVICE_ACTION_TURN_OFF:
154+
break;
155+
case PM_DEVICE_ACTION_TURN_ON:
156+
nxp_gau_dac_init_common(dev);
157+
break;
158+
default:
159+
return -ENOTSUP;
160+
}
161+
return 0;
162+
}
163+
104164
#define NXP_GAU_DAC_INIT(inst) \
105-
\
165+
\
106166
const struct nxp_gau_dac_config nxp_gau_dac_##inst##_config = { \
107167
.base = (DAC_Type *) DT_INST_REG_ADDR(inst), \
108168
.voltage_ref = DT_INST_ENUM_IDX(inst, nxp_dac_reference), \
109169
.conversion_rate = DT_INST_ENUM_IDX(inst, nxp_conversion_rate), \
110170
.output_range = DT_INST_ENUM_IDX(inst, \
111171
nxp_output_voltage_range), \
112172
}; \
113-
\
114-
\
115-
DEVICE_DT_INST_DEFINE(inst, &nxp_gau_dac_init, NULL, \
173+
PM_DEVICE_DT_INST_DEFINE(inst, dac_mcux_pm_action); \
174+
\
175+
DEVICE_DT_INST_DEFINE(inst, &nxp_gau_dac_init, PM_DEVICE_DT_INST_GET(inst), \
116176
NULL, \
117177
&nxp_gau_dac_##inst##_config, \
118178
POST_KERNEL, CONFIG_DAC_INIT_PRIORITY, \
119179
&nxp_gau_dac_driver_api);
120-
180+
121181
DT_INST_FOREACH_STATUS_OKAY(NXP_GAU_DAC_INIT)
182+

dts/arm/nxp/nxp_rw6xx_common.dtsi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@
565565
interrupts = <108 0>;
566566
status = "disabled";
567567
#io-channel-cells = <0>;
568+
zephyr,disabling-power-states = <&suspend &standby>;
568569
power-domains = <&power_mode3_domain>;
569570
};
570571
};

0 commit comments

Comments
 (0)