162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// Register map access API - AC'97 support 462306a36Sopenharmony_ci// 562306a36Sopenharmony_ci// Copyright 2013 Linaro Ltd. All rights reserved. 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/clk.h> 862306a36Sopenharmony_ci#include <linux/err.h> 962306a36Sopenharmony_ci#include <linux/init.h> 1062306a36Sopenharmony_ci#include <linux/io.h> 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci#include <linux/regmap.h> 1362306a36Sopenharmony_ci#include <linux/slab.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <sound/ac97_codec.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cibool regmap_ac97_default_volatile(struct device *dev, unsigned int reg) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci switch (reg) { 2062306a36Sopenharmony_ci case AC97_RESET: 2162306a36Sopenharmony_ci case AC97_POWERDOWN: 2262306a36Sopenharmony_ci case AC97_INT_PAGING: 2362306a36Sopenharmony_ci case AC97_EXTENDED_ID: 2462306a36Sopenharmony_ci case AC97_EXTENDED_STATUS: 2562306a36Sopenharmony_ci case AC97_EXTENDED_MID: 2662306a36Sopenharmony_ci case AC97_EXTENDED_MSTATUS: 2762306a36Sopenharmony_ci case AC97_GPIO_STATUS: 2862306a36Sopenharmony_ci case AC97_MISC_AFE: 2962306a36Sopenharmony_ci case AC97_VENDOR_ID1: 3062306a36Sopenharmony_ci case AC97_VENDOR_ID2: 3162306a36Sopenharmony_ci case AC97_CODEC_CLASS_REV: 3262306a36Sopenharmony_ci case AC97_PCI_SVID: 3362306a36Sopenharmony_ci case AC97_PCI_SID: 3462306a36Sopenharmony_ci case AC97_FUNC_SELECT: 3562306a36Sopenharmony_ci case AC97_FUNC_INFO: 3662306a36Sopenharmony_ci case AC97_SENSE_INFO: 3762306a36Sopenharmony_ci return true; 3862306a36Sopenharmony_ci default: 3962306a36Sopenharmony_ci return false; 4062306a36Sopenharmony_ci } 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(regmap_ac97_default_volatile); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic int regmap_ac97_reg_read(void *context, unsigned int reg, 4562306a36Sopenharmony_ci unsigned int *val) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci struct snd_ac97 *ac97 = context; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci *val = ac97->bus->ops->read(ac97, reg); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci return 0; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic int regmap_ac97_reg_write(void *context, unsigned int reg, 5562306a36Sopenharmony_ci unsigned int val) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci struct snd_ac97 *ac97 = context; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci ac97->bus->ops->write(ac97, reg, val); 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci return 0; 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic const struct regmap_bus ac97_regmap_bus = { 6562306a36Sopenharmony_ci .reg_write = regmap_ac97_reg_write, 6662306a36Sopenharmony_ci .reg_read = regmap_ac97_reg_read, 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistruct regmap *__regmap_init_ac97(struct snd_ac97 *ac97, 7062306a36Sopenharmony_ci const struct regmap_config *config, 7162306a36Sopenharmony_ci struct lock_class_key *lock_key, 7262306a36Sopenharmony_ci const char *lock_name) 7362306a36Sopenharmony_ci{ 7462306a36Sopenharmony_ci return __regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config, 7562306a36Sopenharmony_ci lock_key, lock_name); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(__regmap_init_ac97); 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistruct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97, 8062306a36Sopenharmony_ci const struct regmap_config *config, 8162306a36Sopenharmony_ci struct lock_class_key *lock_key, 8262306a36Sopenharmony_ci const char *lock_name) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci return __devm_regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config, 8562306a36Sopenharmony_ci lock_key, lock_name); 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(__devm_regmap_init_ac97); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 90