1ca514c0fSNuno Sá // SPDX-License-Identifier: GPL-2.0 2ca514c0fSNuno Sá // 3ca514c0fSNuno Sá // Analog Devices ADAU7118 8 channel PDM-to-I2S/TDM Converter driver over I2C 4ca514c0fSNuno Sá // 5ca514c0fSNuno Sá // Copyright 2019 Analog Devices Inc. 6ca514c0fSNuno Sá 7ca514c0fSNuno Sá #include <linux/i2c.h> 8ca514c0fSNuno Sá #include <linux/module.h> 9ca514c0fSNuno Sá #include <linux/regmap.h> 10ca514c0fSNuno Sá 11ca514c0fSNuno Sá #include "adau7118.h" 12ca514c0fSNuno Sá 13ca514c0fSNuno Sá static const struct reg_default adau7118_reg_defaults[] = { 14ca514c0fSNuno Sá { ADAU7118_REG_VENDOR_ID, 0x41 }, 15ca514c0fSNuno Sá { ADAU7118_REG_DEVICE_ID1, 0x71 }, 16ca514c0fSNuno Sá { ADAU7118_REG_DEVICE_ID2, 0x18 }, 17ca514c0fSNuno Sá { ADAU7118_REG_REVISION_ID, 0x00 }, 18ca514c0fSNuno Sá { ADAU7118_REG_ENABLES, 0x3F }, 19ca514c0fSNuno Sá { ADAU7118_REG_DEC_RATIO_CLK_MAP, 0xC0 }, 20ca514c0fSNuno Sá { ADAU7118_REG_HPF_CONTROL, 0xD0 }, 21ca514c0fSNuno Sá { ADAU7118_REG_SPT_CTRL1, 0x41 }, 22ca514c0fSNuno Sá { ADAU7118_REG_SPT_CTRL2, 0x00 }, 23ca514c0fSNuno Sá { ADAU7118_REG_SPT_CX(0), 0x01 }, 24ca514c0fSNuno Sá { ADAU7118_REG_SPT_CX(1), 0x11 }, 25ca514c0fSNuno Sá { ADAU7118_REG_SPT_CX(2), 0x21 }, 26ca514c0fSNuno Sá { ADAU7118_REG_SPT_CX(3), 0x31 }, 27ca514c0fSNuno Sá { ADAU7118_REG_SPT_CX(4), 0x41 }, 28ca514c0fSNuno Sá { ADAU7118_REG_SPT_CX(5), 0x51 }, 29ca514c0fSNuno Sá { ADAU7118_REG_SPT_CX(6), 0x61 }, 30ca514c0fSNuno Sá { ADAU7118_REG_SPT_CX(7), 0x71 }, 31ca514c0fSNuno Sá { ADAU7118_REG_DRIVE_STRENGTH, 0x2a }, 32ca514c0fSNuno Sá { ADAU7118_REG_RESET, 0x00 }, 33ca514c0fSNuno Sá }; 34ca514c0fSNuno Sá 35ca514c0fSNuno Sá static const struct regmap_config adau7118_regmap_config = { 36ca514c0fSNuno Sá .reg_bits = 8, 37ca514c0fSNuno Sá .val_bits = 8, 38ca514c0fSNuno Sá .reg_defaults = adau7118_reg_defaults, 39ca514c0fSNuno Sá .num_reg_defaults = ARRAY_SIZE(adau7118_reg_defaults), 40ca514c0fSNuno Sá .cache_type = REGCACHE_RBTREE, 41ca514c0fSNuno Sá .max_register = ADAU7118_REG_RESET, 42ca514c0fSNuno Sá }; 43ca514c0fSNuno Sá 44ca514c0fSNuno Sá static int adau7118_probe_i2c(struct i2c_client *i2c, 45ca514c0fSNuno Sá const struct i2c_device_id *id) 46ca514c0fSNuno Sá { 47ca514c0fSNuno Sá struct regmap *map; 48ca514c0fSNuno Sá 49ca514c0fSNuno Sá map = devm_regmap_init_i2c(i2c, &adau7118_regmap_config); 50ca514c0fSNuno Sá if (IS_ERR(map)) { 51ca514c0fSNuno Sá dev_err(&i2c->dev, "Failed to init regmap %ld\n", PTR_ERR(map)); 52ca514c0fSNuno Sá return PTR_ERR(map); 53ca514c0fSNuno Sá } 54ca514c0fSNuno Sá 55ca514c0fSNuno Sá return adau7118_probe(&i2c->dev, map, false); 56ca514c0fSNuno Sá } 57ca514c0fSNuno Sá 58ca514c0fSNuno Sá static const struct of_device_id adau7118_of_match[] = { 59ca514c0fSNuno Sá { .compatible = "adi,adau7118" }, 60ca514c0fSNuno Sá {} 61ca514c0fSNuno Sá }; 62ca514c0fSNuno Sá MODULE_DEVICE_TABLE(of, adau7118_of_match); 63ca514c0fSNuno Sá 64ca514c0fSNuno Sá static const struct i2c_device_id adau7118_id[] = { 65ca514c0fSNuno Sá {"adau7118", 0}, 66ca514c0fSNuno Sá {} 67ca514c0fSNuno Sá }; 68ca514c0fSNuno Sá MODULE_DEVICE_TABLE(i2c, adau7118_id); 69ca514c0fSNuno Sá 70ca514c0fSNuno Sá static struct i2c_driver adau7118_driver = { 71ca514c0fSNuno Sá .driver = { 72ca514c0fSNuno Sá .name = "adau7118", 73ca514c0fSNuno Sá .of_match_table = adau7118_of_match, 74ca514c0fSNuno Sá }, 75ca514c0fSNuno Sá .probe = adau7118_probe_i2c, 76ca514c0fSNuno Sá .id_table = adau7118_id, 77ca514c0fSNuno Sá }; 78ca514c0fSNuno Sá module_i2c_driver(adau7118_driver); 79ca514c0fSNuno Sá 80ca514c0fSNuno Sá MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>"); 81ca514c0fSNuno Sá MODULE_DESCRIPTION("ADAU7118 8 channel PDM-to-I2S/TDM Converter driver over I2C"); 82ca514c0fSNuno Sá MODULE_LICENSE("GPL"); 83