0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/gpio.h>
0010 #include <linux/pinctrl/consumer.h>
0011
0012 #include "mt8192-afe-common.h"
0013 #include "mt8192-afe-gpio.h"
0014
0015 static struct pinctrl *aud_pinctrl;
0016
0017 enum mt8192_afe_gpio {
0018 MT8192_AFE_GPIO_DAT_MISO_OFF,
0019 MT8192_AFE_GPIO_DAT_MISO_ON,
0020 MT8192_AFE_GPIO_DAT_MOSI_OFF,
0021 MT8192_AFE_GPIO_DAT_MOSI_ON,
0022 MT8192_AFE_GPIO_DAT_MISO_CH34_OFF,
0023 MT8192_AFE_GPIO_DAT_MISO_CH34_ON,
0024 MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF,
0025 MT8192_AFE_GPIO_DAT_MOSI_CH34_ON,
0026 MT8192_AFE_GPIO_I2S0_OFF,
0027 MT8192_AFE_GPIO_I2S0_ON,
0028 MT8192_AFE_GPIO_I2S1_OFF,
0029 MT8192_AFE_GPIO_I2S1_ON,
0030 MT8192_AFE_GPIO_I2S2_OFF,
0031 MT8192_AFE_GPIO_I2S2_ON,
0032 MT8192_AFE_GPIO_I2S3_OFF,
0033 MT8192_AFE_GPIO_I2S3_ON,
0034 MT8192_AFE_GPIO_I2S5_OFF,
0035 MT8192_AFE_GPIO_I2S5_ON,
0036 MT8192_AFE_GPIO_I2S6_OFF,
0037 MT8192_AFE_GPIO_I2S6_ON,
0038 MT8192_AFE_GPIO_I2S7_OFF,
0039 MT8192_AFE_GPIO_I2S7_ON,
0040 MT8192_AFE_GPIO_I2S8_OFF,
0041 MT8192_AFE_GPIO_I2S8_ON,
0042 MT8192_AFE_GPIO_I2S9_OFF,
0043 MT8192_AFE_GPIO_I2S9_ON,
0044 MT8192_AFE_GPIO_VOW_DAT_OFF,
0045 MT8192_AFE_GPIO_VOW_DAT_ON,
0046 MT8192_AFE_GPIO_VOW_CLK_OFF,
0047 MT8192_AFE_GPIO_VOW_CLK_ON,
0048 MT8192_AFE_GPIO_CLK_MOSI_OFF,
0049 MT8192_AFE_GPIO_CLK_MOSI_ON,
0050 MT8192_AFE_GPIO_TDM_OFF,
0051 MT8192_AFE_GPIO_TDM_ON,
0052 MT8192_AFE_GPIO_GPIO_NUM
0053 };
0054
0055 struct audio_gpio_attr {
0056 const char *name;
0057 bool gpio_prepare;
0058 struct pinctrl_state *gpioctrl;
0059 };
0060
0061 static struct audio_gpio_attr aud_gpios[MT8192_AFE_GPIO_GPIO_NUM] = {
0062 [MT8192_AFE_GPIO_DAT_MISO_OFF] = {"aud_dat_miso_off", false, NULL},
0063 [MT8192_AFE_GPIO_DAT_MISO_ON] = {"aud_dat_miso_on", false, NULL},
0064 [MT8192_AFE_GPIO_DAT_MOSI_OFF] = {"aud_dat_mosi_off", false, NULL},
0065 [MT8192_AFE_GPIO_DAT_MOSI_ON] = {"aud_dat_mosi_on", false, NULL},
0066 [MT8192_AFE_GPIO_I2S0_OFF] = {"aud_gpio_i2s0_off", false, NULL},
0067 [MT8192_AFE_GPIO_I2S0_ON] = {"aud_gpio_i2s0_on", false, NULL},
0068 [MT8192_AFE_GPIO_I2S1_OFF] = {"aud_gpio_i2s1_off", false, NULL},
0069 [MT8192_AFE_GPIO_I2S1_ON] = {"aud_gpio_i2s1_on", false, NULL},
0070 [MT8192_AFE_GPIO_I2S2_OFF] = {"aud_gpio_i2s2_off", false, NULL},
0071 [MT8192_AFE_GPIO_I2S2_ON] = {"aud_gpio_i2s2_on", false, NULL},
0072 [MT8192_AFE_GPIO_I2S3_OFF] = {"aud_gpio_i2s3_off", false, NULL},
0073 [MT8192_AFE_GPIO_I2S3_ON] = {"aud_gpio_i2s3_on", false, NULL},
0074 [MT8192_AFE_GPIO_I2S5_OFF] = {"aud_gpio_i2s5_off", false, NULL},
0075 [MT8192_AFE_GPIO_I2S5_ON] = {"aud_gpio_i2s5_on", false, NULL},
0076 [MT8192_AFE_GPIO_I2S6_OFF] = {"aud_gpio_i2s6_off", false, NULL},
0077 [MT8192_AFE_GPIO_I2S6_ON] = {"aud_gpio_i2s6_on", false, NULL},
0078 [MT8192_AFE_GPIO_I2S7_OFF] = {"aud_gpio_i2s7_off", false, NULL},
0079 [MT8192_AFE_GPIO_I2S7_ON] = {"aud_gpio_i2s7_on", false, NULL},
0080 [MT8192_AFE_GPIO_I2S8_OFF] = {"aud_gpio_i2s8_off", false, NULL},
0081 [MT8192_AFE_GPIO_I2S8_ON] = {"aud_gpio_i2s8_on", false, NULL},
0082 [MT8192_AFE_GPIO_I2S9_OFF] = {"aud_gpio_i2s9_off", false, NULL},
0083 [MT8192_AFE_GPIO_I2S9_ON] = {"aud_gpio_i2s9_on", false, NULL},
0084 [MT8192_AFE_GPIO_TDM_OFF] = {"aud_gpio_tdm_off", false, NULL},
0085 [MT8192_AFE_GPIO_TDM_ON] = {"aud_gpio_tdm_on", false, NULL},
0086 [MT8192_AFE_GPIO_VOW_DAT_OFF] = {"vow_dat_miso_off", false, NULL},
0087 [MT8192_AFE_GPIO_VOW_DAT_ON] = {"vow_dat_miso_on", false, NULL},
0088 [MT8192_AFE_GPIO_VOW_CLK_OFF] = {"vow_clk_miso_off", false, NULL},
0089 [MT8192_AFE_GPIO_VOW_CLK_ON] = {"vow_clk_miso_on", false, NULL},
0090 [MT8192_AFE_GPIO_DAT_MISO_CH34_OFF] = {"aud_dat_miso_ch34_off",
0091 false, NULL},
0092 [MT8192_AFE_GPIO_DAT_MISO_CH34_ON] = {"aud_dat_miso_ch34_on",
0093 false, NULL},
0094 [MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF] = {"aud_dat_mosi_ch34_off",
0095 false, NULL},
0096 [MT8192_AFE_GPIO_DAT_MOSI_CH34_ON] = {"aud_dat_mosi_ch34_on",
0097 false, NULL},
0098 [MT8192_AFE_GPIO_CLK_MOSI_OFF] = {"aud_clk_mosi_off", false, NULL},
0099 [MT8192_AFE_GPIO_CLK_MOSI_ON] = {"aud_clk_mosi_on", false, NULL},
0100 };
0101
0102 static DEFINE_MUTEX(gpio_request_mutex);
0103
0104 static int mt8192_afe_gpio_select(struct device *dev,
0105 enum mt8192_afe_gpio type)
0106 {
0107 int ret;
0108
0109 if (type < 0 || type >= MT8192_AFE_GPIO_GPIO_NUM) {
0110 dev_err(dev, "%s(), error, invalid gpio type %d\n",
0111 __func__, type);
0112 return -EINVAL;
0113 }
0114
0115 if (!aud_gpios[type].gpio_prepare) {
0116 dev_warn(dev, "%s(), error, gpio type %d not prepared\n",
0117 __func__, type);
0118 return -EIO;
0119 }
0120
0121 ret = pinctrl_select_state(aud_pinctrl,
0122 aud_gpios[type].gpioctrl);
0123 if (ret) {
0124 dev_dbg(dev, "%s(), error, can not set gpio type %d\n",
0125 __func__, type);
0126 }
0127
0128 return ret;
0129 }
0130
0131 int mt8192_afe_gpio_init(struct device *dev)
0132 {
0133 int i, ret;
0134
0135 aud_pinctrl = devm_pinctrl_get(dev);
0136 if (IS_ERR(aud_pinctrl)) {
0137 ret = PTR_ERR(aud_pinctrl);
0138 dev_err(dev, "%s(), ret %d, cannot get aud_pinctrl!\n",
0139 __func__, ret);
0140 return ret;
0141 }
0142
0143 for (i = 0; i < ARRAY_SIZE(aud_gpios); i++) {
0144 aud_gpios[i].gpioctrl = pinctrl_lookup_state(aud_pinctrl,
0145 aud_gpios[i].name);
0146 if (IS_ERR(aud_gpios[i].gpioctrl)) {
0147 ret = PTR_ERR(aud_gpios[i].gpioctrl);
0148 dev_dbg(dev, "%s(), pinctrl_lookup_state %s fail, ret %d\n",
0149 __func__, aud_gpios[i].name, ret);
0150 } else {
0151 aud_gpios[i].gpio_prepare = true;
0152 }
0153 }
0154
0155 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_CLK_MOSI_ON);
0156
0157
0158 mt8192_afe_gpio_request(dev, false, MT8192_DAI_ADDA, 0);
0159 mt8192_afe_gpio_request(dev, false, MT8192_DAI_ADDA, 1);
0160
0161 return 0;
0162 }
0163 EXPORT_SYMBOL(mt8192_afe_gpio_init);
0164
0165 static int mt8192_afe_gpio_adda_dl(struct device *dev, bool enable)
0166 {
0167 if (enable) {
0168 return mt8192_afe_gpio_select(dev,
0169 MT8192_AFE_GPIO_DAT_MOSI_ON);
0170 } else {
0171 return mt8192_afe_gpio_select(dev,
0172 MT8192_AFE_GPIO_DAT_MOSI_OFF);
0173 }
0174 }
0175
0176 static int mt8192_afe_gpio_adda_ul(struct device *dev, bool enable)
0177 {
0178 if (enable) {
0179 return mt8192_afe_gpio_select(dev,
0180 MT8192_AFE_GPIO_DAT_MISO_ON);
0181 } else {
0182 return mt8192_afe_gpio_select(dev,
0183 MT8192_AFE_GPIO_DAT_MISO_OFF);
0184 }
0185 }
0186
0187 static int mt8192_afe_gpio_adda_ch34_dl(struct device *dev, bool enable)
0188 {
0189 if (enable) {
0190 return mt8192_afe_gpio_select(dev,
0191 MT8192_AFE_GPIO_DAT_MOSI_CH34_ON);
0192 } else {
0193 return mt8192_afe_gpio_select(dev,
0194 MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF);
0195 }
0196 }
0197
0198 static int mt8192_afe_gpio_adda_ch34_ul(struct device *dev, bool enable)
0199 {
0200 if (enable) {
0201 return mt8192_afe_gpio_select(dev,
0202 MT8192_AFE_GPIO_DAT_MISO_CH34_ON);
0203 } else {
0204 return mt8192_afe_gpio_select(dev,
0205 MT8192_AFE_GPIO_DAT_MISO_CH34_OFF);
0206 }
0207 }
0208
0209 int mt8192_afe_gpio_request(struct device *dev, bool enable,
0210 int dai, int uplink)
0211 {
0212 mutex_lock(&gpio_request_mutex);
0213 switch (dai) {
0214 case MT8192_DAI_ADDA:
0215 if (uplink)
0216 mt8192_afe_gpio_adda_ul(dev, enable);
0217 else
0218 mt8192_afe_gpio_adda_dl(dev, enable);
0219 break;
0220 case MT8192_DAI_ADDA_CH34:
0221 if (uplink)
0222 mt8192_afe_gpio_adda_ch34_ul(dev, enable);
0223 else
0224 mt8192_afe_gpio_adda_ch34_dl(dev, enable);
0225 break;
0226 case MT8192_DAI_I2S_0:
0227 if (enable)
0228 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S0_ON);
0229 else
0230 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S0_OFF);
0231 break;
0232 case MT8192_DAI_I2S_1:
0233 if (enable)
0234 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S1_ON);
0235 else
0236 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S1_OFF);
0237 break;
0238 case MT8192_DAI_I2S_2:
0239 if (enable)
0240 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S2_ON);
0241 else
0242 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S2_OFF);
0243 break;
0244 case MT8192_DAI_I2S_3:
0245 if (enable)
0246 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S3_ON);
0247 else
0248 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S3_OFF);
0249 break;
0250 case MT8192_DAI_I2S_5:
0251 if (enable)
0252 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S5_ON);
0253 else
0254 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S5_OFF);
0255 break;
0256 case MT8192_DAI_I2S_6:
0257 if (enable)
0258 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S6_ON);
0259 else
0260 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S6_OFF);
0261 break;
0262 case MT8192_DAI_I2S_7:
0263 if (enable)
0264 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S7_ON);
0265 else
0266 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S7_OFF);
0267 break;
0268 case MT8192_DAI_I2S_8:
0269 if (enable)
0270 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S8_ON);
0271 else
0272 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S8_OFF);
0273 break;
0274 case MT8192_DAI_I2S_9:
0275 if (enable)
0276 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S9_ON);
0277 else
0278 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S9_OFF);
0279 break;
0280 case MT8192_DAI_TDM:
0281 if (enable)
0282 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_TDM_ON);
0283 else
0284 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_TDM_OFF);
0285 break;
0286 case MT8192_DAI_VOW:
0287 if (enable) {
0288 mt8192_afe_gpio_select(dev,
0289 MT8192_AFE_GPIO_VOW_CLK_ON);
0290 mt8192_afe_gpio_select(dev,
0291 MT8192_AFE_GPIO_VOW_DAT_ON);
0292 } else {
0293 mt8192_afe_gpio_select(dev,
0294 MT8192_AFE_GPIO_VOW_CLK_OFF);
0295 mt8192_afe_gpio_select(dev,
0296 MT8192_AFE_GPIO_VOW_DAT_OFF);
0297 }
0298 break;
0299 default:
0300 mutex_unlock(&gpio_request_mutex);
0301 dev_warn(dev, "%s(), invalid dai %d\n", __func__, dai);
0302 return -EINVAL;
0303 }
0304 mutex_unlock(&gpio_request_mutex);
0305
0306 return 0;
0307 }
0308 EXPORT_SYMBOL(mt8192_afe_gpio_request);