0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/gpio.h>
0009 #include <linux/pinctrl/consumer.h>
0010
0011 #include "mt8186-afe-common.h"
0012 #include "mt8186-afe-gpio.h"
0013
0014 struct pinctrl *aud_pinctrl;
0015
0016 enum mt8186_afe_gpio {
0017 MT8186_AFE_GPIO_CLK_MOSI_OFF,
0018 MT8186_AFE_GPIO_CLK_MOSI_ON,
0019 MT8186_AFE_GPIO_CLK_MISO_OFF,
0020 MT8186_AFE_GPIO_CLK_MISO_ON,
0021 MT8186_AFE_GPIO_DAT_MISO_OFF,
0022 MT8186_AFE_GPIO_DAT_MISO_ON,
0023 MT8186_AFE_GPIO_DAT_MOSI_OFF,
0024 MT8186_AFE_GPIO_DAT_MOSI_ON,
0025 MT8186_AFE_GPIO_I2S0_OFF,
0026 MT8186_AFE_GPIO_I2S0_ON,
0027 MT8186_AFE_GPIO_I2S1_OFF,
0028 MT8186_AFE_GPIO_I2S1_ON,
0029 MT8186_AFE_GPIO_I2S2_OFF,
0030 MT8186_AFE_GPIO_I2S2_ON,
0031 MT8186_AFE_GPIO_I2S3_OFF,
0032 MT8186_AFE_GPIO_I2S3_ON,
0033 MT8186_AFE_GPIO_TDM_OFF,
0034 MT8186_AFE_GPIO_TDM_ON,
0035 MT8186_AFE_GPIO_PCM_OFF,
0036 MT8186_AFE_GPIO_PCM_ON,
0037 MT8186_AFE_GPIO_GPIO_NUM
0038 };
0039
0040 struct audio_gpio_attr {
0041 const char *name;
0042 bool gpio_prepare;
0043 struct pinctrl_state *gpioctrl;
0044 };
0045
0046 static struct audio_gpio_attr aud_gpios[MT8186_AFE_GPIO_GPIO_NUM] = {
0047 [MT8186_AFE_GPIO_CLK_MOSI_OFF] = {"aud_clk_mosi_off", false, NULL},
0048 [MT8186_AFE_GPIO_CLK_MOSI_ON] = {"aud_clk_mosi_on", false, NULL},
0049 [MT8186_AFE_GPIO_CLK_MISO_OFF] = {"aud_clk_miso_off", false, NULL},
0050 [MT8186_AFE_GPIO_CLK_MISO_ON] = {"aud_clk_miso_on", false, NULL},
0051 [MT8186_AFE_GPIO_DAT_MISO_OFF] = {"aud_dat_miso_off", false, NULL},
0052 [MT8186_AFE_GPIO_DAT_MISO_ON] = {"aud_dat_miso_on", false, NULL},
0053 [MT8186_AFE_GPIO_DAT_MOSI_OFF] = {"aud_dat_mosi_off", false, NULL},
0054 [MT8186_AFE_GPIO_DAT_MOSI_ON] = {"aud_dat_mosi_on", false, NULL},
0055 [MT8186_AFE_GPIO_I2S0_OFF] = {"aud_gpio_i2s0_off", false, NULL},
0056 [MT8186_AFE_GPIO_I2S0_ON] = {"aud_gpio_i2s0_on", false, NULL},
0057 [MT8186_AFE_GPIO_I2S1_OFF] = {"aud_gpio_i2s1_off", false, NULL},
0058 [MT8186_AFE_GPIO_I2S1_ON] = {"aud_gpio_i2s1_on", false, NULL},
0059 [MT8186_AFE_GPIO_I2S2_OFF] = {"aud_gpio_i2s2_off", false, NULL},
0060 [MT8186_AFE_GPIO_I2S2_ON] = {"aud_gpio_i2s2_on", false, NULL},
0061 [MT8186_AFE_GPIO_I2S3_OFF] = {"aud_gpio_i2s3_off", false, NULL},
0062 [MT8186_AFE_GPIO_I2S3_ON] = {"aud_gpio_i2s3_on", false, NULL},
0063 [MT8186_AFE_GPIO_TDM_OFF] = {"aud_gpio_tdm_off", false, NULL},
0064 [MT8186_AFE_GPIO_TDM_ON] = {"aud_gpio_tdm_on", false, NULL},
0065 [MT8186_AFE_GPIO_PCM_OFF] = {"aud_gpio_pcm_off", false, NULL},
0066 [MT8186_AFE_GPIO_PCM_ON] = {"aud_gpio_pcm_on", false, NULL},
0067 };
0068
0069 static DEFINE_MUTEX(gpio_request_mutex);
0070
0071 int mt8186_afe_gpio_init(struct device *dev)
0072 {
0073 int i, j, ret;
0074
0075 aud_pinctrl = devm_pinctrl_get(dev);
0076 if (IS_ERR(aud_pinctrl)) {
0077 ret = PTR_ERR(aud_pinctrl);
0078 dev_err(dev, "%s(), ret %d, cannot get aud_pinctrl!\n",
0079 __func__, ret);
0080 return ret;
0081 }
0082
0083 for (i = 0; i < ARRAY_SIZE(aud_gpios); i++) {
0084 aud_gpios[i].gpioctrl = pinctrl_lookup_state(aud_pinctrl,
0085 aud_gpios[i].name);
0086 if (IS_ERR(aud_gpios[i].gpioctrl)) {
0087 ret = PTR_ERR(aud_gpios[i].gpioctrl);
0088 dev_info(dev, "%s(), pinctrl_lookup_state %s fail, ret %d\n",
0089 __func__, aud_gpios[i].name, ret);
0090 } else {
0091 aud_gpios[i].gpio_prepare = true;
0092 }
0093 }
0094
0095
0096 for (i = MT8186_DAI_ADDA; i <= MT8186_DAI_TDM_IN; i++) {
0097 for (j = 0; j <= 1; j++)
0098 mt8186_afe_gpio_request(dev, false, i, j);
0099 }
0100
0101 return 0;
0102 }
0103 EXPORT_SYMBOL_GPL(mt8186_afe_gpio_init);
0104
0105 static int mt8186_afe_gpio_select(struct device *dev,
0106 enum mt8186_afe_gpio type)
0107 {
0108 int ret = 0;
0109
0110 if (type < 0 || type >= MT8186_AFE_GPIO_GPIO_NUM) {
0111 dev_err(dev, "%s(), error, invalid gpio type %d\n",
0112 __func__, type);
0113 return -EINVAL;
0114 }
0115
0116 if (!aud_gpios[type].gpio_prepare) {
0117 dev_err(dev, "%s(), error, gpio type %d not prepared\n",
0118 __func__, type);
0119 return -EIO;
0120 }
0121
0122 ret = pinctrl_select_state(aud_pinctrl,
0123 aud_gpios[type].gpioctrl);
0124 if (ret) {
0125 dev_err(dev, "%s(), error, can not set gpio type %d\n",
0126 __func__, type);
0127 return ret;
0128 }
0129
0130 return 0;
0131 }
0132
0133 static int mt8186_afe_gpio_adda_dl(struct device *dev, bool enable)
0134 {
0135 int ret;
0136
0137 if (enable) {
0138 ret = mt8186_afe_gpio_select(dev, MT8186_AFE_GPIO_CLK_MOSI_ON);
0139 if (ret) {
0140 dev_err(dev, "%s(), MOSI CLK ON select fail!\n", __func__);
0141 return ret;
0142 }
0143
0144 ret = mt8186_afe_gpio_select(dev, MT8186_AFE_GPIO_DAT_MOSI_ON);
0145 if (ret) {
0146 dev_err(dev, "%s(), MOSI DAT ON select fail!\n", __func__);
0147 return ret;
0148 }
0149 } else {
0150 ret = mt8186_afe_gpio_select(dev, MT8186_AFE_GPIO_DAT_MOSI_OFF);
0151 if (ret) {
0152 dev_err(dev, "%s(), MOSI DAT OFF select fail!\n", __func__);
0153 return ret;
0154 }
0155
0156 ret = mt8186_afe_gpio_select(dev, MT8186_AFE_GPIO_CLK_MOSI_OFF);
0157 if (ret) {
0158 dev_err(dev, "%s(), MOSI CLK ON select fail!\n", __func__);
0159 return ret;
0160 }
0161 }
0162
0163 return 0;
0164 }
0165
0166 static int mt8186_afe_gpio_adda_ul(struct device *dev, bool enable)
0167 {
0168 int ret;
0169
0170 if (enable) {
0171 ret = mt8186_afe_gpio_select(dev, MT8186_AFE_GPIO_CLK_MISO_ON);
0172 if (ret) {
0173 dev_err(dev, "%s(), MISO CLK ON slect fail!\n", __func__);
0174 return ret;
0175 }
0176
0177 ret = mt8186_afe_gpio_select(dev, MT8186_AFE_GPIO_DAT_MISO_ON);
0178 if (ret) {
0179 dev_err(dev, "%s(), MISO DAT ON slect fail!\n", __func__);
0180 return ret;
0181 }
0182 } else {
0183 ret = mt8186_afe_gpio_select(dev, MT8186_AFE_GPIO_DAT_MISO_OFF);
0184 if (ret) {
0185 dev_err(dev, "%s(), MISO DAT OFF slect fail!\n", __func__);
0186 return ret;
0187 }
0188
0189 ret = mt8186_afe_gpio_select(dev, MT8186_AFE_GPIO_CLK_MISO_OFF);
0190 if (ret) {
0191 dev_err(dev, "%s(), MISO CLK OFF slect fail!\n", __func__);
0192 return ret;
0193 }
0194 }
0195
0196 return 0;
0197 }
0198
0199 int mt8186_afe_gpio_request(struct device *dev, bool enable,
0200 int dai, int uplink)
0201 {
0202 enum mt8186_afe_gpio sel;
0203 int ret = -EINVAL;
0204
0205 mutex_lock(&gpio_request_mutex);
0206
0207 switch (dai) {
0208 case MT8186_DAI_ADDA:
0209 if (uplink)
0210 ret = mt8186_afe_gpio_adda_ul(dev, enable);
0211 else
0212 ret = mt8186_afe_gpio_adda_dl(dev, enable);
0213 goto unlock;
0214 case MT8186_DAI_I2S_0:
0215 sel = enable ? MT8186_AFE_GPIO_I2S0_ON : MT8186_AFE_GPIO_I2S0_OFF;
0216 break;
0217 case MT8186_DAI_I2S_1:
0218 sel = enable ? MT8186_AFE_GPIO_I2S1_ON : MT8186_AFE_GPIO_I2S1_OFF;
0219 break;
0220 case MT8186_DAI_I2S_2:
0221 sel = enable ? MT8186_AFE_GPIO_I2S2_ON : MT8186_AFE_GPIO_I2S2_OFF;
0222 break;
0223 case MT8186_DAI_I2S_3:
0224 sel = enable ? MT8186_AFE_GPIO_I2S3_ON : MT8186_AFE_GPIO_I2S3_OFF;
0225 break;
0226 case MT8186_DAI_TDM_IN:
0227 sel = enable ? MT8186_AFE_GPIO_TDM_ON : MT8186_AFE_GPIO_TDM_OFF;
0228 break;
0229 case MT8186_DAI_PCM:
0230 sel = enable ? MT8186_AFE_GPIO_PCM_ON : MT8186_AFE_GPIO_PCM_OFF;
0231 break;
0232 default:
0233 dev_err(dev, "%s(), invalid dai %d\n", __func__, dai);
0234 goto unlock;
0235 }
0236
0237 ret = mt8186_afe_gpio_select(dev, sel);
0238
0239 unlock:
0240 mutex_unlock(&gpio_request_mutex);
0241
0242 return ret;
0243 }