mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-28 13:34:38 +08:00
regmap: sdw: Remove 8-bit value size restriction
Some SoundWire devices have larger width device specific register maps, in addition to the standard SoundWire 8-bit map. Update the helpers to allow accessing arbitrarily sized register values and remove the explicit 8-bit restriction from regmap_sdw_config_check. Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/20230112171840.2098463-3-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
6466b376e9
commit
522272047d
@ -6,43 +6,52 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/soundwire/sdw.h>
|
||||
#include <linux/types.h>
|
||||
#include "internal.h"
|
||||
|
||||
static int regmap_sdw_write(void *context, unsigned int reg, unsigned int val)
|
||||
static int regmap_sdw_write(void *context, const void *val_buf, size_t val_size)
|
||||
{
|
||||
struct device *dev = context;
|
||||
struct sdw_slave *slave = dev_to_sdw_dev(dev);
|
||||
/* First word of buffer contains the destination address */
|
||||
u32 addr = le32_to_cpu(*(const __le32 *)val_buf);
|
||||
const u8 *val = val_buf;
|
||||
|
||||
return sdw_write_no_pm(slave, reg, val);
|
||||
return sdw_nwrite_no_pm(slave, addr, val_size - sizeof(addr), val + sizeof(addr));
|
||||
}
|
||||
|
||||
static int regmap_sdw_read(void *context, unsigned int reg, unsigned int *val)
|
||||
static int regmap_sdw_gather_write(void *context,
|
||||
const void *reg_buf, size_t reg_size,
|
||||
const void *val_buf, size_t val_size)
|
||||
{
|
||||
struct device *dev = context;
|
||||
struct sdw_slave *slave = dev_to_sdw_dev(dev);
|
||||
int read;
|
||||
u32 addr = le32_to_cpu(*(const __le32 *)reg_buf);
|
||||
|
||||
read = sdw_read_no_pm(slave, reg);
|
||||
if (read < 0)
|
||||
return read;
|
||||
return sdw_nwrite_no_pm(slave, addr, val_size, val_buf);
|
||||
}
|
||||
|
||||
*val = read;
|
||||
return 0;
|
||||
static int regmap_sdw_read(void *context,
|
||||
const void *reg_buf, size_t reg_size,
|
||||
void *val_buf, size_t val_size)
|
||||
{
|
||||
struct device *dev = context;
|
||||
struct sdw_slave *slave = dev_to_sdw_dev(dev);
|
||||
u32 addr = le32_to_cpu(*(const __le32 *)reg_buf);
|
||||
|
||||
return sdw_nread_no_pm(slave, addr, val_size, val_buf);
|
||||
}
|
||||
|
||||
static const struct regmap_bus regmap_sdw = {
|
||||
.reg_read = regmap_sdw_read,
|
||||
.reg_write = regmap_sdw_write,
|
||||
.write = regmap_sdw_write,
|
||||
.gather_write = regmap_sdw_gather_write,
|
||||
.read = regmap_sdw_read,
|
||||
.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;
|
||||
|
||||
/* Register addresses are 32 bits wide */
|
||||
if (config->reg_bits != 32)
|
||||
return -ENOTSUPP;
|
||||
|
Loading…
Reference in New Issue
Block a user