1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun // Copyright(c) 2015-17 Intel Corporation.
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include <linux/device.h>
5*4882a593Smuzhiyun #include <linux/module.h>
6*4882a593Smuzhiyun #include <linux/soundwire/sdw.h>
7*4882a593Smuzhiyun #include "internal.h"
8*4882a593Smuzhiyun
regmap_sdw_write(void * context,unsigned int reg,unsigned int val)9*4882a593Smuzhiyun static int regmap_sdw_write(void *context, unsigned int reg, unsigned int val)
10*4882a593Smuzhiyun {
11*4882a593Smuzhiyun struct device *dev = context;
12*4882a593Smuzhiyun struct sdw_slave *slave = dev_to_sdw_dev(dev);
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun return sdw_write_no_pm(slave, reg, val);
15*4882a593Smuzhiyun }
16*4882a593Smuzhiyun
regmap_sdw_read(void * context,unsigned int reg,unsigned int * val)17*4882a593Smuzhiyun static int regmap_sdw_read(void *context, unsigned int reg, unsigned int *val)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun struct device *dev = context;
20*4882a593Smuzhiyun struct sdw_slave *slave = dev_to_sdw_dev(dev);
21*4882a593Smuzhiyun int read;
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun read = sdw_read_no_pm(slave, reg);
24*4882a593Smuzhiyun if (read < 0)
25*4882a593Smuzhiyun return read;
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun *val = read;
28*4882a593Smuzhiyun return 0;
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun static struct regmap_bus regmap_sdw = {
32*4882a593Smuzhiyun .reg_read = regmap_sdw_read,
33*4882a593Smuzhiyun .reg_write = regmap_sdw_write,
34*4882a593Smuzhiyun .reg_format_endian_default = REGMAP_ENDIAN_LITTLE,
35*4882a593Smuzhiyun .val_format_endian_default = REGMAP_ENDIAN_LITTLE,
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun
regmap_sdw_config_check(const struct regmap_config * config)38*4882a593Smuzhiyun static int regmap_sdw_config_check(const struct regmap_config *config)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun /* All register are 8-bits wide as per MIPI Soundwire 1.0 Spec */
41*4882a593Smuzhiyun if (config->val_bits != 8)
42*4882a593Smuzhiyun return -ENOTSUPP;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* Registers are 32 bits wide */
45*4882a593Smuzhiyun if (config->reg_bits != 32)
46*4882a593Smuzhiyun return -ENOTSUPP;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun if (config->pad_bits != 0)
49*4882a593Smuzhiyun return -ENOTSUPP;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun return 0;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun
__regmap_init_sdw(struct sdw_slave * sdw,const struct regmap_config * config,struct lock_class_key * lock_key,const char * lock_name)54*4882a593Smuzhiyun struct regmap *__regmap_init_sdw(struct sdw_slave *sdw,
55*4882a593Smuzhiyun const struct regmap_config *config,
56*4882a593Smuzhiyun struct lock_class_key *lock_key,
57*4882a593Smuzhiyun const char *lock_name)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun int ret;
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun ret = regmap_sdw_config_check(config);
62*4882a593Smuzhiyun if (ret)
63*4882a593Smuzhiyun return ERR_PTR(ret);
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun return __regmap_init(&sdw->dev, ®map_sdw,
66*4882a593Smuzhiyun &sdw->dev, config, lock_key, lock_name);
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__regmap_init_sdw);
69*4882a593Smuzhiyun
__devm_regmap_init_sdw(struct sdw_slave * sdw,const struct regmap_config * config,struct lock_class_key * lock_key,const char * lock_name)70*4882a593Smuzhiyun struct regmap *__devm_regmap_init_sdw(struct sdw_slave *sdw,
71*4882a593Smuzhiyun const struct regmap_config *config,
72*4882a593Smuzhiyun struct lock_class_key *lock_key,
73*4882a593Smuzhiyun const char *lock_name)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun int ret;
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun ret = regmap_sdw_config_check(config);
78*4882a593Smuzhiyun if (ret)
79*4882a593Smuzhiyun return ERR_PTR(ret);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun return __devm_regmap_init(&sdw->dev, ®map_sdw,
82*4882a593Smuzhiyun &sdw->dev, config, lock_key, lock_name);
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__devm_regmap_init_sdw);
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun MODULE_DESCRIPTION("Regmap SoundWire Module");
87*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
88