Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 53d3ff7

Browse files
Min Lilag-linaro
authored andcommitted
mfd: rsmu: support I2C SMBus access
8a3400x device implements its own reg_read and reg_write, which only supports I2C bus access. This patch adds support for SMBus access. Signed-off-by: Min Li <min.li.xe@renesas.com> Link: https://lore.kernel.org/r/LV3P220MB12021342F302AADEB6C1601CA0192@LV3P220MB1202.NAMP220.PROD.OUTLOOK.COM Signed-off-by: Lee Jones <lee@kernel.org>
1 parent ecbc0f2 commit 53d3ff7

File tree

2 files changed

+97
-18
lines changed

2 files changed

+97
-18
lines changed

drivers/mfd/rsmu_i2c.c

Lines changed: 93 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
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+
3537
static 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);

drivers/mfd/rsmu_spi.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,10 @@ static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg)
106106
return 0;
107107
page_reg = RSMU_CM_PAGE_ADDR;
108108
page = reg & RSMU_PAGE_MASK;
109-
buf[0] = (u8)(page & 0xff);
110-
buf[1] = (u8)((page >> 8) & 0xff);
111-
buf[2] = (u8)((page >> 16) & 0xff);
112-
buf[3] = (u8)((page >> 24) & 0xff);
109+
buf[0] = (u8)(page & 0xFF);
110+
buf[1] = (u8)((page >> 8) & 0xFF);
111+
buf[2] = (u8)((page >> 16) & 0xFF);
112+
buf[3] = (u8)((page >> 24) & 0xFF);
113113
bytes = 4;
114114
break;
115115
case RSMU_SABRE:

0 commit comments

Comments
 (0)