hda_jack.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /*
  2. * Jack-detection handling for HD-audio
  3. *
  4. * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de>
  5. *
  6. * This driver is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. */
  11. #include <linux/init.h>
  12. #include <linux/slab.h>
  13. #include <linux/export.h>
  14. #include <sound/core.h>
  15. #include <sound/control.h>
  16. #include <sound/jack.h>
  17. #include "hda_codec.h"
  18. #include "hda_local.h"
  19. #include "hda_jack.h"
  20. /* execute pin sense measurement */
  21. static u32 read_pin_sense(struct hda_codec *codec, hda_nid_t nid)
  22. {
  23. u32 pincap;
  24. if (!codec->no_trigger_sense) {
  25. pincap = snd_hda_query_pin_caps(codec, nid);
  26. if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
  27. snd_hda_codec_read(codec, nid, 0,
  28. AC_VERB_SET_PIN_SENSE, 0);
  29. }
  30. return snd_hda_codec_read(codec, nid, 0,
  31. AC_VERB_GET_PIN_SENSE, 0);
  32. }
  33. /**
  34. * snd_hda_jack_tbl_get - query the jack-table entry for the given NID
  35. */
  36. struct hda_jack_tbl *
  37. snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid)
  38. {
  39. struct hda_jack_tbl *jack = codec->jacktbl.list;
  40. int i;
  41. if (!nid || !jack)
  42. return NULL;
  43. for (i = 0; i < codec->jacktbl.used; i++, jack++)
  44. if (jack->nid == nid)
  45. return jack;
  46. return NULL;
  47. }
  48. EXPORT_SYMBOL_HDA(snd_hda_jack_tbl_get);
  49. /**
  50. * snd_hda_jack_tbl_get_from_tag - query the jack-table entry for the given tag
  51. */
  52. struct hda_jack_tbl *
  53. snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec, unsigned char tag)
  54. {
  55. struct hda_jack_tbl *jack = codec->jacktbl.list;
  56. int i;
  57. if (!tag || !jack)
  58. return NULL;
  59. for (i = 0; i < codec->jacktbl.used; i++, jack++)
  60. if (jack->tag == tag)
  61. return jack;
  62. return NULL;
  63. }
  64. EXPORT_SYMBOL_HDA(snd_hda_jack_tbl_get_from_tag);
  65. /**
  66. * snd_hda_jack_tbl_new - create a jack-table entry for the given NID
  67. */
  68. struct hda_jack_tbl *
  69. snd_hda_jack_tbl_new(struct hda_codec *codec, hda_nid_t nid)
  70. {
  71. struct hda_jack_tbl *jack = snd_hda_jack_tbl_get(codec, nid);
  72. if (jack)
  73. return jack;
  74. snd_array_init(&codec->jacktbl, sizeof(*jack), 16);
  75. jack = snd_array_new(&codec->jacktbl);
  76. if (!jack)
  77. return NULL;
  78. jack->nid = nid;
  79. jack->jack_dirty = 1;
  80. jack->tag = codec->jacktbl.used;
  81. return jack;
  82. }
  83. EXPORT_SYMBOL_HDA(snd_hda_jack_tbl_new);
  84. void snd_hda_jack_tbl_clear(struct hda_codec *codec)
  85. {
  86. #ifdef CONFIG_SND_HDA_INPUT_JACK
  87. /* free jack instances manually when clearing/reconfiguring */
  88. if (!codec->bus->shutdown && codec->jacktbl.list) {
  89. struct hda_jack_tbl *jack = codec->jacktbl.list;
  90. int i;
  91. for (i = 0; i < codec->jacktbl.used; i++, jack++) {
  92. if (jack->jack)
  93. snd_device_free(codec->bus->card, jack->jack);
  94. }
  95. }
  96. #endif
  97. snd_array_free(&codec->jacktbl);
  98. }
  99. /* update the cached value and notification flag if needed */
  100. static void jack_detect_update(struct hda_codec *codec,
  101. struct hda_jack_tbl *jack)
  102. {
  103. if (jack->jack_dirty || !jack->jack_detect) {
  104. jack->pin_sense = read_pin_sense(codec, jack->nid);
  105. jack->jack_dirty = 0;
  106. }
  107. }
  108. /**
  109. * snd_hda_set_dirty_all - Mark all the cached as dirty
  110. *
  111. * This function sets the dirty flag to all entries of jack table.
  112. * It's called from the resume path in hda_codec.c.
  113. */
  114. void snd_hda_jack_set_dirty_all(struct hda_codec *codec)
  115. {
  116. struct hda_jack_tbl *jack = codec->jacktbl.list;
  117. int i;
  118. for (i = 0; i < codec->jacktbl.used; i++, jack++)
  119. if (jack->nid)
  120. jack->jack_dirty = 1;
  121. }
  122. EXPORT_SYMBOL_HDA(snd_hda_jack_set_dirty_all);
  123. /**
  124. * snd_hda_pin_sense - execute pin sense measurement
  125. * @codec: the CODEC to sense
  126. * @nid: the pin NID to sense
  127. *
  128. * Execute necessary pin sense measurement and return its Presence Detect,
  129. * Impedance, ELD Valid etc. status bits.
  130. */
  131. u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid)
  132. {
  133. struct hda_jack_tbl *jack = snd_hda_jack_tbl_get(codec, nid);
  134. if (jack) {
  135. jack_detect_update(codec, jack);
  136. return jack->pin_sense;
  137. }
  138. return read_pin_sense(codec, nid);
  139. }
  140. EXPORT_SYMBOL_HDA(snd_hda_pin_sense);
  141. #define get_jack_plug_state(sense) !!(sense & AC_PINSENSE_PRESENCE)
  142. /**
  143. * snd_hda_jack_detect - query pin Presence Detect status
  144. * @codec: the CODEC to sense
  145. * @nid: the pin NID to sense
  146. *
  147. * Query and return the pin's Presence Detect status.
  148. */
  149. int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid)
  150. {
  151. u32 sense = snd_hda_pin_sense(codec, nid);
  152. return get_jack_plug_state(sense);
  153. }
  154. EXPORT_SYMBOL_HDA(snd_hda_jack_detect);
  155. /**
  156. * snd_hda_jack_detect_enable - enable the jack-detection
  157. */
  158. int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid,
  159. unsigned char action)
  160. {
  161. struct hda_jack_tbl *jack = snd_hda_jack_tbl_new(codec, nid);
  162. if (!jack)
  163. return -ENOMEM;
  164. if (jack->jack_detect)
  165. return 0; /* already registered */
  166. jack->jack_detect = 1;
  167. if (action)
  168. jack->action = action;
  169. return snd_hda_codec_write_cache(codec, nid, 0,
  170. AC_VERB_SET_UNSOLICITED_ENABLE,
  171. AC_USRSP_EN | jack->tag);
  172. }
  173. EXPORT_SYMBOL_HDA(snd_hda_jack_detect_enable);
  174. /**
  175. * snd_hda_jack_report_sync - sync the states of all jacks and report if changed
  176. */
  177. void snd_hda_jack_report_sync(struct hda_codec *codec)
  178. {
  179. struct hda_jack_tbl *jack = codec->jacktbl.list;
  180. int i, state;
  181. for (i = 0; i < codec->jacktbl.used; i++, jack++)
  182. if (jack->nid) {
  183. jack_detect_update(codec, jack);
  184. if (!jack->kctl)
  185. continue;
  186. state = get_jack_plug_state(jack->pin_sense);
  187. snd_kctl_jack_report(codec->bus->card, jack->kctl, state);
  188. #ifdef CONFIG_SND_HDA_INPUT_JACK
  189. if (jack->jack)
  190. snd_jack_report(jack->jack,
  191. state ? jack->type : 0);
  192. #endif
  193. }
  194. }
  195. EXPORT_SYMBOL_HDA(snd_hda_jack_report_sync);
  196. #ifdef CONFIG_SND_HDA_INPUT_JACK
  197. /* guess the jack type from the pin-config */
  198. static int get_input_jack_type(struct hda_codec *codec, hda_nid_t nid)
  199. {
  200. unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
  201. switch (get_defcfg_device(def_conf)) {
  202. case AC_JACK_LINE_OUT:
  203. case AC_JACK_SPEAKER:
  204. return SND_JACK_LINEOUT;
  205. case AC_JACK_HP_OUT:
  206. return SND_JACK_HEADPHONE;
  207. case AC_JACK_SPDIF_OUT:
  208. case AC_JACK_DIG_OTHER_OUT:
  209. return SND_JACK_AVOUT;
  210. case AC_JACK_MIC_IN:
  211. return SND_JACK_MICROPHONE;
  212. default:
  213. return SND_JACK_LINEIN;
  214. }
  215. }
  216. static void hda_free_jack_priv(struct snd_jack *jack)
  217. {
  218. struct hda_jack_tbl *jacks = jack->private_data;
  219. jacks->nid = 0;
  220. jacks->jack = NULL;
  221. }
  222. #endif
  223. /**
  224. * snd_hda_jack_add_kctl - Add a kctl for the given pin
  225. *
  226. * This assigns a jack-detection kctl to the given pin. The kcontrol
  227. * will have the given name and index.
  228. */
  229. int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
  230. const char *name, int idx)
  231. {
  232. struct hda_jack_tbl *jack;
  233. struct snd_kcontrol *kctl;
  234. int err, state;
  235. jack = snd_hda_jack_tbl_new(codec, nid);
  236. if (!jack)
  237. return 0;
  238. if (jack->kctl)
  239. return 0; /* already created */
  240. kctl = snd_kctl_jack_new(name, idx, codec);
  241. if (!kctl)
  242. return -ENOMEM;
  243. err = snd_hda_ctl_add(codec, nid, kctl);
  244. if (err < 0)
  245. return err;
  246. jack->kctl = kctl;
  247. state = snd_hda_jack_detect(codec, nid);
  248. snd_kctl_jack_report(codec->bus->card, kctl, state);
  249. #ifdef CONFIG_SND_HDA_INPUT_JACK
  250. jack->type = get_input_jack_type(codec, nid);
  251. err = snd_jack_new(codec->bus->card, name, jack->type, &jack->jack);
  252. if (err < 0)
  253. return err;
  254. jack->jack->private_data = jack;
  255. jack->jack->private_free = hda_free_jack_priv;
  256. snd_jack_report(jack->jack, state ? jack->type : 0);
  257. #endif
  258. return 0;
  259. }
  260. EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctl);
  261. static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid,
  262. const struct auto_pin_cfg *cfg)
  263. {
  264. unsigned int def_conf, conn;
  265. char name[44];
  266. int idx, err;
  267. if (!nid)
  268. return 0;
  269. if (!is_jack_detectable(codec, nid))
  270. return 0;
  271. def_conf = snd_hda_codec_get_pincfg(codec, nid);
  272. conn = get_defcfg_connect(def_conf);
  273. if (conn != AC_JACK_PORT_COMPLEX)
  274. return 0;
  275. snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), &idx);
  276. err = snd_hda_jack_add_kctl(codec, nid, name, idx);
  277. if (err < 0)
  278. return err;
  279. return snd_hda_jack_detect_enable(codec, nid, 0);
  280. }
  281. /**
  282. * snd_hda_jack_add_kctls - Add kctls for all pins included in the given pincfg
  283. */
  284. int snd_hda_jack_add_kctls(struct hda_codec *codec,
  285. const struct auto_pin_cfg *cfg)
  286. {
  287. const hda_nid_t *p;
  288. int i, err;
  289. for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) {
  290. err = add_jack_kctl(codec, *p, cfg);
  291. if (err < 0)
  292. return err;
  293. }
  294. for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) {
  295. if (*p == *cfg->line_out_pins) /* might be duplicated */
  296. break;
  297. err = add_jack_kctl(codec, *p, cfg);
  298. if (err < 0)
  299. return err;
  300. }
  301. for (i = 0, p = cfg->speaker_pins; i < cfg->speaker_outs; i++, p++) {
  302. if (*p == *cfg->line_out_pins) /* might be duplicated */
  303. break;
  304. err = add_jack_kctl(codec, *p, cfg);
  305. if (err < 0)
  306. return err;
  307. }
  308. for (i = 0; i < cfg->num_inputs; i++) {
  309. err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg);
  310. if (err < 0)
  311. return err;
  312. }
  313. for (i = 0, p = cfg->dig_out_pins; i < cfg->dig_outs; i++, p++) {
  314. err = add_jack_kctl(codec, *p, cfg);
  315. if (err < 0)
  316. return err;
  317. }
  318. err = add_jack_kctl(codec, cfg->dig_in_pin, cfg);
  319. if (err < 0)
  320. return err;
  321. err = add_jack_kctl(codec, cfg->mono_out_pin, cfg);
  322. if (err < 0)
  323. return err;
  324. return 0;
  325. }
  326. EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctls);