xref: /OK3568_Linux_fs/kernel/drivers/base/regmap/regmap-ac97.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun //
3*4882a593Smuzhiyun // Register map access API - AC'97 support
4*4882a593Smuzhiyun //
5*4882a593Smuzhiyun // Copyright 2013 Linaro Ltd.  All rights reserved.
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/clk.h>
8*4882a593Smuzhiyun #include <linux/err.h>
9*4882a593Smuzhiyun #include <linux/init.h>
10*4882a593Smuzhiyun #include <linux/io.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/regmap.h>
13*4882a593Smuzhiyun #include <linux/slab.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <sound/ac97_codec.h>
16*4882a593Smuzhiyun 
regmap_ac97_default_volatile(struct device * dev,unsigned int reg)17*4882a593Smuzhiyun bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun 	switch (reg) {
20*4882a593Smuzhiyun 	case AC97_RESET:
21*4882a593Smuzhiyun 	case AC97_POWERDOWN:
22*4882a593Smuzhiyun 	case AC97_INT_PAGING:
23*4882a593Smuzhiyun 	case AC97_EXTENDED_ID:
24*4882a593Smuzhiyun 	case AC97_EXTENDED_STATUS:
25*4882a593Smuzhiyun 	case AC97_EXTENDED_MID:
26*4882a593Smuzhiyun 	case AC97_EXTENDED_MSTATUS:
27*4882a593Smuzhiyun 	case AC97_GPIO_STATUS:
28*4882a593Smuzhiyun 	case AC97_MISC_AFE:
29*4882a593Smuzhiyun 	case AC97_VENDOR_ID1:
30*4882a593Smuzhiyun 	case AC97_VENDOR_ID2:
31*4882a593Smuzhiyun 	case AC97_CODEC_CLASS_REV:
32*4882a593Smuzhiyun 	case AC97_PCI_SVID:
33*4882a593Smuzhiyun 	case AC97_PCI_SID:
34*4882a593Smuzhiyun 	case AC97_FUNC_SELECT:
35*4882a593Smuzhiyun 	case AC97_FUNC_INFO:
36*4882a593Smuzhiyun 	case AC97_SENSE_INFO:
37*4882a593Smuzhiyun 		return true;
38*4882a593Smuzhiyun 	default:
39*4882a593Smuzhiyun 		return false;
40*4882a593Smuzhiyun 	}
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(regmap_ac97_default_volatile);
43*4882a593Smuzhiyun 
regmap_ac97_reg_read(void * context,unsigned int reg,unsigned int * val)44*4882a593Smuzhiyun static int regmap_ac97_reg_read(void *context, unsigned int reg,
45*4882a593Smuzhiyun 	unsigned int *val)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun 	struct snd_ac97 *ac97 = context;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	*val = ac97->bus->ops->read(ac97, reg);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	return 0;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun 
regmap_ac97_reg_write(void * context,unsigned int reg,unsigned int val)54*4882a593Smuzhiyun static int regmap_ac97_reg_write(void *context, unsigned int reg,
55*4882a593Smuzhiyun 	unsigned int val)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	struct snd_ac97 *ac97 = context;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	ac97->bus->ops->write(ac97, reg, val);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	return 0;
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun static const struct regmap_bus ac97_regmap_bus = {
65*4882a593Smuzhiyun 	.reg_write = regmap_ac97_reg_write,
66*4882a593Smuzhiyun 	.reg_read = regmap_ac97_reg_read,
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
__regmap_init_ac97(struct snd_ac97 * ac97,const struct regmap_config * config,struct lock_class_key * lock_key,const char * lock_name)69*4882a593Smuzhiyun struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97,
70*4882a593Smuzhiyun 				  const struct regmap_config *config,
71*4882a593Smuzhiyun 				  struct lock_class_key *lock_key,
72*4882a593Smuzhiyun 				  const char *lock_name)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun 	return __regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config,
75*4882a593Smuzhiyun 			     lock_key, lock_name);
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__regmap_init_ac97);
78*4882a593Smuzhiyun 
__devm_regmap_init_ac97(struct snd_ac97 * ac97,const struct regmap_config * config,struct lock_class_key * lock_key,const char * lock_name)79*4882a593Smuzhiyun struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97,
80*4882a593Smuzhiyun 				       const struct regmap_config *config,
81*4882a593Smuzhiyun 				       struct lock_class_key *lock_key,
82*4882a593Smuzhiyun 				       const char *lock_name)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	return __devm_regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config,
85*4882a593Smuzhiyun 				  lock_key, lock_name);
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__devm_regmap_init_ac97);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
90