3232#define RSMU_SABRE_PAGE_ADDR 0x7F
3333#define RSMU_SABRE_PAGE_WINDOW 128
3434
35+ typedef int (* rsmu_rw_device )(struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u8 bytes );
36+
3537static const struct regmap_range_cfg rsmu_sabre_range_cfg [] = {
3638 {
3739 .range_min = 0 ,
@@ -54,7 +56,28 @@ static bool rsmu_sabre_volatile_reg(struct device *dev, unsigned int reg)
5456 }
5557}
5658
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 )
5881{
5982 struct i2c_client * client = to_i2c_client (rsmu -> dev );
6083 struct i2c_msg msg [2 ];
@@ -84,10 +107,11 @@ static int rsmu_read_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes)
84107 return 0 ;
85108}
86109
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 )
88111{
89112 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 ];
91115 int cnt ;
92116
93117 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
107131 return 0 ;
108132}
109133
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 )
111136{
112137 u32 page = reg & RSMU_CM_PAGE_MASK ;
113138 u8 buf [4 ];
@@ -136,48 +161,93 @@ static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg)
136161 return err ;
137162}
138163
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 )
140165{
141166 struct rsmu_ddata * rsmu = i2c_get_clientdata ((struct i2c_client * )context );
142167 u8 addr = (u8 )(reg & RSMU_CM_ADDRESS_MASK );
143168 int err ;
144169
145- err = rsmu_write_page_register (rsmu , reg );
170+ err = rsmu_write_page_register (rsmu , reg , rsmu_i2c_write_device );
146171 if (err )
147172 return err ;
148173
149- err = rsmu_read_device (rsmu , addr , (u8 * )val , 1 );
174+ err = rsmu_i2c_read_device (rsmu , addr , (u8 * )val , 1 );
150175 if (err )
151176 dev_err (rsmu -> dev , "Failed to read offset address 0x%x\n" , addr );
152177
153178 return err ;
154179}
155180
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 )
157182{
158183 struct rsmu_ddata * rsmu = i2c_get_clientdata ((struct i2c_client * )context );
159184 u8 addr = (u8 )(reg & RSMU_CM_ADDRESS_MASK );
160185 u8 data = (u8 )val ;
161186 int err ;
162187
163- err = rsmu_write_page_register (rsmu , reg );
188+ err = rsmu_write_page_register (rsmu , reg , rsmu_i2c_write_device );
164189 if (err )
165190 return err ;
166191
167- err = rsmu_write_device (rsmu , addr , & data , 1 );
192+ err = rsmu_i2c_write_device (rsmu , addr , & data , 1 );
168193 if (err )
169194 dev_err (rsmu -> dev ,
170195 "Failed to write offset address 0x%x\n" , addr );
171196
172197 return err ;
173198}
174199
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 = {
176237 .reg_bits = 32 ,
177238 .val_bits = 8 ,
178239 .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 ,
181251 .cache_type = REGCACHE_NONE ,
182252};
183253
@@ -219,7 +289,15 @@ static int rsmu_i2c_probe(struct i2c_client *client)
219289
220290 switch (rsmu -> type ) {
221291 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+ }
223301 break ;
224302 case RSMU_SABRE :
225303 cfg = & rsmu_sabre_regmap_config ;
@@ -236,6 +314,7 @@ static int rsmu_i2c_probe(struct i2c_client *client)
236314 rsmu -> regmap = devm_regmap_init (& client -> dev , NULL , client , cfg );
237315 else
238316 rsmu -> regmap = devm_regmap_init_i2c (client , cfg );
317+
239318 if (IS_ERR (rsmu -> regmap )) {
240319 ret = PTR_ERR (rsmu -> regmap );
241320 dev_err (rsmu -> dev , "Failed to allocate register map: %d\n" , ret );
0 commit comments