AudDrv_Gpio.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /*
  2. * Copyright (C) 2007 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /*******************************************************************************
  17. *
  18. * Filename:
  19. * ---------
  20. * AudDrv_Gpio.c
  21. *
  22. * Project:
  23. * --------
  24. * MT6580 Audio Driver GPIO
  25. *
  26. * Description:
  27. * ------------
  28. * Audio register
  29. *
  30. * Author:
  31. * -------
  32. * George
  33. *
  34. *------------------------------------------------------------------------------
  35. *
  36. *
  37. *******************************************************************************/
  38. /*****************************************************************************
  39. * C O M P I L E R F L A G S
  40. *****************************************************************************/
  41. /*****************************************************************************
  42. * E X T E R N A L R E F E R E N C E S
  43. *****************************************************************************/
  44. #if !defined(CONFIG_MTK_LEGACY)
  45. #include <linux/gpio.h>
  46. #include <linux/pinctrl/consumer.h>
  47. #else
  48. #include <mt-plat/mt_gpio.h>
  49. #endif
  50. #include "AudDrv_Gpio.h"
  51. #if !defined(CONFIG_MTK_LEGACY)
  52. struct pinctrl *pinctrlaud;
  53. enum audio_system_gpio_type {
  54. GPIO_DEFAULT = 0,
  55. GPIO_PMIC_MODE0,
  56. GPIO_PMIC_MODE1,
  57. GPIO_I2S_MODE0,
  58. GPIO_I2S_MODE1,
  59. GPIO_EXTAMP_HIGH,
  60. GPIO_EXTAMP_LOW,
  61. GPIO_EXTAMP_GAIN0,
  62. GPIO_EXTAMP_GAIN1,
  63. GPIO_EXTAMP_GAIN2,
  64. GPIO_EXTAMP_GAIN3,
  65. GPIO_HPSPK_SWITCH_HIGH,
  66. GPIO_HPSPK_SWITCH_LOW,
  67. GPIO_NUM
  68. };
  69. struct audio_gpio_attr {
  70. const char *name;
  71. bool gpio_prepare;
  72. struct pinctrl_state *gpioctrl;
  73. };
  74. static struct audio_gpio_attr aud_gpios[GPIO_NUM] = {
  75. [GPIO_DEFAULT] = {"default", false, NULL},
  76. [GPIO_PMIC_MODE0] = {"audpmicclk-mode0", false, NULL},
  77. [GPIO_PMIC_MODE1] = {"audpmicclk-mode1", false, NULL},
  78. [GPIO_I2S_MODE0] = {"audi2s1-mode0", false, NULL},
  79. [GPIO_I2S_MODE1] = {"audi2s1-mode1", false, NULL},
  80. [GPIO_EXTAMP_HIGH] = {"extamp-pullhigh", false, NULL},
  81. [GPIO_EXTAMP_LOW] = {"extamp-pulllow", false, NULL},
  82. [GPIO_EXTAMP_GAIN0] = {"extamp-gain0", false, NULL},
  83. [GPIO_EXTAMP_GAIN1] = {"extamp-gain1", false, NULL},
  84. [GPIO_EXTAMP_GAIN2] = {"extamp-gain2", false, NULL},
  85. [GPIO_EXTAMP_GAIN3] = {"extamp-gain3", false, NULL},
  86. [GPIO_HPSPK_SWITCH_HIGH] = {"hpspk-pullhigh", false, NULL},
  87. [GPIO_HPSPK_SWITCH_LOW] = {"hpspk-pulllow", false, NULL},
  88. };
  89. void AudDrv_GPIO_probe(void *dev)
  90. {
  91. int ret;
  92. int i = 0;
  93. pr_debug("%s\n", __func__);
  94. pinctrlaud = devm_pinctrl_get(dev);
  95. if (IS_ERR(pinctrlaud)) {
  96. ret = PTR_ERR(pinctrlaud);
  97. pr_err("Cannot find pinctrlaud!\n");
  98. return;
  99. }
  100. for (i = 0; i < ARRAY_SIZE(aud_gpios); i++) {
  101. aud_gpios[i].gpioctrl = pinctrl_lookup_state(pinctrlaud, aud_gpios[i].name);
  102. if (IS_ERR(aud_gpios[i].gpioctrl)) {
  103. ret = PTR_ERR(aud_gpios[i].gpioctrl);
  104. pr_err("%s pinctrl_lookup_state %s fail %d\n", __func__, aud_gpios[i].name,
  105. ret);
  106. } else {
  107. aud_gpios[i].gpio_prepare = true;
  108. pr_err("%s pinctrl_lookup_state %s success!\n", __func__, aud_gpios[i].name);
  109. }
  110. }
  111. }
  112. int AudDrv_GPIO_PMIC_Select(int bEnable)
  113. {
  114. int retval = 0;
  115. pr_debug("%s\n", __func__);
  116. if (bEnable == 1) {
  117. if (aud_gpios[GPIO_PMIC_MODE1].gpio_prepare) {
  118. retval =
  119. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_PMIC_MODE1].gpioctrl);
  120. if (retval)
  121. pr_err("could not set aud_gpios[GPIO_PMIC_MODE1] pins\n");
  122. } else {
  123. pr_err("aud_gpios[GPIO_PMIC_MODE1] pins are not prepared!\n");
  124. retval = -1;
  125. }
  126. } else {
  127. if (aud_gpios[GPIO_PMIC_MODE0].gpio_prepare) {
  128. retval =
  129. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_PMIC_MODE0].gpioctrl);
  130. if (retval)
  131. pr_err("could not set aud_gpios[GPIO_PMIC_MODE0] pins\n");
  132. } else {
  133. pr_err("aud_gpios[GPIO_PMIC_MODE0] pins are not prepared!\n");
  134. retval = -1;
  135. }
  136. }
  137. return retval;
  138. }
  139. int AudDrv_GPIO_I2S_Select(int bEnable)
  140. {
  141. int retval = 0;
  142. pr_debug("%s\n", __func__);
  143. if (bEnable == 1) {
  144. if (aud_gpios[GPIO_I2S_MODE1].gpio_prepare) {
  145. retval =
  146. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_I2S_MODE1].gpioctrl);
  147. if (retval)
  148. pr_err("could not set aud_gpios[GPIO_I2S_MODE1] pins\n");
  149. } else {
  150. pr_err("aud_gpios[GPIO_I2S_MODE1] pins are not prepared!\n");
  151. retval = -1;
  152. }
  153. } else {
  154. if (aud_gpios[GPIO_I2S_MODE0].gpio_prepare) {
  155. retval =
  156. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_I2S_MODE0].gpioctrl);
  157. if (retval)
  158. pr_err("could not set aud_gpios[GPIO_I2S_MODE0] pins\n");
  159. } else {
  160. pr_err("aud_gpios[GPIO_I2S_MODE0] pins are not prepared!\n");
  161. retval = -1;
  162. }
  163. }
  164. return retval;
  165. }
  166. int AudDrv_GPIO_EXTAMP_Select(int bEnable)
  167. {
  168. int retval = 0;
  169. pr_debug("%s\n", __func__);
  170. if (bEnable == 1) {
  171. if (aud_gpios[GPIO_EXTAMP_HIGH].gpio_prepare) {
  172. retval =
  173. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_HIGH].gpioctrl);
  174. if (retval)
  175. pr_err("could not set aud_gpios[GPIO_EXTAMP_HIGH] pins\n");
  176. } else {
  177. pr_err("aud_gpios[GPIO_EXTAMP_HIGH] pins are not prepared!\n");
  178. retval = -1;
  179. }
  180. } else {
  181. if (aud_gpios[GPIO_EXTAMP_LOW].gpio_prepare) {
  182. retval =
  183. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_LOW].gpioctrl);
  184. if (retval)
  185. pr_err("could not set aud_gpios[GPIO_EXTAMP_LOW] pins\n");
  186. } else {
  187. pr_err("aud_gpios[GPIO_EXTAMP_LOW] pins are not prepared!\n");
  188. retval = -1;
  189. }
  190. }
  191. return retval;
  192. }
  193. int AudDrv_GPIO_EXTAMP_Gain_Set(int value)
  194. {
  195. int retval = 0;
  196. pr_debug("%s value = %d\n", __func__, value);
  197. switch (value) {
  198. case 3:
  199. if (aud_gpios[GPIO_EXTAMP_GAIN3].gpio_prepare) {
  200. retval =
  201. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_GAIN3].gpioctrl);
  202. if (retval)
  203. pr_err("could not set aud_gpios[GPIO_EXTAMP_GAIN3] pins\n");
  204. } else {
  205. pr_err("aud_gpios[GPIO_EXTAMP_GAIN3] pins are not prepared!\n");
  206. retval = -1;
  207. }
  208. break;
  209. case 2:
  210. if (aud_gpios[GPIO_EXTAMP_GAIN2].gpio_prepare) {
  211. retval =
  212. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_GAIN2].gpioctrl);
  213. if (retval)
  214. pr_err("could not set aud_gpios[GPIO_EXTAMP_GAIN2] pins\n");
  215. } else {
  216. pr_err("aud_gpios[GPIO_EXTAMP_GAIN2] pins are not prepared!\n");
  217. retval = -1;
  218. }
  219. break;
  220. case 1:
  221. if (aud_gpios[GPIO_EXTAMP_GAIN1].gpio_prepare) {
  222. retval =
  223. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_GAIN1].gpioctrl);
  224. if (retval)
  225. pr_err("could not set aud_gpios[GPIO_EXTAMP_GAIN1] pins\n");
  226. } else {
  227. pr_err("aud_gpios[GPIO_EXTAMP_GAIN1] pins are not prepared!\n");
  228. retval = -1;
  229. }
  230. break;
  231. case 0:
  232. if (aud_gpios[GPIO_EXTAMP_GAIN0].gpio_prepare) {
  233. retval =
  234. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_GAIN0].gpioctrl);
  235. if (retval)
  236. pr_err("could not set aud_gpios[GPIO_EXTAMP_GAIN0] pins\n");
  237. } else {
  238. pr_err("aud_gpios[GPIO_EXTAMP_GAIN0] pins are not prepared!\n");
  239. retval = -1;
  240. }
  241. break;
  242. default:
  243. pr_err("unsupported extamp gain mode!!!\n");
  244. return -1;
  245. }
  246. return retval;
  247. }
  248. int AudDrv_GPIO_HP_SPK_Switch_Select(int bEnable)
  249. {
  250. int retval = 0;
  251. pr_debug("%s bEnable = %d\n", __func__, bEnable);
  252. if (bEnable == 1) {
  253. if (aud_gpios[GPIO_HPSPK_SWITCH_HIGH].gpio_prepare) {
  254. retval =
  255. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_HPSPK_SWITCH_HIGH].gpioctrl);
  256. if (retval)
  257. pr_err("could not set aud_gpios[GPIO_HPSPK_SWITCH_HIGH] pins\n");
  258. } else {
  259. pr_err("aud_gpios[GPIO_HPSPK_SWITCH_HIGH] pins are not prepared!\n");
  260. retval = -1;
  261. }
  262. } else {
  263. if (aud_gpios[GPIO_HPSPK_SWITCH_LOW].gpio_prepare) {
  264. retval =
  265. pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_HPSPK_SWITCH_LOW].gpioctrl);
  266. if (retval)
  267. pr_err("could not set aud_gpios[GPIO_HPSPK_SWITCH_LOW] pins\n");
  268. } else {
  269. pr_err("aud_gpios[GPIO_HPSPK_SWITCH_LOW] pins are not prepared!\n");
  270. retval = -1;
  271. }
  272. }
  273. return retval;
  274. }
  275. #endif