Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 150
SoundWire: add MBQ support in regmap#2364
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
653114c98eee1eeba837256cee9bbae11b37e1279eFile filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -15,5 +15,6 @@ 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 | ||
| obj-$(CONFIG_REGMAP_SOUNDWIRE_MBQ) += regmap-sdw-mbq.o | ||
plbossart marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| obj-$(CONFIG_REGMAP_SCCB) += regmap-sccb.o | ||
| obj-$(CONFIG_REGMAP_I3C) += regmap-i3c.o | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,102 @@ | ||
| // SPDX-License-Identifier: GPL-2.0 | ||
| // Copyright(c) 2020 Intel Corporation. | ||
| #include <linux/device.h> | ||
| #include <linux/errno.h> | ||
| #include <linux/mod_devicetable.h> | ||
| #include <linux/module.h> | ||
plbossart marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| #include <linux/regmap.h> | ||
| #include <linux/soundwire/sdw.h> | ||
| #include <linux/soundwire/sdw_registers.h> | ||
| #include "internal.h" | ||
| static int regmap_sdw_mbq_write(void *context, unsigned int reg, unsigned int val) | ||
| { | ||
| struct device *dev = context; | ||
| struct sdw_slave *slave = dev_to_sdw_dev(dev); | ||
| int ret; | ||
| ret = sdw_write(slave, SDW_SDCA_MBQ_CTL(reg), (val >> 8) & 0xff); | ||
| if (ret < 0) | ||
| return ret; | ||
| return sdw_write(slave, reg, val & 0xff); | ||
| } | ||
| static int regmap_sdw_mbq_read(void *context, unsigned int reg, unsigned int *val) | ||
| { | ||
| struct device *dev = context; | ||
| struct sdw_slave *slave = dev_to_sdw_dev(dev); | ||
| int read0; | ||
| int read1; | ||
| read0 = sdw_read(slave, reg); | ||
| if (read0 < 0) | ||
| return read0; | ||
| read1 = sdw_read(slave, SDW_SDCA_MBQ_CTL(reg)); | ||
| if (read1 < 0) | ||
| return read1; | ||
| *val = (read1 << 8) | read0; | ||
RanderWang marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| return 0; | ||
| } | ||
| static struct regmap_bus regmap_sdw_mbq = { | ||
| .reg_read = regmap_sdw_mbq_read, | ||
| .reg_write = regmap_sdw_mbq_write, | ||
| .reg_format_endian_default = REGMAP_ENDIAN_LITTLE, | ||
| .val_format_endian_default = REGMAP_ENDIAN_LITTLE, | ||
| }; | ||
| static int regmap_sdw_mbq_config_check(const struct regmap_config *config) | ||
| { | ||
| /* MBQ-based controls are only 16-bits for now */ | ||
plbossart marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| if (config->val_bits != 16) | ||
| return -EOPNOTSUPP; | ||
| /* Registers are 32 bits wide */ | ||
| if (config->reg_bits != 32) | ||
| return -EOPNOTSUPP; | ||
| if (config->pad_bits != 0) | ||
| return -EOPNOTSUPP; | ||
| return 0; | ||
| } | ||
| struct regmap *__regmap_init_sdw_mbq(struct sdw_slave *sdw, | ||
| const struct regmap_config *config, | ||
| struct lock_class_key *lock_key, | ||
| const char *lock_name) | ||
| { | ||
| int ret; | ||
| ret = regmap_sdw_mbq_config_check(config); | ||
| if (ret) | ||
| return ERR_PTR(ret); | ||
| return __regmap_init(&sdw->dev, ®map_sdw_mbq, | ||
| &sdw->dev, config, lock_key, lock_name); | ||
| } | ||
| EXPORT_SYMBOL_GPL(__regmap_init_sdw_mbq); | ||
| struct regmap *__devm_regmap_init_sdw_mbq(struct sdw_slave *sdw, | ||
| const struct regmap_config *config, | ||
| struct lock_class_key *lock_key, | ||
| const char *lock_name) | ||
| { | ||
| int ret; | ||
| ret = regmap_sdw_mbq_config_check(config); | ||
| if (ret) | ||
| return ERR_PTR(ret); | ||
| return __devm_regmap_init(&sdw->dev, ®map_sdw_mbq, | ||
| &sdw->dev, config, lock_key, lock_name); | ||
| } | ||
| EXPORT_SYMBOL_GPL(__devm_regmap_init_sdw_mbq); | ||
| MODULE_DESCRIPTION("Regmap SoundWire Module"); | ||
| MODULE_LICENSE("GPL v2"); | ||
plbossart marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -567,6 +567,10 @@ 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 *__regmap_init_sdw_mbq(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, | ||
| @@ -612,6 +616,10 @@ 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); | ||
| struct regmap *__devm_regmap_init_sdw_mbq(struct sdw_slave *sdw, | ||
| const struct regmap_config *config, | ||
| struct lock_class_key *lock_key, | ||
| const char *lock_name); | ||
plbossart marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| struct regmap *__devm_regmap_init_slimbus(struct slim_device *slimbus, | ||
| const struct regmap_config *config, | ||
| struct lock_class_key *lock_key, | ||
| @@ -806,6 +814,18 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg); | ||
| __regmap_lockdep_wrapper(__regmap_init_sdw, #config, \ | ||
| sdw, config) | ||
| /** | ||
| * regmap_init_sdw_mbq() - Initialise register map | ||
RanderWang marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| * | ||
| * @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_mbq(sdw, config) \ | ||
| __regmap_lockdep_wrapper(__regmap_init_sdw_mbq, #config, \ | ||
| sdw, config) | ||
| /** | ||
| * devm_regmap_init() - Initialise managed register map | ||
Uh oh!
There was an error while loading. Please reload this page.