1
1
/*
2
- * Copyright 2023 NXP
2
+ * Copyright 2023, 2025 NXP
3
3
*
4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*/
6
6
7
7
#define DT_DRV_COMPAT nxp_gau_dac
8
8
9
9
#include <zephyr/drivers/dac.h>
10
-
11
10
#include <fsl_dac.h>
12
-
11
+ #include "fsl_clock.h"
13
12
#define LOG_LEVEL CONFIG_DAC_LOG_LEVEL
14
13
#include <zephyr/logging/log.h>
15
14
#include <zephyr/irq.h>
15
+ #include <zephyr/pm/policy.h>
16
+ #include <zephyr/pm/device.h>
16
17
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
+
18
28
struct nxp_gau_dac_config {
19
29
DAC_Type * base ;
20
30
dac_conversion_rate_t conversion_rate : 2 ;
21
31
dac_reference_voltage_source_t voltage_ref : 1 ;
22
32
dac_output_voltage_range_t output_range : 2 ;
23
33
};
24
-
34
+
25
35
static inline dac_channel_id_t convert_channel_id (uint8_t channel_id )
26
36
{
27
37
switch (channel_id ) {
@@ -32,19 +42,21 @@ static inline dac_channel_id_t convert_channel_id(uint8_t channel_id)
32
42
return - EINVAL ;
33
43
};
34
44
}
35
-
45
+
36
46
static int nxp_gau_dac_channel_setup (const struct device * dev ,
37
47
const struct dac_channel_cfg * channel_cfg )
38
48
{
39
49
const struct nxp_gau_dac_config * config = dev -> config ;
40
50
dac_channel_config_t dac_channel_config = {0 };
41
51
bool use_internal = true;
42
52
53
+ pm_policy_device_power_lock_get (dev );/*Lock the PM states*/
54
+
43
55
if (channel_cfg -> resolution != 10 ) {
44
56
LOG_ERR ("DAC only support 10 bit resolution" );
45
57
return - EINVAL ;
46
58
}
47
-
59
+
48
60
if (channel_cfg -> internal && channel_cfg -> buffered ) {
49
61
LOG_ERR ("DAC output can not be buffered and internal" );
50
62
return - EINVAL ;
@@ -53,69 +65,118 @@ static int nxp_gau_dac_channel_setup(const struct device *dev,
53
65
LOG_WRN ("Note: buffering DAC output to pad disconnects internal output" );
54
66
use_internal = false;
55
67
}
56
-
68
+
57
69
dac_channel_config .waveType = kDAC_WaveNormal ;
58
70
dac_channel_config .outMode =
59
71
use_internal ? kDAC_ChannelOutputInternal : kDAC_ChannelOutputPAD ;
60
72
dac_channel_config .timingMode = kDAC_NonTimingCorrelated ;
61
73
dac_channel_config .enableTrigger = false;
62
74
dac_channel_config .enableDMA = false;
63
75
dac_channel_config .enableConversion = true;
64
-
76
+
77
+
65
78
DAC_SetChannelConfig (config -> base ,
66
79
(uint32_t )convert_channel_id (channel_cfg -> channel_id ),
67
80
& dac_channel_config );
68
-
81
+
69
82
return 0 ;
70
83
};
71
-
84
+
72
85
static int nxp_gau_dac_write_value (const struct device * dev ,
73
86
uint8_t channel , uint32_t value )
74
87
{
75
88
const struct nxp_gau_dac_config * config = dev -> config ;
76
-
89
+
77
90
DAC_SetChannelData (config -> base ,
78
91
(uint32_t )convert_channel_id (channel ),
79
92
(uint16_t )value );
80
93
return 0 ;
81
94
};
82
-
95
+
83
96
static DEVICE_API (dac , nxp_gau_dac_driver_api ) = {
84
97
.channel_setup = nxp_gau_dac_channel_setup ,
85
98
.write_value = nxp_gau_dac_write_value ,
86
99
};
87
-
100
+
88
101
static int nxp_gau_dac_init (const struct device * dev )
89
102
{
90
103
const struct nxp_gau_dac_config * config = dev -> config ;
91
104
dac_config_t dac_cfg ;
92
-
93
105
DAC_GetDefaultConfig (& dac_cfg );
94
-
106
+
95
107
dac_cfg .conversionRate = config -> conversion_rate ;
96
108
dac_cfg .refSource = config -> voltage_ref ;
97
109
dac_cfg .rangeSelect = config -> output_range ;
98
-
110
+
99
111
DAC_Init (config -> base , & dac_cfg );
100
-
112
+
101
113
return 0 ;
102
114
};
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 ;
103
120
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
+
104
164
#define NXP_GAU_DAC_INIT (inst ) \
105
- \
165
+ \
106
166
const struct nxp_gau_dac_config nxp_gau_dac_##inst##_config = { \
107
167
.base = (DAC_Type *) DT_INST_REG_ADDR(inst), \
108
168
.voltage_ref = DT_INST_ENUM_IDX(inst, nxp_dac_reference), \
109
169
.conversion_rate = DT_INST_ENUM_IDX(inst, nxp_conversion_rate), \
110
170
.output_range = DT_INST_ENUM_IDX(inst, \
111
171
nxp_output_voltage_range), \
112
172
}; \
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) , \
116
176
NULL, \
117
177
&nxp_gau_dac_##inst##_config, \
118
178
POST_KERNEL, CONFIG_DAC_INIT_PRIORITY, \
119
179
&nxp_gau_dac_driver_api);
120
-
180
+
121
181
DT_INST_FOREACH_STATUS_OKAY (NXP_GAU_DAC_INIT )
182
+
0 commit comments