Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 //
0003 // mt8192-afe-gpio.c  --  Mediatek 8192 afe gpio ctrl
0004 //
0005 // Copyright (c) 2020 MediaTek Inc.
0006 // Author: Shane Chien <shane.chien@mediatek.com>
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     /* gpio status init */
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);