2626#define MAX22531_REG_INTERRUPT_ENABLE 0x13
2727#define MAX22531_REG_CONTROL 0x14
2828
29+ #define MAX22531_VREF_MV 1800
30+
31+
2932enum max22531_id {
33+ max22530 ,
3034 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+ }.
3152};
3253
3354struct max22531 {
3455 struct spi_device * spi_dev ;
35- struct regulator * vref ;
56+ const struct max22531_chip_info * chip_info ;
3657 struct regulator * vddl ;
37- struct regulator * vddf ;
58+ struct regulator * vddpl ;
3859 struct regmap * regmap ;
3960};
4061
@@ -46,111 +67,156 @@ struct max22531 {
4667 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
4768 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
4869 .scan_index = ch, \
49- .output = 0, \
5070 }
5171
5272static const struct iio_chan_spec max22531_channels [] = {
5373 MAX22531_CHANNEL (0 ),
5474 MAX22531_CHANNEL (1 ),
5575 MAX22531_CHANNEL (2 ),
5676 MAX22531_CHANNEL (3 ),
57- IIO_CHAN_SOFT_TIMESTAMP (2 ),
5877};
5978
6079static 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 ,
6485};
6586
6687static int max22531_read_raw (struct iio_dev * indio_dev ,
6788 struct iio_chan_spec const * chan ,
6889 int * val , int * val2 , long mask )
6990{
70- struct regmap * * regmap = iio_priv (indio_dev );
91+ struct max22531 * adc = iio_priv (indio_dev );
7192 int ret ;
7293
73- /* mock for now */
7494 switch (mask ) {
7595 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+
80140 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+
82146 default :
83147 return - EINVAL ;
148+
84149 }
85150}
86151
87152static const struct iio_info max22531_info = {
88153 .read_raw = max22531_read_raw ,
89154};
90155
91- static void max22531_regulator_disable (void * reg )
92- {
93- regulator_disable (reg );
94- }
95-
96156static int max22531_probe (struct spi_device * spi )
97157{
98158 dev_info (& spi -> dev , "MAX22531: probing ADC\n" );
99159
100160 unsigned int ret , prod_id ;
161+ const struct max22531_chip_info * info ;
101162 struct max22531 * adc ;
102163 struct iio_dev * indio_dev ;
103164
104165 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" );
110169
111170 adc = iio_priv (indio_dev );
112171 adc -> spi_dev = spi ;
113-
114- indio_dev -> name = "max22531" ;
172+ adc -> chip_info = info ;
173+
174+ indio_dev -> name = adc -> chip_info -> name ;
115175 indio_dev -> info = & max22531_info ;
116176 indio_dev -> channels = max22531_channels ;
117177 indio_dev -> num_channels = ARRAY_SIZE (max22531_channels );
118178
119179 adc -> regmap = devm_regmap_init_spi (spi , & regmap_config );
120180 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" );
122183
123184 ret = regmap_read (adc -> regmap , MAX22531_REG_PROD_ID , & prod_id );
124185 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" );
126188 else
127189 dev_info (& spi -> dev , "MAX22531: Successfully read PROD_ID"
128190 ": %d from the driver.\n" , ret );
129191
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" );
137196
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" ) ;
142201
143202 return devm_iio_device_register (& spi -> dev , indio_dev );
144203}
145204
146205static 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 ] },
148209 { }
149210};
150211MODULE_DEVICE_TABLE (spi , max22531_id );
151212
152213static 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 ], },
154220 { }
155221};
156222MODULE_DEVICE_TABLE (of , max22531_spi_of_id );
0 commit comments