mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
regmap: sdw-mbq: Don't assume the regmap device is the SoundWire slave
Currently, the code assumes that the device that registered the MBQ register map is the actual SoundWire slave device. This works fine for all current users, however future SDCA devices will likely be implemented with the SoundWire slave as a parent device and separate child drivers with regmaps for each audio Function. Update the regmap_init_sdw_mbq_cfg macro to allow these two to be specified separately. Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev> Link: https://patch.msgid.link/20251020155512.353774-3-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
committed by
Mark Brown
parent
715159314d
commit
013a3a66f2
@@ -15,6 +15,7 @@
|
||||
|
||||
struct regmap_mbq_context {
|
||||
struct device *dev;
|
||||
struct sdw_slave *sdw;
|
||||
|
||||
struct regmap_sdw_mbq_cfg cfg;
|
||||
|
||||
@@ -46,7 +47,7 @@ static bool regmap_sdw_mbq_deferrable(struct regmap_mbq_context *ctx, unsigned i
|
||||
static int regmap_sdw_mbq_poll_busy(struct sdw_slave *slave, unsigned int reg,
|
||||
struct regmap_mbq_context *ctx)
|
||||
{
|
||||
struct device *dev = &slave->dev;
|
||||
struct device *dev = ctx->dev;
|
||||
int val, ret = 0;
|
||||
|
||||
dev_dbg(dev, "Deferring transaction for 0x%x\n", reg);
|
||||
@@ -96,8 +97,7 @@ static int regmap_sdw_mbq_write_impl(struct sdw_slave *slave,
|
||||
static int regmap_sdw_mbq_write(void *context, unsigned int reg, unsigned int val)
|
||||
{
|
||||
struct regmap_mbq_context *ctx = context;
|
||||
struct device *dev = ctx->dev;
|
||||
struct sdw_slave *slave = dev_to_sdw_dev(dev);
|
||||
struct sdw_slave *slave = ctx->sdw;
|
||||
bool deferrable = regmap_sdw_mbq_deferrable(ctx, reg);
|
||||
int mbq_size = regmap_sdw_mbq_size(ctx, reg);
|
||||
int ret;
|
||||
@@ -156,8 +156,7 @@ static int regmap_sdw_mbq_read_impl(struct sdw_slave *slave,
|
||||
static int regmap_sdw_mbq_read(void *context, unsigned int reg, unsigned int *val)
|
||||
{
|
||||
struct regmap_mbq_context *ctx = context;
|
||||
struct device *dev = ctx->dev;
|
||||
struct sdw_slave *slave = dev_to_sdw_dev(dev);
|
||||
struct sdw_slave *slave = ctx->sdw;
|
||||
bool deferrable = regmap_sdw_mbq_deferrable(ctx, reg);
|
||||
int mbq_size = regmap_sdw_mbq_size(ctx, reg);
|
||||
int ret;
|
||||
@@ -208,6 +207,7 @@ static int regmap_sdw_mbq_config_check(const struct regmap_config *config)
|
||||
|
||||
static struct regmap_mbq_context *
|
||||
regmap_sdw_mbq_gen_context(struct device *dev,
|
||||
struct sdw_slave *sdw,
|
||||
const struct regmap_config *config,
|
||||
const struct regmap_sdw_mbq_cfg *mbq_config)
|
||||
{
|
||||
@@ -218,6 +218,7 @@ regmap_sdw_mbq_gen_context(struct device *dev,
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ctx->dev = dev;
|
||||
ctx->sdw = sdw;
|
||||
|
||||
if (mbq_config)
|
||||
ctx->cfg = *mbq_config;
|
||||
@@ -228,7 +229,7 @@ regmap_sdw_mbq_gen_context(struct device *dev,
|
||||
return ctx;
|
||||
}
|
||||
|
||||
struct regmap *__regmap_init_sdw_mbq(struct sdw_slave *sdw,
|
||||
struct regmap *__regmap_init_sdw_mbq(struct device *dev, struct sdw_slave *sdw,
|
||||
const struct regmap_config *config,
|
||||
const struct regmap_sdw_mbq_cfg *mbq_config,
|
||||
struct lock_class_key *lock_key,
|
||||
@@ -241,16 +242,16 @@ struct regmap *__regmap_init_sdw_mbq(struct sdw_slave *sdw,
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ctx = regmap_sdw_mbq_gen_context(&sdw->dev, config, mbq_config);
|
||||
ctx = regmap_sdw_mbq_gen_context(dev, sdw, config, mbq_config);
|
||||
if (IS_ERR(ctx))
|
||||
return ERR_CAST(ctx);
|
||||
|
||||
return __regmap_init(&sdw->dev, ®map_sdw_mbq, ctx,
|
||||
return __regmap_init(dev, ®map_sdw_mbq, ctx,
|
||||
config, lock_key, lock_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__regmap_init_sdw_mbq);
|
||||
|
||||
struct regmap *__devm_regmap_init_sdw_mbq(struct sdw_slave *sdw,
|
||||
struct regmap *__devm_regmap_init_sdw_mbq(struct device *dev, struct sdw_slave *sdw,
|
||||
const struct regmap_config *config,
|
||||
const struct regmap_sdw_mbq_cfg *mbq_config,
|
||||
struct lock_class_key *lock_key,
|
||||
@@ -263,11 +264,11 @@ struct regmap *__devm_regmap_init_sdw_mbq(struct sdw_slave *sdw,
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ctx = regmap_sdw_mbq_gen_context(&sdw->dev, config, mbq_config);
|
||||
ctx = regmap_sdw_mbq_gen_context(dev, sdw, config, mbq_config);
|
||||
if (IS_ERR(ctx))
|
||||
return ERR_CAST(ctx);
|
||||
|
||||
return __devm_regmap_init(&sdw->dev, ®map_sdw_mbq, ctx,
|
||||
return __devm_regmap_init(dev, ®map_sdw_mbq, ctx,
|
||||
config, lock_key, lock_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__devm_regmap_init_sdw_mbq);
|
||||
|
||||
@@ -676,7 +676,7 @@ 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,
|
||||
struct regmap *__regmap_init_sdw_mbq(struct device *dev, struct sdw_slave *sdw,
|
||||
const struct regmap_config *config,
|
||||
const struct regmap_sdw_mbq_cfg *mbq_config,
|
||||
struct lock_class_key *lock_key,
|
||||
@@ -738,7 +738,7 @@ 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,
|
||||
struct regmap *__devm_regmap_init_sdw_mbq(struct device *dev, struct sdw_slave *sdw,
|
||||
const struct regmap_config *config,
|
||||
const struct regmap_sdw_mbq_cfg *mbq_config,
|
||||
struct lock_class_key *lock_key,
|
||||
@@ -970,7 +970,7 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
|
||||
*/
|
||||
#define regmap_init_sdw_mbq(sdw, config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init_sdw_mbq, #config, \
|
||||
sdw, config, NULL)
|
||||
&sdw->dev, sdw, config, NULL)
|
||||
|
||||
/**
|
||||
* regmap_init_sdw_mbq_cfg() - Initialise MBQ SDW register map with config
|
||||
@@ -983,9 +983,9 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
|
||||
* to a struct regmap. The regmap will be automatically freed by the
|
||||
* device management code.
|
||||
*/
|
||||
#define regmap_init_sdw_mbq_cfg(sdw, config, mbq_config) \
|
||||
#define regmap_init_sdw_mbq_cfg(dev, sdw, config, mbq_config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init_sdw_mbq, #config, \
|
||||
sdw, config, mbq_config)
|
||||
dev, sdw, config, mbq_config)
|
||||
|
||||
/**
|
||||
* regmap_init_spi_avmm() - Initialize register map for Intel SPI Slave
|
||||
@@ -1198,12 +1198,13 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
|
||||
*/
|
||||
#define devm_regmap_init_sdw_mbq(sdw, config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_sdw_mbq, #config, \
|
||||
sdw, config, NULL)
|
||||
&sdw->dev, sdw, config, NULL)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_sdw_mbq_cfg() - Initialise managed MBQ SDW register map with config
|
||||
*
|
||||
* @sdw: Device that will be interacted with
|
||||
* @dev: Device that will be interacted with
|
||||
* @sdw: SoundWire Device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
* @mbq_config: Properties for the MBQ registers
|
||||
*
|
||||
@@ -1211,9 +1212,9 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
|
||||
* to a struct regmap. The regmap will be automatically freed by the
|
||||
* device management code.
|
||||
*/
|
||||
#define devm_regmap_init_sdw_mbq_cfg(sdw, config, mbq_config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_sdw_mbq, \
|
||||
#config, sdw, config, mbq_config)
|
||||
#define devm_regmap_init_sdw_mbq_cfg(dev, sdw, config, mbq_config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_sdw_mbq, \
|
||||
#config, dev, sdw, config, mbq_config)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_slimbus() - Initialise managed register map
|
||||
|
||||
@@ -419,7 +419,9 @@ static int rt722_sdca_sdw_probe(struct sdw_slave *slave,
|
||||
struct regmap *regmap;
|
||||
|
||||
/* Regmap Initialization */
|
||||
regmap = devm_regmap_init_sdw_mbq_cfg(slave, &rt722_sdca_regmap, &rt722_mbq_config);
|
||||
regmap = devm_regmap_init_sdw_mbq_cfg(&slave->dev, slave,
|
||||
&rt722_sdca_regmap,
|
||||
&rt722_mbq_config);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user