diff options
| -rw-r--r-- | include/sound/hdaudio.h | 66 | ||||
| -rw-r--r-- | sound/hda/Makefile | 2 | ||||
| -rw-r--r-- | sound/hda/hdac_device.c | 471 | ||||
| -rw-r--r-- | sound/hda/local.h | 19 | ||||
| -rw-r--r-- | sound/pci/hda/hda_auto_parser.c | 33 | ||||
| -rw-r--r-- | sound/pci/hda/hda_beep.c | 4 | ||||
| -rw-r--r-- | sound/pci/hda/hda_bind.c | 95 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 396 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.h | 43 | ||||
| -rw-r--r-- | sound/pci/hda/hda_generic.c | 25 | ||||
| -rw-r--r-- | sound/pci/hda/hda_local.h | 15 | ||||
| -rw-r--r-- | sound/pci/hda/hda_proc.c | 42 | ||||
| -rw-r--r-- | sound/pci/hda/hda_sysfs.c | 58 | ||||
| -rw-r--r-- | sound/pci/hda/local.h | 39 | ||||
| -rw-r--r-- | sound/pci/hda/patch_analog.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/patch_ca0132.c | 6 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 16 | ||||
| -rw-r--r-- | sound/pci/hda/patch_hdmi.c | 20 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 78 | ||||
| -rw-r--r-- | sound/pci/hda/patch_si3054.c | 6 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 84 | ||||
| -rw-r--r-- | sound/pci/hda/patch_via.c | 23 | ||||
| -rw-r--r-- | sound/pci/hda/thinkpad_helper.c | 2 |
23 files changed, 880 insertions, 665 deletions
diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h index 848ab6e68099..b81b4bec6f05 100644 --- a/include/sound/hdaudio.h +++ b/include/sound/hdaudio.h | |||
| @@ -8,6 +8,9 @@ | |||
| 8 | #include <linux/device.h> | 8 | #include <linux/device.h> |
| 9 | #include <sound/hda_verbs.h> | 9 | #include <sound/hda_verbs.h> |
| 10 | 10 | ||
| 11 | /* codec node id */ | ||
| 12 | typedef u16 hda_nid_t; | ||
| 13 | |||
| 11 | struct hdac_bus; | 14 | struct hdac_bus; |
| 12 | struct hdac_device; | 15 | struct hdac_device; |
| 13 | struct hdac_driver; | 16 | struct hdac_driver; |
| @@ -26,6 +29,30 @@ struct hdac_device { | |||
| 26 | struct hdac_bus *bus; | 29 | struct hdac_bus *bus; |
| 27 | unsigned int addr; /* codec address */ | 30 | unsigned int addr; /* codec address */ |
| 28 | struct list_head list; /* list point for bus codec_list */ | 31 | struct list_head list; /* list point for bus codec_list */ |
| 32 | |||
| 33 | hda_nid_t afg; /* AFG node id */ | ||
| 34 | hda_nid_t mfg; /* MFG node id */ | ||
| 35 | |||
| 36 | /* ids */ | ||
| 37 | unsigned int vendor_id; | ||
| 38 | unsigned int subsystem_id; | ||
| 39 | unsigned int revision_id; | ||
| 40 | unsigned int afg_function_id; | ||
| 41 | unsigned int mfg_function_id; | ||
| 42 | unsigned int afg_unsol:1; | ||
| 43 | unsigned int mfg_unsol:1; | ||
| 44 | |||
| 45 | unsigned int power_caps; /* FG power caps */ | ||
| 46 | |||
| 47 | const char *vendor_name; /* codec vendor name */ | ||
| 48 | const char *chip_name; /* codec chip name */ | ||
| 49 | |||
| 50 | /* widgets */ | ||
| 51 | unsigned int num_nodes; | ||
| 52 | hda_nid_t start_nid, end_nid; | ||
| 53 | |||
| 54 | /* misc flags */ | ||
| 55 | atomic_t in_pm; /* suspend/resume being performed */ | ||
| 29 | }; | 56 | }; |
| 30 | 57 | ||
| 31 | /* device/driver type used for matching */ | 58 | /* device/driver type used for matching */ |
| @@ -34,8 +61,37 @@ enum { | |||
| 34 | HDA_DEV_LEGACY, | 61 | HDA_DEV_LEGACY, |
| 35 | }; | 62 | }; |
| 36 | 63 | ||
| 64 | /* direction */ | ||
| 65 | enum { | ||
| 66 | HDA_INPUT, HDA_OUTPUT | ||
| 67 | }; | ||
| 68 | |||
| 37 | #define dev_to_hdac_dev(_dev) container_of(_dev, struct hdac_device, dev) | 69 | #define dev_to_hdac_dev(_dev) container_of(_dev, struct hdac_device, dev) |
| 38 | 70 | ||
| 71 | int snd_hdac_device_init(struct hdac_device *dev, struct hdac_bus *bus, | ||
| 72 | const char *name, unsigned int addr); | ||
| 73 | void snd_hdac_device_exit(struct hdac_device *dev); | ||
| 74 | |||
| 75 | int snd_hdac_refresh_widgets(struct hdac_device *codec); | ||
| 76 | |||
| 77 | unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid, | ||
| 78 | unsigned int verb, unsigned int parm); | ||
| 79 | int snd_hdac_read(struct hdac_device *codec, hda_nid_t nid, | ||
| 80 | unsigned int verb, unsigned int parm, unsigned int *res); | ||
| 81 | int snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm); | ||
| 82 | int snd_hdac_get_connections(struct hdac_device *codec, hda_nid_t nid, | ||
| 83 | hda_nid_t *conn_list, int max_conns); | ||
| 84 | int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid, | ||
| 85 | hda_nid_t *start_id); | ||
| 86 | |||
| 87 | #ifdef CONFIG_PM | ||
| 88 | void snd_hdac_power_up(struct hdac_device *codec); | ||
| 89 | void snd_hdac_power_down(struct hdac_device *codec); | ||
| 90 | #else | ||
| 91 | static inline void snd_hdac_power_up(struct hdac_device *codec) {} | ||
| 92 | static inline void snd_hdac_power_down(struct hdac_device *codec) {} | ||
| 93 | #endif | ||
| 94 | |||
| 39 | /* | 95 | /* |
| 40 | * HD-audio codec base driver | 96 | * HD-audio codec base driver |
| 41 | */ | 97 | */ |
| @@ -100,4 +156,14 @@ int snd_hdac_bus_add_device(struct hdac_bus *bus, struct hdac_device *codec); | |||
| 100 | void snd_hdac_bus_remove_device(struct hdac_bus *bus, | 156 | void snd_hdac_bus_remove_device(struct hdac_bus *bus, |
| 101 | struct hdac_device *codec); | 157 | struct hdac_device *codec); |
| 102 | 158 | ||
| 159 | static inline void snd_hdac_codec_link_up(struct hdac_device *codec) | ||
| 160 | { | ||
| 161 | set_bit(codec->addr, &codec->bus->codec_powered); | ||
| 162 | } | ||
| 163 | |||
| 164 | static inline void snd_hdac_codec_link_down(struct hdac_device *codec) | ||
| 165 | { | ||
| 166 | clear_bit(codec->addr, &codec->bus->codec_powered); | ||
| 167 | } | ||
| 168 | |||
| 103 | #endif /* __SOUND_HDAUDIO_H */ | 169 | #endif /* __SOUND_HDAUDIO_H */ |
diff --git a/sound/hda/Makefile b/sound/hda/Makefile index 828680b282fa..3c7625e595cf 100644 --- a/sound/hda/Makefile +++ b/sound/hda/Makefile | |||
| @@ -1,3 +1,3 @@ | |||
| 1 | snd-hda-core-objs := hda_bus_type.o hdac_bus.o | 1 | snd-hda-core-objs := hda_bus_type.o hdac_bus.o hdac_device.o |
| 2 | 2 | ||
| 3 | obj-$(CONFIG_SND_HDA_CORE) += snd-hda-core.o | 3 | obj-$(CONFIG_SND_HDA_CORE) += snd-hda-core.o |
diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c new file mode 100644 index 000000000000..a3f52ad4de37 --- /dev/null +++ b/sound/hda/hdac_device.c | |||
| @@ -0,0 +1,471 @@ | |||
| 1 | /* | ||
| 2 | * HD-audio codec core device | ||
| 3 | */ | ||
| 4 | |||
| 5 | #include <linux/init.h> | ||
| 6 | #include <linux/device.h> | ||
| 7 | #include <linux/slab.h> | ||
| 8 | #include <linux/module.h> | ||
| 9 | #include <linux/export.h> | ||
| 10 | #include <linux/pm_runtime.h> | ||
| 11 | #include <sound/hdaudio.h> | ||
| 12 | #include "local.h" | ||
| 13 | |||
| 14 | static void setup_fg_nodes(struct hdac_device *codec); | ||
| 15 | static int get_codec_vendor_name(struct hdac_device *codec); | ||
| 16 | |||
| 17 | static void default_release(struct device *dev) | ||
| 18 | { | ||
| 19 | snd_hdac_device_exit(container_of(dev, struct hdac_device, dev)); | ||
| 20 | } | ||
| 21 | |||
| 22 | /** | ||
| 23 | * snd_hdac_device_init - initialize the HD-audio codec base device | ||
| 24 | * @codec: device to initialize | ||
| 25 | * @bus: but to attach | ||
| 26 | * @name: device name string | ||
| 27 | * @addr: codec address | ||
| 28 | * | ||
| 29 | * Returns zero for success or a negative error code. | ||
| 30 | * | ||
| 31 | * This function increments the runtime PM counter and marks it active. | ||
| 32 | * The caller needs to turn it off appropriately later. | ||
| 33 | * | ||
| 34 | * The caller needs to set the device's release op properly by itself. | ||
| 35 | */ | ||
| 36 | int snd_hdac_device_init(struct hdac_device *codec, struct hdac_bus *bus, | ||
| 37 | const char *name, unsigned int addr) | ||
| 38 | { | ||
| 39 | struct device *dev; | ||
| 40 | hda_nid_t fg; | ||
| 41 | int err; | ||
| 42 | |||
| 43 | dev = &codec->dev; | ||
| 44 | device_initialize(dev); | ||
| 45 | dev->parent = bus->dev; | ||
| 46 | dev->bus = &snd_hda_bus_type; | ||
| 47 | dev->release = default_release; | ||
| 48 | dev_set_name(dev, "%s", name); | ||
| 49 | device_enable_async_suspend(dev); | ||
| 50 | |||
| 51 | codec->bus = bus; | ||
| 52 | codec->addr = addr; | ||
| 53 | codec->type = HDA_DEV_CORE; | ||
| 54 | pm_runtime_set_active(&codec->dev); | ||
| 55 | pm_runtime_get_noresume(&codec->dev); | ||
| 56 | atomic_set(&codec->in_pm, 0); | ||
| 57 | |||
| 58 | err = snd_hdac_bus_add_device(bus, codec); | ||
| 59 | if (err < 0) | ||
| 60 | goto error; | ||
| 61 | |||
| 62 | /* fill parameters */ | ||
| 63 | codec->vendor_id = snd_hdac_read_parm(codec, AC_NODE_ROOT, | ||
| 64 | AC_PAR_VENDOR_ID); | ||
| 65 | if (codec->vendor_id == -1) { | ||
| 66 | /* read again, hopefully the access method was corrected | ||
| 67 | * in the last read... | ||
| 68 | */ | ||
| 69 | codec->vendor_id = snd_hdac_read_parm(codec, AC_NODE_ROOT, | ||
| 70 | AC_PAR_VENDOR_ID); | ||
| 71 | } | ||
| 72 | |||
| 73 | codec->subsystem_id = snd_hdac_read_parm(codec, AC_NODE_ROOT, | ||
| 74 | AC_PAR_SUBSYSTEM_ID); | ||
| 75 | codec->revision_id = snd_hdac_read_parm(codec, AC_NODE_ROOT, | ||
| 76 | AC_PAR_REV_ID); | ||
| 77 | |||
| 78 | setup_fg_nodes(codec); | ||
| 79 | if (!codec->afg && !codec->mfg) { | ||
| 80 | dev_err(dev, "no AFG or MFG node found\n"); | ||
| 81 | err = -ENODEV; | ||
| 82 | goto error; | ||
| 83 | } | ||
| 84 | |||
| 85 | fg = codec->afg ? codec->afg : codec->mfg; | ||
| 86 | |||
| 87 | err = snd_hdac_refresh_widgets(codec); | ||
| 88 | if (err < 0) | ||
| 89 | goto error; | ||
| 90 | |||
| 91 | codec->power_caps = snd_hdac_read_parm(codec, fg, AC_PAR_POWER_STATE); | ||
| 92 | /* reread ssid if not set by parameter */ | ||
| 93 | if (codec->subsystem_id == -1) | ||
| 94 | snd_hdac_read(codec, fg, AC_VERB_GET_SUBSYSTEM_ID, 0, | ||
| 95 | &codec->subsystem_id); | ||
| 96 | |||
| 97 | err = get_codec_vendor_name(codec); | ||
| 98 | if (err < 0) | ||
| 99 | goto error; | ||
| 100 | |||
| 101 | codec->chip_name = kasprintf(GFP_KERNEL, "ID %x", | ||
| 102 | codec->vendor_id & 0xffff); | ||
| 103 | if (!codec->chip_name) { | ||
| 104 | err = -ENOMEM; | ||
| 105 | goto error; | ||
| 106 | } | ||
| 107 | |||
| 108 | return 0; | ||
| 109 | |||
| 110 | error: | ||
| 111 | pm_runtime_put_noidle(&codec->dev); | ||
| 112 | put_device(&codec->dev); | ||
| 113 | return err; | ||
| 114 | } | ||
| 115 | EXPORT_SYMBOL_GPL(snd_hdac_device_init); | ||
| 116 | |||
| 117 | /** | ||
| 118 | * snd_hdac_device_exit - clean up the HD-audio codec base device | ||
| 119 | * @codec: device to clean up | ||
| 120 | */ | ||
| 121 | void snd_hdac_device_exit(struct hdac_device *codec) | ||
| 122 | { | ||
| 123 | /* pm_runtime_put_noidle(&codec->dev); */ | ||
| 124 | snd_hdac_bus_remove_device(codec->bus, codec); | ||
| 125 | kfree(codec->vendor_name); | ||
| 126 | kfree(codec->chip_name); | ||
| 127 | } | ||
| 128 | EXPORT_SYMBOL_GPL(snd_hdac_device_exit); | ||
| 129 | |||
| 130 | /** | ||
| 131 | * snd_hdac_make_cmd - compose a 32bit command word to be sent to the | ||
| 132 | * HD-audio controller | ||
| 133 | * @codec: the codec object | ||
| 134 | * @nid: NID to encode | ||
| 135 | * @verb: verb to encode | ||
| 136 | * @parm: parameter to encode | ||
| 137 | * | ||
| 138 | * Return an encoded command verb or -1 for error. | ||
| 139 | */ | ||
| 140 | unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid, | ||
| 141 | unsigned int verb, unsigned int parm) | ||
| 142 | { | ||
| 143 | u32 val, addr; | ||
| 144 | |||
| 145 | addr = codec->addr; | ||
| 146 | if ((addr & ~0xf) || (nid & ~0x7f) || | ||
| 147 | (verb & ~0xfff) || (parm & ~0xffff)) { | ||
| 148 | dev_err(&codec->dev, "out of range cmd %x:%x:%x:%x\n", | ||
| 149 | addr, nid, verb, parm); | ||
| 150 | return -1; | ||
| 151 | } | ||
| 152 | |||
| 153 | val = addr << 28; | ||
| 154 | val |= (u32)nid << 20; | ||
| 155 | val |= verb << 8; | ||
| 156 | val |= parm; | ||
| 157 | return val; | ||
| 158 | } | ||
| 159 | EXPORT_SYMBOL_GPL(snd_hdac_make_cmd); | ||
| 160 | |||
| 161 | /** | ||
| 162 | * snd_hdac_read - execute a verb | ||
| 163 | * @codec: the codec object | ||
| 164 | * @nid: NID to execute a verb | ||
| 165 | * @verb: verb to execute | ||
| 166 | * @parm: parameter for a verb | ||
| 167 | * @res: the pointer to store the result, NULL if running async | ||
| 168 | * | ||
| 169 | * Returns zero if successful, or a negative error code. | ||
| 170 | */ | ||
| 171 | int snd_hdac_read(struct hdac_device *codec, hda_nid_t nid, | ||
| 172 | unsigned int verb, unsigned int parm, unsigned int *res) | ||
| 173 | { | ||
| 174 | unsigned int cmd = snd_hdac_make_cmd(codec, nid, verb, parm); | ||
| 175 | |||
| 176 | return snd_hdac_bus_exec_verb(codec->bus, codec->addr, cmd, res); | ||
| 177 | } | ||
| 178 | EXPORT_SYMBOL_GPL(snd_hdac_read); | ||
| 179 | |||
| 180 | /** | ||
| 181 | * snd_hdac_read_parm - read a codec parameter | ||
| 182 | * @codec: the codec object | ||
| 183 | * @nid: NID to read a parameter | ||
| 184 | * @parm: parameter to read | ||
| 185 | * | ||
| 186 | * Returns -1 for error. If you need to distinguish the error more | ||
| 187 | * strictly, use snd_hdac_read() directly. | ||
| 188 | */ | ||
| 189 | int snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm) | ||
| 190 | { | ||
| 191 | int val; | ||
| 192 | |||
| 193 | if (snd_hdac_read(codec, nid, AC_VERB_PARAMETERS, parm, &val)) | ||
| 194 | return -1; | ||
| 195 | return val; | ||
| 196 | } | ||
| 197 | EXPORT_SYMBOL_GPL(snd_hdac_read_parm); | ||
| 198 | |||
| 199 | /** | ||
| 200 | * snd_hdac_get_sub_nodes - get start NID and number of subtree nodes | ||
| 201 | * @codec: the codec object | ||
| 202 | * @nid: NID to inspect | ||
| 203 | * @start_id: the pointer to store the starting NID | ||
| 204 | * | ||
| 205 | * Returns the number of subtree nodes or zero if not found. | ||
| 206 | */ | ||
| 207 | int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid, | ||
| 208 | hda_nid_t *start_id) | ||
| 209 | { | ||
| 210 | unsigned int parm; | ||
| 211 | |||
| 212 | parm = snd_hdac_read_parm(codec, nid, AC_PAR_NODE_COUNT); | ||
| 213 | if (parm == -1) { | ||
| 214 | *start_id = 0; | ||
| 215 | return 0; | ||
| 216 | } | ||
| 217 | *start_id = (parm >> 16) & 0x7fff; | ||
| 218 | return (int)(parm & 0x7fff); | ||
| 219 | } | ||
| 220 | EXPORT_SYMBOL_GPL(snd_hdac_get_sub_nodes); | ||
| 221 | |||
| 222 | /* | ||
| 223 | * look for an AFG and MFG nodes | ||
| 224 | */ | ||
| 225 | static void setup_fg_nodes(struct hdac_device *codec) | ||
| 226 | { | ||
| 227 | int i, total_nodes, function_id; | ||
| 228 | hda_nid_t nid; | ||
| 229 | |||
| 230 | total_nodes = snd_hdac_get_sub_nodes(codec, AC_NODE_ROOT, &nid); | ||
| 231 | for (i = 0; i < total_nodes; i++, nid++) { | ||
| 232 | function_id = snd_hdac_read_parm(codec, nid, | ||
| 233 | AC_PAR_FUNCTION_TYPE); | ||
| 234 | switch (function_id & 0xff) { | ||
| 235 | case AC_GRP_AUDIO_FUNCTION: | ||
| 236 | codec->afg = nid; | ||
| 237 | codec->afg_function_id = function_id & 0xff; | ||
| 238 | codec->afg_unsol = (function_id >> 8) & 1; | ||
| 239 | break; | ||
| 240 | case AC_GRP_MODEM_FUNCTION: | ||
| 241 | codec->mfg = nid; | ||
| 242 | codec->mfg_function_id = function_id & 0xff; | ||
| 243 | codec->mfg_unsol = (function_id >> 8) & 1; | ||
| 244 | break; | ||
| 245 | default: | ||
| 246 | break; | ||
| 247 | } | ||
| 248 | } | ||
| 249 | } | ||
| 250 | |||
| 251 | /** | ||
| 252 | * snd_hdac_refresh_widgets - Reset the widget start/end nodes | ||
| 253 | * @codec: the codec object | ||
| 254 | */ | ||
| 255 | int snd_hdac_refresh_widgets(struct hdac_device *codec) | ||
| 256 | { | ||
| 257 | hda_nid_t start_nid; | ||
| 258 | int nums; | ||
| 259 | |||
| 260 | nums = snd_hdac_get_sub_nodes(codec, codec->afg, &start_nid); | ||
| 261 | if (!start_nid || nums <= 0 || nums >= 0xff) { | ||
| 262 | dev_err(&codec->dev, "cannot read sub nodes for FG 0x%02x\n", | ||
| 263 | codec->afg); | ||
| 264 | return -EINVAL; | ||
| 265 | } | ||
| 266 | |||
| 267 | codec->num_nodes = nums; | ||
| 268 | codec->start_nid = start_nid; | ||
| 269 | codec->end_nid = start_nid + nums; | ||
| 270 | return 0; | ||
| 271 | } | ||
| 272 | EXPORT_SYMBOL_GPL(snd_hdac_refresh_widgets); | ||
| 273 | |||
| 274 | /* return CONNLIST_LEN parameter of the given widget */ | ||
| 275 | static unsigned int get_num_conns(struct hdac_device *codec, hda_nid_t nid) | ||
| 276 | { | ||
| 277 | unsigned int wcaps = get_wcaps(codec, nid); | ||
| 278 | unsigned int parm; | ||
| 279 | |||
| 280 | if (!(wcaps & AC_WCAP_CONN_LIST) && | ||
| 281 | get_wcaps_type(wcaps) != AC_WID_VOL_KNB) | ||
| 282 | return 0; | ||
| 283 | |||
| 284 | parm = snd_hdac_read_parm(codec, nid, AC_PAR_CONNLIST_LEN); | ||
| 285 | if (parm == -1) | ||
| 286 | parm = 0; | ||
| 287 | return parm; | ||
| 288 | } | ||
| 289 | |||
| 290 | /** | ||
| 291 | * snd_hdac_get_connections - get a widget connection list | ||
| 292 | * @codec: the codec object | ||
| 293 | * @nid: NID | ||
| 294 | * @conn_list: the array to store the results, can be NULL | ||
| 295 | * @max_conns: the max size of the given array | ||
| 296 | * | ||
| 297 | * Returns the number of connected widgets, zero for no connection, or a | ||
| 298 | * negative error code. When the number of elements don't fit with the | ||
| 299 | * given array size, it returns -ENOSPC. | ||
| 300 | * | ||
| 301 | * When @conn_list is NULL, it just checks the number of connections. | ||
| 302 | */ | ||
| 303 | int snd_hdac_get_connections(struct hdac_device *codec, hda_nid_t nid, | ||
| 304 | hda_nid_t *conn_list, int max_conns) | ||
| 305 | { | ||
| 306 | unsigned int parm; | ||
| 307 | int i, conn_len, conns, err; | ||
| 308 | unsigned int shift, num_elems, mask; | ||
| 309 | hda_nid_t prev_nid; | ||
| 310 | int null_count = 0; | ||
| 311 | |||
| 312 | parm = get_num_conns(codec, nid); | ||
| 313 | if (!parm) | ||
| 314 | return 0; | ||
| 315 | |||
| 316 | if (parm & AC_CLIST_LONG) { | ||
| 317 | /* long form */ | ||
| 318 | shift = 16; | ||
| 319 | num_elems = 2; | ||
| 320 | } else { | ||
| 321 | /* short form */ | ||
| 322 | shift = 8; | ||
| 323 | num_elems = 4; | ||
| 324 | } | ||
| 325 | conn_len = parm & AC_CLIST_LENGTH; | ||
| 326 | mask = (1 << (shift-1)) - 1; | ||
| 327 | |||
| 328 | if (!conn_len) | ||
| 329 | return 0; /* no connection */ | ||
| 330 | |||
| 331 | if (conn_len == 1) { | ||
| 332 | /* single connection */ | ||
| 333 | err = snd_hdac_read(codec, nid, AC_VERB_GET_CONNECT_LIST, 0, | ||
| 334 | &parm); | ||
| 335 | if (err < 0) | ||
| 336 | return err; | ||
| 337 | if (conn_list) | ||
| 338 | conn_list[0] = parm & mask; | ||
| 339 | return 1; | ||
| 340 | } | ||
| 341 | |||
| 342 | /* multi connection */ | ||
| 343 | conns = 0; | ||
| 344 | prev_nid = 0; | ||
| 345 | for (i = 0; i < conn_len; i++) { | ||
| 346 | int range_val; | ||
| 347 | hda_nid_t val, n; | ||
| 348 | |||
| 349 | if (i % num_elems == 0) { | ||
| 350 | err = snd_hdac_read(codec, nid, | ||
| 351 | AC_VERB_GET_CONNECT_LIST, i, | ||
| 352 | &parm); | ||
| 353 | if (err < 0) | ||
| 354 | return -EIO; | ||
| 355 | } | ||
| 356 | range_val = !!(parm & (1 << (shift-1))); /* ranges */ | ||
| 357 | val = parm & mask; | ||
| 358 | if (val == 0 && null_count++) { /* no second chance */ | ||
| 359 | dev_dbg(&codec->dev, | ||
| 360 | "invalid CONNECT_LIST verb %x[%i]:%x\n", | ||
| 361 | nid, i, parm); | ||
| 362 | return 0; | ||
| 363 | } | ||
| 364 | parm >>= shift; | ||
| 365 | if (range_val) { | ||
| 366 | /* ranges between the previous and this one */ | ||
| 367 | if (!prev_nid || prev_nid >= val) { | ||
| 368 | dev_warn(&codec->dev, | ||
| 369 | "invalid dep_range_val %x:%x\n", | ||
| 370 | prev_nid, val); | ||
| 371 | continue; | ||
| 372 | } | ||
| 373 | for (n = prev_nid + 1; n <= val; n++) { | ||
| 374 | if (conn_list) { | ||
| 375 | if (conns >= max_conns) | ||
| 376 | return -ENOSPC; | ||
| 377 | conn_list[conns] = n; | ||
| 378 | } | ||
| 379 | conns++; | ||
| 380 | } | ||
| 381 | } else { | ||
| 382 | if (conn_list) { | ||
| 383 | if (conns >= max_conns) | ||
| 384 | return -ENOSPC; | ||
| 385 | conn_list[conns] = val; | ||
| 386 | } | ||
| 387 | conns++; | ||
| 388 | } | ||
| 389 | prev_nid = val; | ||
| 390 | } | ||
| 391 | return conns; | ||
| 392 | } | ||
| 393 | EXPORT_SYMBOL_GPL(snd_hdac_get_connections); | ||
| 394 | |||
| 395 | #ifdef CONFIG_PM | ||
| 396 | /** | ||
| 397 | * snd_hdac_power_up - increment the runtime pm counter | ||
| 398 | * @codec: the codec object | ||
| 399 | */ | ||
| 400 | void snd_hdac_power_up(struct hdac_device *codec) | ||
| 401 | { | ||
| 402 | struct device *dev = &codec->dev; | ||
| 403 | |||
| 404 | if (atomic_read(&codec->in_pm)) | ||
| 405 | return; | ||
| 406 | pm_runtime_get_sync(dev); | ||
| 407 | } | ||
| 408 | EXPORT_SYMBOL_GPL(snd_hdac_power_up); | ||
| 409 | |||
| 410 | /** | ||
| 411 | * snd_hdac_power_up - decrement the runtime pm counter | ||
| 412 | * @codec: the codec object | ||
| 413 | */ | ||
| 414 | void snd_hdac_power_down(struct hdac_device *codec) | ||
| 415 | { | ||
| 416 | struct device *dev = &codec->dev; | ||
| 417 | |||
| 418 | if (atomic_read(&codec->in_pm)) | ||
| 419 | return; | ||
| 420 | pm_runtime_mark_last_busy(dev); | ||
| 421 | pm_runtime_put_autosuspend(dev); | ||
| 422 | } | ||
| 423 | EXPORT_SYMBOL_GPL(snd_hdac_power_down); | ||
| 424 | #endif | ||
| 425 | |||
| 426 | /* codec vendor labels */ | ||
| 427 | struct hda_vendor_id { | ||
| 428 | unsigned int id; | ||
| 429 | const char *name; | ||
| 430 | }; | ||
| 431 | |||
| 432 | static struct hda_vendor_id hda_vendor_ids[] = { | ||
| 433 | { 0x1002, "ATI" }, | ||
| 434 | { 0x1013, "Cirrus Logic" }, | ||
| 435 | { 0x1057, "Motorola" }, | ||
| 436 | { 0x1095, "Silicon Image" }, | ||
| 437 | { 0x10de, "Nvidia" }, | ||
| 438 | { 0x10ec, "Realtek" }, | ||
| 439 | { 0x1102, "Creative" }, | ||
| 440 | { 0x1106, "VIA" }, | ||
| 441 | { 0x111d, "IDT" }, | ||
| 442 | { 0x11c1, "LSI" }, | ||
| 443 | { 0x11d4, "Analog Devices" }, | ||
| 444 | { 0x13f6, "C-Media" }, | ||
| 445 | { 0x14f1, "Conexant" }, | ||
| 446 | { 0x17e8, "Chrontel" }, | ||
| 447 | { 0x1854, "LG" }, | ||
| 448 | { 0x1aec, "Wolfson Microelectronics" }, | ||
| 449 | { 0x1af4, "QEMU" }, | ||
| 450 | { 0x434d, "C-Media" }, | ||
| 451 | { 0x8086, "Intel" }, | ||
| 452 | { 0x8384, "SigmaTel" }, | ||
| 453 | {} /* terminator */ | ||
| 454 | }; | ||
| 455 | |||
| 456 | /* store the codec vendor name */ | ||
| 457 | static int get_codec_vendor_name(struct hdac_device *codec) | ||
| 458 | { | ||
| 459 | const struct hda_vendor_id *c; | ||
| 460 | u16 vendor_id = codec->vendor_id >> 16; | ||
| 461 | |||
| 462 | for (c = hda_vendor_ids; c->id; c++) { | ||
| 463 | if (c->id == vendor_id) { | ||
| 464 | codec->vendor_name = kstrdup(c->name, GFP_KERNEL); | ||
| 465 | return codec->vendor_name ? 0 : -ENOMEM; | ||
| 466 | } | ||
| 467 | } | ||
| 468 | |||
| 469 | codec->vendor_name = kasprintf(GFP_KERNEL, "Generic %04x", vendor_id); | ||
| 470 | return codec->vendor_name ? 0 : -ENOMEM; | ||
| 471 | } | ||
diff --git a/sound/hda/local.h b/sound/hda/local.h new file mode 100644 index 000000000000..a077d1f656f6 --- /dev/null +++ b/sound/hda/local.h | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | /* | ||
| 2 | * Local helper macros and functions for HD-audio core drivers | ||
| 3 | */ | ||
| 4 | |||
| 5 | #ifndef __HDAC_LOCAL_H | ||
| 6 | #define __HDAC_LOCAL_H | ||
| 7 | |||
| 8 | #define get_wcaps(codec, nid) \ | ||
| 9 | snd_hdac_read_parm(codec, nid, AC_PAR_AUDIO_WIDGET_CAP) | ||
| 10 | |||
| 11 | /* get the widget type from widget capability bits */ | ||
| 12 | static inline int get_wcaps_type(unsigned int wcaps) | ||
| 13 | { | ||
| 14 | if (!wcaps) | ||
| 15 | return -1; /* invalid type */ | ||
| 16 | return (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; | ||
| 17 | } | ||
| 18 | |||
| 19 | #endif /* __HDAC_LOCAL_H */ | ||
diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c index 3f8706bb3d16..03b7399bb7f0 100644 --- a/sound/pci/hda/hda_auto_parser.c +++ b/sound/pci/hda/hda_auto_parser.c | |||
| @@ -172,7 +172,7 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec, | |||
| 172 | const hda_nid_t *ignore_nids, | 172 | const hda_nid_t *ignore_nids, |
| 173 | unsigned int cond_flags) | 173 | unsigned int cond_flags) |
| 174 | { | 174 | { |
| 175 | hda_nid_t nid, end_nid; | 175 | hda_nid_t nid; |
| 176 | short seq, assoc_line_out; | 176 | short seq, assoc_line_out; |
| 177 | struct auto_out_pin line_out[ARRAY_SIZE(cfg->line_out_pins)]; | 177 | struct auto_out_pin line_out[ARRAY_SIZE(cfg->line_out_pins)]; |
| 178 | struct auto_out_pin speaker_out[ARRAY_SIZE(cfg->speaker_pins)]; | 178 | struct auto_out_pin speaker_out[ARRAY_SIZE(cfg->speaker_pins)]; |
| @@ -189,8 +189,7 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec, | |||
| 189 | memset(hp_out, 0, sizeof(hp_out)); | 189 | memset(hp_out, 0, sizeof(hp_out)); |
| 190 | assoc_line_out = 0; | 190 | assoc_line_out = 0; |
| 191 | 191 | ||
| 192 | end_nid = codec->start_nid + codec->num_nodes; | 192 | for_each_hda_codec_node(nid, codec) { |
| 193 | for (nid = codec->start_nid; nid < end_nid; nid++) { | ||
| 194 | unsigned int wid_caps = get_wcaps(codec, nid); | 193 | unsigned int wid_caps = get_wcaps(codec, nid); |
| 195 | unsigned int wid_type = get_wcaps_type(wid_caps); | 194 | unsigned int wid_type = get_wcaps_type(wid_caps); |
| 196 | unsigned int def_conf; | 195 | unsigned int def_conf; |
| @@ -410,7 +409,7 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec, | |||
| 410 | * debug prints of the parsed results | 409 | * debug prints of the parsed results |
| 411 | */ | 410 | */ |
| 412 | codec_info(codec, "autoconfig for %s: line_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x) type:%s\n", | 411 | codec_info(codec, "autoconfig for %s: line_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x) type:%s\n", |
| 413 | codec->chip_name, cfg->line_outs, cfg->line_out_pins[0], | 412 | codec->core.chip_name, cfg->line_outs, cfg->line_out_pins[0], |
| 414 | cfg->line_out_pins[1], cfg->line_out_pins[2], | 413 | cfg->line_out_pins[1], cfg->line_out_pins[2], |
| 415 | cfg->line_out_pins[3], cfg->line_out_pins[4], | 414 | cfg->line_out_pins[3], cfg->line_out_pins[4], |
| 416 | cfg->line_out_type == AUTO_PIN_HP_OUT ? "hp" : | 415 | cfg->line_out_type == AUTO_PIN_HP_OUT ? "hp" : |
| @@ -836,33 +835,33 @@ static void apply_fixup(struct hda_codec *codec, int id, int action, int depth) | |||
| 836 | if (action != HDA_FIXUP_ACT_PRE_PROBE || !fix->v.pins) | 835 | if (action != HDA_FIXUP_ACT_PRE_PROBE || !fix->v.pins) |
| 837 | break; | 836 | break; |
| 838 | codec_dbg(codec, "%s: Apply pincfg for %s\n", | 837 | codec_dbg(codec, "%s: Apply pincfg for %s\n", |
| 839 | codec->chip_name, modelname); | 838 | codec->core.chip_name, modelname); |
| 840 | snd_hda_apply_pincfgs(codec, fix->v.pins); | 839 | snd_hda_apply_pincfgs(codec, fix->v.pins); |
| 841 | break; | 840 | break; |
| 842 | case HDA_FIXUP_VERBS: | 841 | case HDA_FIXUP_VERBS: |
| 843 | if (action != HDA_FIXUP_ACT_PROBE || !fix->v.verbs) | 842 | if (action != HDA_FIXUP_ACT_PROBE || !fix->v.verbs) |
| 844 | break; | 843 | break; |
| 845 | codec_dbg(codec, "%s: Apply fix-verbs for %s\n", | 844 | codec_dbg(codec, "%s: Apply fix-verbs for %s\n", |
| 846 | codec->chip_name, modelname); | 845 | codec->core.chip_name, modelname); |
| 847 | snd_hda_add_verbs(codec, fix->v.verbs); | 846 | snd_hda_add_verbs(codec, fix->v.verbs); |
| 848 | break; | 847 | break; |
| 849 | case HDA_FIXUP_FUNC: | 848 | case HDA_FIXUP_FUNC: |
| 850 | if (!fix->v.func) | 849 | if (!fix->v.func) |
| 851 | break; | 850 | break; |
| 852 | codec_dbg(codec, "%s: Apply fix-func for %s\n", | 851 | codec_dbg(codec, "%s: Apply fix-func for %s\n", |
| 853 | codec->chip_name, modelname); | 852 | codec->core.chip_name, modelname); |
| 854 | fix->v.func(codec, fix, action); | 853 | fix->v.func(codec, fix, action); |
| 855 | break; | 854 | break; |
| 856 | case HDA_FIXUP_PINCTLS: | 855 | case HDA_FIXUP_PINCTLS: |
| 857 | if (action != HDA_FIXUP_ACT_PROBE || !fix->v.pins) | 856 | if (action != HDA_FIXUP_ACT_PROBE || !fix->v.pins) |
| 858 | break; | 857 | break; |
| 859 | codec_dbg(codec, "%s: Apply pinctl for %s\n", | 858 | codec_dbg(codec, "%s: Apply pinctl for %s\n", |
| 860 | codec->chip_name, modelname); | 859 | codec->core.chip_name, modelname); |
| 861 | set_pin_targets(codec, fix->v.pins); | 860 | set_pin_targets(codec, fix->v.pins); |
| 862 | break; | 861 | break; |
| 863 | default: | 862 | default: |
| 864 | codec_err(codec, "%s: Invalid fixup type %d\n", | 863 | codec_err(codec, "%s: Invalid fixup type %d\n", |
| 865 | codec->chip_name, fix->type); | 864 | codec->core.chip_name, fix->type); |
| 866 | break; | 865 | break; |
| 867 | } | 866 | } |
| 868 | if (!fix->chained || fix->chained_before) | 867 | if (!fix->chained || fix->chained_before) |
| @@ -912,16 +911,16 @@ void snd_hda_pick_pin_fixup(struct hda_codec *codec, | |||
| 912 | return; | 911 | return; |
| 913 | 912 | ||
| 914 | for (pq = pin_quirk; pq->subvendor; pq++) { | 913 | for (pq = pin_quirk; pq->subvendor; pq++) { |
| 915 | if ((codec->subsystem_id & 0xffff0000) != (pq->subvendor << 16)) | 914 | if ((codec->core.subsystem_id & 0xffff0000) != (pq->subvendor << 16)) |
| 916 | continue; | 915 | continue; |
| 917 | if (codec->vendor_id != pq->codec) | 916 | if (codec->core.vendor_id != pq->codec) |
| 918 | continue; | 917 | continue; |
| 919 | if (pin_config_match(codec, pq->pins)) { | 918 | if (pin_config_match(codec, pq->pins)) { |
| 920 | codec->fixup_id = pq->value; | 919 | codec->fixup_id = pq->value; |
| 921 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 920 | #ifdef CONFIG_SND_DEBUG_VERBOSE |
| 922 | codec->fixup_name = pq->name; | 921 | codec->fixup_name = pq->name; |
| 923 | codec_dbg(codec, "%s: picked fixup %s (pin match)\n", | 922 | codec_dbg(codec, "%s: picked fixup %s (pin match)\n", |
| 924 | codec->chip_name, codec->fixup_name); | 923 | codec->core.chip_name, codec->fixup_name); |
| 925 | #endif | 924 | #endif |
| 926 | codec->fixup_list = fixlist; | 925 | codec->fixup_list = fixlist; |
| 927 | return; | 926 | return; |
| @@ -963,7 +962,7 @@ void snd_hda_pick_fixup(struct hda_codec *codec, | |||
| 963 | codec->fixup_name = NULL; | 962 | codec->fixup_name = NULL; |
| 964 | codec->fixup_id = HDA_FIXUP_ID_NO_FIXUP; | 963 | codec->fixup_id = HDA_FIXUP_ID_NO_FIXUP; |
| 965 | codec_dbg(codec, "%s: picked no fixup (nofixup specified)\n", | 964 | codec_dbg(codec, "%s: picked no fixup (nofixup specified)\n", |
| 966 | codec->chip_name); | 965 | codec->core.chip_name); |
| 967 | return; | 966 | return; |
| 968 | } | 967 | } |
| 969 | 968 | ||
| @@ -974,7 +973,7 @@ void snd_hda_pick_fixup(struct hda_codec *codec, | |||
| 974 | codec->fixup_name = models->name; | 973 | codec->fixup_name = models->name; |
| 975 | codec->fixup_list = fixlist; | 974 | codec->fixup_list = fixlist; |
| 976 | codec_dbg(codec, "%s: picked fixup %s (model specified)\n", | 975 | codec_dbg(codec, "%s: picked fixup %s (model specified)\n", |
| 977 | codec->chip_name, codec->fixup_name); | 976 | codec->core.chip_name, codec->fixup_name); |
| 978 | return; | 977 | return; |
| 979 | } | 978 | } |
| 980 | models++; | 979 | models++; |
| @@ -987,7 +986,7 @@ void snd_hda_pick_fixup(struct hda_codec *codec, | |||
| 987 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 986 | #ifdef CONFIG_SND_DEBUG_VERBOSE |
| 988 | name = q->name; | 987 | name = q->name; |
| 989 | codec_dbg(codec, "%s: picked fixup %s (PCI SSID%s)\n", | 988 | codec_dbg(codec, "%s: picked fixup %s (PCI SSID%s)\n", |
| 990 | codec->chip_name, name, q->subdevice_mask ? "" : " - vendor generic"); | 989 | codec->core.chip_name, name, q->subdevice_mask ? "" : " - vendor generic"); |
| 991 | #endif | 990 | #endif |
| 992 | } | 991 | } |
| 993 | } | 992 | } |
| @@ -996,12 +995,12 @@ void snd_hda_pick_fixup(struct hda_codec *codec, | |||
| 996 | unsigned int vendorid = | 995 | unsigned int vendorid = |
| 997 | q->subdevice | (q->subvendor << 16); | 996 | q->subdevice | (q->subvendor << 16); |
| 998 | unsigned int mask = 0xffff0000 | q->subdevice_mask; | 997 | unsigned int mask = 0xffff0000 | q->subdevice_mask; |
| 999 | if ((codec->subsystem_id & mask) == (vendorid & mask)) { | 998 | if ((codec->core.subsystem_id & mask) == (vendorid & mask)) { |
| 1000 | id = q->value; | 999 | id = q->value; |
| 1001 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1000 | #ifdef CONFIG_SND_DEBUG_VERBOSE |
| 1002 | name = q->name; | 1001 | name = q->name; |
| 1003 | codec_dbg(codec, "%s: picked fixup %s (codec SSID)\n", | 1002 | codec_dbg(codec, "%s: picked fixup %s (codec SSID)\n", |
| 1004 | codec->chip_name, name); | 1003 | codec->core.chip_name, name); |
| 1005 | #endif | 1004 | #endif |
| 1006 | break; | 1005 | break; |
| 1007 | } | 1006 | } |
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c index 4cdac3a71cae..3364dc0fdeab 100644 --- a/sound/pci/hda/hda_beep.c +++ b/sound/pci/hda/hda_beep.c | |||
| @@ -165,8 +165,8 @@ static int snd_hda_do_attach(struct hda_beep *beep) | |||
| 165 | input_dev->id.bustype = BUS_PCI; | 165 | input_dev->id.bustype = BUS_PCI; |
| 166 | input_dev->dev.parent = &codec->card->card_dev; | 166 | input_dev->dev.parent = &codec->card->card_dev; |
| 167 | 167 | ||
| 168 | input_dev->id.vendor = codec->vendor_id >> 16; | 168 | input_dev->id.vendor = codec->core.vendor_id >> 16; |
| 169 | input_dev->id.product = codec->vendor_id & 0xffff; | 169 | input_dev->id.product = codec->core.vendor_id & 0xffff; |
| 170 | input_dev->id.version = 0x01; | 170 | input_dev->id.version = 0x01; |
| 171 | 171 | ||
| 172 | input_dev->evbit[0] = BIT_MASK(EV_SND); | 172 | input_dev->evbit[0] = BIT_MASK(EV_SND); |
diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c index 0b9ea70c546b..ad276a9771db 100644 --- a/sound/pci/hda/hda_bind.c +++ b/sound/pci/hda/hda_bind.c | |||
| @@ -14,36 +14,6 @@ | |||
| 14 | #include "hda_codec.h" | 14 | #include "hda_codec.h" |
| 15 | #include "hda_local.h" | 15 | #include "hda_local.h" |
| 16 | 16 | ||
| 17 | /* codec vendor labels */ | ||
| 18 | struct hda_vendor_id { | ||
| 19 | unsigned int id; | ||
| 20 | const char *name; | ||
| 21 | }; | ||
| 22 | |||
| 23 | static struct hda_vendor_id hda_vendor_ids[] = { | ||
| 24 | { 0x1002, "ATI" }, | ||
| 25 | { 0x1013, "Cirrus Logic" }, | ||
| 26 | { 0x1057, "Motorola" }, | ||
| 27 | { 0x1095, "Silicon Image" }, | ||
| 28 | { 0x10de, "Nvidia" }, | ||
| 29 | { 0x10ec, "Realtek" }, | ||
| 30 | { 0x1102, "Creative" }, | ||
| 31 | { 0x1106, "VIA" }, | ||
| 32 | { 0x111d, "IDT" }, | ||
| 33 | { 0x11c1, "LSI" }, | ||
| 34 | { 0x11d4, "Analog Devices" }, | ||
| 35 | { 0x13f6, "C-Media" }, | ||
| 36 | { 0x14f1, "Conexant" }, | ||
| 37 | { 0x17e8, "Chrontel" }, | ||
| 38 | { 0x1854, "LG" }, | ||
| 39 | { 0x1aec, "Wolfson Microelectronics" }, | ||
| 40 | { 0x1af4, "QEMU" }, | ||
| 41 | { 0x434d, "C-Media" }, | ||
| 42 | { 0x8086, "Intel" }, | ||
| 43 | { 0x8384, "SigmaTel" }, | ||
| 44 | {} /* terminator */ | ||
| 45 | }; | ||
| 46 | |||
| 47 | /* | 17 | /* |
| 48 | * find a matching codec preset | 18 | * find a matching codec preset |
| 49 | */ | 19 | */ |
| @@ -54,19 +24,19 @@ static int hda_codec_match(struct hdac_device *dev, struct hdac_driver *drv) | |||
| 54 | container_of(drv, struct hda_codec_driver, core); | 24 | container_of(drv, struct hda_codec_driver, core); |
| 55 | const struct hda_codec_preset *preset; | 25 | const struct hda_codec_preset *preset; |
| 56 | /* check probe_id instead of vendor_id if set */ | 26 | /* check probe_id instead of vendor_id if set */ |
| 57 | u32 id = codec->probe_id ? codec->probe_id : codec->vendor_id; | 27 | u32 id = codec->probe_id ? codec->probe_id : codec->core.vendor_id; |
| 58 | 28 | ||
| 59 | for (preset = driver->preset; preset->id; preset++) { | 29 | for (preset = driver->preset; preset->id; preset++) { |
| 60 | u32 mask = preset->mask; | 30 | u32 mask = preset->mask; |
| 61 | 31 | ||
| 62 | if (preset->afg && preset->afg != codec->afg) | 32 | if (preset->afg && preset->afg != codec->core.afg) |
| 63 | continue; | 33 | continue; |
| 64 | if (preset->mfg && preset->mfg != codec->mfg) | 34 | if (preset->mfg && preset->mfg != codec->core.mfg) |
| 65 | continue; | 35 | continue; |
| 66 | if (!mask) | 36 | if (!mask) |
| 67 | mask = ~0; | 37 | mask = ~0; |
| 68 | if (preset->id == (id & mask) && | 38 | if (preset->id == (id & mask) && |
| 69 | (!preset->rev || preset->rev == codec->revision_id)) { | 39 | (!preset->rev || preset->rev == codec->core.revision_id)) { |
| 70 | codec->preset = preset; | 40 | codec->preset = preset; |
| 71 | return 1; | 41 | return 1; |
| 72 | } | 42 | } |
| @@ -86,15 +56,11 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev) | |||
| 86 | /* reset the codec name from the preset */ | 56 | /* reset the codec name from the preset */ |
| 87 | static int codec_refresh_name(struct hda_codec *codec, const char *name) | 57 | static int codec_refresh_name(struct hda_codec *codec, const char *name) |
| 88 | { | 58 | { |
| 89 | char tmp[16]; | 59 | if (name) { |
| 90 | 60 | kfree(codec->core.chip_name); | |
| 91 | kfree(codec->chip_name); | 61 | codec->core.chip_name = kstrdup(name, GFP_KERNEL); |
| 92 | if (!name) { | ||
| 93 | sprintf(tmp, "ID %x", codec->vendor_id & 0xffff); | ||
| 94 | name = tmp; | ||
| 95 | } | 62 | } |
| 96 | codec->chip_name = kstrdup(name, GFP_KERNEL); | 63 | return codec->core.chip_name ? 0 : -ENOMEM; |
| 97 | return codec->chip_name ? 0 : -ENOMEM; | ||
| 98 | } | 64 | } |
| 99 | 65 | ||
| 100 | static int hda_codec_driver_probe(struct device *dev) | 66 | static int hda_codec_driver_probe(struct device *dev) |
| @@ -192,48 +158,23 @@ static inline bool codec_probed(struct hda_codec *codec) | |||
| 192 | static void codec_bind_module(struct hda_codec *codec) | 158 | static void codec_bind_module(struct hda_codec *codec) |
| 193 | { | 159 | { |
| 194 | #ifdef MODULE | 160 | #ifdef MODULE |
| 195 | request_module("snd-hda-codec-id:%08x", codec->vendor_id); | 161 | request_module("snd-hda-codec-id:%08x", codec->core.vendor_id); |
| 196 | if (codec_probed(codec)) | 162 | if (codec_probed(codec)) |
| 197 | return; | 163 | return; |
| 198 | request_module("snd-hda-codec-id:%04x*", | 164 | request_module("snd-hda-codec-id:%04x*", |
| 199 | (codec->vendor_id >> 16) & 0xffff); | 165 | (codec->core.vendor_id >> 16) & 0xffff); |
| 200 | if (codec_probed(codec)) | 166 | if (codec_probed(codec)) |
| 201 | return; | 167 | return; |
| 202 | #endif | 168 | #endif |
| 203 | } | 169 | } |
| 204 | 170 | ||
| 205 | /* store the codec vendor name */ | ||
| 206 | static int get_codec_vendor_name(struct hda_codec *codec) | ||
| 207 | { | ||
| 208 | const struct hda_vendor_id *c; | ||
| 209 | const char *vendor = NULL; | ||
| 210 | u16 vendor_id = codec->vendor_id >> 16; | ||
| 211 | char tmp[16]; | ||
| 212 | |||
| 213 | for (c = hda_vendor_ids; c->id; c++) { | ||
| 214 | if (c->id == vendor_id) { | ||
| 215 | vendor = c->name; | ||
| 216 | break; | ||
| 217 | } | ||
| 218 | } | ||
| 219 | if (!vendor) { | ||
| 220 | sprintf(tmp, "Generic %04x", vendor_id); | ||
| 221 | vendor = tmp; | ||
| 222 | } | ||
| 223 | codec->vendor_name = kstrdup(vendor, GFP_KERNEL); | ||
| 224 | if (!codec->vendor_name) | ||
| 225 | return -ENOMEM; | ||
| 226 | return 0; | ||
| 227 | } | ||
| 228 | |||
| 229 | #if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) | 171 | #if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) |
| 230 | /* if all audio out widgets are digital, let's assume the codec as a HDMI/DP */ | 172 | /* if all audio out widgets are digital, let's assume the codec as a HDMI/DP */ |
| 231 | static bool is_likely_hdmi_codec(struct hda_codec *codec) | 173 | static bool is_likely_hdmi_codec(struct hda_codec *codec) |
| 232 | { | 174 | { |
| 233 | hda_nid_t nid = codec->start_nid; | 175 | hda_nid_t nid; |
| 234 | int i; | ||
| 235 | 176 | ||
| 236 | for (i = 0; i < codec->num_nodes; i++, nid++) { | 177 | for_each_hda_codec_node(nid, codec) { |
| 237 | unsigned int wcaps = get_wcaps(codec, nid); | 178 | unsigned int wcaps = get_wcaps(codec, nid); |
| 238 | switch (get_wcaps_type(wcaps)) { | 179 | switch (get_wcaps_type(wcaps)) { |
| 239 | case AC_WID_AUD_IN: | 180 | case AC_WID_AUD_IN: |
| @@ -294,12 +235,6 @@ int snd_hda_codec_configure(struct hda_codec *codec) | |||
| 294 | { | 235 | { |
| 295 | int err; | 236 | int err; |
| 296 | 237 | ||
| 297 | if (!codec->vendor_name) { | ||
| 298 | err = get_codec_vendor_name(codec); | ||
| 299 | if (err < 0) | ||
| 300 | return err; | ||
| 301 | } | ||
| 302 | |||
| 303 | if (is_generic_config(codec)) | 238 | if (is_generic_config(codec)) |
| 304 | codec->probe_id = HDA_CODEC_ID_GENERIC; | 239 | codec->probe_id = HDA_CODEC_ID_GENERIC; |
| 305 | else | 240 | else |
| @@ -320,10 +255,10 @@ int snd_hda_codec_configure(struct hda_codec *codec) | |||
| 320 | } | 255 | } |
| 321 | 256 | ||
| 322 | /* audio codec should override the mixer name */ | 257 | /* audio codec should override the mixer name */ |
| 323 | if (codec->afg || !*codec->card->mixername) | 258 | if (codec->core.afg || !*codec->card->mixername) |
| 324 | snprintf(codec->card->mixername, | 259 | snprintf(codec->card->mixername, |
| 325 | sizeof(codec->card->mixername), | 260 | sizeof(codec->card->mixername), "%s %s", |
| 326 | "%s %s", codec->vendor_name, codec->chip_name); | 261 | codec->core.vendor_name, codec->core.chip_name); |
| 327 | return 0; | 262 | return 0; |
| 328 | 263 | ||
| 329 | error: | 264 | error: |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index f96bff37c787..ddfc0fbbee23 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include <sound/hda_hwdep.h> | 40 | #include <sound/hda_hwdep.h> |
| 41 | 41 | ||
| 42 | #ifdef CONFIG_PM | 42 | #ifdef CONFIG_PM |
| 43 | #define codec_in_pm(codec) atomic_read(&(codec)->in_pm) | 43 | #define codec_in_pm(codec) atomic_read(&(codec)->core.in_pm) |
| 44 | #define hda_codec_is_power_on(codec) \ | 44 | #define hda_codec_is_power_on(codec) \ |
| 45 | (!pm_runtime_suspended(hda_codec_dev(codec))) | 45 | (!pm_runtime_suspended(hda_codec_dev(codec))) |
| 46 | #else | 46 | #else |
| @@ -48,6 +48,11 @@ | |||
| 48 | #define hda_codec_is_power_on(codec) 1 | 48 | #define hda_codec_is_power_on(codec) 1 |
| 49 | #endif | 49 | #endif |
| 50 | 50 | ||
| 51 | #define codec_has_epss(codec) \ | ||
| 52 | ((codec)->core.power_caps & AC_PWRST_EPSS) | ||
| 53 | #define codec_has_clkstop(codec) \ | ||
| 54 | ((codec)->core.power_caps & AC_PWRST_CLKSTOP) | ||
| 55 | |||
| 51 | /** | 56 | /** |
| 52 | * snd_hda_get_jack_location - Give a location string of the jack | 57 | * snd_hda_get_jack_location - Give a location string of the jack |
| 53 | * @cfg: pin default config value | 58 | * @cfg: pin default config value |
| @@ -119,30 +124,6 @@ const char *snd_hda_get_jack_type(u32 cfg) | |||
| 119 | EXPORT_SYMBOL_GPL(snd_hda_get_jack_type); | 124 | EXPORT_SYMBOL_GPL(snd_hda_get_jack_type); |
| 120 | 125 | ||
| 121 | /* | 126 | /* |
| 122 | * Compose a 32bit command word to be sent to the HD-audio controller | ||
| 123 | */ | ||
| 124 | static inline unsigned int | ||
| 125 | make_codec_cmd(struct hda_codec *codec, hda_nid_t nid, int flags, | ||
| 126 | unsigned int verb, unsigned int parm) | ||
| 127 | { | ||
| 128 | unsigned int addr = codec->core.addr; | ||
| 129 | u32 val; | ||
| 130 | |||
| 131 | if ((addr & ~0xf) || (nid & ~0x7f) || | ||
| 132 | (verb & ~0xfff) || (parm & ~0xffff)) { | ||
| 133 | codec_err(codec, "hda-codec: out of range cmd %x:%x:%x:%x\n", | ||
| 134 | addr, nid, verb, parm); | ||
| 135 | return ~0; | ||
| 136 | } | ||
| 137 | |||
| 138 | val = (u32)addr << 28; | ||
| 139 | val |= (u32)nid << 20; | ||
| 140 | val |= verb << 8; | ||
| 141 | val |= parm; | ||
| 142 | return val; | ||
| 143 | } | ||
| 144 | |||
| 145 | /* | ||
| 146 | * Send and receive a verb | 127 | * Send and receive a verb |
| 147 | */ | 128 | */ |
| 148 | static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd, | 129 | static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd, |
| @@ -194,7 +175,7 @@ unsigned int snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid, | |||
| 194 | int flags, | 175 | int flags, |
| 195 | unsigned int verb, unsigned int parm) | 176 | unsigned int verb, unsigned int parm) |
| 196 | { | 177 | { |
| 197 | unsigned cmd = make_codec_cmd(codec, nid, flags, verb, parm); | 178 | unsigned int cmd = snd_hdac_make_cmd(&codec->core, nid, verb, parm); |
| 198 | unsigned int res; | 179 | unsigned int res; |
| 199 | if (codec_exec_verb(codec, cmd, flags, &res)) | 180 | if (codec_exec_verb(codec, cmd, flags, &res)) |
| 200 | return -1; | 181 | return -1; |
| @@ -217,7 +198,7 @@ EXPORT_SYMBOL_GPL(snd_hda_codec_read); | |||
| 217 | int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int flags, | 198 | int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int flags, |
| 218 | unsigned int verb, unsigned int parm) | 199 | unsigned int verb, unsigned int parm) |
| 219 | { | 200 | { |
| 220 | unsigned int cmd = make_codec_cmd(codec, nid, flags, verb, parm); | 201 | unsigned int cmd = snd_hdac_make_cmd(&codec->core, nid, verb, parm); |
| 221 | return codec_exec_verb(codec, cmd, flags, NULL); | 202 | return codec_exec_verb(codec, cmd, flags, NULL); |
| 222 | } | 203 | } |
| 223 | EXPORT_SYMBOL_GPL(snd_hda_codec_write); | 204 | EXPORT_SYMBOL_GPL(snd_hda_codec_write); |
| @@ -237,30 +218,6 @@ void snd_hda_sequence_write(struct hda_codec *codec, const struct hda_verb *seq) | |||
| 237 | } | 218 | } |
| 238 | EXPORT_SYMBOL_GPL(snd_hda_sequence_write); | 219 | EXPORT_SYMBOL_GPL(snd_hda_sequence_write); |
| 239 | 220 | ||
| 240 | /** | ||
| 241 | * snd_hda_get_sub_nodes - get the range of sub nodes | ||
| 242 | * @codec: the HDA codec | ||
| 243 | * @nid: NID to parse | ||
| 244 | * @start_id: the pointer to store the start NID | ||
| 245 | * | ||
| 246 | * Parse the NID and store the start NID of its sub-nodes. | ||
| 247 | * Returns the number of sub-nodes. | ||
| 248 | */ | ||
| 249 | int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid, | ||
| 250 | hda_nid_t *start_id) | ||
| 251 | { | ||
| 252 | unsigned int parm; | ||
| 253 | |||
| 254 | parm = snd_hda_param_read(codec, nid, AC_PAR_NODE_COUNT); | ||
| 255 | if (parm == -1) { | ||
| 256 | *start_id = 0; | ||
| 257 | return 0; | ||
| 258 | } | ||
| 259 | *start_id = (parm >> 16) & 0x7fff; | ||
| 260 | return (int)(parm & 0x7fff); | ||
| 261 | } | ||
| 262 | EXPORT_SYMBOL_GPL(snd_hda_get_sub_nodes); | ||
| 263 | |||
| 264 | /* connection list element */ | 221 | /* connection list element */ |
| 265 | struct hda_conn_list { | 222 | struct hda_conn_list { |
| 266 | struct list_head list; | 223 | struct list_head list; |
| @@ -401,128 +358,6 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, | |||
| 401 | } | 358 | } |
| 402 | EXPORT_SYMBOL_GPL(snd_hda_get_connections); | 359 | EXPORT_SYMBOL_GPL(snd_hda_get_connections); |
| 403 | 360 | ||
| 404 | /* return CONNLIST_LEN parameter of the given widget */ | ||
| 405 | static unsigned int get_num_conns(struct hda_codec *codec, hda_nid_t nid) | ||
| 406 | { | ||
| 407 | unsigned int wcaps = get_wcaps(codec, nid); | ||
| 408 | unsigned int parm; | ||
| 409 | |||
| 410 | if (!(wcaps & AC_WCAP_CONN_LIST) && | ||
| 411 | get_wcaps_type(wcaps) != AC_WID_VOL_KNB) | ||
| 412 | return 0; | ||
| 413 | |||
| 414 | parm = snd_hda_param_read(codec, nid, AC_PAR_CONNLIST_LEN); | ||
| 415 | if (parm == -1) | ||
| 416 | parm = 0; | ||
| 417 | return parm; | ||
| 418 | } | ||
| 419 | |||
| 420 | int snd_hda_get_num_raw_conns(struct hda_codec *codec, hda_nid_t nid) | ||
| 421 | { | ||
| 422 | return snd_hda_get_raw_connections(codec, nid, NULL, 0); | ||
| 423 | } | ||
| 424 | |||
| 425 | /** | ||
| 426 | * snd_hda_get_raw_connections - copy connection list without cache | ||
| 427 | * @codec: the HDA codec | ||
| 428 | * @nid: NID to parse | ||
| 429 | * @conn_list: connection list array | ||
| 430 | * @max_conns: max. number of connections to store | ||
| 431 | * | ||
| 432 | * Like snd_hda_get_connections(), copy the connection list but without | ||
| 433 | * checking through the connection-list cache. | ||
| 434 | * Currently called only from hda_proc.c, so not exported. | ||
| 435 | */ | ||
| 436 | int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, | ||
| 437 | hda_nid_t *conn_list, int max_conns) | ||
| 438 | { | ||
| 439 | unsigned int parm; | ||
| 440 | int i, conn_len, conns; | ||
| 441 | unsigned int shift, num_elems, mask; | ||
| 442 | hda_nid_t prev_nid; | ||
| 443 | int null_count = 0; | ||
| 444 | |||
| 445 | parm = get_num_conns(codec, nid); | ||
| 446 | if (!parm) | ||
| 447 | return 0; | ||
| 448 | |||
| 449 | if (parm & AC_CLIST_LONG) { | ||
| 450 | /* long form */ | ||
| 451 | shift = 16; | ||
| 452 | num_elems = 2; | ||
| 453 | } else { | ||
| 454 | /* short form */ | ||
| 455 | shift = 8; | ||
| 456 | num_elems = 4; | ||
| 457 | } | ||
| 458 | conn_len = parm & AC_CLIST_LENGTH; | ||
| 459 | mask = (1 << (shift-1)) - 1; | ||
| 460 | |||
| 461 | if (!conn_len) | ||
| 462 | return 0; /* no connection */ | ||
| 463 | |||
| 464 | if (conn_len == 1) { | ||
| 465 | /* single connection */ | ||
| 466 | parm = snd_hda_codec_read(codec, nid, 0, | ||
| 467 | AC_VERB_GET_CONNECT_LIST, 0); | ||
| 468 | if (parm == -1 && codec->bus->rirb_error) | ||
| 469 | return -EIO; | ||
| 470 | if (conn_list) | ||
| 471 | conn_list[0] = parm & mask; | ||
| 472 | return 1; | ||
| 473 | } | ||
| 474 | |||
| 475 | /* multi connection */ | ||
| 476 | conns = 0; | ||
| 477 | prev_nid = 0; | ||
| 478 | for (i = 0; i < conn_len; i++) { | ||
| 479 | int range_val; | ||
| 480 | hda_nid_t val, n; | ||
| 481 | |||
| 482 | if (i % num_elems == 0) { | ||
| 483 | parm = snd_hda_codec_read(codec, nid, 0, | ||
| 484 | AC_VERB_GET_CONNECT_LIST, i); | ||
| 485 | if (parm == -1 && codec->bus->rirb_error) | ||
| 486 | return -EIO; | ||
| 487 | } | ||
| 488 | range_val = !!(parm & (1 << (shift-1))); /* ranges */ | ||
| 489 | val = parm & mask; | ||
| 490 | if (val == 0 && null_count++) { /* no second chance */ | ||
| 491 | codec_dbg(codec, | ||
| 492 | "invalid CONNECT_LIST verb %x[%i]:%x\n", | ||
| 493 | nid, i, parm); | ||
| 494 | return 0; | ||
| 495 | } | ||
| 496 | parm >>= shift; | ||
| 497 | if (range_val) { | ||
| 498 | /* ranges between the previous and this one */ | ||
| 499 | if (!prev_nid || prev_nid >= val) { | ||
| 500 | codec_warn(codec, | ||
| 501 | "invalid dep_range_val %x:%x\n", | ||
| 502 | prev_nid, val); | ||
| 503 | continue; | ||
| 504 | } | ||
| 505 | for (n = prev_nid + 1; n <= val; n++) { | ||
| 506 | if (conn_list) { | ||
| 507 | if (conns >= max_conns) | ||
| 508 | return -ENOSPC; | ||
| 509 | conn_list[conns] = n; | ||
| 510 | } | ||
| 511 | conns++; | ||
| 512 | } | ||
| 513 | } else { | ||
| 514 | if (conn_list) { | ||
| 515 | if (conns >= max_conns) | ||
| 516 | return -ENOSPC; | ||
| 517 | conn_list[conns] = val; | ||
| 518 | } | ||
| 519 | conns++; | ||
| 520 | } | ||
| 521 | prev_nid = val; | ||
| 522 | } | ||
| 523 | return conns; | ||
| 524 | } | ||
| 525 | |||
| 526 | /** | 361 | /** |
| 527 | * snd_hda_override_conn_list - add/modify the connection-list to cache | 362 | * snd_hda_override_conn_list - add/modify the connection-list to cache |
| 528 | * @codec: the HDA codec | 363 | * @codec: the HDA codec |
| @@ -738,35 +573,6 @@ int snd_hda_bus_new(struct snd_card *card, | |||
| 738 | EXPORT_SYMBOL_GPL(snd_hda_bus_new); | 573 | EXPORT_SYMBOL_GPL(snd_hda_bus_new); |
| 739 | 574 | ||
| 740 | /* | 575 | /* |
| 741 | * look for an AFG and MFG nodes | ||
| 742 | */ | ||
| 743 | static void setup_fg_nodes(struct hda_codec *codec) | ||
| 744 | { | ||
| 745 | int i, total_nodes, function_id; | ||
| 746 | hda_nid_t nid; | ||
| 747 | |||
| 748 | total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid); | ||
| 749 | for (i = 0; i < total_nodes; i++, nid++) { | ||
| 750 | function_id = snd_hda_param_read(codec, nid, | ||
| 751 | AC_PAR_FUNCTION_TYPE); | ||
| 752 | switch (function_id & 0xff) { | ||
| 753 | case AC_GRP_AUDIO_FUNCTION: | ||
| 754 | codec->afg = nid; | ||
| 755 | codec->afg_function_id = function_id & 0xff; | ||
| 756 | codec->afg_unsol = (function_id >> 8) & 1; | ||
| 757 | break; | ||
| 758 | case AC_GRP_MODEM_FUNCTION: | ||
| 759 | codec->mfg = nid; | ||
| 760 | codec->mfg_function_id = function_id & 0xff; | ||
| 761 | codec->mfg_unsol = (function_id >> 8) & 1; | ||
| 762 | break; | ||
| 763 | default: | ||
| 764 | break; | ||
| 765 | } | ||
| 766 | } | ||
| 767 | } | ||
| 768 | |||
| 769 | /* | ||
| 770 | * read widget caps for each widget and store in cache | 576 | * read widget caps for each widget and store in cache |
| 771 | */ | 577 | */ |
| 772 | static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node) | 578 | static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node) |
| @@ -774,13 +580,11 @@ static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node) | |||
| 774 | int i; | 580 | int i; |
| 775 | hda_nid_t nid; | 581 | hda_nid_t nid; |
| 776 | 582 | ||
| 777 | codec->num_nodes = snd_hda_get_sub_nodes(codec, fg_node, | 583 | codec->wcaps = kmalloc(codec->core.num_nodes * 4, GFP_KERNEL); |
| 778 | &codec->start_nid); | ||
| 779 | codec->wcaps = kmalloc(codec->num_nodes * 4, GFP_KERNEL); | ||
| 780 | if (!codec->wcaps) | 584 | if (!codec->wcaps) |
| 781 | return -ENOMEM; | 585 | return -ENOMEM; |
| 782 | nid = codec->start_nid; | 586 | nid = codec->core.start_nid; |
| 783 | for (i = 0; i < codec->num_nodes; i++, nid++) | 587 | for (i = 0; i < codec->core.num_nodes; i++, nid++) |
| 784 | codec->wcaps[i] = snd_hda_param_read(codec, nid, | 588 | codec->wcaps[i] = snd_hda_param_read(codec, nid, |
| 785 | AC_PAR_AUDIO_WIDGET_CAP); | 589 | AC_PAR_AUDIO_WIDGET_CAP); |
| 786 | return 0; | 590 | return 0; |
| @@ -789,10 +593,9 @@ static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node) | |||
| 789 | /* read all pin default configurations and save codec->init_pins */ | 593 | /* read all pin default configurations and save codec->init_pins */ |
| 790 | static int read_pin_defaults(struct hda_codec *codec) | 594 | static int read_pin_defaults(struct hda_codec *codec) |
| 791 | { | 595 | { |
| 792 | int i; | 596 | hda_nid_t nid; |
| 793 | hda_nid_t nid = codec->start_nid; | ||
| 794 | 597 | ||
| 795 | for (i = 0; i < codec->num_nodes; i++, nid++) { | 598 | for_each_hda_codec_node(nid, codec) { |
| 796 | struct hda_pincfg *pin; | 599 | struct hda_pincfg *pin; |
| 797 | unsigned int wcaps = get_wcaps(codec, nid); | 600 | unsigned int wcaps = get_wcaps(codec, nid); |
| 798 | unsigned int wid_type = get_wcaps_type(wcaps); | 601 | unsigned int wid_type = get_wcaps_type(wcaps); |
| @@ -1136,9 +939,6 @@ void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec) | |||
| 1136 | remove_conn_list(codec); | 939 | remove_conn_list(codec); |
| 1137 | } | 940 | } |
| 1138 | 941 | ||
| 1139 | static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec, | ||
| 1140 | hda_nid_t fg, unsigned int power_state); | ||
| 1141 | |||
| 1142 | static unsigned int hda_set_power_state(struct hda_codec *codec, | 942 | static unsigned int hda_set_power_state(struct hda_codec *codec, |
| 1143 | unsigned int power_state); | 943 | unsigned int power_state); |
| 1144 | 944 | ||
| @@ -1178,12 +978,10 @@ static void snd_hda_codec_dev_release(struct device *dev) | |||
| 1178 | struct hda_codec *codec = dev_to_hda_codec(dev); | 978 | struct hda_codec *codec = dev_to_hda_codec(dev); |
| 1179 | 979 | ||
| 1180 | free_init_pincfgs(codec); | 980 | free_init_pincfgs(codec); |
| 1181 | snd_hdac_bus_remove_device(&codec->bus->core, &codec->core); | 981 | snd_hdac_device_exit(&codec->core); |
| 1182 | snd_hda_sysfs_clear(codec); | 982 | snd_hda_sysfs_clear(codec); |
| 1183 | free_hda_cache(&codec->amp_cache); | 983 | free_hda_cache(&codec->amp_cache); |
| 1184 | free_hda_cache(&codec->cmd_cache); | 984 | free_hda_cache(&codec->cmd_cache); |
| 1185 | kfree(codec->vendor_name); | ||
| 1186 | kfree(codec->chip_name); | ||
| 1187 | kfree(codec->modelname); | 985 | kfree(codec->modelname); |
| 1188 | kfree(codec->wcaps); | 986 | kfree(codec->wcaps); |
| 1189 | kfree(codec); | 987 | kfree(codec); |
| @@ -1201,7 +999,6 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, | |||
| 1201 | unsigned int codec_addr, struct hda_codec **codecp) | 999 | unsigned int codec_addr, struct hda_codec **codecp) |
| 1202 | { | 1000 | { |
| 1203 | struct hda_codec *codec; | 1001 | struct hda_codec *codec; |
| 1204 | struct device *dev; | ||
| 1205 | char component[31]; | 1002 | char component[31]; |
| 1206 | hda_nid_t fg; | 1003 | hda_nid_t fg; |
| 1207 | int err; | 1004 | int err; |
| @@ -1220,19 +1017,16 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, | |||
| 1220 | if (!codec) | 1017 | if (!codec) |
| 1221 | return -ENOMEM; | 1018 | return -ENOMEM; |
| 1222 | 1019 | ||
| 1223 | codec->core.bus = &bus->core; | 1020 | sprintf(component, "hdaudioC%dD%d", card->number, codec_addr); |
| 1224 | codec->core.addr = codec_addr; | 1021 | err = snd_hdac_device_init(&codec->core, &bus->core, component, |
| 1225 | codec->core.type = HDA_DEV_LEGACY; | 1022 | codec_addr); |
| 1023 | if (err < 0) { | ||
| 1024 | kfree(codec); | ||
| 1025 | return err; | ||
| 1026 | } | ||
| 1226 | 1027 | ||
| 1227 | dev = hda_codec_dev(codec); | 1028 | codec->core.dev.release = snd_hda_codec_dev_release; |
| 1228 | device_initialize(dev); | 1029 | codec->core.type = HDA_DEV_LEGACY; |
| 1229 | dev->parent = bus->core.dev; | ||
| 1230 | dev->bus = &snd_hda_bus_type; | ||
| 1231 | dev->release = snd_hda_codec_dev_release; | ||
| 1232 | dev->groups = snd_hda_dev_attr_groups; | ||
| 1233 | dev_set_name(dev, "hdaudioC%dD%d", card->number, codec_addr); | ||
| 1234 | dev_set_drvdata(dev, codec); /* for sysfs */ | ||
| 1235 | device_enable_async_suspend(dev); | ||
| 1236 | 1030 | ||
| 1237 | codec->bus = bus; | 1031 | codec->bus = bus; |
| 1238 | codec->card = card; | 1032 | codec->card = card; |
| @@ -1258,12 +1052,6 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, | |||
| 1258 | codec->fixup_id = HDA_FIXUP_ID_NOT_SET; | 1052 | codec->fixup_id = HDA_FIXUP_ID_NOT_SET; |
| 1259 | 1053 | ||
| 1260 | #ifdef CONFIG_PM | 1054 | #ifdef CONFIG_PM |
| 1261 | /* snd_hda_codec_new() marks the codec as power-up, and leave it as is. | ||
| 1262 | * it's powered down later in snd_hda_codec_dev_register(). | ||
| 1263 | */ | ||
| 1264 | set_bit(codec->core.addr, &bus->core.codec_powered); | ||
| 1265 | pm_runtime_set_active(hda_codec_dev(codec)); | ||
| 1266 | pm_runtime_get_noresume(hda_codec_dev(codec)); | ||
| 1267 | codec->power_jiffies = jiffies; | 1055 | codec->power_jiffies = jiffies; |
| 1268 | #endif | 1056 | #endif |
| 1269 | 1057 | ||
| @@ -1277,31 +1065,7 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, | |||
| 1277 | } | 1065 | } |
| 1278 | } | 1066 | } |
| 1279 | 1067 | ||
| 1280 | err = snd_hdac_bus_add_device(&bus->core, &codec->core); | 1068 | fg = codec->core.afg ? codec->core.afg : codec->core.mfg; |
| 1281 | if (err < 0) | ||
| 1282 | goto error; | ||
| 1283 | |||
| 1284 | codec->vendor_id = snd_hda_param_read(codec, AC_NODE_ROOT, | ||
| 1285 | AC_PAR_VENDOR_ID); | ||
| 1286 | if (codec->vendor_id == -1) | ||
| 1287 | /* read again, hopefully the access method was corrected | ||
| 1288 | * in the last read... | ||
| 1289 | */ | ||
| 1290 | codec->vendor_id = snd_hda_param_read(codec, AC_NODE_ROOT, | ||
| 1291 | AC_PAR_VENDOR_ID); | ||
| 1292 | codec->subsystem_id = snd_hda_param_read(codec, AC_NODE_ROOT, | ||
| 1293 | AC_PAR_SUBSYSTEM_ID); | ||
| 1294 | codec->revision_id = snd_hda_param_read(codec, AC_NODE_ROOT, | ||
| 1295 | AC_PAR_REV_ID); | ||
| 1296 | |||
| 1297 | setup_fg_nodes(codec); | ||
| 1298 | if (!codec->afg && !codec->mfg) { | ||
| 1299 | codec_err(codec, "no AFG or MFG node found\n"); | ||
| 1300 | err = -ENODEV; | ||
| 1301 | goto error; | ||
| 1302 | } | ||
| 1303 | |||
| 1304 | fg = codec->afg ? codec->afg : codec->mfg; | ||
| 1305 | err = read_widget_caps(codec, fg); | 1069 | err = read_widget_caps(codec, fg); |
| 1306 | if (err < 0) | 1070 | if (err < 0) |
| 1307 | goto error; | 1071 | goto error; |
| @@ -1309,19 +1073,6 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, | |||
| 1309 | if (err < 0) | 1073 | if (err < 0) |
| 1310 | goto error; | 1074 | goto error; |
| 1311 | 1075 | ||
| 1312 | if (!codec->subsystem_id) { | ||
| 1313 | codec->subsystem_id = | ||
| 1314 | snd_hda_codec_read(codec, fg, 0, | ||
| 1315 | AC_VERB_GET_SUBSYSTEM_ID, 0); | ||
| 1316 | } | ||
| 1317 | |||
| 1318 | #ifdef CONFIG_PM | ||
| 1319 | codec->d3_stop_clk = snd_hda_codec_get_supported_ps(codec, fg, | ||
| 1320 | AC_PWRST_CLKSTOP); | ||
| 1321 | #endif | ||
| 1322 | codec->epss = snd_hda_codec_get_supported_ps(codec, fg, | ||
| 1323 | AC_PWRST_EPSS); | ||
| 1324 | |||
| 1325 | /* power-up all before initialization */ | 1076 | /* power-up all before initialization */ |
| 1326 | hda_set_power_state(codec, AC_PWRST_D0); | 1077 | hda_set_power_state(codec, AC_PWRST_D0); |
| 1327 | 1078 | ||
| @@ -1329,8 +1080,8 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, | |||
| 1329 | 1080 | ||
| 1330 | snd_hda_create_hwdep(codec); | 1081 | snd_hda_create_hwdep(codec); |
| 1331 | 1082 | ||
| 1332 | sprintf(component, "HDA:%08x,%08x,%08x", codec->vendor_id, | 1083 | sprintf(component, "HDA:%08x,%08x,%08x", codec->core.vendor_id, |
| 1333 | codec->subsystem_id, codec->revision_id); | 1084 | codec->core.subsystem_id, codec->core.revision_id); |
| 1334 | snd_component_add(card, component); | 1085 | snd_component_add(card, component); |
| 1335 | 1086 | ||
| 1336 | err = snd_device_new(card, SNDRV_DEV_CODEC, codec, &dev_ops); | 1087 | err = snd_device_new(card, SNDRV_DEV_CODEC, codec, &dev_ops); |
| @@ -1342,6 +1093,7 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, | |||
| 1342 | return 0; | 1093 | return 0; |
| 1343 | 1094 | ||
| 1344 | error: | 1095 | error: |
| 1096 | pm_runtime_put_noidle(hda_codec_dev(codec)); | ||
| 1345 | put_device(hda_codec_dev(codec)); | 1097 | put_device(hda_codec_dev(codec)); |
| 1346 | return err; | 1098 | return err; |
| 1347 | } | 1099 | } |
| @@ -1359,11 +1111,15 @@ int snd_hda_codec_update_widgets(struct hda_codec *codec) | |||
| 1359 | hda_nid_t fg; | 1111 | hda_nid_t fg; |
| 1360 | int err; | 1112 | int err; |
| 1361 | 1113 | ||
| 1114 | err = snd_hdac_refresh_widgets(&codec->core); | ||
| 1115 | if (err < 0) | ||
| 1116 | return err; | ||
| 1117 | |||
| 1362 | /* Assume the function group node does not change, | 1118 | /* Assume the function group node does not change, |
| 1363 | * only the widget nodes may change. | 1119 | * only the widget nodes may change. |
| 1364 | */ | 1120 | */ |
| 1365 | kfree(codec->wcaps); | 1121 | kfree(codec->wcaps); |
| 1366 | fg = codec->afg ? codec->afg : codec->mfg; | 1122 | fg = codec->core.afg ? codec->core.afg : codec->core.mfg; |
| 1367 | err = read_widget_caps(codec, fg); | 1123 | err = read_widget_caps(codec, fg); |
| 1368 | if (err < 0) | 1124 | if (err < 0) |
| 1369 | return err; | 1125 | return err; |
| @@ -1663,7 +1419,7 @@ static unsigned int read_amp_cap(struct hda_codec *codec, hda_nid_t nid, | |||
| 1663 | int direction) | 1419 | int direction) |
| 1664 | { | 1420 | { |
| 1665 | if (!(get_wcaps(codec, nid) & AC_WCAP_AMP_OVRD)) | 1421 | if (!(get_wcaps(codec, nid) & AC_WCAP_AMP_OVRD)) |
| 1666 | nid = codec->afg; | 1422 | nid = codec->core.afg; |
| 1667 | return snd_hda_param_read(codec, nid, | 1423 | return snd_hda_param_read(codec, nid, |
| 1668 | direction == HDA_OUTPUT ? | 1424 | direction == HDA_OUTPUT ? |
| 1669 | AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP); | 1425 | AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP); |
| @@ -3664,10 +3420,9 @@ EXPORT_SYMBOL_GPL(snd_hda_codec_flush_cache); | |||
| 3664 | void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg, | 3420 | void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg, |
| 3665 | unsigned int power_state) | 3421 | unsigned int power_state) |
| 3666 | { | 3422 | { |
| 3667 | hda_nid_t nid = codec->start_nid; | 3423 | hda_nid_t nid; |
| 3668 | int i; | ||
| 3669 | 3424 | ||
| 3670 | for (i = 0; i < codec->num_nodes; i++, nid++) { | 3425 | for_each_hda_codec_node(nid, codec) { |
| 3671 | unsigned int wcaps = get_wcaps(codec, nid); | 3426 | unsigned int wcaps = get_wcaps(codec, nid); |
| 3672 | unsigned int state = power_state; | 3427 | unsigned int state = power_state; |
| 3673 | if (!(wcaps & AC_WCAP_POWER)) | 3428 | if (!(wcaps & AC_WCAP_POWER)) |
| @@ -3684,22 +3439,6 @@ void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg, | |||
| 3684 | EXPORT_SYMBOL_GPL(snd_hda_codec_set_power_to_all); | 3439 | EXPORT_SYMBOL_GPL(snd_hda_codec_set_power_to_all); |
| 3685 | 3440 | ||
| 3686 | /* | 3441 | /* |
| 3687 | * supported power states check | ||
| 3688 | */ | ||
| 3689 | static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec, hda_nid_t fg, | ||
| 3690 | unsigned int power_state) | ||
| 3691 | { | ||
| 3692 | int sup = snd_hda_param_read(codec, fg, AC_PAR_POWER_STATE); | ||
| 3693 | |||
| 3694 | if (sup == -1) | ||
| 3695 | return false; | ||
| 3696 | if (sup & power_state) | ||
| 3697 | return true; | ||
| 3698 | else | ||
| 3699 | return false; | ||
| 3700 | } | ||
| 3701 | |||
| 3702 | /* | ||
| 3703 | * wait until the state is reached, returns the current state | 3442 | * wait until the state is reached, returns the current state |
| 3704 | */ | 3443 | */ |
| 3705 | static unsigned int hda_sync_power_state(struct hda_codec *codec, | 3444 | static unsigned int hda_sync_power_state(struct hda_codec *codec, |
| @@ -3738,7 +3477,7 @@ unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec, | |||
| 3738 | hda_nid_t nid, | 3477 | hda_nid_t nid, |
| 3739 | unsigned int power_state) | 3478 | unsigned int power_state) |
| 3740 | { | 3479 | { |
| 3741 | if (nid == codec->afg || nid == codec->mfg) | 3480 | if (nid == codec->core.afg || nid == codec->core.mfg) |
| 3742 | return power_state; | 3481 | return power_state; |
| 3743 | if (power_state == AC_PWRST_D3 && | 3482 | if (power_state == AC_PWRST_D3 && |
| 3744 | get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_PIN && | 3483 | get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_PIN && |
| @@ -3758,7 +3497,7 @@ EXPORT_SYMBOL_GPL(snd_hda_codec_eapd_power_filter); | |||
| 3758 | static unsigned int hda_set_power_state(struct hda_codec *codec, | 3497 | static unsigned int hda_set_power_state(struct hda_codec *codec, |
| 3759 | unsigned int power_state) | 3498 | unsigned int power_state) |
| 3760 | { | 3499 | { |
| 3761 | hda_nid_t fg = codec->afg ? codec->afg : codec->mfg; | 3500 | hda_nid_t fg = codec->core.afg ? codec->core.afg : codec->core.mfg; |
| 3762 | int count; | 3501 | int count; |
| 3763 | unsigned int state; | 3502 | unsigned int state; |
| 3764 | int flags = 0; | 3503 | int flags = 0; |
| @@ -3766,7 +3505,7 @@ static unsigned int hda_set_power_state(struct hda_codec *codec, | |||
| 3766 | /* this delay seems necessary to avoid click noise at power-down */ | 3505 | /* this delay seems necessary to avoid click noise at power-down */ |
| 3767 | if (power_state == AC_PWRST_D3) { | 3506 | if (power_state == AC_PWRST_D3) { |
| 3768 | if (codec->depop_delay < 0) | 3507 | if (codec->depop_delay < 0) |
| 3769 | msleep(codec->epss ? 10 : 100); | 3508 | msleep(codec_has_epss(codec) ? 10 : 100); |
| 3770 | else if (codec->depop_delay > 0) | 3509 | else if (codec->depop_delay > 0) |
| 3771 | msleep(codec->depop_delay); | 3510 | msleep(codec->depop_delay); |
| 3772 | flags = HDA_RW_NO_RESPONSE_FALLBACK; | 3511 | flags = HDA_RW_NO_RESPONSE_FALLBACK; |
| @@ -3800,14 +3539,13 @@ static unsigned int hda_set_power_state(struct hda_codec *codec, | |||
| 3800 | */ | 3539 | */ |
| 3801 | static void sync_power_up_states(struct hda_codec *codec) | 3540 | static void sync_power_up_states(struct hda_codec *codec) |
| 3802 | { | 3541 | { |
| 3803 | hda_nid_t nid = codec->start_nid; | 3542 | hda_nid_t nid; |
| 3804 | int i; | ||
| 3805 | 3543 | ||
| 3806 | /* don't care if no filter is used */ | 3544 | /* don't care if no filter is used */ |
| 3807 | if (!codec->power_filter) | 3545 | if (!codec->power_filter) |
| 3808 | return; | 3546 | return; |
| 3809 | 3547 | ||
| 3810 | for (i = 0; i < codec->num_nodes; i++, nid++) { | 3548 | for_each_hda_codec_node(nid, codec) { |
| 3811 | unsigned int wcaps = get_wcaps(codec, nid); | 3549 | unsigned int wcaps = get_wcaps(codec, nid); |
| 3812 | unsigned int target; | 3550 | unsigned int target; |
| 3813 | if (!(wcaps & AC_WCAP_POWER)) | 3551 | if (!(wcaps & AC_WCAP_POWER)) |
| @@ -3858,14 +3596,14 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec) | |||
| 3858 | { | 3596 | { |
| 3859 | unsigned int state; | 3597 | unsigned int state; |
| 3860 | 3598 | ||
| 3861 | atomic_inc(&codec->in_pm); | 3599 | atomic_inc(&codec->core.in_pm); |
| 3862 | 3600 | ||
| 3863 | if (codec->patch_ops.suspend) | 3601 | if (codec->patch_ops.suspend) |
| 3864 | codec->patch_ops.suspend(codec); | 3602 | codec->patch_ops.suspend(codec); |
| 3865 | hda_cleanup_all_streams(codec); | 3603 | hda_cleanup_all_streams(codec); |
| 3866 | state = hda_set_power_state(codec, AC_PWRST_D3); | 3604 | state = hda_set_power_state(codec, AC_PWRST_D3); |
| 3867 | update_power_acct(codec, true); | 3605 | update_power_acct(codec, true); |
| 3868 | atomic_dec(&codec->in_pm); | 3606 | atomic_dec(&codec->core.in_pm); |
| 3869 | return state; | 3607 | return state; |
| 3870 | } | 3608 | } |
| 3871 | 3609 | ||
| @@ -3890,7 +3628,7 @@ static void hda_mark_cmd_cache_dirty(struct hda_codec *codec) | |||
| 3890 | */ | 3628 | */ |
| 3891 | static void hda_call_codec_resume(struct hda_codec *codec) | 3629 | static void hda_call_codec_resume(struct hda_codec *codec) |
| 3892 | { | 3630 | { |
| 3893 | atomic_inc(&codec->in_pm); | 3631 | atomic_inc(&codec->core.in_pm); |
| 3894 | 3632 | ||
| 3895 | hda_mark_cmd_cache_dirty(codec); | 3633 | hda_mark_cmd_cache_dirty(codec); |
| 3896 | 3634 | ||
| @@ -3913,7 +3651,7 @@ static void hda_call_codec_resume(struct hda_codec *codec) | |||
| 3913 | hda_jackpoll_work(&codec->jackpoll_work.work); | 3651 | hda_jackpoll_work(&codec->jackpoll_work.work); |
| 3914 | else | 3652 | else |
| 3915 | snd_hda_jack_report_sync(codec); | 3653 | snd_hda_jack_report_sync(codec); |
| 3916 | atomic_dec(&codec->in_pm); | 3654 | atomic_dec(&codec->core.in_pm); |
| 3917 | } | 3655 | } |
| 3918 | 3656 | ||
| 3919 | static int hda_codec_runtime_suspend(struct device *dev) | 3657 | static int hda_codec_runtime_suspend(struct device *dev) |
| @@ -3926,8 +3664,9 @@ static int hda_codec_runtime_suspend(struct device *dev) | |||
| 3926 | list_for_each_entry(pcm, &codec->pcm_list_head, list) | 3664 | list_for_each_entry(pcm, &codec->pcm_list_head, list) |
| 3927 | snd_pcm_suspend_all(pcm->pcm); | 3665 | snd_pcm_suspend_all(pcm->pcm); |
| 3928 | state = hda_call_codec_suspend(codec); | 3666 | state = hda_call_codec_suspend(codec); |
| 3929 | if (codec->d3_stop_clk && codec->epss && (state & AC_PWRST_CLK_STOP_OK)) | 3667 | if (codec_has_clkstop(codec) && codec_has_epss(codec) && |
| 3930 | clear_bit(codec->core.addr, &codec->bus->core.codec_powered); | 3668 | (state & AC_PWRST_CLK_STOP_OK)) |
| 3669 | snd_hdac_codec_link_down(&codec->core); | ||
| 3931 | return 0; | 3670 | return 0; |
| 3932 | } | 3671 | } |
| 3933 | 3672 | ||
| @@ -3935,7 +3674,7 @@ static int hda_codec_runtime_resume(struct device *dev) | |||
| 3935 | { | 3674 | { |
| 3936 | struct hda_codec *codec = dev_to_hda_codec(dev); | 3675 | struct hda_codec *codec = dev_to_hda_codec(dev); |
| 3937 | 3676 | ||
| 3938 | set_bit(codec->core.addr, &codec->bus->core.codec_powered); | 3677 | snd_hdac_codec_link_up(&codec->core); |
| 3939 | hda_call_codec_resume(codec); | 3678 | hda_call_codec_resume(codec); |
| 3940 | pm_runtime_mark_last_busy(dev); | 3679 | pm_runtime_mark_last_busy(dev); |
| 3941 | return 0; | 3680 | return 0; |
| @@ -4129,11 +3868,11 @@ static unsigned int get_pcm_param(struct hda_codec *codec, hda_nid_t nid, | |||
| 4129 | int dir) | 3868 | int dir) |
| 4130 | { | 3869 | { |
| 4131 | unsigned int val = 0; | 3870 | unsigned int val = 0; |
| 4132 | if (nid != codec->afg && | 3871 | if (nid != codec->core.afg && |
| 4133 | (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) | 3872 | (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) |
| 4134 | val = snd_hda_param_read(codec, nid, AC_PAR_PCM); | 3873 | val = snd_hda_param_read(codec, nid, AC_PAR_PCM); |
| 4135 | if (!val || val == -1) | 3874 | if (!val || val == -1) |
| 4136 | val = snd_hda_param_read(codec, codec->afg, AC_PAR_PCM); | 3875 | val = snd_hda_param_read(codec, codec->core.afg, AC_PAR_PCM); |
| 4137 | if (!val || val == -1) | 3876 | if (!val || val == -1) |
| 4138 | return 0; | 3877 | return 0; |
| 4139 | return val; | 3878 | return val; |
| @@ -4150,7 +3889,7 @@ static unsigned int get_stream_param(struct hda_codec *codec, hda_nid_t nid, | |||
| 4150 | { | 3889 | { |
| 4151 | unsigned int streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM); | 3890 | unsigned int streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM); |
| 4152 | if (!streams || streams == -1) | 3891 | if (!streams || streams == -1) |
| 4153 | streams = snd_hda_param_read(codec, codec->afg, AC_PAR_STREAM); | 3892 | streams = snd_hda_param_read(codec, codec->core.afg, AC_PAR_STREAM); |
| 4154 | if (!streams || streams == -1) | 3893 | if (!streams || streams == -1) |
| 4155 | return 0; | 3894 | return 0; |
| 4156 | return streams; | 3895 | return streams; |
| @@ -4632,39 +4371,6 @@ int snd_hda_add_new_ctls(struct hda_codec *codec, | |||
| 4632 | EXPORT_SYMBOL_GPL(snd_hda_add_new_ctls); | 4371 | EXPORT_SYMBOL_GPL(snd_hda_add_new_ctls); |
| 4633 | 4372 | ||
| 4634 | #ifdef CONFIG_PM | 4373 | #ifdef CONFIG_PM |
| 4635 | /** | ||
| 4636 | * snd_hda_power_up - Power-up the codec | ||
| 4637 | * @codec: HD-audio codec | ||
| 4638 | * | ||
| 4639 | * Increment the usage counter and resume the device if not done yet. | ||
| 4640 | */ | ||
| 4641 | void snd_hda_power_up(struct hda_codec *codec) | ||
| 4642 | { | ||
| 4643 | struct device *dev = hda_codec_dev(codec); | ||
| 4644 | |||
| 4645 | if (codec_in_pm(codec)) | ||
| 4646 | return; | ||
| 4647 | pm_runtime_get_sync(dev); | ||
| 4648 | } | ||
| 4649 | EXPORT_SYMBOL_GPL(snd_hda_power_up); | ||
| 4650 | |||
| 4651 | /** | ||
| 4652 | * snd_hda_power_down - Power-down the codec | ||
| 4653 | * @codec: HD-audio codec | ||
| 4654 | * | ||
| 4655 | * Decrement the usage counter and schedules the autosuspend if none used. | ||
| 4656 | */ | ||
| 4657 | void snd_hda_power_down(struct hda_codec *codec) | ||
| 4658 | { | ||
| 4659 | struct device *dev = hda_codec_dev(codec); | ||
| 4660 | |||
| 4661 | if (codec_in_pm(codec)) | ||
| 4662 | return; | ||
| 4663 | pm_runtime_mark_last_busy(dev); | ||
| 4664 | pm_runtime_put_autosuspend(dev); | ||
| 4665 | } | ||
| 4666 | EXPORT_SYMBOL_GPL(snd_hda_power_down); | ||
| 4667 | |||
| 4668 | static void codec_set_power_save(struct hda_codec *codec, int delay) | 4374 | static void codec_set_power_save(struct hda_codec *codec, int delay) |
| 4669 | { | 4375 | { |
| 4670 | struct device *dev = hda_codec_dev(codec); | 4376 | struct device *dev = hda_codec_dev(codec); |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 6efcb4ad6935..e7c47a439762 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
| @@ -261,24 +261,10 @@ struct hda_codec { | |||
| 261 | struct hda_bus *bus; | 261 | struct hda_bus *bus; |
| 262 | struct snd_card *card; | 262 | struct snd_card *card; |
| 263 | unsigned int addr; /* codec addr*/ | 263 | unsigned int addr; /* codec addr*/ |
| 264 | |||
| 265 | hda_nid_t afg; /* AFG node id */ | ||
| 266 | hda_nid_t mfg; /* MFG node id */ | ||
| 267 | |||
| 268 | /* ids */ | ||
| 269 | u8 afg_function_id; | ||
| 270 | u8 mfg_function_id; | ||
| 271 | u8 afg_unsol; | ||
| 272 | u8 mfg_unsol; | ||
| 273 | u32 vendor_id; | ||
| 274 | u32 subsystem_id; | ||
| 275 | u32 revision_id; | ||
| 276 | u32 probe_id; /* overridden id for probing */ | 264 | u32 probe_id; /* overridden id for probing */ |
| 277 | 265 | ||
| 278 | /* detected preset */ | 266 | /* detected preset */ |
| 279 | const struct hda_codec_preset *preset; | 267 | const struct hda_codec_preset *preset; |
| 280 | const char *vendor_name; /* codec vendor name */ | ||
| 281 | const char *chip_name; /* codec chip name */ | ||
| 282 | const char *modelname; /* model name for preset */ | 268 | const char *modelname; /* model name for preset */ |
| 283 | 269 | ||
| 284 | /* set by patch */ | 270 | /* set by patch */ |
| @@ -295,8 +281,6 @@ struct hda_codec { | |||
| 295 | unsigned int beep_mode; | 281 | unsigned int beep_mode; |
| 296 | 282 | ||
| 297 | /* widget capabilities cache */ | 283 | /* widget capabilities cache */ |
| 298 | unsigned int num_nodes; | ||
| 299 | hda_nid_t start_nid; | ||
| 300 | u32 *wcaps; | 284 | u32 *wcaps; |
| 301 | 285 | ||
| 302 | struct snd_array mixers; /* list of assigned mixer elements */ | 286 | struct snd_array mixers; /* list of assigned mixer elements */ |
| @@ -347,14 +331,11 @@ struct hda_codec { | |||
| 347 | unsigned int inv_eapd:1; /* broken h/w: inverted EAPD control */ | 331 | unsigned int inv_eapd:1; /* broken h/w: inverted EAPD control */ |
| 348 | unsigned int inv_jack_detect:1; /* broken h/w: inverted detection bit */ | 332 | unsigned int inv_jack_detect:1; /* broken h/w: inverted detection bit */ |
| 349 | unsigned int pcm_format_first:1; /* PCM format must be set first */ | 333 | unsigned int pcm_format_first:1; /* PCM format must be set first */ |
| 350 | unsigned int epss:1; /* supporting EPSS? */ | ||
| 351 | unsigned int cached_write:1; /* write only to caches */ | 334 | unsigned int cached_write:1; /* write only to caches */ |
| 352 | unsigned int dp_mst:1; /* support DP1.2 Multi-stream transport */ | 335 | unsigned int dp_mst:1; /* support DP1.2 Multi-stream transport */ |
| 353 | unsigned int dump_coef:1; /* dump processing coefs in codec proc file */ | 336 | unsigned int dump_coef:1; /* dump processing coefs in codec proc file */ |
| 354 | unsigned int power_save_node:1; /* advanced PM for each widget */ | 337 | unsigned int power_save_node:1; /* advanced PM for each widget */ |
| 355 | #ifdef CONFIG_PM | 338 | #ifdef CONFIG_PM |
| 356 | unsigned int d3_stop_clk:1; /* support D3 operation without BCLK */ | ||
| 357 | atomic_t in_pm; /* suspend/resume being performed */ | ||
| 358 | unsigned long power_on_acct; | 339 | unsigned long power_on_acct; |
| 359 | unsigned long power_off_acct; | 340 | unsigned long power_off_acct; |
| 360 | unsigned long power_jiffies; | 341 | unsigned long power_jiffies; |
| @@ -395,11 +376,6 @@ struct hda_codec { | |||
| 395 | #define list_for_each_codec(c, bus) \ | 376 | #define list_for_each_codec(c, bus) \ |
| 396 | list_for_each_entry(c, &(bus)->core.codec_list, core.list) | 377 | list_for_each_entry(c, &(bus)->core.codec_list, core.list) |
| 397 | 378 | ||
| 398 | /* direction */ | ||
| 399 | enum { | ||
| 400 | HDA_INPUT, HDA_OUTPUT | ||
| 401 | }; | ||
| 402 | |||
| 403 | /* snd_hda_codec_read/write optional flags */ | 379 | /* snd_hda_codec_read/write optional flags */ |
| 404 | #define HDA_RW_NO_RESPONSE_FALLBACK (1 << 0) | 380 | #define HDA_RW_NO_RESPONSE_FALLBACK (1 << 0) |
| 405 | 381 | ||
| @@ -422,8 +398,8 @@ int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int flags, | |||
| 422 | unsigned int verb, unsigned int parm); | 398 | unsigned int verb, unsigned int parm); |
| 423 | #define snd_hda_param_read(codec, nid, param) \ | 399 | #define snd_hda_param_read(codec, nid, param) \ |
| 424 | snd_hda_codec_read(codec, nid, 0, AC_VERB_PARAMETERS, param) | 400 | snd_hda_codec_read(codec, nid, 0, AC_VERB_PARAMETERS, param) |
| 425 | int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid, | 401 | #define snd_hda_get_sub_nodes(codec, nid, start_nid) \ |
| 426 | hda_nid_t *start_id); | 402 | snd_hdac_get_sub_nodes(&(codec)->core, nid, start_nid) |
| 427 | int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, | 403 | int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, |
| 428 | hda_nid_t *conn_list, int max_conns); | 404 | hda_nid_t *conn_list, int max_conns); |
| 429 | static inline int | 405 | static inline int |
| @@ -431,9 +407,12 @@ snd_hda_get_num_conns(struct hda_codec *codec, hda_nid_t nid) | |||
| 431 | { | 407 | { |
| 432 | return snd_hda_get_connections(codec, nid, NULL, 0); | 408 | return snd_hda_get_connections(codec, nid, NULL, 0); |
| 433 | } | 409 | } |
| 434 | int snd_hda_get_num_raw_conns(struct hda_codec *codec, hda_nid_t nid); | 410 | |
| 435 | int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, | 411 | #define snd_hda_get_raw_connections(codec, nid, list, max_conns) \ |
| 436 | hda_nid_t *conn_list, int max_conns); | 412 | snd_hdac_get_connections(&(codec)->core, nid, list, max_conns) |
| 413 | #define snd_hda_get_num_raw_conns(codec, nid) \ | ||
| 414 | snd_hdac_get_connections(&(codec)->core, nid, NULL, 0); | ||
| 415 | |||
| 437 | int snd_hda_get_conn_list(struct hda_codec *codec, hda_nid_t nid, | 416 | int snd_hda_get_conn_list(struct hda_codec *codec, hda_nid_t nid, |
| 438 | const hda_nid_t **listp); | 417 | const hda_nid_t **listp); |
| 439 | int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int nums, | 418 | int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int nums, |
| @@ -582,14 +561,12 @@ const char *snd_hda_get_jack_location(u32 cfg); | |||
| 582 | /* | 561 | /* |
| 583 | * power saving | 562 | * power saving |
| 584 | */ | 563 | */ |
| 564 | #define snd_hda_power_up(codec) snd_hdac_power_up(&(codec)->core) | ||
| 565 | #define snd_hda_power_down(codec) snd_hdac_power_down(&(codec)->core) | ||
| 585 | #ifdef CONFIG_PM | 566 | #ifdef CONFIG_PM |
| 586 | void snd_hda_power_up(struct hda_codec *codec); | ||
| 587 | void snd_hda_power_down(struct hda_codec *codec); | ||
| 588 | void snd_hda_set_power_save(struct hda_bus *bus, int delay); | 567 | void snd_hda_set_power_save(struct hda_bus *bus, int delay); |
| 589 | void snd_hda_update_power_acct(struct hda_codec *codec); | 568 | void snd_hda_update_power_acct(struct hda_codec *codec); |
| 590 | #else | 569 | #else |
| 591 | static inline void snd_hda_power_up(struct hda_codec *codec) {} | ||
| 592 | static inline void snd_hda_power_down(struct hda_codec *codec) {} | ||
| 593 | static inline void snd_hda_set_power_save(struct hda_bus *bus, int delay) {} | 570 | static inline void snd_hda_set_power_save(struct hda_bus *bus, int delay) {} |
| 594 | #endif | 571 | #endif |
| 595 | 572 | ||
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 0ef2459cd05f..4850f92c89c4 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
| @@ -654,7 +654,7 @@ static bool is_active_nid(struct hda_codec *codec, hda_nid_t nid, | |||
| 654 | int type = get_wcaps_type(get_wcaps(codec, nid)); | 654 | int type = get_wcaps_type(get_wcaps(codec, nid)); |
| 655 | int i, n; | 655 | int i, n; |
| 656 | 656 | ||
| 657 | if (nid == codec->afg) | 657 | if (nid == codec->core.afg) |
| 658 | return true; | 658 | return true; |
| 659 | 659 | ||
| 660 | for (n = 0; n < spec->paths.used; n++) { | 660 | for (n = 0; n < spec->paths.used; n++) { |
| @@ -832,7 +832,7 @@ static hda_nid_t path_power_update(struct hda_codec *codec, | |||
| 832 | 832 | ||
| 833 | for (i = 0; i < path->depth; i++) { | 833 | for (i = 0; i < path->depth; i++) { |
| 834 | nid = path->path[i]; | 834 | nid = path->path[i]; |
| 835 | if (nid == codec->afg) | 835 | if (nid == codec->core.afg) |
| 836 | continue; | 836 | continue; |
| 837 | if (!allow_powerdown || is_active_nid_for_any(codec, nid)) | 837 | if (!allow_powerdown || is_active_nid_for_any(codec, nid)) |
| 838 | state = AC_PWRST_D0; | 838 | state = AC_PWRST_D0; |
| @@ -1897,12 +1897,11 @@ static void debug_show_configs(struct hda_codec *codec, | |||
| 1897 | static void fill_all_dac_nids(struct hda_codec *codec) | 1897 | static void fill_all_dac_nids(struct hda_codec *codec) |
| 1898 | { | 1898 | { |
| 1899 | struct hda_gen_spec *spec = codec->spec; | 1899 | struct hda_gen_spec *spec = codec->spec; |
| 1900 | int i; | 1900 | hda_nid_t nid; |
| 1901 | hda_nid_t nid = codec->start_nid; | ||
| 1902 | 1901 | ||
| 1903 | spec->num_all_dacs = 0; | 1902 | spec->num_all_dacs = 0; |
| 1904 | memset(spec->all_dacs, 0, sizeof(spec->all_dacs)); | 1903 | memset(spec->all_dacs, 0, sizeof(spec->all_dacs)); |
| 1905 | for (i = 0; i < codec->num_nodes; i++, nid++) { | 1904 | for_each_hda_codec_node(nid, codec) { |
| 1906 | if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT) | 1905 | if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT) |
| 1907 | continue; | 1906 | continue; |
| 1908 | if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) { | 1907 | if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) { |
| @@ -3067,10 +3066,9 @@ static int fill_adc_nids(struct hda_codec *codec) | |||
| 3067 | hda_nid_t nid; | 3066 | hda_nid_t nid; |
| 3068 | hda_nid_t *adc_nids = spec->adc_nids; | 3067 | hda_nid_t *adc_nids = spec->adc_nids; |
| 3069 | int max_nums = ARRAY_SIZE(spec->adc_nids); | 3068 | int max_nums = ARRAY_SIZE(spec->adc_nids); |
| 3070 | int i, nums = 0; | 3069 | int nums = 0; |
| 3071 | 3070 | ||
| 3072 | nid = codec->start_nid; | 3071 | for_each_hda_codec_node(nid, codec) { |
| 3073 | for (i = 0; i < codec->num_nodes; i++, nid++) { | ||
| 3074 | unsigned int caps = get_wcaps(codec, nid); | 3072 | unsigned int caps = get_wcaps(codec, nid); |
| 3075 | int type = get_wcaps_type(caps); | 3073 | int type = get_wcaps_type(caps); |
| 3076 | 3074 | ||
| @@ -3864,8 +3862,7 @@ static void parse_digital(struct hda_codec *codec) | |||
| 3864 | 3862 | ||
| 3865 | if (spec->autocfg.dig_in_pin) { | 3863 | if (spec->autocfg.dig_in_pin) { |
| 3866 | pin = spec->autocfg.dig_in_pin; | 3864 | pin = spec->autocfg.dig_in_pin; |
| 3867 | dig_nid = codec->start_nid; | 3865 | for_each_hda_codec_node(dig_nid, codec) { |
| 3868 | for (i = 0; i < codec->num_nodes; i++, dig_nid++) { | ||
| 3869 | unsigned int wcaps = get_wcaps(codec, dig_nid); | 3866 | unsigned int wcaps = get_wcaps(codec, dig_nid); |
| 3870 | if (get_wcaps_type(wcaps) != AC_WID_AUD_IN) | 3867 | if (get_wcaps_type(wcaps) != AC_WID_AUD_IN) |
| 3871 | continue; | 3868 | continue; |
| @@ -4706,7 +4703,7 @@ unsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec, | |||
| 4706 | hda_nid_t nid, | 4703 | hda_nid_t nid, |
| 4707 | unsigned int power_state) | 4704 | unsigned int power_state) |
| 4708 | { | 4705 | { |
| 4709 | if (power_state != AC_PWRST_D0 || nid == codec->afg) | 4706 | if (power_state != AC_PWRST_D0 || nid == codec->core.afg) |
| 4710 | return power_state; | 4707 | return power_state; |
| 4711 | if (get_wcaps_type(get_wcaps(codec, nid)) >= AC_WID_POWER) | 4708 | if (get_wcaps_type(get_wcaps(codec, nid)) >= AC_WID_POWER) |
| 4712 | return power_state; | 4709 | return power_state; |
| @@ -5478,7 +5475,7 @@ int snd_hda_gen_build_pcms(struct hda_codec *codec) | |||
| 5478 | 5475 | ||
| 5479 | fill_pcm_stream_name(spec->stream_name_analog, | 5476 | fill_pcm_stream_name(spec->stream_name_analog, |
| 5480 | sizeof(spec->stream_name_analog), | 5477 | sizeof(spec->stream_name_analog), |
| 5481 | " Analog", codec->chip_name); | 5478 | " Analog", codec->core.chip_name); |
| 5482 | info = snd_hda_codec_pcm_new(codec, "%s", spec->stream_name_analog); | 5479 | info = snd_hda_codec_pcm_new(codec, "%s", spec->stream_name_analog); |
| 5483 | if (!info) | 5480 | if (!info) |
| 5484 | return -ENOMEM; | 5481 | return -ENOMEM; |
| @@ -5509,7 +5506,7 @@ int snd_hda_gen_build_pcms(struct hda_codec *codec) | |||
| 5509 | if (spec->multiout.dig_out_nid || spec->dig_in_nid) { | 5506 | if (spec->multiout.dig_out_nid || spec->dig_in_nid) { |
| 5510 | fill_pcm_stream_name(spec->stream_name_digital, | 5507 | fill_pcm_stream_name(spec->stream_name_digital, |
| 5511 | sizeof(spec->stream_name_digital), | 5508 | sizeof(spec->stream_name_digital), |
| 5512 | " Digital", codec->chip_name); | 5509 | " Digital", codec->core.chip_name); |
| 5513 | info = snd_hda_codec_pcm_new(codec, "%s", | 5510 | info = snd_hda_codec_pcm_new(codec, "%s", |
| 5514 | spec->stream_name_digital); | 5511 | spec->stream_name_digital); |
| 5515 | if (!info) | 5512 | if (!info) |
| @@ -5544,7 +5541,7 @@ int snd_hda_gen_build_pcms(struct hda_codec *codec) | |||
| 5544 | if (spec->alt_dac_nid || have_multi_adcs) { | 5541 | if (spec->alt_dac_nid || have_multi_adcs) { |
| 5545 | fill_pcm_stream_name(spec->stream_name_alt_analog, | 5542 | fill_pcm_stream_name(spec->stream_name_alt_analog, |
| 5546 | sizeof(spec->stream_name_alt_analog), | 5543 | sizeof(spec->stream_name_alt_analog), |
| 5547 | " Alt Analog", codec->chip_name); | 5544 | " Alt Analog", codec->core.chip_name); |
| 5548 | info = snd_hda_codec_pcm_new(codec, "%s", | 5545 | info = snd_hda_codec_pcm_new(codec, "%s", |
| 5549 | spec->stream_name_alt_analog); | 5546 | spec->stream_name_alt_analog); |
| 5550 | if (!info) | 5547 | if (!info) |
diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 1d001647fc47..e0db30c66e5f 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h | |||
| @@ -515,15 +515,18 @@ int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid); | |||
| 515 | int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid, | 515 | int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid, |
| 516 | unsigned int val); | 516 | unsigned int val); |
| 517 | 517 | ||
| 518 | #define for_each_hda_codec_node(nid, codec) \ | ||
| 519 | for ((nid) = (codec)->core.start_nid; (nid) < (codec)->core.end_nid; (nid)++) | ||
| 520 | |||
| 518 | /* | 521 | /* |
| 519 | * get widget capabilities | 522 | * get widget capabilities |
| 520 | */ | 523 | */ |
| 521 | static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid) | 524 | static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid) |
| 522 | { | 525 | { |
| 523 | if (nid < codec->start_nid || | 526 | if (nid < codec->core.start_nid || |
| 524 | nid >= codec->start_nid + codec->num_nodes) | 527 | nid >= codec->core.start_nid + codec->core.num_nodes) |
| 525 | return 0; | 528 | return 0; |
| 526 | return codec->wcaps[nid - codec->start_nid]; | 529 | return codec->wcaps[nid - codec->core.start_nid]; |
| 527 | } | 530 | } |
| 528 | 531 | ||
| 529 | /* get the widget type from widget capability bits */ | 532 | /* get the widget type from widget capability bits */ |
| @@ -547,9 +550,9 @@ static inline unsigned int get_wcaps_channels(u32 wcaps) | |||
| 547 | static inline void snd_hda_override_wcaps(struct hda_codec *codec, | 550 | static inline void snd_hda_override_wcaps(struct hda_codec *codec, |
| 548 | hda_nid_t nid, u32 val) | 551 | hda_nid_t nid, u32 val) |
| 549 | { | 552 | { |
| 550 | if (nid >= codec->start_nid && | 553 | if (nid >= codec->core.start_nid && |
| 551 | nid < codec->start_nid + codec->num_nodes) | 554 | nid < codec->core.start_nid + codec->core.num_nodes) |
| 552 | codec->wcaps[nid - codec->start_nid] = val; | 555 | codec->wcaps[nid - codec->core.start_nid] = val; |
| 553 | } | 556 | } |
| 554 | 557 | ||
| 555 | u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction); | 558 | u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction); |
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index dacfe74a2a1f..a4f5a30f1d41 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c | |||
| @@ -289,7 +289,7 @@ static void print_pin_caps(struct snd_info_buffer *buffer, | |||
| 289 | snd_iprintf(buffer, " Balanced"); | 289 | snd_iprintf(buffer, " Balanced"); |
| 290 | if (caps & AC_PINCAP_HDMI) { | 290 | if (caps & AC_PINCAP_HDMI) { |
| 291 | /* Realtek uses this bit as a different meaning */ | 291 | /* Realtek uses this bit as a different meaning */ |
| 292 | if ((codec->vendor_id >> 16) == 0x10ec) | 292 | if ((codec->core.vendor_id >> 16) == 0x10ec) |
| 293 | snd_iprintf(buffer, " R/L"); | 293 | snd_iprintf(buffer, " R/L"); |
| 294 | else { | 294 | else { |
| 295 | if (caps & AC_PINCAP_HBR) | 295 | if (caps & AC_PINCAP_HBR) |
| @@ -597,7 +597,7 @@ static void print_gpio(struct snd_info_buffer *buffer, | |||
| 597 | struct hda_codec *codec, hda_nid_t nid) | 597 | struct hda_codec *codec, hda_nid_t nid) |
| 598 | { | 598 | { |
| 599 | unsigned int gpio = | 599 | unsigned int gpio = |
| 600 | snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP); | 600 | snd_hda_param_read(codec, codec->core.afg, AC_PAR_GPIO_CAP); |
| 601 | unsigned int enable, direction, wake, unsol, sticky, data; | 601 | unsigned int enable, direction, wake, unsol, sticky, data; |
| 602 | int i, max; | 602 | int i, max; |
| 603 | snd_iprintf(buffer, "GPIO: io=%d, o=%d, i=%d, " | 603 | snd_iprintf(buffer, "GPIO: io=%d, o=%d, i=%d, " |
| @@ -667,13 +667,9 @@ static void print_device_list(struct snd_info_buffer *buffer, | |||
| 667 | } | 667 | } |
| 668 | } | 668 | } |
| 669 | 669 | ||
| 670 | static void print_codec_info(struct snd_info_entry *entry, | 670 | static void print_codec_core_info(struct hdac_device *codec, |
| 671 | struct snd_info_buffer *buffer) | 671 | struct snd_info_buffer *buffer) |
| 672 | { | 672 | { |
| 673 | struct hda_codec *codec = entry->private_data; | ||
| 674 | hda_nid_t nid; | ||
| 675 | int i, nodes; | ||
| 676 | |||
| 677 | snd_iprintf(buffer, "Codec: "); | 673 | snd_iprintf(buffer, "Codec: "); |
| 678 | if (codec->vendor_name && codec->chip_name) | 674 | if (codec->vendor_name && codec->chip_name) |
| 679 | snd_iprintf(buffer, "%s %s\n", | 675 | snd_iprintf(buffer, "%s %s\n", |
| @@ -695,29 +691,39 @@ static void print_codec_info(struct snd_info_entry *entry, | |||
| 695 | snd_iprintf(buffer, "Modem Function Group: 0x%x\n", codec->mfg); | 691 | snd_iprintf(buffer, "Modem Function Group: 0x%x\n", codec->mfg); |
| 696 | else | 692 | else |
| 697 | snd_iprintf(buffer, "No Modem Function Group found\n"); | 693 | snd_iprintf(buffer, "No Modem Function Group found\n"); |
| 694 | } | ||
| 695 | |||
| 696 | static void print_codec_info(struct snd_info_entry *entry, | ||
| 697 | struct snd_info_buffer *buffer) | ||
| 698 | { | ||
| 699 | struct hda_codec *codec = entry->private_data; | ||
| 700 | hda_nid_t nid, fg; | ||
| 701 | int i, nodes; | ||
| 698 | 702 | ||
| 699 | if (! codec->afg) | 703 | print_codec_core_info(&codec->core, buffer); |
| 704 | fg = codec->core.afg; | ||
| 705 | if (!fg) | ||
| 700 | return; | 706 | return; |
| 701 | snd_hda_power_up(codec); | 707 | snd_hda_power_up(codec); |
| 702 | snd_iprintf(buffer, "Default PCM:\n"); | 708 | snd_iprintf(buffer, "Default PCM:\n"); |
| 703 | print_pcm_caps(buffer, codec, codec->afg); | 709 | print_pcm_caps(buffer, codec, fg); |
| 704 | snd_iprintf(buffer, "Default Amp-In caps: "); | 710 | snd_iprintf(buffer, "Default Amp-In caps: "); |
| 705 | print_amp_caps(buffer, codec, codec->afg, HDA_INPUT); | 711 | print_amp_caps(buffer, codec, fg, HDA_INPUT); |
| 706 | snd_iprintf(buffer, "Default Amp-Out caps: "); | 712 | snd_iprintf(buffer, "Default Amp-Out caps: "); |
| 707 | print_amp_caps(buffer, codec, codec->afg, HDA_OUTPUT); | 713 | print_amp_caps(buffer, codec, fg, HDA_OUTPUT); |
| 708 | snd_iprintf(buffer, "State of AFG node 0x%02x:\n", codec->afg); | 714 | snd_iprintf(buffer, "State of AFG node 0x%02x:\n", fg); |
| 709 | print_power_state(buffer, codec, codec->afg); | 715 | print_power_state(buffer, codec, fg); |
| 710 | 716 | ||
| 711 | nodes = snd_hda_get_sub_nodes(codec, codec->afg, &nid); | 717 | nodes = snd_hda_get_sub_nodes(codec, fg, &nid); |
| 712 | if (! nid || nodes < 0) { | 718 | if (! nid || nodes < 0) { |
| 713 | snd_iprintf(buffer, "Invalid AFG subtree\n"); | 719 | snd_iprintf(buffer, "Invalid AFG subtree\n"); |
| 714 | snd_hda_power_down(codec); | 720 | snd_hda_power_down(codec); |
| 715 | return; | 721 | return; |
| 716 | } | 722 | } |
| 717 | 723 | ||
| 718 | print_gpio(buffer, codec, codec->afg); | 724 | print_gpio(buffer, codec, fg); |
| 719 | if (codec->proc_widget_hook) | 725 | if (codec->proc_widget_hook) |
| 720 | codec->proc_widget_hook(buffer, codec, codec->afg); | 726 | codec->proc_widget_hook(buffer, codec, fg); |
| 721 | 727 | ||
| 722 | for (i = 0; i < nodes; i++, nid++) { | 728 | for (i = 0; i < nodes; i++, nid++) { |
| 723 | unsigned int wid_caps = | 729 | unsigned int wid_caps = |
| @@ -860,7 +866,7 @@ int snd_hda_codec_proc_new(struct hda_codec *codec) | |||
| 860 | struct snd_info_entry *entry; | 866 | struct snd_info_entry *entry; |
| 861 | int err; | 867 | int err; |
| 862 | 868 | ||
| 863 | snprintf(name, sizeof(name), "codec#%d", codec->addr); | 869 | snprintf(name, sizeof(name), "codec#%d", codec->core.addr); |
| 864 | err = snd_card_proc_new(codec->card, name, &entry); | 870 | err = snd_card_proc_new(codec->card, name, &entry); |
| 865 | if (err < 0) | 871 | if (err < 0) |
| 866 | return err; | 872 | return err; |
diff --git a/sound/pci/hda/hda_sysfs.c b/sound/pci/hda/hda_sysfs.c index 3b5ed1108f9f..a6e3d9b511ab 100644 --- a/sound/pci/hda/hda_sysfs.c +++ b/sound/pci/hda/hda_sysfs.c | |||
| @@ -48,33 +48,33 @@ static DEVICE_ATTR_RO(power_on_acct); | |||
| 48 | static DEVICE_ATTR_RO(power_off_acct); | 48 | static DEVICE_ATTR_RO(power_off_acct); |
| 49 | #endif /* CONFIG_PM */ | 49 | #endif /* CONFIG_PM */ |
| 50 | 50 | ||
| 51 | #define CODEC_INFO_SHOW(type) \ | 51 | #define CODEC_INFO_SHOW(type, field) \ |
| 52 | static ssize_t type##_show(struct device *dev, \ | 52 | static ssize_t type##_show(struct device *dev, \ |
| 53 | struct device_attribute *attr, \ | 53 | struct device_attribute *attr, \ |
| 54 | char *buf) \ | 54 | char *buf) \ |
| 55 | { \ | 55 | { \ |
| 56 | struct hda_codec *codec = dev_get_drvdata(dev); \ | 56 | struct hda_codec *codec = dev_get_drvdata(dev); \ |
| 57 | return sprintf(buf, "0x%x\n", codec->type); \ | 57 | return sprintf(buf, "0x%x\n", codec->field); \ |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | #define CODEC_INFO_STR_SHOW(type) \ | 60 | #define CODEC_INFO_STR_SHOW(type, field) \ |
| 61 | static ssize_t type##_show(struct device *dev, \ | 61 | static ssize_t type##_show(struct device *dev, \ |
| 62 | struct device_attribute *attr, \ | 62 | struct device_attribute *attr, \ |
| 63 | char *buf) \ | 63 | char *buf) \ |
| 64 | { \ | 64 | { \ |
| 65 | struct hda_codec *codec = dev_get_drvdata(dev); \ | 65 | struct hda_codec *codec = dev_get_drvdata(dev); \ |
| 66 | return sprintf(buf, "%s\n", \ | 66 | return sprintf(buf, "%s\n", \ |
| 67 | codec->type ? codec->type : ""); \ | 67 | codec->field ? codec->field : ""); \ |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | CODEC_INFO_SHOW(vendor_id); | 70 | CODEC_INFO_SHOW(vendor_id, core.vendor_id); |
| 71 | CODEC_INFO_SHOW(subsystem_id); | 71 | CODEC_INFO_SHOW(subsystem_id, core.subsystem_id); |
| 72 | CODEC_INFO_SHOW(revision_id); | 72 | CODEC_INFO_SHOW(revision_id, core.revision_id); |
| 73 | CODEC_INFO_SHOW(afg); | 73 | CODEC_INFO_SHOW(afg, core.afg); |
| 74 | CODEC_INFO_SHOW(mfg); | 74 | CODEC_INFO_SHOW(mfg, core.mfg); |
| 75 | CODEC_INFO_STR_SHOW(vendor_name); | 75 | CODEC_INFO_STR_SHOW(vendor_name, core.vendor_name); |
| 76 | CODEC_INFO_STR_SHOW(chip_name); | 76 | CODEC_INFO_STR_SHOW(chip_name, core.chip_name); |
| 77 | CODEC_INFO_STR_SHOW(modelname); | 77 | CODEC_INFO_STR_SHOW(modelname, modelname); |
| 78 | 78 | ||
| 79 | static ssize_t pin_configs_show(struct hda_codec *codec, | 79 | static ssize_t pin_configs_show(struct hda_codec *codec, |
| 80 | struct snd_array *list, | 80 | struct snd_array *list, |
| @@ -170,7 +170,7 @@ static char *kstrndup_noeol(const char *src, size_t len) | |||
| 170 | return s; | 170 | return s; |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | #define CODEC_INFO_STORE(type) \ | 173 | #define CODEC_INFO_STORE(type, field) \ |
| 174 | static ssize_t type##_store(struct device *dev, \ | 174 | static ssize_t type##_store(struct device *dev, \ |
| 175 | struct device_attribute *attr, \ | 175 | struct device_attribute *attr, \ |
| 176 | const char *buf, size_t count) \ | 176 | const char *buf, size_t count) \ |
| @@ -180,11 +180,11 @@ static ssize_t type##_store(struct device *dev, \ | |||
| 180 | int err = kstrtoul(buf, 0, &val); \ | 180 | int err = kstrtoul(buf, 0, &val); \ |
| 181 | if (err < 0) \ | 181 | if (err < 0) \ |
| 182 | return err; \ | 182 | return err; \ |
| 183 | codec->type = val; \ | 183 | codec->field = val; \ |
| 184 | return count; \ | 184 | return count; \ |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | #define CODEC_INFO_STR_STORE(type) \ | 187 | #define CODEC_INFO_STR_STORE(type, field) \ |
| 188 | static ssize_t type##_store(struct device *dev, \ | 188 | static ssize_t type##_store(struct device *dev, \ |
| 189 | struct device_attribute *attr, \ | 189 | struct device_attribute *attr, \ |
| 190 | const char *buf, size_t count) \ | 190 | const char *buf, size_t count) \ |
| @@ -193,17 +193,17 @@ static ssize_t type##_store(struct device *dev, \ | |||
| 193 | char *s = kstrndup_noeol(buf, 64); \ | 193 | char *s = kstrndup_noeol(buf, 64); \ |
| 194 | if (!s) \ | 194 | if (!s) \ |
| 195 | return -ENOMEM; \ | 195 | return -ENOMEM; \ |
| 196 | kfree(codec->type); \ | 196 | kfree(codec->field); \ |
| 197 | codec->type = s; \ | 197 | codec->field = s; \ |
| 198 | return count; \ | 198 | return count; \ |
| 199 | } | 199 | } |
| 200 | 200 | ||
| 201 | CODEC_INFO_STORE(vendor_id); | 201 | CODEC_INFO_STORE(vendor_id, core.vendor_id); |
| 202 | CODEC_INFO_STORE(subsystem_id); | 202 | CODEC_INFO_STORE(subsystem_id, core.subsystem_id); |
| 203 | CODEC_INFO_STORE(revision_id); | 203 | CODEC_INFO_STORE(revision_id, core.revision_id); |
| 204 | CODEC_INFO_STR_STORE(vendor_name); | 204 | CODEC_INFO_STR_STORE(vendor_name, core.vendor_name); |
| 205 | CODEC_INFO_STR_STORE(chip_name); | 205 | CODEC_INFO_STR_STORE(chip_name, core.chip_name); |
| 206 | CODEC_INFO_STR_STORE(modelname); | 206 | CODEC_INFO_STR_STORE(modelname, modelname); |
| 207 | 207 | ||
| 208 | #define CODEC_ACTION_STORE(type) \ | 208 | #define CODEC_ACTION_STORE(type) \ |
| 209 | static ssize_t type##_store(struct device *dev, \ | 209 | static ssize_t type##_store(struct device *dev, \ |
| @@ -553,9 +553,9 @@ static void parse_codec_mode(char *buf, struct hda_bus *bus, | |||
| 553 | *codecp = NULL; | 553 | *codecp = NULL; |
| 554 | if (sscanf(buf, "%i %i %i", &vendorid, &subid, &caddr) == 3) { | 554 | if (sscanf(buf, "%i %i %i", &vendorid, &subid, &caddr) == 3) { |
| 555 | list_for_each_codec(codec, bus) { | 555 | list_for_each_codec(codec, bus) { |
| 556 | if ((vendorid <= 0 || codec->vendor_id == vendorid) && | 556 | if ((vendorid <= 0 || codec->core.vendor_id == vendorid) && |
| 557 | (subid <= 0 || codec->subsystem_id == subid) && | 557 | (subid <= 0 || codec->core.subsystem_id == subid) && |
| 558 | codec->addr == caddr) { | 558 | codec->core.addr == caddr) { |
| 559 | *codecp = codec; | 559 | *codecp = codec; |
| 560 | break; | 560 | break; |
| 561 | } | 561 | } |
| @@ -595,8 +595,8 @@ static void parse_model_mode(char *buf, struct hda_bus *bus, | |||
| 595 | static void parse_chip_name_mode(char *buf, struct hda_bus *bus, | 595 | static void parse_chip_name_mode(char *buf, struct hda_bus *bus, |
| 596 | struct hda_codec **codecp) | 596 | struct hda_codec **codecp) |
| 597 | { | 597 | { |
| 598 | kfree((*codecp)->chip_name); | 598 | kfree((*codecp)->core.chip_name); |
| 599 | (*codecp)->chip_name = kstrdup(buf, GFP_KERNEL); | 599 | (*codecp)->core.chip_name = kstrdup(buf, GFP_KERNEL); |
| 600 | } | 600 | } |
| 601 | 601 | ||
| 602 | #define DEFINE_PARSE_ID_MODE(name) \ | 602 | #define DEFINE_PARSE_ID_MODE(name) \ |
| @@ -605,7 +605,7 @@ static void parse_##name##_mode(char *buf, struct hda_bus *bus, \ | |||
| 605 | { \ | 605 | { \ |
| 606 | unsigned long val; \ | 606 | unsigned long val; \ |
| 607 | if (!kstrtoul(buf, 0, &val)) \ | 607 | if (!kstrtoul(buf, 0, &val)) \ |
| 608 | (*codecp)->name = val; \ | 608 | (*codecp)->core.name = val; \ |
| 609 | } | 609 | } |
| 610 | 610 | ||
| 611 | DEFINE_PARSE_ID_MODE(vendor_id); | 611 | DEFINE_PARSE_ID_MODE(vendor_id); |
diff --git a/sound/pci/hda/local.h b/sound/pci/hda/local.h new file mode 100644 index 000000000000..28cb7f98982e --- /dev/null +++ b/sound/pci/hda/local.h | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | /* | ||
| 2 | */ | ||
| 3 | |||
| 4 | #ifndef __HDAC_LOCAL_H | ||
| 5 | #define __HDAC_LOCAL_H | ||
| 6 | |||
| 7 | int hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm); | ||
| 8 | |||
| 9 | #define get_wcaps(codec, nid) \ | ||
| 10 | hdac_read_parm(codec, nid, AC_PAR_AUDIO_WIDGET_CAP) | ||
| 11 | /* get the widget type from widget capability bits */ | ||
| 12 | static inline int get_wcaps_type(unsigned int wcaps) | ||
| 13 | { | ||
| 14 | if (!wcaps) | ||
| 15 | return -1; /* invalid type */ | ||
| 16 | return (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; | ||
| 17 | } | ||
| 18 | |||
| 19 | #define get_pin_caps(codec, nid) \ | ||
| 20 | hdac_read_parm(codec, nid, AC_PAR_PIN_CAP) | ||
| 21 | |||
| 22 | static inline | ||
| 23 | unsigned int get_pin_cfg(struct hdac_device *codec, hda_nid_t nid) | ||
| 24 | { | ||
| 25 | unsigned int val; | ||
| 26 | |||
| 27 | if (snd_hdac_read(codec, nid, AC_VERB_GET_CONFIG_DEFAULT, 0, &val)) | ||
| 28 | return -1; | ||
| 29 | return val; | ||
| 30 | } | ||
| 31 | |||
| 32 | #define get_amp_caps(codec, nid, dir) \ | ||
| 33 | hdac_read_parm(codec, nid, (dir) == HDA_OUTPUT ? \ | ||
| 34 | AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP) | ||
| 35 | |||
| 36 | #define get_power_caps(codec, nid) \ | ||
| 37 | hdac_read_parm(codec, nid, AC_PAR_POWER_STATE) | ||
| 38 | |||
| 39 | #endif /* __HDAC_LOCAL_H */ | ||
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index af4c7be86c27..2278e83234b5 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
| @@ -99,7 +99,7 @@ static void ad198x_power_eapd_write(struct hda_codec *codec, hda_nid_t front, | |||
| 99 | static void ad198x_power_eapd(struct hda_codec *codec) | 99 | static void ad198x_power_eapd(struct hda_codec *codec) |
| 100 | { | 100 | { |
| 101 | /* We currently only handle front, HP */ | 101 | /* We currently only handle front, HP */ |
| 102 | switch (codec->vendor_id) { | 102 | switch (codec->core.vendor_id) { |
| 103 | case 0x11d41882: | 103 | case 0x11d41882: |
| 104 | case 0x11d4882a: | 104 | case 0x11d4882a: |
| 105 | case 0x11d41884: | 105 | case 0x11d41884: |
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 72d20652df50..5aff35a09fd4 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c | |||
| @@ -4243,13 +4243,9 @@ static void ca0132_refresh_widget_caps(struct hda_codec *codec) | |||
| 4243 | { | 4243 | { |
| 4244 | struct ca0132_spec *spec = codec->spec; | 4244 | struct ca0132_spec *spec = codec->spec; |
| 4245 | int i; | 4245 | int i; |
| 4246 | hda_nid_t nid; | ||
| 4247 | 4246 | ||
| 4248 | codec_dbg(codec, "ca0132_refresh_widget_caps.\n"); | 4247 | codec_dbg(codec, "ca0132_refresh_widget_caps.\n"); |
| 4249 | nid = codec->start_nid; | 4248 | snd_hda_codec_update_widgets(codec); |
| 4250 | for (i = 0; i < codec->num_nodes; i++, nid++) | ||
| 4251 | codec->wcaps[i] = snd_hda_param_read(codec, nid, | ||
| 4252 | AC_PAR_AUDIO_WIDGET_CAP); | ||
| 4253 | 4249 | ||
| 4254 | for (i = 0; i < spec->multiout.num_dacs; i++) | 4250 | for (i = 0; i < spec->multiout.num_dacs; i++) |
| 4255 | refresh_amp_caps(codec, spec->dacs[i], HDA_OUTPUT); | 4251 | refresh_amp_caps(codec, spec->dacs[i], HDA_OUTPUT); |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 142a6cf786da..1e21f9fbd54b 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -103,10 +103,9 @@ static int add_beep_ctls(struct hda_codec *codec) | |||
| 103 | static void cx_auto_parse_beep(struct hda_codec *codec) | 103 | static void cx_auto_parse_beep(struct hda_codec *codec) |
| 104 | { | 104 | { |
| 105 | struct conexant_spec *spec = codec->spec; | 105 | struct conexant_spec *spec = codec->spec; |
| 106 | hda_nid_t nid, end_nid; | 106 | hda_nid_t nid; |
| 107 | 107 | ||
| 108 | end_nid = codec->start_nid + codec->num_nodes; | 108 | for_each_hda_codec_node(nid, codec) |
| 109 | for (nid = codec->start_nid; nid < end_nid; nid++) | ||
| 110 | if (get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_BEEP) { | 109 | if (get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_BEEP) { |
| 111 | set_beep_amp(spec, nid, 0, HDA_OUTPUT); | 110 | set_beep_amp(spec, nid, 0, HDA_OUTPUT); |
| 112 | break; | 111 | break; |
| @@ -120,10 +119,9 @@ static void cx_auto_parse_beep(struct hda_codec *codec) | |||
| 120 | static void cx_auto_parse_eapd(struct hda_codec *codec) | 119 | static void cx_auto_parse_eapd(struct hda_codec *codec) |
| 121 | { | 120 | { |
| 122 | struct conexant_spec *spec = codec->spec; | 121 | struct conexant_spec *spec = codec->spec; |
| 123 | hda_nid_t nid, end_nid; | 122 | hda_nid_t nid; |
| 124 | 123 | ||
| 125 | end_nid = codec->start_nid + codec->num_nodes; | 124 | for_each_hda_codec_node(nid, codec) { |
| 126 | for (nid = codec->start_nid; nid < end_nid; nid++) { | ||
| 127 | if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN) | 125 | if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN) |
| 128 | continue; | 126 | continue; |
| 129 | if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)) | 127 | if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)) |
| @@ -848,7 +846,7 @@ static int patch_conexant_auto(struct hda_codec *codec) | |||
| 848 | struct conexant_spec *spec; | 846 | struct conexant_spec *spec; |
| 849 | int err; | 847 | int err; |
| 850 | 848 | ||
| 851 | codec_info(codec, "%s: BIOS auto-probing.\n", codec->chip_name); | 849 | codec_info(codec, "%s: BIOS auto-probing.\n", codec->core.chip_name); |
| 852 | 850 | ||
| 853 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 851 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
| 854 | if (!spec) | 852 | if (!spec) |
| @@ -862,7 +860,7 @@ static int patch_conexant_auto(struct hda_codec *codec) | |||
| 862 | if (spec->dynamic_eapd) | 860 | if (spec->dynamic_eapd) |
| 863 | spec->gen.vmaster_mute.hook = cx_auto_vmaster_hook; | 861 | spec->gen.vmaster_mute.hook = cx_auto_vmaster_hook; |
| 864 | 862 | ||
| 865 | switch (codec->vendor_id) { | 863 | switch (codec->core.vendor_id) { |
| 866 | case 0x14f15045: | 864 | case 0x14f15045: |
| 867 | codec->single_adc_amp = 1; | 865 | codec->single_adc_amp = 1; |
| 868 | spec->gen.mixer_nid = 0x17; | 866 | spec->gen.mixer_nid = 0x17; |
| @@ -896,7 +894,7 @@ static int patch_conexant_auto(struct hda_codec *codec) | |||
| 896 | * others may use EAPD really as an amp switch, so it might be | 894 | * others may use EAPD really as an amp switch, so it might be |
| 897 | * not good to expose it blindly. | 895 | * not good to expose it blindly. |
| 898 | */ | 896 | */ |
| 899 | switch (codec->subsystem_id >> 16) { | 897 | switch (codec->core.subsystem_id >> 16) { |
| 900 | case 0x103c: | 898 | case 0x103c: |
| 901 | spec->gen.vmaster_mute_enum = 1; | 899 | spec->gen.vmaster_mute_enum = 1; |
| 902 | break; | 900 | break; |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 7e9ff7b16e56..35d92a8a99ce 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -45,14 +45,14 @@ static bool static_hdmi_pcm; | |||
| 45 | module_param(static_hdmi_pcm, bool, 0644); | 45 | module_param(static_hdmi_pcm, bool, 0644); |
| 46 | MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); | 46 | MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); |
| 47 | 47 | ||
| 48 | #define is_haswell(codec) ((codec)->vendor_id == 0x80862807) | 48 | #define is_haswell(codec) ((codec)->core.vendor_id == 0x80862807) |
| 49 | #define is_broadwell(codec) ((codec)->vendor_id == 0x80862808) | 49 | #define is_broadwell(codec) ((codec)->core.vendor_id == 0x80862808) |
| 50 | #define is_skylake(codec) ((codec)->vendor_id == 0x80862809) | 50 | #define is_skylake(codec) ((codec)->core.vendor_id == 0x80862809) |
| 51 | #define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \ | 51 | #define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \ |
| 52 | || is_skylake(codec)) | 52 | || is_skylake(codec)) |
| 53 | 53 | ||
| 54 | #define is_valleyview(codec) ((codec)->vendor_id == 0x80862882) | 54 | #define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882) |
| 55 | #define is_cherryview(codec) ((codec)->vendor_id == 0x80862883) | 55 | #define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883) |
| 56 | #define is_valleyview_plus(codec) (is_valleyview(codec) || is_cherryview(codec)) | 56 | #define is_valleyview_plus(codec) (is_valleyview(codec) || is_cherryview(codec)) |
| 57 | 57 | ||
| 58 | struct hdmi_spec_per_cvt { | 58 | struct hdmi_spec_per_cvt { |
| @@ -1391,13 +1391,12 @@ static void intel_not_share_assigned_cvt(struct hda_codec *codec, | |||
| 1391 | hda_nid_t pin_nid, int mux_idx) | 1391 | hda_nid_t pin_nid, int mux_idx) |
| 1392 | { | 1392 | { |
| 1393 | struct hdmi_spec *spec = codec->spec; | 1393 | struct hdmi_spec *spec = codec->spec; |
| 1394 | hda_nid_t nid, end_nid; | 1394 | hda_nid_t nid; |
| 1395 | int cvt_idx, curr; | 1395 | int cvt_idx, curr; |
| 1396 | struct hdmi_spec_per_cvt *per_cvt; | 1396 | struct hdmi_spec_per_cvt *per_cvt; |
| 1397 | 1397 | ||
| 1398 | /* configure all pins, including "no physical connection" ones */ | 1398 | /* configure all pins, including "no physical connection" ones */ |
| 1399 | end_nid = codec->start_nid + codec->num_nodes; | 1399 | for_each_hda_codec_node(nid, codec) { |
| 1400 | for (nid = codec->start_nid; nid < end_nid; nid++) { | ||
| 1401 | unsigned int wid_caps = get_wcaps(codec, nid); | 1400 | unsigned int wid_caps = get_wcaps(codec, nid); |
| 1402 | unsigned int wid_type = get_wcaps_type(wid_caps); | 1401 | unsigned int wid_type = get_wcaps_type(wid_caps); |
| 1403 | 1402 | ||
| @@ -1728,7 +1727,7 @@ static int hdmi_parse_codec(struct hda_codec *codec) | |||
| 1728 | hda_nid_t nid; | 1727 | hda_nid_t nid; |
| 1729 | int i, nodes; | 1728 | int i, nodes; |
| 1730 | 1729 | ||
| 1731 | nodes = snd_hda_get_sub_nodes(codec, codec->afg, &nid); | 1730 | nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &nid); |
| 1732 | if (!nid || nodes < 0) { | 1731 | if (!nid || nodes < 0) { |
| 1733 | codec_warn(codec, "HDMI: failed to get afg sub nodes\n"); | 1732 | codec_warn(codec, "HDMI: failed to get afg sub nodes\n"); |
| 1734 | return -EINVAL; | 1733 | return -EINVAL; |
| @@ -2928,7 +2927,8 @@ static int patch_nvhdmi(struct hda_codec *codec) | |||
| 2928 | */ | 2927 | */ |
| 2929 | 2928 | ||
| 2930 | #define is_amdhdmi_rev3_or_later(codec) \ | 2929 | #define is_amdhdmi_rev3_or_later(codec) \ |
| 2931 | ((codec)->vendor_id == 0x1002aa01 && ((codec)->revision_id & 0xff00) >= 0x0300) | 2930 | ((codec)->core.vendor_id == 0x1002aa01 && \ |
| 2931 | ((codec)->core.revision_id & 0xff00) >= 0x0300) | ||
| 2932 | #define has_amd_full_remap_support(codec) is_amdhdmi_rev3_or_later(codec) | 2932 | #define has_amd_full_remap_support(codec) is_amdhdmi_rev3_or_later(codec) |
| 2933 | 2933 | ||
| 2934 | /* ATI/AMD specific HDA pin verbs, see the AMD HDA Verbs specification */ | 2934 | /* ATI/AMD specific HDA pin verbs, see the AMD HDA Verbs specification */ |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 124eacf67fc4..eee4532ab5f6 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -299,7 +299,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) | |||
| 299 | 299 | ||
| 300 | coef = alc_get_coef0(codec); | 300 | coef = alc_get_coef0(codec); |
| 301 | 301 | ||
| 302 | switch (codec->vendor_id) { | 302 | switch (codec->core.vendor_id) { |
| 303 | case 0x10ec0262: | 303 | case 0x10ec0262: |
| 304 | alc_update_coef_idx(codec, 0x7, 0, 1<<5); | 304 | alc_update_coef_idx(codec, 0x7, 0, 1<<5); |
| 305 | break; | 305 | break; |
| @@ -432,7 +432,7 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type) | |||
| 432 | snd_hda_sequence_write(codec, alc_gpio3_init_verbs); | 432 | snd_hda_sequence_write(codec, alc_gpio3_init_verbs); |
| 433 | break; | 433 | break; |
| 434 | case ALC_INIT_DEFAULT: | 434 | case ALC_INIT_DEFAULT: |
| 435 | switch (codec->vendor_id) { | 435 | switch (codec->core.vendor_id) { |
| 436 | case 0x10ec0260: | 436 | case 0x10ec0260: |
| 437 | alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010); | 437 | alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010); |
| 438 | break; | 438 | break; |
| @@ -498,18 +498,18 @@ static int alc_auto_parse_customize_define(struct hda_codec *codec) | |||
| 498 | 498 | ||
| 499 | if (!codec->bus->pci) | 499 | if (!codec->bus->pci) |
| 500 | return -1; | 500 | return -1; |
| 501 | ass = codec->subsystem_id & 0xffff; | 501 | ass = codec->core.subsystem_id & 0xffff; |
| 502 | if (ass != codec->bus->pci->subsystem_device && (ass & 1)) | 502 | if (ass != codec->bus->pci->subsystem_device && (ass & 1)) |
| 503 | goto do_sku; | 503 | goto do_sku; |
| 504 | 504 | ||
| 505 | nid = 0x1d; | 505 | nid = 0x1d; |
| 506 | if (codec->vendor_id == 0x10ec0260) | 506 | if (codec->core.vendor_id == 0x10ec0260) |
| 507 | nid = 0x17; | 507 | nid = 0x17; |
| 508 | ass = snd_hda_codec_get_pincfg(codec, nid); | 508 | ass = snd_hda_codec_get_pincfg(codec, nid); |
| 509 | 509 | ||
| 510 | if (!(ass & 1)) { | 510 | if (!(ass & 1)) { |
| 511 | codec_info(codec, "%s: SKU not ready 0x%08x\n", | 511 | codec_info(codec, "%s: SKU not ready 0x%08x\n", |
| 512 | codec->chip_name, ass); | 512 | codec->core.chip_name, ass); |
| 513 | return -1; | 513 | return -1; |
| 514 | } | 514 | } |
| 515 | 515 | ||
| @@ -585,7 +585,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports) | |||
| 585 | goto do_sku; | 585 | goto do_sku; |
| 586 | } | 586 | } |
| 587 | 587 | ||
| 588 | ass = codec->subsystem_id & 0xffff; | 588 | ass = codec->core.subsystem_id & 0xffff; |
| 589 | if (codec->bus->pci && | 589 | if (codec->bus->pci && |
| 590 | ass != codec->bus->pci->subsystem_device && (ass & 1)) | 590 | ass != codec->bus->pci->subsystem_device && (ass & 1)) |
| 591 | goto do_sku; | 591 | goto do_sku; |
| @@ -600,7 +600,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports) | |||
| 600 | * 0 : override | 600 | * 0 : override |
| 601 | */ | 601 | */ |
| 602 | nid = 0x1d; | 602 | nid = 0x1d; |
| 603 | if (codec->vendor_id == 0x10ec0260) | 603 | if (codec->core.vendor_id == 0x10ec0260) |
| 604 | nid = 0x17; | 604 | nid = 0x17; |
| 605 | ass = snd_hda_codec_get_pincfg(codec, nid); | 605 | ass = snd_hda_codec_get_pincfg(codec, nid); |
| 606 | codec_dbg(codec, | 606 | codec_dbg(codec, |
| @@ -621,7 +621,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports) | |||
| 621 | return 0; | 621 | return 0; |
| 622 | do_sku: | 622 | do_sku: |
| 623 | codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n", | 623 | codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n", |
| 624 | ass & 0xffff, codec->vendor_id); | 624 | ass & 0xffff, codec->core.vendor_id); |
| 625 | /* | 625 | /* |
| 626 | * 0 : override | 626 | * 0 : override |
| 627 | * 1 : Swap Jack | 627 | * 1 : Swap Jack |
| @@ -826,9 +826,9 @@ static const struct hda_codec_ops alc_patch_ops = { | |||
| 826 | /* replace the codec chip_name with the given string */ | 826 | /* replace the codec chip_name with the given string */ |
| 827 | static int alc_codec_rename(struct hda_codec *codec, const char *name) | 827 | static int alc_codec_rename(struct hda_codec *codec, const char *name) |
| 828 | { | 828 | { |
| 829 | kfree(codec->chip_name); | 829 | kfree(codec->core.chip_name); |
| 830 | codec->chip_name = kstrdup(name, GFP_KERNEL); | 830 | codec->core.chip_name = kstrdup(name, GFP_KERNEL); |
| 831 | if (!codec->chip_name) { | 831 | if (!codec->core.chip_name) { |
| 832 | alc_free(codec); | 832 | alc_free(codec); |
| 833 | return -ENOMEM; | 833 | return -ENOMEM; |
| 834 | } | 834 | } |
| @@ -904,7 +904,7 @@ static int alc_codec_rename_from_preset(struct hda_codec *codec) | |||
| 904 | const struct alc_codec_rename_pci_table *q; | 904 | const struct alc_codec_rename_pci_table *q; |
| 905 | 905 | ||
| 906 | for (p = rename_tbl; p->vendor_id; p++) { | 906 | for (p = rename_tbl; p->vendor_id; p++) { |
| 907 | if (p->vendor_id != codec->vendor_id) | 907 | if (p->vendor_id != codec->core.vendor_id) |
| 908 | continue; | 908 | continue; |
| 909 | if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits) | 909 | if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits) |
| 910 | return alc_codec_rename(codec, p->name); | 910 | return alc_codec_rename(codec, p->name); |
| @@ -913,7 +913,7 @@ static int alc_codec_rename_from_preset(struct hda_codec *codec) | |||
| 913 | if (!codec->bus->pci) | 913 | if (!codec->bus->pci) |
| 914 | return 0; | 914 | return 0; |
| 915 | for (q = rename_pci_tbl; q->codec_vendor_id; q++) { | 915 | for (q = rename_pci_tbl; q->codec_vendor_id; q++) { |
| 916 | if (q->codec_vendor_id != codec->vendor_id) | 916 | if (q->codec_vendor_id != codec->core.vendor_id) |
| 917 | continue; | 917 | continue; |
| 918 | if (q->pci_subvendor != codec->bus->pci->subsystem_vendor) | 918 | if (q->pci_subvendor != codec->bus->pci->subsystem_vendor) |
| 919 | continue; | 919 | continue; |
| @@ -1785,7 +1785,7 @@ static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted) | |||
| 1785 | { | 1785 | { |
| 1786 | unsigned int gpiostate, gpiomask, gpiodir; | 1786 | unsigned int gpiostate, gpiomask, gpiodir; |
| 1787 | 1787 | ||
| 1788 | gpiostate = snd_hda_codec_read(codec, codec->afg, 0, | 1788 | gpiostate = snd_hda_codec_read(codec, codec->core.afg, 0, |
| 1789 | AC_VERB_GET_GPIO_DATA, 0); | 1789 | AC_VERB_GET_GPIO_DATA, 0); |
| 1790 | 1790 | ||
| 1791 | if (!muted) | 1791 | if (!muted) |
| @@ -1793,23 +1793,23 @@ static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted) | |||
| 1793 | else | 1793 | else |
| 1794 | gpiostate &= ~(1 << pin); | 1794 | gpiostate &= ~(1 << pin); |
| 1795 | 1795 | ||
| 1796 | gpiomask = snd_hda_codec_read(codec, codec->afg, 0, | 1796 | gpiomask = snd_hda_codec_read(codec, codec->core.afg, 0, |
| 1797 | AC_VERB_GET_GPIO_MASK, 0); | 1797 | AC_VERB_GET_GPIO_MASK, 0); |
| 1798 | gpiomask |= (1 << pin); | 1798 | gpiomask |= (1 << pin); |
| 1799 | 1799 | ||
| 1800 | gpiodir = snd_hda_codec_read(codec, codec->afg, 0, | 1800 | gpiodir = snd_hda_codec_read(codec, codec->core.afg, 0, |
| 1801 | AC_VERB_GET_GPIO_DIRECTION, 0); | 1801 | AC_VERB_GET_GPIO_DIRECTION, 0); |
| 1802 | gpiodir |= (1 << pin); | 1802 | gpiodir |= (1 << pin); |
| 1803 | 1803 | ||
| 1804 | 1804 | ||
| 1805 | snd_hda_codec_write(codec, codec->afg, 0, | 1805 | snd_hda_codec_write(codec, codec->core.afg, 0, |
| 1806 | AC_VERB_SET_GPIO_MASK, gpiomask); | 1806 | AC_VERB_SET_GPIO_MASK, gpiomask); |
| 1807 | snd_hda_codec_write(codec, codec->afg, 0, | 1807 | snd_hda_codec_write(codec, codec->core.afg, 0, |
| 1808 | AC_VERB_SET_GPIO_DIRECTION, gpiodir); | 1808 | AC_VERB_SET_GPIO_DIRECTION, gpiodir); |
| 1809 | 1809 | ||
| 1810 | msleep(1); | 1810 | msleep(1); |
| 1811 | 1811 | ||
| 1812 | snd_hda_codec_write(codec, codec->afg, 0, | 1812 | snd_hda_codec_write(codec, codec->core.afg, 0, |
| 1813 | AC_VERB_SET_GPIO_DATA, gpiostate); | 1813 | AC_VERB_SET_GPIO_DATA, gpiostate); |
| 1814 | } | 1814 | } |
| 1815 | 1815 | ||
| @@ -2269,7 +2269,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 2269 | 2269 | ||
| 2270 | spec = codec->spec; | 2270 | spec = codec->spec; |
| 2271 | 2271 | ||
| 2272 | switch (codec->vendor_id) { | 2272 | switch (codec->core.vendor_id) { |
| 2273 | case 0x10ec0882: | 2273 | case 0x10ec0882: |
| 2274 | case 0x10ec0885: | 2274 | case 0x10ec0885: |
| 2275 | case 0x10ec0900: | 2275 | case 0x10ec0900: |
| @@ -3067,7 +3067,7 @@ static int alc269_resume(struct hda_codec *codec) | |||
| 3067 | * in the driver. | 3067 | * in the driver. |
| 3068 | */ | 3068 | */ |
| 3069 | if (spec->gpio_led) | 3069 | if (spec->gpio_led) |
| 3070 | snd_hda_codec_write(codec, codec->afg, 0, AC_VERB_SET_GPIO_DATA, | 3070 | snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_DATA, |
| 3071 | spec->gpio_led); | 3071 | spec->gpio_led); |
| 3072 | 3072 | ||
| 3073 | if (spec->has_alc5505_dsp) | 3073 | if (spec->has_alc5505_dsp) |
| @@ -3112,8 +3112,8 @@ static void alc271_fixup_dmic(struct hda_codec *codec, | |||
| 3112 | }; | 3112 | }; |
| 3113 | unsigned int cfg; | 3113 | unsigned int cfg; |
| 3114 | 3114 | ||
| 3115 | if (strcmp(codec->chip_name, "ALC271X") && | 3115 | if (strcmp(codec->core.chip_name, "ALC271X") && |
| 3116 | strcmp(codec->chip_name, "ALC269VB")) | 3116 | strcmp(codec->core.chip_name, "ALC269VB")) |
| 3117 | return; | 3117 | return; |
| 3118 | cfg = snd_hda_codec_get_pincfg(codec, 0x12); | 3118 | cfg = snd_hda_codec_get_pincfg(codec, 0x12); |
| 3119 | if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED) | 3119 | if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED) |
| @@ -3479,9 +3479,9 @@ static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec, | |||
| 3479 | } | 3479 | } |
| 3480 | 3480 | ||
| 3481 | snd_hda_add_verbs(codec, gpio_init); | 3481 | snd_hda_add_verbs(codec, gpio_init); |
| 3482 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 3482 | snd_hda_codec_write_cache(codec, codec->core.afg, 0, |
| 3483 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04); | 3483 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04); |
| 3484 | snd_hda_jack_detect_enable_callback(codec, codec->afg, | 3484 | snd_hda_jack_detect_enable_callback(codec, codec->core.afg, |
| 3485 | gpio2_mic_hotkey_event); | 3485 | gpio2_mic_hotkey_event); |
| 3486 | 3486 | ||
| 3487 | spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook; | 3487 | spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook; |
| @@ -3564,7 +3564,7 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec) | |||
| 3564 | {} | 3564 | {} |
| 3565 | }; | 3565 | }; |
| 3566 | 3566 | ||
| 3567 | switch (codec->vendor_id) { | 3567 | switch (codec->core.vendor_id) { |
| 3568 | case 0x10ec0255: | 3568 | case 0x10ec0255: |
| 3569 | alc_process_coef_fw(codec, coef0255); | 3569 | alc_process_coef_fw(codec, coef0255); |
| 3570 | break; | 3570 | break; |
| @@ -3619,7 +3619,7 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, | |||
| 3619 | {} | 3619 | {} |
| 3620 | }; | 3620 | }; |
| 3621 | 3621 | ||
| 3622 | switch (codec->vendor_id) { | 3622 | switch (codec->core.vendor_id) { |
| 3623 | case 0x10ec0255: | 3623 | case 0x10ec0255: |
| 3624 | alc_write_coef_idx(codec, 0x45, 0xc489); | 3624 | alc_write_coef_idx(codec, 0x45, 0xc489); |
| 3625 | snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); | 3625 | snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); |
| @@ -3688,7 +3688,7 @@ static void alc_headset_mode_default(struct hda_codec *codec) | |||
| 3688 | {} | 3688 | {} |
| 3689 | }; | 3689 | }; |
| 3690 | 3690 | ||
| 3691 | switch (codec->vendor_id) { | 3691 | switch (codec->core.vendor_id) { |
| 3692 | case 0x10ec0255: | 3692 | case 0x10ec0255: |
| 3693 | alc_process_coef_fw(codec, coef0255); | 3693 | alc_process_coef_fw(codec, coef0255); |
| 3694 | break; | 3694 | break; |
| @@ -3742,7 +3742,7 @@ static void alc_headset_mode_ctia(struct hda_codec *codec) | |||
| 3742 | {} | 3742 | {} |
| 3743 | }; | 3743 | }; |
| 3744 | 3744 | ||
| 3745 | switch (codec->vendor_id) { | 3745 | switch (codec->core.vendor_id) { |
| 3746 | case 0x10ec0255: | 3746 | case 0x10ec0255: |
| 3747 | alc_process_coef_fw(codec, coef0255); | 3747 | alc_process_coef_fw(codec, coef0255); |
| 3748 | break; | 3748 | break; |
| @@ -3796,7 +3796,7 @@ static void alc_headset_mode_omtp(struct hda_codec *codec) | |||
| 3796 | {} | 3796 | {} |
| 3797 | }; | 3797 | }; |
| 3798 | 3798 | ||
| 3799 | switch (codec->vendor_id) { | 3799 | switch (codec->core.vendor_id) { |
| 3800 | case 0x10ec0255: | 3800 | case 0x10ec0255: |
| 3801 | alc_process_coef_fw(codec, coef0255); | 3801 | alc_process_coef_fw(codec, coef0255); |
| 3802 | break; | 3802 | break; |
| @@ -3841,7 +3841,7 @@ static void alc_determine_headset_type(struct hda_codec *codec) | |||
| 3841 | {} | 3841 | {} |
| 3842 | }; | 3842 | }; |
| 3843 | 3843 | ||
| 3844 | switch (codec->vendor_id) { | 3844 | switch (codec->core.vendor_id) { |
| 3845 | case 0x10ec0255: | 3845 | case 0x10ec0255: |
| 3846 | alc_process_coef_fw(codec, coef0255); | 3846 | alc_process_coef_fw(codec, coef0255); |
| 3847 | msleep(300); | 3847 | msleep(300); |
| @@ -4078,7 +4078,7 @@ static unsigned int alc_power_filter_xps13(struct hda_codec *codec, | |||
| 4078 | 4078 | ||
| 4079 | /* Avoid pop noises when headphones are plugged in */ | 4079 | /* Avoid pop noises when headphones are plugged in */ |
| 4080 | if (spec->gen.hp_jack_present) | 4080 | if (spec->gen.hp_jack_present) |
| 4081 | if (nid == codec->afg || nid == 0x02 || nid == 0x15) | 4081 | if (nid == codec->core.afg || nid == 0x02 || nid == 0x15) |
| 4082 | return AC_PWRST_D0; | 4082 | return AC_PWRST_D0; |
| 4083 | return power_state; | 4083 | return power_state; |
| 4084 | } | 4084 | } |
| @@ -5428,7 +5428,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 5428 | if (has_cdefine_beep(codec)) | 5428 | if (has_cdefine_beep(codec)) |
| 5429 | spec->gen.beep_nid = 0x01; | 5429 | spec->gen.beep_nid = 0x01; |
| 5430 | 5430 | ||
| 5431 | switch (codec->vendor_id) { | 5431 | switch (codec->core.vendor_id) { |
| 5432 | case 0x10ec0269: | 5432 | case 0x10ec0269: |
| 5433 | spec->codec_variant = ALC269_TYPE_ALC269VA; | 5433 | spec->codec_variant = ALC269_TYPE_ALC269VA; |
| 5434 | switch (alc_get_coef0(codec) & 0x00f0) { | 5434 | switch (alc_get_coef0(codec) & 0x00f0) { |
| @@ -5772,9 +5772,9 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
| 5772 | static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 }; | 5772 | static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 }; |
| 5773 | const hda_nid_t *ssids; | 5773 | const hda_nid_t *ssids; |
| 5774 | 5774 | ||
| 5775 | if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 || | 5775 | if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 || |
| 5776 | codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670 || | 5776 | codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 || |
| 5777 | codec->vendor_id == 0x10ec0671) | 5777 | codec->core.vendor_id == 0x10ec0671) |
| 5778 | ssids = alc663_ssids; | 5778 | ssids = alc663_ssids; |
| 5779 | else | 5779 | else |
| 5780 | ssids = alc662_ssids; | 5780 | ssids = alc662_ssids; |
| @@ -5819,7 +5819,7 @@ static unsigned int gpio_led_power_filter(struct hda_codec *codec, | |||
| 5819 | unsigned int power_state) | 5819 | unsigned int power_state) |
| 5820 | { | 5820 | { |
| 5821 | struct alc_spec *spec = codec->spec; | 5821 | struct alc_spec *spec = codec->spec; |
| 5822 | if (nid == codec->afg && power_state == AC_PWRST_D3 && spec->gpio_led) | 5822 | if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_led) |
| 5823 | return AC_PWRST_D0; | 5823 | return AC_PWRST_D0; |
| 5824 | return power_state; | 5824 | return power_state; |
| 5825 | } | 5825 | } |
| @@ -6317,7 +6317,7 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 6317 | 6317 | ||
| 6318 | alc_fix_pll_init(codec, 0x20, 0x04, 15); | 6318 | alc_fix_pll_init(codec, 0x20, 0x04, 15); |
| 6319 | 6319 | ||
| 6320 | switch (codec->vendor_id) { | 6320 | switch (codec->core.vendor_id) { |
| 6321 | case 0x10ec0668: | 6321 | case 0x10ec0668: |
| 6322 | spec->init_hook = alc668_restore_default_value; | 6322 | spec->init_hook = alc668_restore_default_value; |
| 6323 | break; | 6323 | break; |
| @@ -6347,7 +6347,7 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 6347 | goto error; | 6347 | goto error; |
| 6348 | 6348 | ||
| 6349 | if (!spec->gen.no_analog && spec->gen.beep_nid) { | 6349 | if (!spec->gen.no_analog && spec->gen.beep_nid) { |
| 6350 | switch (codec->vendor_id) { | 6350 | switch (codec->core.vendor_id) { |
| 6351 | case 0x10ec0662: | 6351 | case 0x10ec0662: |
| 6352 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 6352 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
| 6353 | break; | 6353 | break; |
diff --git a/sound/pci/hda/patch_si3054.c b/sound/pci/hda/patch_si3054.c index df243134baa8..49b4868797a5 100644 --- a/sound/pci/hda/patch_si3054.c +++ b/sound/pci/hda/patch_si3054.c | |||
| @@ -205,8 +205,8 @@ static int si3054_build_pcms(struct hda_codec *codec) | |||
| 205 | return -ENOMEM; | 205 | return -ENOMEM; |
| 206 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = si3054_pcm; | 206 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = si3054_pcm; |
| 207 | info->stream[SNDRV_PCM_STREAM_CAPTURE] = si3054_pcm; | 207 | info->stream[SNDRV_PCM_STREAM_CAPTURE] = si3054_pcm; |
| 208 | info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = codec->mfg; | 208 | info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = codec->core.mfg; |
| 209 | info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = codec->mfg; | 209 | info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = codec->core.mfg; |
| 210 | info->pcm_type = HDA_PCM_TYPE_MODEM; | 210 | info->pcm_type = HDA_PCM_TYPE_MODEM; |
| 211 | return 0; | 211 | return 0; |
| 212 | } | 212 | } |
| @@ -223,7 +223,7 @@ static int si3054_init(struct hda_codec *codec) | |||
| 223 | u16 val; | 223 | u16 val; |
| 224 | 224 | ||
| 225 | snd_hda_codec_write(codec, AC_NODE_ROOT, 0, AC_VERB_SET_CODEC_RESET, 0); | 225 | snd_hda_codec_write(codec, AC_NODE_ROOT, 0, AC_VERB_SET_CODEC_RESET, 0); |
| 226 | snd_hda_codec_write(codec, codec->mfg, 0, AC_VERB_SET_STREAM_FORMAT, 0); | 226 | snd_hda_codec_write(codec, codec->core.mfg, 0, AC_VERB_SET_STREAM_FORMAT, 0); |
| 227 | SET_REG(codec, SI3054_LINE_RATE, 9600); | 227 | SET_REG(codec, SI3054_LINE_RATE, 9600); |
| 228 | SET_REG(codec, SI3054_LINE_LEVEL, SI3054_DTAG_MASK|SI3054_ATAG_MASK); | 228 | SET_REG(codec, SI3054_LINE_LEVEL, SI3054_DTAG_MASK|SI3054_ATAG_MASK); |
| 229 | SET_REG(codec, SI3054_EXTENDED_MID, 0); | 229 | SET_REG(codec, SI3054_EXTENDED_MID, 0); |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 5b7c173adcb8..b314551749f1 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -299,32 +299,33 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask, | |||
| 299 | unsigned int dir_mask, unsigned int data) | 299 | unsigned int dir_mask, unsigned int data) |
| 300 | { | 300 | { |
| 301 | unsigned int gpiostate, gpiomask, gpiodir; | 301 | unsigned int gpiostate, gpiomask, gpiodir; |
| 302 | hda_nid_t fg = codec->core.afg; | ||
| 302 | 303 | ||
| 303 | codec_dbg(codec, "%s msk %x dir %x gpio %x\n", __func__, mask, dir_mask, data); | 304 | codec_dbg(codec, "%s msk %x dir %x gpio %x\n", __func__, mask, dir_mask, data); |
| 304 | 305 | ||
| 305 | gpiostate = snd_hda_codec_read(codec, codec->afg, 0, | 306 | gpiostate = snd_hda_codec_read(codec, fg, 0, |
| 306 | AC_VERB_GET_GPIO_DATA, 0); | 307 | AC_VERB_GET_GPIO_DATA, 0); |
| 307 | gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask); | 308 | gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask); |
| 308 | 309 | ||
| 309 | gpiomask = snd_hda_codec_read(codec, codec->afg, 0, | 310 | gpiomask = snd_hda_codec_read(codec, fg, 0, |
| 310 | AC_VERB_GET_GPIO_MASK, 0); | 311 | AC_VERB_GET_GPIO_MASK, 0); |
| 311 | gpiomask |= mask; | 312 | gpiomask |= mask; |
| 312 | 313 | ||
| 313 | gpiodir = snd_hda_codec_read(codec, codec->afg, 0, | 314 | gpiodir = snd_hda_codec_read(codec, fg, 0, |
| 314 | AC_VERB_GET_GPIO_DIRECTION, 0); | 315 | AC_VERB_GET_GPIO_DIRECTION, 0); |
| 315 | gpiodir |= dir_mask; | 316 | gpiodir |= dir_mask; |
| 316 | 317 | ||
| 317 | /* Configure GPIOx as CMOS */ | 318 | /* Configure GPIOx as CMOS */ |
| 318 | snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0); | 319 | snd_hda_codec_write(codec, fg, 0, 0x7e7, 0); |
| 319 | 320 | ||
| 320 | snd_hda_codec_write(codec, codec->afg, 0, | 321 | snd_hda_codec_write(codec, fg, 0, |
| 321 | AC_VERB_SET_GPIO_MASK, gpiomask); | 322 | AC_VERB_SET_GPIO_MASK, gpiomask); |
| 322 | snd_hda_codec_read(codec, codec->afg, 0, | 323 | snd_hda_codec_read(codec, fg, 0, |
| 323 | AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */ | 324 | AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */ |
| 324 | 325 | ||
| 325 | msleep(1); | 326 | msleep(1); |
| 326 | 327 | ||
| 327 | snd_hda_codec_read(codec, codec->afg, 0, | 328 | snd_hda_codec_read(codec, fg, 0, |
| 328 | AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ | 329 | AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ |
| 329 | } | 330 | } |
| 330 | 331 | ||
| @@ -387,7 +388,7 @@ static unsigned int stac_vref_led_power_filter(struct hda_codec *codec, | |||
| 387 | hda_nid_t nid, | 388 | hda_nid_t nid, |
| 388 | unsigned int power_state) | 389 | unsigned int power_state) |
| 389 | { | 390 | { |
| 390 | if (nid == codec->afg && power_state == AC_PWRST_D3) | 391 | if (nid == codec->core.afg && power_state == AC_PWRST_D3) |
| 391 | return AC_PWRST_D1; | 392 | return AC_PWRST_D1; |
| 392 | return snd_hda_gen_path_power_filter(codec, nid, power_state); | 393 | return snd_hda_gen_path_power_filter(codec, nid, power_state); |
| 393 | } | 394 | } |
| @@ -432,7 +433,7 @@ static void stac_update_outputs(struct hda_codec *codec) | |||
| 432 | 433 | ||
| 433 | if (spec->gpio_mute) | 434 | if (spec->gpio_mute) |
| 434 | spec->gen.master_mute = | 435 | spec->gen.master_mute = |
| 435 | !(snd_hda_codec_read(codec, codec->afg, 0, | 436 | !(snd_hda_codec_read(codec, codec->core.afg, 0, |
| 436 | AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute); | 437 | AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute); |
| 437 | 438 | ||
| 438 | snd_hda_gen_update_outputs(codec); | 439 | snd_hda_gen_update_outputs(codec); |
| @@ -476,7 +477,7 @@ static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, | |||
| 476 | if (val != spec->power_map_bits) { | 477 | if (val != spec->power_map_bits) { |
| 477 | spec->power_map_bits = val; | 478 | spec->power_map_bits = val; |
| 478 | if (do_write) | 479 | if (do_write) |
| 479 | snd_hda_codec_write(codec, codec->afg, 0, | 480 | snd_hda_codec_write(codec, codec->core.afg, 0, |
| 480 | AC_VERB_IDT_SET_POWER_MAP, val); | 481 | AC_VERB_IDT_SET_POWER_MAP, val); |
| 481 | } | 482 | } |
| 482 | } | 483 | } |
| @@ -508,7 +509,8 @@ static void jack_update_power(struct hda_codec *codec, | |||
| 508 | false); | 509 | false); |
| 509 | } | 510 | } |
| 510 | 511 | ||
| 511 | snd_hda_codec_write(codec, codec->afg, 0, AC_VERB_IDT_SET_POWER_MAP, | 512 | snd_hda_codec_write(codec, codec->core.afg, 0, |
| 513 | AC_VERB_IDT_SET_POWER_MAP, | ||
| 512 | spec->power_map_bits); | 514 | spec->power_map_bits); |
| 513 | } | 515 | } |
| 514 | 516 | ||
| @@ -517,10 +519,10 @@ static void stac_vref_event(struct hda_codec *codec, | |||
| 517 | { | 519 | { |
| 518 | unsigned int data; | 520 | unsigned int data; |
| 519 | 521 | ||
| 520 | data = snd_hda_codec_read(codec, codec->afg, 0, | 522 | data = snd_hda_codec_read(codec, codec->core.afg, 0, |
| 521 | AC_VERB_GET_GPIO_DATA, 0); | 523 | AC_VERB_GET_GPIO_DATA, 0); |
| 522 | /* toggle VREF state based on GPIOx status */ | 524 | /* toggle VREF state based on GPIOx status */ |
| 523 | snd_hda_codec_write(codec, codec->afg, 0, 0x7e0, | 525 | snd_hda_codec_write(codec, codec->core.afg, 0, 0x7e0, |
| 524 | !!(data & (1 << event->private_data))); | 526 | !!(data & (1 << event->private_data))); |
| 525 | } | 527 | } |
| 526 | 528 | ||
| @@ -622,7 +624,7 @@ static int stac_aloopback_put(struct snd_kcontrol *kcontrol, | |||
| 622 | /* Only return the bits defined by the shift value of the | 624 | /* Only return the bits defined by the shift value of the |
| 623 | * first two bytes of the mask | 625 | * first two bytes of the mask |
| 624 | */ | 626 | */ |
| 625 | dac_mode = snd_hda_codec_read(codec, codec->afg, 0, | 627 | dac_mode = snd_hda_codec_read(codec, codec->core.afg, 0, |
| 626 | kcontrol->private_value & 0xFFFF, 0x0); | 628 | kcontrol->private_value & 0xFFFF, 0x0); |
| 627 | dac_mode >>= spec->aloopback_shift; | 629 | dac_mode >>= spec->aloopback_shift; |
| 628 | 630 | ||
| @@ -634,7 +636,7 @@ static int stac_aloopback_put(struct snd_kcontrol *kcontrol, | |||
| 634 | dac_mode &= ~idx_val; | 636 | dac_mode &= ~idx_val; |
| 635 | } | 637 | } |
| 636 | 638 | ||
| 637 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 639 | snd_hda_codec_write_cache(codec, codec->core.afg, 0, |
| 638 | kcontrol->private_value >> 16, dac_mode); | 640 | kcontrol->private_value >> 16, dac_mode); |
| 639 | 641 | ||
| 640 | return 1; | 642 | return 1; |
| @@ -658,11 +660,11 @@ static int stac_aloopback_put(struct snd_kcontrol *kcontrol, | |||
| 658 | /* check whether it's a HP laptop with a docking port */ | 660 | /* check whether it's a HP laptop with a docking port */ |
| 659 | static bool hp_bnb2011_with_dock(struct hda_codec *codec) | 661 | static bool hp_bnb2011_with_dock(struct hda_codec *codec) |
| 660 | { | 662 | { |
| 661 | if (codec->vendor_id != 0x111d7605 && | 663 | if (codec->core.vendor_id != 0x111d7605 && |
| 662 | codec->vendor_id != 0x111d76d1) | 664 | codec->core.vendor_id != 0x111d76d1) |
| 663 | return false; | 665 | return false; |
| 664 | 666 | ||
| 665 | switch (codec->subsystem_id) { | 667 | switch (codec->core.subsystem_id) { |
| 666 | case 0x103c1618: | 668 | case 0x103c1618: |
| 667 | case 0x103c1619: | 669 | case 0x103c1619: |
| 668 | case 0x103c161a: | 670 | case 0x103c161a: |
| @@ -733,7 +735,7 @@ static void set_hp_led_gpio(struct hda_codec *codec) | |||
| 733 | if (spec->gpio_led) | 735 | if (spec->gpio_led) |
| 734 | return; | 736 | return; |
| 735 | 737 | ||
| 736 | gpio = snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP); | 738 | gpio = snd_hda_param_read(codec, codec->core.afg, AC_PAR_GPIO_CAP); |
| 737 | gpio &= AC_GPIO_IO_COUNT; | 739 | gpio &= AC_GPIO_IO_COUNT; |
| 738 | if (gpio > 3) | 740 | if (gpio > 3) |
| 739 | spec->gpio_led = 0x08; /* GPIO 3 */ | 741 | spec->gpio_led = 0x08; /* GPIO 3 */ |
| @@ -777,7 +779,7 @@ static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) | |||
| 777 | &spec->gpio_led_polarity, | 779 | &spec->gpio_led_polarity, |
| 778 | &spec->gpio_led) == 2) { | 780 | &spec->gpio_led) == 2) { |
| 779 | unsigned int max_gpio; | 781 | unsigned int max_gpio; |
| 780 | max_gpio = snd_hda_param_read(codec, codec->afg, | 782 | max_gpio = snd_hda_param_read(codec, codec->core.afg, |
| 781 | AC_PAR_GPIO_CAP); | 783 | AC_PAR_GPIO_CAP); |
| 782 | max_gpio &= AC_GPIO_IO_COUNT; | 784 | max_gpio &= AC_GPIO_IO_COUNT; |
| 783 | if (spec->gpio_led < max_gpio) | 785 | if (spec->gpio_led < max_gpio) |
| @@ -807,7 +809,7 @@ static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) | |||
| 807 | * we statically set the GPIO - if not a B-series system | 809 | * we statically set the GPIO - if not a B-series system |
| 808 | * and default polarity is provided | 810 | * and default polarity is provided |
| 809 | */ | 811 | */ |
| 810 | if (!hp_blike_system(codec->subsystem_id) && | 812 | if (!hp_blike_system(codec->core.subsystem_id) && |
| 811 | (default_polarity == 0 || default_polarity == 1)) { | 813 | (default_polarity == 0 || default_polarity == 1)) { |
| 812 | set_hp_led_gpio(codec); | 814 | set_hp_led_gpio(codec); |
| 813 | spec->gpio_led_polarity = default_polarity; | 815 | spec->gpio_led_polarity = default_polarity; |
| @@ -2134,7 +2136,7 @@ static void stac92hd83xxx_fixup_hp_mic_led(struct hda_codec *codec, | |||
| 2134 | spec->mic_mute_led_gpio = 0x08; /* GPIO3 */ | 2136 | spec->mic_mute_led_gpio = 0x08; /* GPIO3 */ |
| 2135 | #ifdef CONFIG_PM | 2137 | #ifdef CONFIG_PM |
| 2136 | /* resetting controller clears GPIO, so we need to keep on */ | 2138 | /* resetting controller clears GPIO, so we need to keep on */ |
| 2137 | codec->d3_stop_clk = 0; | 2139 | codec->core.power_caps &= ~AC_PWRST_CLKSTOP; |
| 2138 | #endif | 2140 | #endif |
| 2139 | } | 2141 | } |
| 2140 | } | 2142 | } |
| @@ -3031,9 +3033,9 @@ static void stac92hd71bxx_fixup_hp_m4(struct hda_codec *codec, | |||
| 3031 | return; | 3033 | return; |
| 3032 | 3034 | ||
| 3033 | /* Enable VREF power saving on GPIO1 detect */ | 3035 | /* Enable VREF power saving on GPIO1 detect */ |
| 3034 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 3036 | snd_hda_codec_write_cache(codec, codec->core.afg, 0, |
| 3035 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); | 3037 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); |
| 3036 | jack = snd_hda_jack_detect_enable_callback(codec, codec->afg, | 3038 | jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg, |
| 3037 | stac_vref_event); | 3039 | stac_vref_event); |
| 3038 | if (!IS_ERR(jack)) | 3040 | if (!IS_ERR(jack)) |
| 3039 | jack->private_data = 0x02; | 3041 | jack->private_data = 0x02; |
| @@ -3093,7 +3095,7 @@ static void stac92hd71bxx_fixup_hp(struct hda_codec *codec, | |||
| 3093 | if (action != HDA_FIXUP_ACT_PRE_PROBE) | 3095 | if (action != HDA_FIXUP_ACT_PRE_PROBE) |
| 3094 | return; | 3096 | return; |
| 3095 | 3097 | ||
| 3096 | if (hp_blike_system(codec->subsystem_id)) { | 3098 | if (hp_blike_system(codec->core.subsystem_id)) { |
| 3097 | unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f); | 3099 | unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f); |
| 3098 | if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT || | 3100 | if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT || |
| 3099 | get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER || | 3101 | get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER || |
| @@ -3792,7 +3794,7 @@ static void stac927x_fixup_dell_dmic(struct hda_codec *codec, | |||
| 3792 | if (action != HDA_FIXUP_ACT_PRE_PROBE) | 3794 | if (action != HDA_FIXUP_ACT_PRE_PROBE) |
| 3793 | return; | 3795 | return; |
| 3794 | 3796 | ||
| 3795 | if (codec->subsystem_id != 0x1028022f) { | 3797 | if (codec->core.subsystem_id != 0x1028022f) { |
| 3796 | /* GPIO2 High = Enable EAPD */ | 3798 | /* GPIO2 High = Enable EAPD */ |
| 3797 | spec->eapd_mask = spec->gpio_mask = 0x04; | 3799 | spec->eapd_mask = spec->gpio_mask = 0x04; |
| 3798 | spec->gpio_dir = spec->gpio_data = 0x04; | 3800 | spec->gpio_dir = spec->gpio_data = 0x04; |
| @@ -4053,9 +4055,9 @@ static void stac9205_fixup_dell_m43(struct hda_codec *codec, | |||
| 4053 | snd_hda_apply_pincfgs(codec, dell_9205_m43_pin_configs); | 4055 | snd_hda_apply_pincfgs(codec, dell_9205_m43_pin_configs); |
| 4054 | 4056 | ||
| 4055 | /* Enable unsol response for GPIO4/Dock HP connection */ | 4057 | /* Enable unsol response for GPIO4/Dock HP connection */ |
| 4056 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 4058 | snd_hda_codec_write_cache(codec, codec->core.afg, 0, |
| 4057 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); | 4059 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); |
| 4058 | jack = snd_hda_jack_detect_enable_callback(codec, codec->afg, | 4060 | jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg, |
| 4059 | stac_vref_event); | 4061 | stac_vref_event); |
| 4060 | if (!IS_ERR(jack)) | 4062 | if (!IS_ERR(jack)) |
| 4061 | jack->private_data = 0x01; | 4063 | jack->private_data = 0x01; |
| @@ -4302,7 +4304,7 @@ static int stac_init(struct hda_codec *codec) | |||
| 4302 | 4304 | ||
| 4303 | /* sync the power-map */ | 4305 | /* sync the power-map */ |
| 4304 | if (spec->num_pwrs) | 4306 | if (spec->num_pwrs) |
| 4305 | snd_hda_codec_write(codec, codec->afg, 0, | 4307 | snd_hda_codec_write(codec, codec->core.afg, 0, |
| 4306 | AC_VERB_IDT_SET_POWER_MAP, | 4308 | AC_VERB_IDT_SET_POWER_MAP, |
| 4307 | spec->power_map_bits); | 4309 | spec->power_map_bits); |
| 4308 | 4310 | ||
| @@ -4338,7 +4340,7 @@ static void stac_shutup(struct hda_codec *codec) | |||
| 4338 | static void stac92hd_proc_hook(struct snd_info_buffer *buffer, | 4340 | static void stac92hd_proc_hook(struct snd_info_buffer *buffer, |
| 4339 | struct hda_codec *codec, hda_nid_t nid) | 4341 | struct hda_codec *codec, hda_nid_t nid) |
| 4340 | { | 4342 | { |
| 4341 | if (nid == codec->afg) | 4343 | if (nid == codec->core.afg) |
| 4342 | snd_iprintf(buffer, "Power-Map: 0x%02x\n", | 4344 | snd_iprintf(buffer, "Power-Map: 0x%02x\n", |
| 4343 | snd_hda_codec_read(codec, nid, 0, | 4345 | snd_hda_codec_read(codec, nid, 0, |
| 4344 | AC_VERB_IDT_GET_POWER_MAP, 0)); | 4346 | AC_VERB_IDT_GET_POWER_MAP, 0)); |
| @@ -4349,7 +4351,7 @@ static void analog_loop_proc_hook(struct snd_info_buffer *buffer, | |||
| 4349 | unsigned int verb) | 4351 | unsigned int verb) |
| 4350 | { | 4352 | { |
| 4351 | snd_iprintf(buffer, "Analog Loopback: 0x%02x\n", | 4353 | snd_iprintf(buffer, "Analog Loopback: 0x%02x\n", |
| 4352 | snd_hda_codec_read(codec, codec->afg, 0, verb, 0)); | 4354 | snd_hda_codec_read(codec, codec->core.afg, 0, verb, 0)); |
| 4353 | } | 4355 | } |
| 4354 | 4356 | ||
| 4355 | /* stac92hd71bxx, stac92hd73xx */ | 4357 | /* stac92hd71bxx, stac92hd73xx */ |
| @@ -4357,21 +4359,21 @@ static void stac92hd7x_proc_hook(struct snd_info_buffer *buffer, | |||
| 4357 | struct hda_codec *codec, hda_nid_t nid) | 4359 | struct hda_codec *codec, hda_nid_t nid) |
| 4358 | { | 4360 | { |
| 4359 | stac92hd_proc_hook(buffer, codec, nid); | 4361 | stac92hd_proc_hook(buffer, codec, nid); |
| 4360 | if (nid == codec->afg) | 4362 | if (nid == codec->core.afg) |
| 4361 | analog_loop_proc_hook(buffer, codec, 0xfa0); | 4363 | analog_loop_proc_hook(buffer, codec, 0xfa0); |
| 4362 | } | 4364 | } |
| 4363 | 4365 | ||
| 4364 | static void stac9205_proc_hook(struct snd_info_buffer *buffer, | 4366 | static void stac9205_proc_hook(struct snd_info_buffer *buffer, |
| 4365 | struct hda_codec *codec, hda_nid_t nid) | 4367 | struct hda_codec *codec, hda_nid_t nid) |
| 4366 | { | 4368 | { |
| 4367 | if (nid == codec->afg) | 4369 | if (nid == codec->core.afg) |
| 4368 | analog_loop_proc_hook(buffer, codec, 0xfe0); | 4370 | analog_loop_proc_hook(buffer, codec, 0xfe0); |
| 4369 | } | 4371 | } |
| 4370 | 4372 | ||
| 4371 | static void stac927x_proc_hook(struct snd_info_buffer *buffer, | 4373 | static void stac927x_proc_hook(struct snd_info_buffer *buffer, |
| 4372 | struct hda_codec *codec, hda_nid_t nid) | 4374 | struct hda_codec *codec, hda_nid_t nid) |
| 4373 | { | 4375 | { |
| 4374 | if (nid == codec->afg) | 4376 | if (nid == codec->core.afg) |
| 4375 | analog_loop_proc_hook(buffer, codec, 0xfeb); | 4377 | analog_loop_proc_hook(buffer, codec, 0xfeb); |
| 4376 | } | 4378 | } |
| 4377 | #else | 4379 | #else |
| @@ -4597,7 +4599,8 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) | |||
| 4597 | if (err < 0) | 4599 | if (err < 0) |
| 4598 | return err; | 4600 | return err; |
| 4599 | 4601 | ||
| 4600 | codec->epss = 0; /* longer delay needed for D3 */ | 4602 | /* longer delay needed for D3 */ |
| 4603 | codec->core.power_caps &= ~AC_PWRST_EPSS; | ||
| 4601 | 4604 | ||
| 4602 | spec = codec->spec; | 4605 | spec = codec->spec; |
| 4603 | codec->power_save_node = 1; | 4606 | codec->power_save_node = 1; |
| @@ -4647,7 +4650,8 @@ static int patch_stac92hd95(struct hda_codec *codec) | |||
| 4647 | if (err < 0) | 4650 | if (err < 0) |
| 4648 | return err; | 4651 | return err; |
| 4649 | 4652 | ||
| 4650 | codec->epss = 0; /* longer delay needed for D3 */ | 4653 | /* longer delay needed for D3 */ |
| 4654 | codec->core.power_caps &= ~AC_PWRST_EPSS; | ||
| 4651 | 4655 | ||
| 4652 | spec = codec->spec; | 4656 | spec = codec->spec; |
| 4653 | codec->power_save_node = 1; | 4657 | codec->power_save_node = 1; |
| @@ -4706,14 +4710,14 @@ static int patch_stac92hd71bxx(struct hda_codec *codec) | |||
| 4706 | spec->gpio_dir = 0x01; | 4710 | spec->gpio_dir = 0x01; |
| 4707 | spec->gpio_data = 0x01; | 4711 | spec->gpio_data = 0x01; |
| 4708 | 4712 | ||
| 4709 | switch (codec->vendor_id) { | 4713 | switch (codec->core.vendor_id) { |
| 4710 | case 0x111d76b6: /* 4 Port without Analog Mixer */ | 4714 | case 0x111d76b6: /* 4 Port without Analog Mixer */ |
| 4711 | case 0x111d76b7: | 4715 | case 0x111d76b7: |
| 4712 | unmute_init++; | 4716 | unmute_init++; |
| 4713 | break; | 4717 | break; |
| 4714 | case 0x111d7608: /* 5 Port with Analog Mixer */ | 4718 | case 0x111d7608: /* 5 Port with Analog Mixer */ |
| 4715 | if ((codec->revision_id & 0xf) == 0 || | 4719 | if ((codec->core.revision_id & 0xf) == 0 || |
| 4716 | (codec->revision_id & 0xf) == 1) | 4720 | (codec->core.revision_id & 0xf) == 1) |
| 4717 | spec->stream_delay = 40; /* 40 milliseconds */ | 4721 | spec->stream_delay = 40; /* 40 milliseconds */ |
| 4718 | 4722 | ||
| 4719 | /* disable VSW */ | 4723 | /* disable VSW */ |
| @@ -4722,7 +4726,7 @@ static int patch_stac92hd71bxx(struct hda_codec *codec) | |||
| 4722 | snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3); | 4726 | snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3); |
| 4723 | break; | 4727 | break; |
| 4724 | case 0x111d7603: /* 6 Port with Analog Mixer */ | 4728 | case 0x111d7603: /* 6 Port with Analog Mixer */ |
| 4725 | if ((codec->revision_id & 0xf) == 1) | 4729 | if ((codec->core.revision_id & 0xf) == 1) |
| 4726 | spec->stream_delay = 40; /* 40 milliseconds */ | 4730 | spec->stream_delay = 40; /* 40 milliseconds */ |
| 4727 | 4731 | ||
| 4728 | break; | 4732 | break; |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 485663bb9101..a34d7671937f 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
| @@ -140,7 +140,7 @@ static struct via_spec *via_new_spec(struct hda_codec *codec) | |||
| 140 | 140 | ||
| 141 | static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec) | 141 | static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec) |
| 142 | { | 142 | { |
| 143 | u32 vendor_id = codec->vendor_id; | 143 | u32 vendor_id = codec->core.vendor_id; |
| 144 | u16 ven_id = vendor_id >> 16; | 144 | u16 ven_id = vendor_id >> 16; |
| 145 | u16 dev_id = vendor_id & 0xffff; | 145 | u16 dev_id = vendor_id & 0xffff; |
| 146 | enum VIA_HDA_CODEC codec_type; | 146 | enum VIA_HDA_CODEC codec_type; |
| @@ -335,7 +335,7 @@ static void __analog_low_current_mode(struct hda_codec *codec, bool force) | |||
| 335 | return; /* other codecs are not supported */ | 335 | return; /* other codecs are not supported */ |
| 336 | } | 336 | } |
| 337 | /* send verb */ | 337 | /* send verb */ |
| 338 | snd_hda_codec_write(codec, codec->afg, 0, verb, parm); | 338 | snd_hda_codec_write(codec, codec->core.afg, 0, verb, parm); |
| 339 | } | 339 | } |
| 340 | 340 | ||
| 341 | static void analog_low_current_mode(struct hda_codec *codec) | 341 | static void analog_low_current_mode(struct hda_codec *codec) |
| @@ -558,7 +558,7 @@ static int vt1708_build_pcms(struct hda_codec *codec) | |||
| 558 | int i, err; | 558 | int i, err; |
| 559 | 559 | ||
| 560 | err = snd_hda_gen_build_pcms(codec); | 560 | err = snd_hda_gen_build_pcms(codec); |
| 561 | if (err < 0 || codec->vendor_id != 0x11061708) | 561 | if (err < 0 || codec->core.vendor_id != 0x11061708) |
| 562 | return err; | 562 | return err; |
| 563 | 563 | ||
| 564 | /* We got noisy outputs on the right channel on VT1708 when | 564 | /* We got noisy outputs on the right channel on VT1708 when |
| @@ -714,19 +714,19 @@ static int patch_vt1708S(struct hda_codec *codec) | |||
| 714 | 714 | ||
| 715 | /* correct names for VT1708BCE */ | 715 | /* correct names for VT1708BCE */ |
| 716 | if (get_codec_type(codec) == VT1708BCE) { | 716 | if (get_codec_type(codec) == VT1708BCE) { |
| 717 | kfree(codec->chip_name); | 717 | kfree(codec->core.chip_name); |
| 718 | codec->chip_name = kstrdup("VT1708BCE", GFP_KERNEL); | 718 | codec->core.chip_name = kstrdup("VT1708BCE", GFP_KERNEL); |
| 719 | snprintf(codec->card->mixername, | 719 | snprintf(codec->card->mixername, |
| 720 | sizeof(codec->card->mixername), | 720 | sizeof(codec->card->mixername), |
| 721 | "%s %s", codec->vendor_name, codec->chip_name); | 721 | "%s %s", codec->core.vendor_name, codec->core.chip_name); |
| 722 | } | 722 | } |
| 723 | /* correct names for VT1705 */ | 723 | /* correct names for VT1705 */ |
| 724 | if (codec->vendor_id == 0x11064397) { | 724 | if (codec->core.vendor_id == 0x11064397) { |
| 725 | kfree(codec->chip_name); | 725 | kfree(codec->core.chip_name); |
| 726 | codec->chip_name = kstrdup("VT1705", GFP_KERNEL); | 726 | codec->core.chip_name = kstrdup("VT1705", GFP_KERNEL); |
| 727 | snprintf(codec->card->mixername, | 727 | snprintf(codec->card->mixername, |
| 728 | sizeof(codec->card->mixername), | 728 | sizeof(codec->card->mixername), |
| 729 | "%s %s", codec->vendor_name, codec->chip_name); | 729 | "%s %s", codec->core.vendor_name, codec->core.chip_name); |
| 730 | } | 730 | } |
| 731 | 731 | ||
| 732 | /* automatic parse from the BIOS config */ | 732 | /* automatic parse from the BIOS config */ |
| @@ -815,8 +815,7 @@ static int add_secret_dac_path(struct hda_codec *codec) | |||
| 815 | } | 815 | } |
| 816 | 816 | ||
| 817 | /* find the primary DAC and add to the connection list */ | 817 | /* find the primary DAC and add to the connection list */ |
| 818 | nid = codec->start_nid; | 818 | for_each_hda_codec_node(nid, codec) { |
| 819 | for (i = 0; i < codec->num_nodes; i++, nid++) { | ||
| 820 | unsigned int caps = get_wcaps(codec, nid); | 819 | unsigned int caps = get_wcaps(codec, nid); |
| 821 | if (get_wcaps_type(caps) == AC_WID_AUD_OUT && | 820 | if (get_wcaps_type(caps) == AC_WID_AUD_OUT && |
| 822 | !(caps & AC_WCAP_DIGITAL)) { | 821 | !(caps & AC_WCAP_DIGITAL)) { |
diff --git a/sound/pci/hda/thinkpad_helper.c b/sound/pci/hda/thinkpad_helper.c index 6ba0b5517c40..0a4ad5feb82e 100644 --- a/sound/pci/hda/thinkpad_helper.c +++ b/sound/pci/hda/thinkpad_helper.c | |||
| @@ -21,7 +21,7 @@ static acpi_status acpi_check_cb(acpi_handle handle, u32 lvl, void *context, | |||
| 21 | static bool is_thinkpad(struct hda_codec *codec) | 21 | static bool is_thinkpad(struct hda_codec *codec) |
| 22 | { | 22 | { |
| 23 | bool found = false; | 23 | bool found = false; |
| 24 | if (codec->subsystem_id >> 16 != 0x17aa) | 24 | if (codec->core.subsystem_id >> 16 != 0x17aa) |
| 25 | return false; | 25 | return false; |
| 26 | if (ACPI_SUCCESS(acpi_get_devices("LEN0068", acpi_check_cb, &found, NULL)) && found) | 26 | if (ACPI_SUCCESS(acpi_get_devices("LEN0068", acpi_check_cb, &found, NULL)) && found) |
| 27 | return true; | 27 | return true; |
