0001
0002
0003
0004 #include <linux/device.h>
0005 #include <linux/errno.h>
0006 #include <linux/module.h>
0007 #include <linux/regmap.h>
0008 #include <linux/soundwire/sdw.h>
0009 #include "internal.h"
0010
0011 static int regmap_sdw_write(void *context, unsigned int reg, unsigned int val)
0012 {
0013 struct device *dev = context;
0014 struct sdw_slave *slave = dev_to_sdw_dev(dev);
0015
0016 return sdw_write_no_pm(slave, reg, val);
0017 }
0018
0019 static int regmap_sdw_read(void *context, unsigned int reg, unsigned int *val)
0020 {
0021 struct device *dev = context;
0022 struct sdw_slave *slave = dev_to_sdw_dev(dev);
0023 int read;
0024
0025 read = sdw_read_no_pm(slave, reg);
0026 if (read < 0)
0027 return read;
0028
0029 *val = read;
0030 return 0;
0031 }
0032
0033 static const struct regmap_bus regmap_sdw = {
0034 .reg_read = regmap_sdw_read,
0035 .reg_write = regmap_sdw_write,
0036 .reg_format_endian_default = REGMAP_ENDIAN_LITTLE,
0037 .val_format_endian_default = REGMAP_ENDIAN_LITTLE,
0038 };
0039
0040 static int regmap_sdw_config_check(const struct regmap_config *config)
0041 {
0042
0043 if (config->val_bits != 8)
0044 return -ENOTSUPP;
0045
0046
0047 if (config->reg_bits != 32)
0048 return -ENOTSUPP;
0049
0050 if (config->pad_bits != 0)
0051 return -ENOTSUPP;
0052
0053 return 0;
0054 }
0055
0056 struct regmap *__regmap_init_sdw(struct sdw_slave *sdw,
0057 const struct regmap_config *config,
0058 struct lock_class_key *lock_key,
0059 const char *lock_name)
0060 {
0061 int ret;
0062
0063 ret = regmap_sdw_config_check(config);
0064 if (ret)
0065 return ERR_PTR(ret);
0066
0067 return __regmap_init(&sdw->dev, ®map_sdw,
0068 &sdw->dev, config, lock_key, lock_name);
0069 }
0070 EXPORT_SYMBOL_GPL(__regmap_init_sdw);
0071
0072 struct regmap *__devm_regmap_init_sdw(struct sdw_slave *sdw,
0073 const struct regmap_config *config,
0074 struct lock_class_key *lock_key,
0075 const char *lock_name)
0076 {
0077 int ret;
0078
0079 ret = regmap_sdw_config_check(config);
0080 if (ret)
0081 return ERR_PTR(ret);
0082
0083 return __devm_regmap_init(&sdw->dev, ®map_sdw,
0084 &sdw->dev, config, lock_key, lock_name);
0085 }
0086 EXPORT_SYMBOL_GPL(__devm_regmap_init_sdw);
0087
0088 MODULE_DESCRIPTION("Regmap SoundWire Module");
0089 MODULE_LICENSE("GPL v2");