mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
![Mark Brown](/assets/img/avatar_default.png)
The maple tree register cache is based on a much more modern data structure than the rbtree cache and makes optimisation choices which are probably more appropriate for modern systems than those made by the rbtree cache. In v6.5 it has also acquired the ability to generate multi-register writes in sync operations, bringing performance up to parity with the rbtree cache there. Update the adau7118 driver to use the more modern data structure. Reviewed-by: Nuno Sa <nuno.sa@analog.com> Signed-off-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/r/20230713-asoc-ad-maple-v1-9-7d2f35d42b5f@kernel.org Signed-off-by: Mark Brown <broonie@kernel.org>
88 lines
2.3 KiB
C
88 lines
2.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
//
|
|
// Analog Devices ADAU7118 8 channel PDM-to-I2S/TDM Converter driver over I2C
|
|
//
|
|
// Copyright 2019 Analog Devices Inc.
|
|
|
|
#include <linux/i2c.h>
|
|
#include <linux/module.h>
|
|
#include <linux/regmap.h>
|
|
|
|
#include "adau7118.h"
|
|
|
|
static const struct reg_default adau7118_reg_defaults[] = {
|
|
{ ADAU7118_REG_VENDOR_ID, 0x41 },
|
|
{ ADAU7118_REG_DEVICE_ID1, 0x71 },
|
|
{ ADAU7118_REG_DEVICE_ID2, 0x18 },
|
|
{ ADAU7118_REG_REVISION_ID, 0x00 },
|
|
{ ADAU7118_REG_ENABLES, 0x3F },
|
|
{ ADAU7118_REG_DEC_RATIO_CLK_MAP, 0xC0 },
|
|
{ ADAU7118_REG_HPF_CONTROL, 0xD0 },
|
|
{ ADAU7118_REG_SPT_CTRL1, 0x41 },
|
|
{ ADAU7118_REG_SPT_CTRL2, 0x00 },
|
|
{ ADAU7118_REG_SPT_CX(0), 0x01 },
|
|
{ ADAU7118_REG_SPT_CX(1), 0x11 },
|
|
{ ADAU7118_REG_SPT_CX(2), 0x21 },
|
|
{ ADAU7118_REG_SPT_CX(3), 0x31 },
|
|
{ ADAU7118_REG_SPT_CX(4), 0x41 },
|
|
{ ADAU7118_REG_SPT_CX(5), 0x51 },
|
|
{ ADAU7118_REG_SPT_CX(6), 0x61 },
|
|
{ ADAU7118_REG_SPT_CX(7), 0x71 },
|
|
{ ADAU7118_REG_DRIVE_STRENGTH, 0x2a },
|
|
{ ADAU7118_REG_RESET, 0x00 },
|
|
};
|
|
|
|
static bool adau7118_volatile(struct device *dev, unsigned int reg)
|
|
{
|
|
return (reg == ADAU7118_REG_RESET);
|
|
}
|
|
|
|
|
|
static const struct regmap_config adau7118_regmap_config = {
|
|
.reg_bits = 8,
|
|
.val_bits = 8,
|
|
.reg_defaults = adau7118_reg_defaults,
|
|
.num_reg_defaults = ARRAY_SIZE(adau7118_reg_defaults),
|
|
.cache_type = REGCACHE_MAPLE,
|
|
.max_register = ADAU7118_REG_RESET,
|
|
.volatile_reg = adau7118_volatile,
|
|
};
|
|
|
|
static int adau7118_probe_i2c(struct i2c_client *i2c)
|
|
{
|
|
struct regmap *map;
|
|
|
|
map = devm_regmap_init_i2c(i2c, &adau7118_regmap_config);
|
|
if (IS_ERR(map)) {
|
|
dev_err(&i2c->dev, "Failed to init regmap %ld\n", PTR_ERR(map));
|
|
return PTR_ERR(map);
|
|
}
|
|
|
|
return adau7118_probe(&i2c->dev, map, false);
|
|
}
|
|
|
|
static const struct of_device_id adau7118_of_match[] = {
|
|
{ .compatible = "adi,adau7118" },
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(of, adau7118_of_match);
|
|
|
|
static const struct i2c_device_id adau7118_id[] = {
|
|
{"adau7118", 0},
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(i2c, adau7118_id);
|
|
|
|
static struct i2c_driver adau7118_driver = {
|
|
.driver = {
|
|
.name = "adau7118",
|
|
.of_match_table = adau7118_of_match,
|
|
},
|
|
.probe = adau7118_probe_i2c,
|
|
.id_table = adau7118_id,
|
|
};
|
|
module_i2c_driver(adau7118_driver);
|
|
|
|
MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");
|
|
MODULE_DESCRIPTION("ADAU7118 8 channel PDM-to-I2S/TDM Converter driver over I2C");
|
|
MODULE_LICENSE("GPL");
|