hdac_regmap.c (faa75f8a2edf005a5caf43be4875ffeeb9bcb498) hdac_regmap.c (5e56bcea5017b7b7808df60f21ef01738b6e1a25)
1/*
2 * Regmap support for HD-audio verbs
3 *
4 * A virtual register is translated to one or more hda verbs for write,
5 * vice versa for read.
6 *
7 * A few limitations:
8 * - Provided for not all verbs but only subset standard non-volatile verbs.

--- 46 unchanged lines hidden (view full) ---

55
56 return false;
57}
58
59static bool hda_writeable_reg(struct device *dev, unsigned int reg)
60{
61 struct hdac_device *codec = dev_to_hdac_dev(dev);
62 unsigned int verb = get_verb(reg);
1/*
2 * Regmap support for HD-audio verbs
3 *
4 * A virtual register is translated to one or more hda verbs for write,
5 * vice versa for read.
6 *
7 * A few limitations:
8 * - Provided for not all verbs but only subset standard non-volatile verbs.

--- 46 unchanged lines hidden (view full) ---

55
56 return false;
57}
58
59static bool hda_writeable_reg(struct device *dev, unsigned int reg)
60{
61 struct hdac_device *codec = dev_to_hdac_dev(dev);
62 unsigned int verb = get_verb(reg);
63 int i;
63
64
65 for (i = 0; i < codec->vendor_verbs.used; i++) {
66 unsigned int *v = snd_array_elem(&codec->vendor_verbs, i);
67 if (verb == *v)
68 return true;
69 }
70
64 if (codec->caps_overwriting)
65 return true;
66
67 switch (verb & 0xf00) {
68 case AC_VERB_GET_STREAM_FORMAT:
69 case AC_VERB_GET_AMP_GAIN_MUTE:
70 return true;
71 case 0xf00:

--- 123 unchanged lines hidden (view full) ---

195int snd_hdac_regmap_init(struct hdac_device *codec)
196{
197 struct regmap *regmap;
198
199 regmap = regmap_init(&codec->dev, NULL, codec, &hda_regmap_cfg);
200 if (IS_ERR(regmap))
201 return PTR_ERR(regmap);
202 codec->regmap = regmap;
71 if (codec->caps_overwriting)
72 return true;
73
74 switch (verb & 0xf00) {
75 case AC_VERB_GET_STREAM_FORMAT:
76 case AC_VERB_GET_AMP_GAIN_MUTE:
77 return true;
78 case 0xf00:

--- 123 unchanged lines hidden (view full) ---

202int snd_hdac_regmap_init(struct hdac_device *codec)
203{
204 struct regmap *regmap;
205
206 regmap = regmap_init(&codec->dev, NULL, codec, &hda_regmap_cfg);
207 if (IS_ERR(regmap))
208 return PTR_ERR(regmap);
209 codec->regmap = regmap;
210 snd_array_init(&codec->vendor_verbs, sizeof(unsigned int), 8);
203 return 0;
204}
205EXPORT_SYMBOL_GPL(snd_hdac_regmap_init);
206
207void snd_hdac_regmap_exit(struct hdac_device *codec)
208{
209 if (codec->regmap) {
210 regmap_exit(codec->regmap);
211 codec->regmap = NULL;
211 return 0;
212}
213EXPORT_SYMBOL_GPL(snd_hdac_regmap_init);
214
215void snd_hdac_regmap_exit(struct hdac_device *codec)
216{
217 if (codec->regmap) {
218 regmap_exit(codec->regmap);
219 codec->regmap = NULL;
220 snd_array_free(&codec->vendor_verbs);
212 }
213}
214EXPORT_SYMBOL_GPL(snd_hdac_regmap_exit);
215
221 }
222}
223EXPORT_SYMBOL_GPL(snd_hdac_regmap_exit);
224
225/**
226 * snd_hdac_regmap_add_vendor_verb - add a vendor-specific verb to regmap
227 * @codec: the codec object
228 * @verb: verb to allow accessing via regmap
229 *
230 * Returns zero for success or a negative error code.
231 */
232int snd_hdac_regmap_add_vendor_verb(struct hdac_device *codec,
233 unsigned int verb)
234{
235 unsigned int *p = snd_array_new(&codec->vendor_verbs);
236
237 if (!p)
238 return -ENOMEM;
239 *p = verb;
240 return 0;
241}
242EXPORT_SYMBOL_GPL(snd_hdac_regmap_add_vendor_verb);
243
216/*
217 * helper functions
218 */
219
220/* write a pseudo-register value (w/o power sequence) */
221static int reg_raw_write(struct hdac_device *codec, unsigned int reg,
222 unsigned int val)
223{

--- 89 unchanged lines hidden ---
244/*
245 * helper functions
246 */
247
248/* write a pseudo-register value (w/o power sequence) */
249static int reg_raw_write(struct hdac_device *codec, unsigned int reg,
250 unsigned int val)
251{

--- 89 unchanged lines hidden ---