mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 04:21:09 -04:00
Add __regmap_init_i3c() and the corresponding regmap_init_i3c() macro to allow creating a regmap for I3C devices without using the device-managed version. This mirrors the pattern already established for other buses such as I2C, SPI and so on, giving drivers more flexibility when the regmap lifetime is not directly tied to the device. Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn> Link: https://patch.msgid.link/a81256a8866b163979a20406abf01df7d7440104.1775788105.git.xiaopei01@kylinos.cn Signed-off-by: Mark Brown <broonie@kernel.org>
72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
// Copyright (c) 2018 Synopsys, Inc. and/or its affiliates.
|
|
|
|
#include <linux/array_size.h>
|
|
#include <linux/regmap.h>
|
|
#include <linux/i3c/device.h>
|
|
#include <linux/i3c/master.h>
|
|
#include <linux/module.h>
|
|
|
|
static int regmap_i3c_write(void *context, const void *data, size_t count)
|
|
{
|
|
struct device *dev = context;
|
|
struct i3c_device *i3c = dev_to_i3cdev(dev);
|
|
struct i3c_xfer xfers[] = {
|
|
{
|
|
.rnw = false,
|
|
.len = count,
|
|
.data.out = data,
|
|
},
|
|
};
|
|
|
|
return i3c_device_do_xfers(i3c, xfers, ARRAY_SIZE(xfers), I3C_SDR);
|
|
}
|
|
|
|
static int regmap_i3c_read(void *context,
|
|
const void *reg, size_t reg_size,
|
|
void *val, size_t val_size)
|
|
{
|
|
struct device *dev = context;
|
|
struct i3c_device *i3c = dev_to_i3cdev(dev);
|
|
struct i3c_xfer xfers[2];
|
|
|
|
xfers[0].rnw = false;
|
|
xfers[0].len = reg_size;
|
|
xfers[0].data.out = reg;
|
|
|
|
xfers[1].rnw = true;
|
|
xfers[1].len = val_size;
|
|
xfers[1].data.in = val;
|
|
|
|
return i3c_device_do_xfers(i3c, xfers, ARRAY_SIZE(xfers), I3C_SDR);
|
|
}
|
|
|
|
static const struct regmap_bus regmap_i3c = {
|
|
.write = regmap_i3c_write,
|
|
.read = regmap_i3c_read,
|
|
};
|
|
|
|
struct regmap *__regmap_init_i3c(struct i3c_device *i3c,
|
|
const struct regmap_config *config,
|
|
struct lock_class_key *lock_key,
|
|
const char *lock_name)
|
|
{
|
|
return __regmap_init(&i3c->dev, ®map_i3c, &i3c->dev, config,
|
|
lock_key, lock_name);
|
|
}
|
|
EXPORT_SYMBOL_GPL(__regmap_init_i3c);
|
|
|
|
struct regmap *__devm_regmap_init_i3c(struct i3c_device *i3c,
|
|
const struct regmap_config *config,
|
|
struct lock_class_key *lock_key,
|
|
const char *lock_name)
|
|
{
|
|
return __devm_regmap_init(&i3c->dev, ®map_i3c, &i3c->dev, config,
|
|
lock_key, lock_name);
|
|
}
|
|
EXPORT_SYMBOL_GPL(__devm_regmap_init_i3c);
|
|
|
|
MODULE_AUTHOR("Vitor Soares <vitor.soares@synopsys.com>");
|
|
MODULE_DESCRIPTION("regmap I3C Module");
|
|
MODULE_LICENSE("GPL v2");
|