1818#include "rsmu.h"
1919
2020/*
21- * 16 -bit register address: the lower 8 bits of the register address come
22- * from the offset addr byte and the upper 8 bits come from the page register.
21+ * 32 -bit register address: the lower 8 bits of the register address come
22+ * from the offset addr byte and the upper 24 bits come from the page register.
2323 */
24- #define RSMU_CM_PAGE_ADDR 0xFD
25- #define RSMU_CM_PAGE_WINDOW 256
24+ #define RSMU_CM_PAGE_ADDR 0xFC
25+ #define RSMU_CM_PAGE_MASK 0xFFFFFF00
26+ #define RSMU_CM_ADDRESS_MASK 0x000000FF
2627
2728/*
2829 * 15-bit register address: the lower 7 bits of the register address come
3132#define RSMU_SABRE_PAGE_ADDR 0x7F
3233#define RSMU_SABRE_PAGE_WINDOW 128
3334
34- static const struct regmap_range_cfg rsmu_cm_range_cfg [] = {
35- {
36- .range_min = 0 ,
37- .range_max = 0xD000 ,
38- .selector_reg = RSMU_CM_PAGE_ADDR ,
39- .selector_mask = 0xFF ,
40- .selector_shift = 0 ,
41- .window_start = 0 ,
42- .window_len = RSMU_CM_PAGE_WINDOW ,
43- }
44- };
45-
4635static const struct regmap_range_cfg rsmu_sabre_range_cfg [] = {
4736 {
4837 .range_min = 0 ,
@@ -55,35 +44,141 @@ static const struct regmap_range_cfg rsmu_sabre_range_cfg[] = {
5544 }
5645};
5746
58- static bool rsmu_cm_volatile_reg (struct device * dev , unsigned int reg )
47+ static bool rsmu_sabre_volatile_reg (struct device * dev , unsigned int reg )
5948{
6049 switch (reg ) {
61- case RSMU_CM_PAGE_ADDR :
50+ case RSMU_SABRE_PAGE_ADDR :
6251 return false;
6352 default :
6453 return true;
6554 }
6655}
6756
68- static bool rsmu_sabre_volatile_reg (struct device * dev , unsigned int reg )
57+ static int rsmu_read_device (struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u16 bytes )
6958{
70- switch (reg ) {
71- case RSMU_SABRE_PAGE_ADDR :
72- return false;
73- default :
74- return true;
59+ struct i2c_client * client = to_i2c_client (rsmu -> dev );
60+ struct i2c_msg msg [2 ];
61+ int cnt ;
62+
63+ msg [0 ].addr = client -> addr ;
64+ msg [0 ].flags = 0 ;
65+ msg [0 ].len = 1 ;
66+ msg [0 ].buf = & reg ;
67+
68+ msg [1 ].addr = client -> addr ;
69+ msg [1 ].flags = I2C_M_RD ;
70+ msg [1 ].len = bytes ;
71+ msg [1 ].buf = buf ;
72+
73+ cnt = i2c_transfer (client -> adapter , msg , 2 );
74+
75+ if (cnt < 0 ) {
76+ dev_err (rsmu -> dev , "i2c_transfer failed at addr: %04x!" , reg );
77+ return cnt ;
78+ } else if (cnt != 2 ) {
79+ dev_err (rsmu -> dev ,
80+ "i2c_transfer sent only %d of 2 messages" , cnt );
81+ return - EIO ;
82+ }
83+
84+ return 0 ;
85+ }
86+
87+ static int rsmu_write_device (struct rsmu_ddata * rsmu , u8 reg , u8 * buf , u16 bytes )
88+ {
89+ struct i2c_client * client = to_i2c_client (rsmu -> dev );
90+ u8 msg [RSMU_MAX_WRITE_COUNT + 1 ]; /* 1 Byte added for the device register */
91+ int cnt ;
92+
93+ if (bytes > RSMU_MAX_WRITE_COUNT )
94+ return - EINVAL ;
95+
96+ msg [0 ] = reg ;
97+ memcpy (& msg [1 ], buf , bytes );
98+
99+ cnt = i2c_master_send (client , msg , bytes + 1 );
100+
101+ if (cnt < 0 ) {
102+ dev_err (& client -> dev ,
103+ "i2c_master_send failed at addr: %04x!" , reg );
104+ return cnt ;
75105 }
106+
107+ return 0 ;
108+ }
109+
110+ static int rsmu_write_page_register (struct rsmu_ddata * rsmu , u32 reg )
111+ {
112+ u32 page = reg & RSMU_CM_PAGE_MASK ;
113+ u8 buf [4 ];
114+ int err ;
115+
116+ /* Do not modify offset register for none-scsr registers */
117+ if (reg < RSMU_CM_SCSR_BASE )
118+ return 0 ;
119+
120+ /* Simply return if we are on the same page */
121+ if (rsmu -> page == page )
122+ return 0 ;
123+
124+ buf [0 ] = 0x0 ;
125+ buf [1 ] = (u8 )((page >> 8 ) & 0xFF );
126+ buf [2 ] = (u8 )((page >> 16 ) & 0xFF );
127+ buf [3 ] = (u8 )((page >> 24 ) & 0xFF );
128+
129+ err = rsmu_write_device (rsmu , RSMU_CM_PAGE_ADDR , buf , sizeof (buf ));
130+ if (err )
131+ dev_err (rsmu -> dev , "Failed to set page offset 0x%x\n" , page );
132+ else
133+ /* Remember the last page */
134+ rsmu -> page = page ;
135+
136+ return err ;
137+ }
138+
139+ static int rsmu_reg_read (void * context , unsigned int reg , unsigned int * val )
140+ {
141+ struct rsmu_ddata * rsmu = i2c_get_clientdata ((struct i2c_client * )context );
142+ u8 addr = (u8 )(reg & RSMU_CM_ADDRESS_MASK );
143+ int err ;
144+
145+ err = rsmu_write_page_register (rsmu , reg );
146+ if (err )
147+ return err ;
148+
149+ err = rsmu_read_device (rsmu , addr , (u8 * )val , 1 );
150+ if (err )
151+ dev_err (rsmu -> dev , "Failed to read offset address 0x%x\n" , addr );
152+
153+ return err ;
154+ }
155+
156+ static int rsmu_reg_write (void * context , unsigned int reg , unsigned int val )
157+ {
158+ struct rsmu_ddata * rsmu = i2c_get_clientdata ((struct i2c_client * )context );
159+ u8 addr = (u8 )(reg & RSMU_CM_ADDRESS_MASK );
160+ u8 data = (u8 )val ;
161+ int err ;
162+
163+ err = rsmu_write_page_register (rsmu , reg );
164+ if (err )
165+ return err ;
166+
167+ err = rsmu_write_device (rsmu , addr , & data , 1 );
168+ if (err )
169+ dev_err (rsmu -> dev ,
170+ "Failed to write offset address 0x%x\n" , addr );
171+
172+ return err ;
76173}
77174
78175static const struct regmap_config rsmu_cm_regmap_config = {
79- .reg_bits = 8 ,
176+ .reg_bits = 32 ,
80177 .val_bits = 8 ,
81- .max_register = 0xD000 ,
82- .ranges = rsmu_cm_range_cfg ,
83- .num_ranges = ARRAY_SIZE (rsmu_cm_range_cfg ),
84- .volatile_reg = rsmu_cm_volatile_reg ,
85- .cache_type = REGCACHE_RBTREE ,
86- .can_multi_write = true,
178+ .max_register = 0x20120000 ,
179+ .reg_read = rsmu_reg_read ,
180+ .reg_write = rsmu_reg_write ,
181+ .cache_type = REGCACHE_NONE ,
87182};
88183
89184static const struct regmap_config rsmu_sabre_regmap_config = {
@@ -101,14 +196,14 @@ static const struct regmap_config rsmu_sl_regmap_config = {
101196 .reg_bits = 16 ,
102197 .val_bits = 8 ,
103198 .reg_format_endian = REGMAP_ENDIAN_BIG ,
104- .max_register = 0x339 ,
199+ .max_register = 0x340 ,
105200 .cache_type = REGCACHE_NONE ,
106201 .can_multi_write = true,
107202};
108203
109- static int rsmu_i2c_probe (struct i2c_client * client )
204+ static int rsmu_i2c_probe (struct i2c_client * client ,
205+ const struct i2c_device_id * id )
110206{
111- const struct i2c_device_id * id = i2c_client_get_device_id (client );
112207 const struct regmap_config * cfg ;
113208 struct rsmu_ddata * rsmu ;
114209 int ret ;
@@ -136,7 +231,11 @@ static int rsmu_i2c_probe(struct i2c_client *client)
136231 dev_err (rsmu -> dev , "Unsupported RSMU device type: %d\n" , rsmu -> type );
137232 return - ENODEV ;
138233 }
139- rsmu -> regmap = devm_regmap_init_i2c (client , cfg );
234+
235+ if (rsmu -> type == RSMU_CM )
236+ rsmu -> regmap = devm_regmap_init (& client -> dev , NULL , client , cfg );
237+ else
238+ rsmu -> regmap = devm_regmap_init_i2c (client , cfg );
140239 if (IS_ERR (rsmu -> regmap )) {
141240 ret = PTR_ERR (rsmu -> regmap );
142241 dev_err (rsmu -> dev , "Failed to allocate register map: %d\n" , ret );
@@ -180,7 +279,7 @@ static struct i2c_driver rsmu_i2c_driver = {
180279 .name = "rsmu-i2c" ,
181280 .of_match_table = of_match_ptr (rsmu_i2c_of_match ),
182281 },
183- .probe_new = rsmu_i2c_probe ,
282+ .probe = rsmu_i2c_probe ,
184283 .remove = rsmu_i2c_remove ,
185284 .id_table = rsmu_i2c_id ,
186285};
0 commit comments