32
32
#define RSMU_SABRE_PAGE_ADDR 0x7F
33
33
#define RSMU_SABRE_PAGE_WINDOW 128
34
34
35
+ typedef int (* rsmu_rw_device )(struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u8 bytes );
36
+
35
37
static const struct regmap_range_cfg rsmu_sabre_range_cfg [] = {
36
38
{
37
39
.range_min = 0 ,
@@ -54,7 +56,28 @@ static bool rsmu_sabre_volatile_reg(struct device *dev, unsigned int reg)
54
56
}
55
57
}
56
58
57
- static int rsmu_read_device (struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u16 bytes )
59
+ static int rsmu_smbus_i2c_write_device (struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u8 bytes )
60
+ {
61
+ struct i2c_client * client = to_i2c_client (rsmu -> dev );
62
+
63
+ return i2c_smbus_write_i2c_block_data (client , reg , bytes , buf );
64
+ }
65
+
66
+ static int rsmu_smbus_i2c_read_device (struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u8 bytes )
67
+ {
68
+ struct i2c_client * client = to_i2c_client (rsmu -> dev );
69
+ int ret ;
70
+
71
+ ret = i2c_smbus_read_i2c_block_data (client , reg , bytes , buf );
72
+ if (ret == bytes )
73
+ return 0 ;
74
+ else if (ret < 0 )
75
+ return ret ;
76
+ else
77
+ return - EIO ;
78
+ }
79
+
80
+ static int rsmu_i2c_read_device (struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u8 bytes )
58
81
{
59
82
struct i2c_client * client = to_i2c_client (rsmu -> dev );
60
83
struct i2c_msg msg [2 ];
@@ -84,10 +107,11 @@ static int rsmu_read_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes)
84
107
return 0 ;
85
108
}
86
109
87
- static int rsmu_write_device (struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u16 bytes )
110
+ static int rsmu_i2c_write_device (struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u8 bytes )
88
111
{
89
112
struct i2c_client * client = to_i2c_client (rsmu -> dev );
90
- u8 msg [RSMU_MAX_WRITE_COUNT + 1 ]; /* 1 Byte added for the device register */
113
+ /* we add 1 byte for device register */
114
+ u8 msg [RSMU_MAX_WRITE_COUNT + 1 ];
91
115
int cnt ;
92
116
93
117
if (bytes > RSMU_MAX_WRITE_COUNT )
@@ -107,7 +131,8 @@ static int rsmu_write_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes
107
131
return 0 ;
108
132
}
109
133
110
- static int rsmu_write_page_register (struct rsmu_ddata * rsmu , u32 reg )
134
+ static int rsmu_write_page_register (struct rsmu_ddata * rsmu , u32 reg ,
135
+ rsmu_rw_device rsmu_write_device )
111
136
{
112
137
u32 page = reg & RSMU_CM_PAGE_MASK ;
113
138
u8 buf [4 ];
@@ -136,48 +161,93 @@ static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg)
136
161
return err ;
137
162
}
138
163
139
- static int rsmu_reg_read (void * context , unsigned int reg , unsigned int * val )
164
+ static int rsmu_i2c_reg_read (void * context , unsigned int reg , unsigned int * val )
140
165
{
141
166
struct rsmu_ddata * rsmu = i2c_get_clientdata ((struct i2c_client * )context );
142
167
u8 addr = (u8 )(reg & RSMU_CM_ADDRESS_MASK );
143
168
int err ;
144
169
145
- err = rsmu_write_page_register (rsmu , reg );
170
+ err = rsmu_write_page_register (rsmu , reg , rsmu_i2c_write_device );
146
171
if (err )
147
172
return err ;
148
173
149
- err = rsmu_read_device (rsmu , addr , (u8 * )val , 1 );
174
+ err = rsmu_i2c_read_device (rsmu , addr , (u8 * )val , 1 );
150
175
if (err )
151
176
dev_err (rsmu -> dev , "Failed to read offset address 0x%x\n" , addr );
152
177
153
178
return err ;
154
179
}
155
180
156
- static int rsmu_reg_write (void * context , unsigned int reg , unsigned int val )
181
+ static int rsmu_i2c_reg_write (void * context , unsigned int reg , unsigned int val )
157
182
{
158
183
struct rsmu_ddata * rsmu = i2c_get_clientdata ((struct i2c_client * )context );
159
184
u8 addr = (u8 )(reg & RSMU_CM_ADDRESS_MASK );
160
185
u8 data = (u8 )val ;
161
186
int err ;
162
187
163
- err = rsmu_write_page_register (rsmu , reg );
188
+ err = rsmu_write_page_register (rsmu , reg , rsmu_i2c_write_device );
164
189
if (err )
165
190
return err ;
166
191
167
- err = rsmu_write_device (rsmu , addr , & data , 1 );
192
+ err = rsmu_i2c_write_device (rsmu , addr , & data , 1 );
168
193
if (err )
169
194
dev_err (rsmu -> dev ,
170
195
"Failed to write offset address 0x%x\n" , addr );
171
196
172
197
return err ;
173
198
}
174
199
175
- static const struct regmap_config rsmu_cm_regmap_config = {
200
+ static int rsmu_smbus_i2c_reg_read (void * context , unsigned int reg , unsigned int * val )
201
+ {
202
+ struct rsmu_ddata * rsmu = i2c_get_clientdata ((struct i2c_client * )context );
203
+ u8 addr = (u8 )(reg & RSMU_CM_ADDRESS_MASK );
204
+ int err ;
205
+
206
+ err = rsmu_write_page_register (rsmu , reg , rsmu_smbus_i2c_write_device );
207
+ if (err )
208
+ return err ;
209
+
210
+ err = rsmu_smbus_i2c_read_device (rsmu , addr , (u8 * )val , 1 );
211
+ if (err )
212
+ dev_err (rsmu -> dev , "Failed to read offset address 0x%x\n" , addr );
213
+
214
+ return err ;
215
+ }
216
+
217
+ static int rsmu_smbus_i2c_reg_write (void * context , unsigned int reg , unsigned int val )
218
+ {
219
+ struct rsmu_ddata * rsmu = i2c_get_clientdata ((struct i2c_client * )context );
220
+ u8 addr = (u8 )(reg & RSMU_CM_ADDRESS_MASK );
221
+ u8 data = (u8 )val ;
222
+ int err ;
223
+
224
+ err = rsmu_write_page_register (rsmu , reg , rsmu_smbus_i2c_write_device );
225
+ if (err )
226
+ return err ;
227
+
228
+ err = rsmu_smbus_i2c_write_device (rsmu , addr , & data , 1 );
229
+ if (err )
230
+ dev_err (rsmu -> dev ,
231
+ "Failed to write offset address 0x%x\n" , addr );
232
+
233
+ return err ;
234
+ }
235
+
236
+ static const struct regmap_config rsmu_i2c_cm_regmap_config = {
176
237
.reg_bits = 32 ,
177
238
.val_bits = 8 ,
178
239
.max_register = 0x20120000 ,
179
- .reg_read = rsmu_reg_read ,
180
- .reg_write = rsmu_reg_write ,
240
+ .reg_read = rsmu_i2c_reg_read ,
241
+ .reg_write = rsmu_i2c_reg_write ,
242
+ .cache_type = REGCACHE_NONE ,
243
+ };
244
+
245
+ static const struct regmap_config rsmu_smbus_i2c_cm_regmap_config = {
246
+ .reg_bits = 32 ,
247
+ .val_bits = 8 ,
248
+ .max_register = 0x20120000 ,
249
+ .reg_read = rsmu_smbus_i2c_reg_read ,
250
+ .reg_write = rsmu_smbus_i2c_reg_write ,
181
251
.cache_type = REGCACHE_NONE ,
182
252
};
183
253
@@ -219,7 +289,15 @@ static int rsmu_i2c_probe(struct i2c_client *client)
219
289
220
290
switch (rsmu -> type ) {
221
291
case RSMU_CM :
222
- cfg = & rsmu_cm_regmap_config ;
292
+ if (i2c_check_functionality (client -> adapter , I2C_FUNC_I2C )) {
293
+ cfg = & rsmu_i2c_cm_regmap_config ;
294
+ } else if (i2c_check_functionality (client -> adapter ,
295
+ I2C_FUNC_SMBUS_I2C_BLOCK )) {
296
+ cfg = & rsmu_smbus_i2c_cm_regmap_config ;
297
+ } else {
298
+ dev_err (rsmu -> dev , "Unsupported i2c adapter\n" );
299
+ return - ENOTSUPP ;
300
+ }
223
301
break ;
224
302
case RSMU_SABRE :
225
303
cfg = & rsmu_sabre_regmap_config ;
@@ -236,6 +314,7 @@ static int rsmu_i2c_probe(struct i2c_client *client)
236
314
rsmu -> regmap = devm_regmap_init (& client -> dev , NULL , client , cfg );
237
315
else
238
316
rsmu -> regmap = devm_regmap_init_i2c (client , cfg );
317
+
239
318
if (IS_ERR (rsmu -> regmap )) {
240
319
ret = PTR_ERR (rsmu -> regmap );
241
320
dev_err (rsmu -> dev , "Failed to allocate register map: %d\n" , ret );
0 commit comments