xref: /OK3568_Linux_fs/kernel/drivers/base/regmap/regmap-slimbus.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun // Copyright (c) 2017, Linaro Ltd.
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #include <linux/regmap.h>
5*4882a593Smuzhiyun #include <linux/slimbus.h>
6*4882a593Smuzhiyun #include <linux/module.h>
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include "internal.h"
9*4882a593Smuzhiyun 
regmap_slimbus_write(void * context,const void * data,size_t count)10*4882a593Smuzhiyun static int regmap_slimbus_write(void *context, const void *data, size_t count)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun 	struct slim_device *sdev = context;
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun 	return slim_write(sdev, *(u16 *)data, count - 2, (u8 *)data + 2);
15*4882a593Smuzhiyun }
16*4882a593Smuzhiyun 
regmap_slimbus_read(void * context,const void * reg,size_t reg_size,void * val,size_t val_size)17*4882a593Smuzhiyun static int regmap_slimbus_read(void *context, const void *reg, size_t reg_size,
18*4882a593Smuzhiyun 			       void *val, size_t val_size)
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun 	struct slim_device *sdev = context;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	return slim_read(sdev, *(u16 *)reg, val_size, val);
23*4882a593Smuzhiyun }
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun static struct regmap_bus regmap_slimbus_bus = {
26*4882a593Smuzhiyun 	.write = regmap_slimbus_write,
27*4882a593Smuzhiyun 	.read = regmap_slimbus_read,
28*4882a593Smuzhiyun 	.reg_format_endian_default = REGMAP_ENDIAN_LITTLE,
29*4882a593Smuzhiyun 	.val_format_endian_default = REGMAP_ENDIAN_LITTLE,
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun 
regmap_get_slimbus(struct slim_device * slim,const struct regmap_config * config)32*4882a593Smuzhiyun static const struct regmap_bus *regmap_get_slimbus(struct slim_device *slim,
33*4882a593Smuzhiyun 					const struct regmap_config *config)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun 	if (config->val_bits == 8 && config->reg_bits == 16)
36*4882a593Smuzhiyun 		return &regmap_slimbus_bus;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	return ERR_PTR(-ENOTSUPP);
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun 
__regmap_init_slimbus(struct slim_device * slimbus,const struct regmap_config * config,struct lock_class_key * lock_key,const char * lock_name)41*4882a593Smuzhiyun struct regmap *__regmap_init_slimbus(struct slim_device *slimbus,
42*4882a593Smuzhiyun 				     const struct regmap_config *config,
43*4882a593Smuzhiyun 				     struct lock_class_key *lock_key,
44*4882a593Smuzhiyun 				     const char *lock_name)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	const struct regmap_bus *bus = regmap_get_slimbus(slimbus, config);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	if (IS_ERR(bus))
49*4882a593Smuzhiyun 		return ERR_CAST(bus);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	return __regmap_init(&slimbus->dev, bus, &slimbus->dev, config,
52*4882a593Smuzhiyun 			     lock_key, lock_name);
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__regmap_init_slimbus);
55*4882a593Smuzhiyun 
__devm_regmap_init_slimbus(struct slim_device * slimbus,const struct regmap_config * config,struct lock_class_key * lock_key,const char * lock_name)56*4882a593Smuzhiyun struct regmap *__devm_regmap_init_slimbus(struct slim_device *slimbus,
57*4882a593Smuzhiyun 					  const struct regmap_config *config,
58*4882a593Smuzhiyun 					  struct lock_class_key *lock_key,
59*4882a593Smuzhiyun 					  const char *lock_name)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun 	const struct regmap_bus *bus = regmap_get_slimbus(slimbus, config);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	if (IS_ERR(bus))
64*4882a593Smuzhiyun 		return ERR_CAST(bus);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	return __devm_regmap_init(&slimbus->dev, bus, &slimbus, config,
67*4882a593Smuzhiyun 				  lock_key, lock_name);
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__devm_regmap_init_slimbus);
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
72