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