26
26
#define MAX22531_REG_INTERRUPT_ENABLE 0x13
27
27
#define MAX22531_REG_CONTROL 0x14
28
28
29
+ #define MAX22531_VREF_MV 1800
30
+
31
+
29
32
enum max22531_id {
33
+ max22530 ,
30
34
max22531 ,
35
+ max22532 ,
36
+ };
37
+
38
+ struct max22531_chip_info {
39
+ const char * name ;
40
+ };
41
+
42
+ static struct max22531_chip_info max22531_chip_info_tbl [] = {
43
+ [max22530 ] = {
44
+ .name = "max22530" ,
45
+ },
46
+ [max22531 ] = {
47
+ .name = "max22531" ,
48
+ },
49
+ [max22532 ] = {
50
+ .name = "max22532" ,
51
+ }.
31
52
};
32
53
33
54
struct max22531 {
34
55
struct spi_device * spi_dev ;
35
- struct regulator * vref ;
56
+ const struct max22531_chip_info * chip_info ;
36
57
struct regulator * vddl ;
37
- struct regulator * vddf ;
58
+ struct regulator * vddpl ;
38
59
struct regmap * regmap ;
39
60
};
40
61
@@ -46,111 +67,156 @@ struct max22531 {
46
67
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
47
68
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
48
69
.scan_index = ch, \
49
- .output = 0, \
50
70
}
51
71
52
72
static const struct iio_chan_spec max22531_channels [] = {
53
73
MAX22531_CHANNEL (0 ),
54
74
MAX22531_CHANNEL (1 ),
55
75
MAX22531_CHANNEL (2 ),
56
76
MAX22531_CHANNEL (3 ),
57
- IIO_CHAN_SOFT_TIMESTAMP (2 ),
58
77
};
59
78
60
79
static const struct regmap_config regmap_config = {
61
- .reg_bits = 16 ,
62
- .val_bits = 16 ,
63
- .max_register = 0x14 ,
80
+ .reg_bits = 6 ,
81
+ .val_bits = 6 ,
82
+ .write_flag_mask = BIT (1 ),
83
+ .pad_bits = 1 ,
84
+ .max_register = MAX22531_REG_CONTROL ,
64
85
};
65
86
66
87
static int max22531_read_raw (struct iio_dev * indio_dev ,
67
88
struct iio_chan_spec const * chan ,
68
89
int * val , int * val2 , long mask )
69
90
{
70
- struct regmap * * regmap = iio_priv (indio_dev );
91
+ struct max22531 * adc = iio_priv (indio_dev );
71
92
int ret ;
72
93
73
- /* mock for now */
74
94
switch (mask ) {
75
95
case IIO_CHAN_INFO_RAW :
76
- ret = regmap_read (* regmap , chan -> address , val );
77
- if (ret )
78
- return ret ;
79
- return IIO_VAL_INT ;
96
+ switch (chan -> channel ) {
97
+ case 0 :
98
+ reg = MAX22531_REG_ADC1 ;
99
+ break ;
100
+ case 1 :
101
+ reg = MAX22531_REG_ADC2 ;
102
+ break ;
103
+ case 2 :
104
+ reg = MAX22531_REG_ADC3 ;
105
+ break ;
106
+ case 3 :
107
+ reg = MAX22531_REG_ADC3 ;
108
+ break ;
109
+ default :
110
+ return - EINVAL ;
111
+ }
112
+ ret = regmap_read (adc -> regmap , reg , val );
113
+ if (ret )
114
+ return ret ;
115
+ return IIO_VAL_INT ;
116
+
117
+ case IIO_CHAN_INFO_SCALE :
118
+ switch (chan -> channel ) {
119
+ case 0 :
120
+ reg = MAX22531_REG_FADC1 ;
121
+ break ;
122
+ case 1 :
123
+ reg = MAX22531_REG_FADC2 ;
124
+ break ;
125
+ case 2 :
126
+ reg = MAX22531_REG_FADC3 ;
127
+ break ;
128
+ case 3 :
129
+ reg = MAX22531_REG_FADC4 ;
130
+ break ;
131
+ default :
132
+ return - EINVAL ;
133
+ }
134
+
135
+ reg = regmap_read (adc -> regmap , reg , val );
136
+ if (ret )
137
+ return ret ;
138
+ return IIO_VAL_INT ;
139
+
80
140
case IIO_CHAN_INFO_SCALE :
81
- return IIO_VAL_INT ;
141
+ * val = MAX22531_VREF_MV ;
142
+ * val2 = 12 ;
143
+
144
+ return IIO_VAL_FRACTIONAL_LOG2 ;
145
+
82
146
default :
83
147
return - EINVAL ;
148
+
84
149
}
85
150
}
86
151
87
152
static const struct iio_info max22531_info = {
88
153
.read_raw = max22531_read_raw ,
89
154
};
90
155
91
- static void max22531_regulator_disable (void * reg )
92
- {
93
- regulator_disable (reg );
94
- }
95
-
96
156
static int max22531_probe (struct spi_device * spi )
97
157
{
98
158
dev_info (& spi -> dev , "MAX22531: probing ADC\n" );
99
159
100
160
unsigned int ret , prod_id ;
161
+ const struct max22531_chip_info * info ;
101
162
struct max22531 * adc ;
102
163
struct iio_dev * indio_dev ;
103
164
104
165
indio_dev = devm_iio_device_alloc (& spi -> dev , sizeof (* adc ));
105
- if (!indio_dev ) {
106
- dev_err (& spi -> dev , "MAX22531: Failed to allocate memory"
107
- "for IIO device.\n" );
108
- return - ENOMEM ;
109
- }
166
+ if (!indio_dev )
167
+ dev_err_probe (& spi -> dev , - ENODEV ,
168
+ "MAX22531: Failed to allocate memory or IIO device.\n" );
110
169
111
170
adc = iio_priv (indio_dev );
112
171
adc -> spi_dev = spi ;
113
-
114
- indio_dev -> name = "max22531" ;
172
+ adc -> chip_info = info ;
173
+
174
+ indio_dev -> name = adc -> chip_info -> name ;
115
175
indio_dev -> info = & max22531_info ;
116
176
indio_dev -> channels = max22531_channels ;
117
177
indio_dev -> num_channels = ARRAY_SIZE (max22531_channels );
118
178
119
179
adc -> regmap = devm_regmap_init_spi (spi , & regmap_config );
120
180
if (IS_ERR (adc -> regmap ))
121
- dev_err (& spi -> dev , "regmap init failure\n" );
181
+ return dev_err_probe (& spi -> dev , PTR_ERR (adc -> regmap ),
182
+ "regmap init failure\n" );
122
183
123
184
ret = regmap_read (adc -> regmap , MAX22531_REG_PROD_ID , & prod_id );
124
185
if (ret )
125
- dev_err (& spi -> dev , "Failed to read PROD_ID\n" );
186
+ return dev_err_probe (& spi -> dev , PTR_ERR (adc -> regmap ),
187
+ "Failed to read PROD_ID\n" );
126
188
else
127
189
dev_info (& spi -> dev , "MAX22531: Successfully read PROD_ID"
128
190
": %d from the driver.\n" , ret );
129
191
130
- adc -> vref = devm_regulator_get (& spi -> dev , "vref" );
131
- if (IS_ERR (adc -> vref ))
132
- dev_err (& spi -> dev , "Failed to retrieve vref\n" );
133
-
134
- ret = regulator_enable (adc -> vref );
135
- if (ret )
136
- return ret ;
192
+ adc -> vddl = devm_regulator_get_enable (& spi -> dev , "vddl" );
193
+ if (IS_ERR (adc -> vddl ))
194
+ return dev_err_probe (& spi -> dev , PTR_ERR (adc -> vddl ),
195
+ "Failed to retrieve power logic supply\n" );
137
196
138
- ret = devm_add_action_or_reset (& spi -> dev , max22531_regulator_disable ,
139
- adc -> vref );
140
- if ( ret )
141
- return ret ;
197
+ adc -> vddpl = devm_regulator_get_enable (& spi -> dev , "vddpl" );
198
+ if ( IS_ERR ( adc -> vddpl ))
199
+ return dev_err_probe ( & spi -> dev , PTR_ERR ( adc -> vddpl ),
200
+ "Failed to retrieve isolated DC-DC supply\n" ) ;
142
201
143
202
return devm_iio_device_register (& spi -> dev , indio_dev );
144
203
}
145
204
146
205
static const struct spi_device_id max22531_id [] = {
147
- { "max22531" },
206
+ { "max22530" , (kernel_ulong_t )& max22531_chip_info_tbl [max22530 ] },
207
+ { "max22531" , (kernel_ulong_t )& max22531_chip_info_tbl [max22531 ] },
208
+ { "max22532" , (kernel_ulong_t )& max22531_chip_info_tbl [max22532 ] },
148
209
{ }
149
210
};
150
211
MODULE_DEVICE_TABLE (spi , max22531_id );
151
212
152
213
static const struct of_device_id max22531_spi_of_id [] = {
153
- { .compatible = "adi,max22531" },
214
+ { .compatible = "adi,max22530" ,
215
+ .data = & max22531_chip_info_tbl [max22530 ], },
216
+ { .compatible = "adi,max22531" ,
217
+ .data = & max22531_chip_info_tbl [max22531 ], },
218
+ { .compatible = "adi,max22532" ,
219
+ .data = & max22531_chip_info_tbl [max22532 ], },
154
220
{ }
155
221
};
156
222
MODULE_DEVICE_TABLE (of , max22531_spi_of_id );
0 commit comments