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 --- |