11#include <linux/module.h>
22#include <linux/spi/spi.h>
33#include <linux/iio/iio.h>
4+ #include <linux/regmap.h>
5+ #include <linux/regulator/consumer.h>
6+
7+ #define MAX22531_REG_PROD_ID 0x00
8+ #define MAX22531_REG_ADC1 0x01
9+ #define MAX22531_REG_ADC2 0x02
10+ #define MAX22531_REG_ADC3 0x03
11+ #define MAX22531_REG_ADC4 0x04
12+ #define MAX22531_REG_FADC1 0x05
13+ #define MAX22531_REG_FADC2 0x06
14+ #define MAX22531_REG_FADC3 0x07
15+ #define MAX22531_REG_FADC4 0x08
16+ #define MAX22531_REG_COUTHI1 0x09
17+ #define MAX22531_REG_COUTHI2 0x0a
18+ #define MAX22531_REG_COUTHI3 0x0b
19+ #define MAX22531_REG_COUTHI4 0x0c
20+ #define MAX22531_REG_COUTLO1 0x0d
21+ #define MAX22531_REG_COUTLO2 0x0e
22+ #define MAX22531_REG_COUTLO3 0x0f
23+ #define MAX22531_REG_COUTLO4 0x10
24+ #define MAX22531_REG_COUT_STATUS 0x11
25+ #define MAX22531_REG_INTERRUPT_STATUS 0x12
26+ #define MAX22531_REG_INTERRUPT_ENABLE 0x13
27+ #define MAX22531_REG_CONTROL 0x14
428
529enum max22531_id {
630 max22531 ,
731};
832
933struct max22531 {
10- struct spi_device * spi ;
34+ struct spi_device * spi_dev ;
1135 struct regulator * vref ;
36+ struct regulator * vddl ;
37+ struct regulator * vddf ;
38+ struct regmap * regmap ;
1239};
1340
1441#define MAX22531_CHANNEL (ch ) \
@@ -30,53 +57,111 @@ static const struct iio_chan_spec max22531_channels[] = {
3057 IIO_CHAN_SOFT_TIMESTAMP (2 ),
3158};
3259
60+ static const struct regmap_config regmap_config = {
61+ .reg_bits = 16 ,
62+ .val_bits = 16 ,
63+ .max_register = 0x14 ,
64+ };
65+
66+ static int max22531_read_raw (struct iio_dev * indio_dev ,
67+ struct iio_chan_spec const * chan ,
68+ int * val , int * val2 , long mask )
69+ {
70+ struct regmap * * regmap = iio_priv (indio_dev );
71+ int ret ;
72+
73+ /* mock for now */
74+ switch (mask ) {
75+ case IIO_CHAN_INFO_RAW :
76+ ret = regmap_read (* regmap , chan -> address , val );
77+ if (ret )
78+ return ret ;
79+ return IIO_VAL_INT ;
80+ case IIO_CHAN_INFO_SCALE :
81+ return IIO_VAL_INT ;
82+ default :
83+ return - EINVAL ;
84+ }
85+ }
86+
3387static const struct iio_info max22531_info = {
88+ .read_raw = max22531_read_raw ,
3489};
3590
91+ static void max22531_regulator_disable (void * reg )
92+ {
93+ regulator_disable (reg );
94+ }
95+
3696static int max22531_probe (struct spi_device * spi )
3797{
38- pr_err ( "max22531: probe on \n" );
98+ dev_info ( & spi -> dev , "MAX22531: probing ADC \n" );
3999
100+ unsigned int ret , prod_id ;
40101 struct max22531 * adc ;
41102 struct iio_dev * indio_dev ;
42- const struct spi_device_id * id = spi_get_device_id (spi );
43103
44104 indio_dev = devm_iio_device_alloc (& spi -> dev , sizeof (* adc ));
45105 if (!indio_dev ) {
46- pr_err ("max22531: Failed to allocate memory for IIO device.\n" );
106+ dev_err (& spi -> dev , "MAX22531: Failed to allocate memory"
107+ "for IIO device.\n" );
47108 return - ENOMEM ;
48109 }
49110
50111 adc = iio_priv (indio_dev );
51- adc -> spi = spi ;
112+ adc -> spi_dev = spi ;
52113
53- indio_dev -> name = spi_get_device_id ( spi ) -> name ;
114+ indio_dev -> name = "max22531" ;
54115 indio_dev -> info = & max22531_info ;
55116 indio_dev -> channels = max22531_channels ;
56117 indio_dev -> num_channels = ARRAY_SIZE (max22531_channels );
57118
119+ adc -> regmap = devm_regmap_init_spi (spi , & regmap_config );
120+ if (IS_ERR (adc -> regmap ))
121+ dev_err (& spi -> dev , "regmap init failure\n" );
122+
123+ ret = regmap_read (adc -> regmap , MAX22531_REG_PROD_ID , & prod_id );
124+ if (ret )
125+ dev_err (& spi -> dev , "Failed to read PROD_ID\n" );
126+ else
127+ dev_info (& spi -> dev , "MAX22531: Successfully read PROD_ID"
128+ ": %d from the driver.\n" , ret );
129+
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 ;
137+
138+ ret = devm_add_action_or_reset (& spi -> dev , max22531_regulator_disable ,
139+ adc -> vref );
140+ if (ret )
141+ return ret ;
142+
58143 return devm_iio_device_register (& spi -> dev , indio_dev );
59144}
60145
61146static const struct spi_device_id max22531_id [] = {
62- { "max22531" , max22531 },
63- {}
147+ { "max22531" },
148+ { }
64149};
65150MODULE_DEVICE_TABLE (spi , max22531_id );
66151
67- static const struct of_device_id max22531_dt_ids [] = {
68- { .compatible = "maxim ,max22531" },
69- {},
152+ static const struct of_device_id max22531_spi_of_id [] = {
153+ { .compatible = "adi ,max22531" },
154+ { }
70155};
71- MODULE_DEVICE_TABLE (of , max22531_dt_ids );
156+ MODULE_DEVICE_TABLE (of , max22531_spi_of_id );
72157
73158static struct spi_driver max22531_driver = {
74159 .driver = {
75160 .name = "max22531" ,
76- .of_match_table = max22531_dt_ids ,
161+ .of_match_table = max22531_spi_of_id ,
77162 },
78- .probe = max22531_probe ,
79- .id_table = max22531_id ,
163+ .probe = max22531_probe ,
164+ .id_table = max22531_id ,
80165};
81166module_spi_driver (max22531_driver );
82167
0 commit comments