Loading drivers/base/regmap/Kconfig +4 −0 Original line number Diff line number Diff line Loading @@ -37,3 +37,7 @@ config REGMAP_MMIO config REGMAP_IRQ bool config REGMAP_SOUNDWIRE tristate depends on SOUNDWIRE_BUS drivers/base/regmap/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -13,3 +13,4 @@ obj-$(CONFIG_REGMAP_SPMI) += regmap-spmi.o obj-$(CONFIG_REGMAP_MMIO) += regmap-mmio.o obj-$(CONFIG_REGMAP_IRQ) += regmap-irq.o obj-$(CONFIG_REGMAP_W1) += regmap-w1.o obj-$(CONFIG_REGMAP_SOUNDWIRE) += regmap-sdw.o drivers/base/regmap/regmap-sdw.c 0 → 100644 +88 −0 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 // Copyright(c) 2015-17 Intel Corporation. #include <linux/device.h> #include <linux/mod_devicetable.h> #include <linux/module.h> #include <linux/soundwire/sdw.h> #include "internal.h" static int regmap_sdw_write(void *context, unsigned int reg, unsigned int val) { struct device *dev = context; struct sdw_slave *slave = dev_to_sdw_dev(dev); return sdw_write(slave, reg, val); } static int regmap_sdw_read(void *context, unsigned int reg, unsigned int *val) { struct device *dev = context; struct sdw_slave *slave = dev_to_sdw_dev(dev); int read; read = sdw_read(slave, reg); if (read < 0) return read; *val = read; return 0; } static struct regmap_bus regmap_sdw = { .reg_read = regmap_sdw_read, .reg_write = regmap_sdw_write, .reg_format_endian_default = REGMAP_ENDIAN_LITTLE, .val_format_endian_default = REGMAP_ENDIAN_LITTLE, }; static int regmap_sdw_config_check(const struct regmap_config *config) { /* All register are 8-bits wide as per MIPI Soundwire 1.0 Spec */ if (config->val_bits != 8) return -ENOTSUPP; /* Registers are 32 bits wide */ if (config->reg_bits != 32) return -ENOTSUPP; if (config->pad_bits != 0) return -ENOTSUPP; return 0; } struct regmap *__regmap_init_sdw(struct sdw_slave *sdw, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name) { int ret; ret = regmap_sdw_config_check(config); if (ret) return ERR_PTR(ret); return __regmap_init(&sdw->dev, ®map_sdw, &sdw->dev, config, lock_key, lock_name); } EXPORT_SYMBOL_GPL(__regmap_init_sdw); struct regmap *__devm_regmap_init_sdw(struct sdw_slave *sdw, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name) { int ret; ret = regmap_sdw_config_check(config); if (ret) return ERR_PTR(ret); return __devm_regmap_init(&sdw->dev, ®map_sdw, &sdw->dev, config, lock_key, lock_name); } EXPORT_SYMBOL_GPL(__devm_regmap_init_sdw); MODULE_DESCRIPTION("Regmap SoundWire Module"); MODULE_LICENSE("GPL v2"); drivers/base/regmap/regmap.c +3 −1 Original line number Diff line number Diff line Loading @@ -777,7 +777,9 @@ struct regmap *__regmap_init(struct device *dev, INIT_LIST_HEAD(&map->async_free); init_waitqueue_head(&map->async_waitq); if (config->read_flag_mask || config->write_flag_mask) { if (config->read_flag_mask || config->write_flag_mask || config->zero_flag_mask) { map->read_flag_mask = config->read_flag_mask; map->write_flag_mask = config->write_flag_mask; } else if (bus) { Loading include/linux/regmap.h +42 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ struct regmap; struct regmap_range_cfg; struct regmap_field; struct snd_ac97; struct sdw_slave; /* An enum of all the supported cache types */ enum regcache_type { Loading Loading @@ -299,7 +300,10 @@ typedef void (*regmap_unlock)(void *); * a read. * @write_flag_mask: Mask to be set in the top bytes of the register when doing * a write. If both read_flag_mask and write_flag_mask are * empty the regmap_bus default masks are used. * empty and zero_flag_mask is not set the regmap_bus default * masks are used. * @zero_flag_mask: If set, read_flag_mask and write_flag_mask are used even * if they are both empty. * @use_single_rw: If set, converts the bulk read and write operations into * a series of single read and write operations. This is useful * for device that does not support bulk read and write. Loading Loading @@ -361,6 +365,7 @@ struct regmap_config { unsigned long read_flag_mask; unsigned long write_flag_mask; bool zero_flag_mask; bool use_single_rw; bool can_multi_write; Loading Loading @@ -531,6 +536,10 @@ struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name); struct regmap *__regmap_init_sdw(struct sdw_slave *sdw, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name); struct regmap *__devm_regmap_init(struct device *dev, const struct regmap_bus *bus, Loading Loading @@ -568,6 +577,10 @@ struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name); struct regmap *__devm_regmap_init_sdw(struct sdw_slave *sdw, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name); /* * Wrapper for regmap_init macros to include a unique lockdep key and name Loading Loading @@ -716,6 +729,20 @@ int regmap_attach_dev(struct device *dev, struct regmap *map, ac97, config) bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg); /** * regmap_init_sdw() - Initialise register map * * @sdw: Device that will be interacted with * @config: Configuration for register map * * The return value will be an ERR_PTR() on error or a valid pointer to * a struct regmap. */ #define regmap_init_sdw(sdw, config) \ __regmap_lockdep_wrapper(__regmap_init_sdw, #config, \ sdw, config) /** * devm_regmap_init() - Initialise managed register map * Loading Loading @@ -846,6 +873,20 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg); __regmap_lockdep_wrapper(__devm_regmap_init_ac97, #config, \ ac97, config) /** * devm_regmap_init_sdw() - Initialise managed register map * * @sdw: Device that will be interacted with * @config: Configuration for register map * * The return value will be an ERR_PTR() on error or a valid pointer * to a struct regmap. The regmap will be automatically freed by the * device management code. */ #define devm_regmap_init_sdw(sdw, config) \ __regmap_lockdep_wrapper(__devm_regmap_init_sdw, #config, \ sdw, config) void regmap_exit(struct regmap *map); int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config); Loading Loading
drivers/base/regmap/Kconfig +4 −0 Original line number Diff line number Diff line Loading @@ -37,3 +37,7 @@ config REGMAP_MMIO config REGMAP_IRQ bool config REGMAP_SOUNDWIRE tristate depends on SOUNDWIRE_BUS
drivers/base/regmap/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -13,3 +13,4 @@ obj-$(CONFIG_REGMAP_SPMI) += regmap-spmi.o obj-$(CONFIG_REGMAP_MMIO) += regmap-mmio.o obj-$(CONFIG_REGMAP_IRQ) += regmap-irq.o obj-$(CONFIG_REGMAP_W1) += regmap-w1.o obj-$(CONFIG_REGMAP_SOUNDWIRE) += regmap-sdw.o
drivers/base/regmap/regmap-sdw.c 0 → 100644 +88 −0 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 // Copyright(c) 2015-17 Intel Corporation. #include <linux/device.h> #include <linux/mod_devicetable.h> #include <linux/module.h> #include <linux/soundwire/sdw.h> #include "internal.h" static int regmap_sdw_write(void *context, unsigned int reg, unsigned int val) { struct device *dev = context; struct sdw_slave *slave = dev_to_sdw_dev(dev); return sdw_write(slave, reg, val); } static int regmap_sdw_read(void *context, unsigned int reg, unsigned int *val) { struct device *dev = context; struct sdw_slave *slave = dev_to_sdw_dev(dev); int read; read = sdw_read(slave, reg); if (read < 0) return read; *val = read; return 0; } static struct regmap_bus regmap_sdw = { .reg_read = regmap_sdw_read, .reg_write = regmap_sdw_write, .reg_format_endian_default = REGMAP_ENDIAN_LITTLE, .val_format_endian_default = REGMAP_ENDIAN_LITTLE, }; static int regmap_sdw_config_check(const struct regmap_config *config) { /* All register are 8-bits wide as per MIPI Soundwire 1.0 Spec */ if (config->val_bits != 8) return -ENOTSUPP; /* Registers are 32 bits wide */ if (config->reg_bits != 32) return -ENOTSUPP; if (config->pad_bits != 0) return -ENOTSUPP; return 0; } struct regmap *__regmap_init_sdw(struct sdw_slave *sdw, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name) { int ret; ret = regmap_sdw_config_check(config); if (ret) return ERR_PTR(ret); return __regmap_init(&sdw->dev, ®map_sdw, &sdw->dev, config, lock_key, lock_name); } EXPORT_SYMBOL_GPL(__regmap_init_sdw); struct regmap *__devm_regmap_init_sdw(struct sdw_slave *sdw, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name) { int ret; ret = regmap_sdw_config_check(config); if (ret) return ERR_PTR(ret); return __devm_regmap_init(&sdw->dev, ®map_sdw, &sdw->dev, config, lock_key, lock_name); } EXPORT_SYMBOL_GPL(__devm_regmap_init_sdw); MODULE_DESCRIPTION("Regmap SoundWire Module"); MODULE_LICENSE("GPL v2");
drivers/base/regmap/regmap.c +3 −1 Original line number Diff line number Diff line Loading @@ -777,7 +777,9 @@ struct regmap *__regmap_init(struct device *dev, INIT_LIST_HEAD(&map->async_free); init_waitqueue_head(&map->async_waitq); if (config->read_flag_mask || config->write_flag_mask) { if (config->read_flag_mask || config->write_flag_mask || config->zero_flag_mask) { map->read_flag_mask = config->read_flag_mask; map->write_flag_mask = config->write_flag_mask; } else if (bus) { Loading
include/linux/regmap.h +42 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ struct regmap; struct regmap_range_cfg; struct regmap_field; struct snd_ac97; struct sdw_slave; /* An enum of all the supported cache types */ enum regcache_type { Loading Loading @@ -299,7 +300,10 @@ typedef void (*regmap_unlock)(void *); * a read. * @write_flag_mask: Mask to be set in the top bytes of the register when doing * a write. If both read_flag_mask and write_flag_mask are * empty the regmap_bus default masks are used. * empty and zero_flag_mask is not set the regmap_bus default * masks are used. * @zero_flag_mask: If set, read_flag_mask and write_flag_mask are used even * if they are both empty. * @use_single_rw: If set, converts the bulk read and write operations into * a series of single read and write operations. This is useful * for device that does not support bulk read and write. Loading Loading @@ -361,6 +365,7 @@ struct regmap_config { unsigned long read_flag_mask; unsigned long write_flag_mask; bool zero_flag_mask; bool use_single_rw; bool can_multi_write; Loading Loading @@ -531,6 +536,10 @@ struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name); struct regmap *__regmap_init_sdw(struct sdw_slave *sdw, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name); struct regmap *__devm_regmap_init(struct device *dev, const struct regmap_bus *bus, Loading Loading @@ -568,6 +577,10 @@ struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name); struct regmap *__devm_regmap_init_sdw(struct sdw_slave *sdw, const struct regmap_config *config, struct lock_class_key *lock_key, const char *lock_name); /* * Wrapper for regmap_init macros to include a unique lockdep key and name Loading Loading @@ -716,6 +729,20 @@ int regmap_attach_dev(struct device *dev, struct regmap *map, ac97, config) bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg); /** * regmap_init_sdw() - Initialise register map * * @sdw: Device that will be interacted with * @config: Configuration for register map * * The return value will be an ERR_PTR() on error or a valid pointer to * a struct regmap. */ #define regmap_init_sdw(sdw, config) \ __regmap_lockdep_wrapper(__regmap_init_sdw, #config, \ sdw, config) /** * devm_regmap_init() - Initialise managed register map * Loading Loading @@ -846,6 +873,20 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg); __regmap_lockdep_wrapper(__devm_regmap_init_ac97, #config, \ ac97, config) /** * devm_regmap_init_sdw() - Initialise managed register map * * @sdw: Device that will be interacted with * @config: Configuration for register map * * The return value will be an ERR_PTR() on error or a valid pointer * to a struct regmap. The regmap will be automatically freed by the * device management code. */ #define devm_regmap_init_sdw(sdw, config) \ __regmap_lockdep_wrapper(__devm_regmap_init_sdw, #config, \ sdw, config) void regmap_exit(struct regmap *map); int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config); Loading