mt8192-afe-gpio.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // mt8192-afe-gpio.c -- Mediatek 8192 afe gpio ctrl
  4. //
  5. // Copyright (c) 2020 MediaTek Inc.
  6. // Author: Shane Chien <[email protected]>
  7. //
  8. #include <linux/gpio.h>
  9. #include <linux/pinctrl/consumer.h>
  10. #include "mt8192-afe-common.h"
  11. #include "mt8192-afe-gpio.h"
  12. static struct pinctrl *aud_pinctrl;
  13. enum mt8192_afe_gpio {
  14. MT8192_AFE_GPIO_DAT_MISO_OFF,
  15. MT8192_AFE_GPIO_DAT_MISO_ON,
  16. MT8192_AFE_GPIO_DAT_MOSI_OFF,
  17. MT8192_AFE_GPIO_DAT_MOSI_ON,
  18. MT8192_AFE_GPIO_DAT_MISO_CH34_OFF,
  19. MT8192_AFE_GPIO_DAT_MISO_CH34_ON,
  20. MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF,
  21. MT8192_AFE_GPIO_DAT_MOSI_CH34_ON,
  22. MT8192_AFE_GPIO_I2S0_OFF,
  23. MT8192_AFE_GPIO_I2S0_ON,
  24. MT8192_AFE_GPIO_I2S1_OFF,
  25. MT8192_AFE_GPIO_I2S1_ON,
  26. MT8192_AFE_GPIO_I2S2_OFF,
  27. MT8192_AFE_GPIO_I2S2_ON,
  28. MT8192_AFE_GPIO_I2S3_OFF,
  29. MT8192_AFE_GPIO_I2S3_ON,
  30. MT8192_AFE_GPIO_I2S5_OFF,
  31. MT8192_AFE_GPIO_I2S5_ON,
  32. MT8192_AFE_GPIO_I2S6_OFF,
  33. MT8192_AFE_GPIO_I2S6_ON,
  34. MT8192_AFE_GPIO_I2S7_OFF,
  35. MT8192_AFE_GPIO_I2S7_ON,
  36. MT8192_AFE_GPIO_I2S8_OFF,
  37. MT8192_AFE_GPIO_I2S8_ON,
  38. MT8192_AFE_GPIO_I2S9_OFF,
  39. MT8192_AFE_GPIO_I2S9_ON,
  40. MT8192_AFE_GPIO_VOW_DAT_OFF,
  41. MT8192_AFE_GPIO_VOW_DAT_ON,
  42. MT8192_AFE_GPIO_VOW_CLK_OFF,
  43. MT8192_AFE_GPIO_VOW_CLK_ON,
  44. MT8192_AFE_GPIO_CLK_MOSI_OFF,
  45. MT8192_AFE_GPIO_CLK_MOSI_ON,
  46. MT8192_AFE_GPIO_TDM_OFF,
  47. MT8192_AFE_GPIO_TDM_ON,
  48. MT8192_AFE_GPIO_GPIO_NUM
  49. };
  50. struct audio_gpio_attr {
  51. const char *name;
  52. bool gpio_prepare;
  53. struct pinctrl_state *gpioctrl;
  54. };
  55. static struct audio_gpio_attr aud_gpios[MT8192_AFE_GPIO_GPIO_NUM] = {
  56. [MT8192_AFE_GPIO_DAT_MISO_OFF] = {"aud_dat_miso_off", false, NULL},
  57. [MT8192_AFE_GPIO_DAT_MISO_ON] = {"aud_dat_miso_on", false, NULL},
  58. [MT8192_AFE_GPIO_DAT_MOSI_OFF] = {"aud_dat_mosi_off", false, NULL},
  59. [MT8192_AFE_GPIO_DAT_MOSI_ON] = {"aud_dat_mosi_on", false, NULL},
  60. [MT8192_AFE_GPIO_I2S0_OFF] = {"aud_gpio_i2s0_off", false, NULL},
  61. [MT8192_AFE_GPIO_I2S0_ON] = {"aud_gpio_i2s0_on", false, NULL},
  62. [MT8192_AFE_GPIO_I2S1_OFF] = {"aud_gpio_i2s1_off", false, NULL},
  63. [MT8192_AFE_GPIO_I2S1_ON] = {"aud_gpio_i2s1_on", false, NULL},
  64. [MT8192_AFE_GPIO_I2S2_OFF] = {"aud_gpio_i2s2_off", false, NULL},
  65. [MT8192_AFE_GPIO_I2S2_ON] = {"aud_gpio_i2s2_on", false, NULL},
  66. [MT8192_AFE_GPIO_I2S3_OFF] = {"aud_gpio_i2s3_off", false, NULL},
  67. [MT8192_AFE_GPIO_I2S3_ON] = {"aud_gpio_i2s3_on", false, NULL},
  68. [MT8192_AFE_GPIO_I2S5_OFF] = {"aud_gpio_i2s5_off", false, NULL},
  69. [MT8192_AFE_GPIO_I2S5_ON] = {"aud_gpio_i2s5_on", false, NULL},
  70. [MT8192_AFE_GPIO_I2S6_OFF] = {"aud_gpio_i2s6_off", false, NULL},
  71. [MT8192_AFE_GPIO_I2S6_ON] = {"aud_gpio_i2s6_on", false, NULL},
  72. [MT8192_AFE_GPIO_I2S7_OFF] = {"aud_gpio_i2s7_off", false, NULL},
  73. [MT8192_AFE_GPIO_I2S7_ON] = {"aud_gpio_i2s7_on", false, NULL},
  74. [MT8192_AFE_GPIO_I2S8_OFF] = {"aud_gpio_i2s8_off", false, NULL},
  75. [MT8192_AFE_GPIO_I2S8_ON] = {"aud_gpio_i2s8_on", false, NULL},
  76. [MT8192_AFE_GPIO_I2S9_OFF] = {"aud_gpio_i2s9_off", false, NULL},
  77. [MT8192_AFE_GPIO_I2S9_ON] = {"aud_gpio_i2s9_on", false, NULL},
  78. [MT8192_AFE_GPIO_TDM_OFF] = {"aud_gpio_tdm_off", false, NULL},
  79. [MT8192_AFE_GPIO_TDM_ON] = {"aud_gpio_tdm_on", false, NULL},
  80. [MT8192_AFE_GPIO_VOW_DAT_OFF] = {"vow_dat_miso_off", false, NULL},
  81. [MT8192_AFE_GPIO_VOW_DAT_ON] = {"vow_dat_miso_on", false, NULL},
  82. [MT8192_AFE_GPIO_VOW_CLK_OFF] = {"vow_clk_miso_off", false, NULL},
  83. [MT8192_AFE_GPIO_VOW_CLK_ON] = {"vow_clk_miso_on", false, NULL},
  84. [MT8192_AFE_GPIO_DAT_MISO_CH34_OFF] = {"aud_dat_miso_ch34_off",
  85. false, NULL},
  86. [MT8192_AFE_GPIO_DAT_MISO_CH34_ON] = {"aud_dat_miso_ch34_on",
  87. false, NULL},
  88. [MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF] = {"aud_dat_mosi_ch34_off",
  89. false, NULL},
  90. [MT8192_AFE_GPIO_DAT_MOSI_CH34_ON] = {"aud_dat_mosi_ch34_on",
  91. false, NULL},
  92. [MT8192_AFE_GPIO_CLK_MOSI_OFF] = {"aud_clk_mosi_off", false, NULL},
  93. [MT8192_AFE_GPIO_CLK_MOSI_ON] = {"aud_clk_mosi_on", false, NULL},
  94. };
  95. static DEFINE_MUTEX(gpio_request_mutex);
  96. static int mt8192_afe_gpio_select(struct device *dev,
  97. enum mt8192_afe_gpio type)
  98. {
  99. int ret;
  100. if (type < 0 || type >= MT8192_AFE_GPIO_GPIO_NUM) {
  101. dev_err(dev, "%s(), error, invalid gpio type %d\n",
  102. __func__, type);
  103. return -EINVAL;
  104. }
  105. if (!aud_gpios[type].gpio_prepare) {
  106. dev_warn(dev, "%s(), error, gpio type %d not prepared\n",
  107. __func__, type);
  108. return -EIO;
  109. }
  110. ret = pinctrl_select_state(aud_pinctrl,
  111. aud_gpios[type].gpioctrl);
  112. if (ret) {
  113. dev_dbg(dev, "%s(), error, can not set gpio type %d\n",
  114. __func__, type);
  115. }
  116. return ret;
  117. }
  118. int mt8192_afe_gpio_init(struct device *dev)
  119. {
  120. int i, ret;
  121. aud_pinctrl = devm_pinctrl_get(dev);
  122. if (IS_ERR(aud_pinctrl)) {
  123. ret = PTR_ERR(aud_pinctrl);
  124. dev_err(dev, "%s(), ret %d, cannot get aud_pinctrl!\n",
  125. __func__, ret);
  126. return ret;
  127. }
  128. for (i = 0; i < ARRAY_SIZE(aud_gpios); i++) {
  129. aud_gpios[i].gpioctrl = pinctrl_lookup_state(aud_pinctrl,
  130. aud_gpios[i].name);
  131. if (IS_ERR(aud_gpios[i].gpioctrl)) {
  132. ret = PTR_ERR(aud_gpios[i].gpioctrl);
  133. dev_dbg(dev, "%s(), pinctrl_lookup_state %s fail, ret %d\n",
  134. __func__, aud_gpios[i].name, ret);
  135. } else {
  136. aud_gpios[i].gpio_prepare = true;
  137. }
  138. }
  139. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_CLK_MOSI_ON);
  140. /* gpio status init */
  141. mt8192_afe_gpio_request(dev, false, MT8192_DAI_ADDA, 0);
  142. mt8192_afe_gpio_request(dev, false, MT8192_DAI_ADDA, 1);
  143. return 0;
  144. }
  145. EXPORT_SYMBOL(mt8192_afe_gpio_init);
  146. static int mt8192_afe_gpio_adda_dl(struct device *dev, bool enable)
  147. {
  148. if (enable) {
  149. return mt8192_afe_gpio_select(dev,
  150. MT8192_AFE_GPIO_DAT_MOSI_ON);
  151. } else {
  152. return mt8192_afe_gpio_select(dev,
  153. MT8192_AFE_GPIO_DAT_MOSI_OFF);
  154. }
  155. }
  156. static int mt8192_afe_gpio_adda_ul(struct device *dev, bool enable)
  157. {
  158. if (enable) {
  159. return mt8192_afe_gpio_select(dev,
  160. MT8192_AFE_GPIO_DAT_MISO_ON);
  161. } else {
  162. return mt8192_afe_gpio_select(dev,
  163. MT8192_AFE_GPIO_DAT_MISO_OFF);
  164. }
  165. }
  166. static int mt8192_afe_gpio_adda_ch34_dl(struct device *dev, bool enable)
  167. {
  168. if (enable) {
  169. return mt8192_afe_gpio_select(dev,
  170. MT8192_AFE_GPIO_DAT_MOSI_CH34_ON);
  171. } else {
  172. return mt8192_afe_gpio_select(dev,
  173. MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF);
  174. }
  175. }
  176. static int mt8192_afe_gpio_adda_ch34_ul(struct device *dev, bool enable)
  177. {
  178. if (enable) {
  179. return mt8192_afe_gpio_select(dev,
  180. MT8192_AFE_GPIO_DAT_MISO_CH34_ON);
  181. } else {
  182. return mt8192_afe_gpio_select(dev,
  183. MT8192_AFE_GPIO_DAT_MISO_CH34_OFF);
  184. }
  185. }
  186. int mt8192_afe_gpio_request(struct device *dev, bool enable,
  187. int dai, int uplink)
  188. {
  189. mutex_lock(&gpio_request_mutex);
  190. switch (dai) {
  191. case MT8192_DAI_ADDA:
  192. if (uplink)
  193. mt8192_afe_gpio_adda_ul(dev, enable);
  194. else
  195. mt8192_afe_gpio_adda_dl(dev, enable);
  196. break;
  197. case MT8192_DAI_ADDA_CH34:
  198. if (uplink)
  199. mt8192_afe_gpio_adda_ch34_ul(dev, enable);
  200. else
  201. mt8192_afe_gpio_adda_ch34_dl(dev, enable);
  202. break;
  203. case MT8192_DAI_I2S_0:
  204. if (enable)
  205. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S0_ON);
  206. else
  207. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S0_OFF);
  208. break;
  209. case MT8192_DAI_I2S_1:
  210. if (enable)
  211. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S1_ON);
  212. else
  213. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S1_OFF);
  214. break;
  215. case MT8192_DAI_I2S_2:
  216. if (enable)
  217. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S2_ON);
  218. else
  219. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S2_OFF);
  220. break;
  221. case MT8192_DAI_I2S_3:
  222. if (enable)
  223. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S3_ON);
  224. else
  225. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S3_OFF);
  226. break;
  227. case MT8192_DAI_I2S_5:
  228. if (enable)
  229. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S5_ON);
  230. else
  231. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S5_OFF);
  232. break;
  233. case MT8192_DAI_I2S_6:
  234. if (enable)
  235. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S6_ON);
  236. else
  237. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S6_OFF);
  238. break;
  239. case MT8192_DAI_I2S_7:
  240. if (enable)
  241. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S7_ON);
  242. else
  243. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S7_OFF);
  244. break;
  245. case MT8192_DAI_I2S_8:
  246. if (enable)
  247. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S8_ON);
  248. else
  249. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S8_OFF);
  250. break;
  251. case MT8192_DAI_I2S_9:
  252. if (enable)
  253. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S9_ON);
  254. else
  255. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S9_OFF);
  256. break;
  257. case MT8192_DAI_TDM:
  258. if (enable)
  259. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_TDM_ON);
  260. else
  261. mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_TDM_OFF);
  262. break;
  263. case MT8192_DAI_VOW:
  264. if (enable) {
  265. mt8192_afe_gpio_select(dev,
  266. MT8192_AFE_GPIO_VOW_CLK_ON);
  267. mt8192_afe_gpio_select(dev,
  268. MT8192_AFE_GPIO_VOW_DAT_ON);
  269. } else {
  270. mt8192_afe_gpio_select(dev,
  271. MT8192_AFE_GPIO_VOW_CLK_OFF);
  272. mt8192_afe_gpio_select(dev,
  273. MT8192_AFE_GPIO_VOW_DAT_OFF);
  274. }
  275. break;
  276. default:
  277. mutex_unlock(&gpio_request_mutex);
  278. dev_warn(dev, "%s(), invalid dai %d\n", __func__, dai);
  279. return -EINVAL;
  280. }
  281. mutex_unlock(&gpio_request_mutex);
  282. return 0;
  283. }
  284. EXPORT_SYMBOL(mt8192_afe_gpio_request);