Path: blob/master/sound/soc/mediatek/mt8192/mt8192-afe-gpio.c
26488 views
// SPDX-License-Identifier: GPL-2.01//2// mt8192-afe-gpio.c -- Mediatek 8192 afe gpio ctrl3//4// Copyright (c) 2020 MediaTek Inc.5// Author: Shane Chien <[email protected]>6//78#include <linux/pinctrl/consumer.h>910#include "mt8192-afe-common.h"11#include "mt8192-afe-gpio.h"1213static struct pinctrl *aud_pinctrl;1415enum mt8192_afe_gpio {16MT8192_AFE_GPIO_DAT_MISO_OFF,17MT8192_AFE_GPIO_DAT_MISO_ON,18MT8192_AFE_GPIO_DAT_MOSI_OFF,19MT8192_AFE_GPIO_DAT_MOSI_ON,20MT8192_AFE_GPIO_DAT_MISO_CH34_OFF,21MT8192_AFE_GPIO_DAT_MISO_CH34_ON,22MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF,23MT8192_AFE_GPIO_DAT_MOSI_CH34_ON,24MT8192_AFE_GPIO_I2S0_OFF,25MT8192_AFE_GPIO_I2S0_ON,26MT8192_AFE_GPIO_I2S1_OFF,27MT8192_AFE_GPIO_I2S1_ON,28MT8192_AFE_GPIO_I2S2_OFF,29MT8192_AFE_GPIO_I2S2_ON,30MT8192_AFE_GPIO_I2S3_OFF,31MT8192_AFE_GPIO_I2S3_ON,32MT8192_AFE_GPIO_I2S5_OFF,33MT8192_AFE_GPIO_I2S5_ON,34MT8192_AFE_GPIO_I2S6_OFF,35MT8192_AFE_GPIO_I2S6_ON,36MT8192_AFE_GPIO_I2S7_OFF,37MT8192_AFE_GPIO_I2S7_ON,38MT8192_AFE_GPIO_I2S8_OFF,39MT8192_AFE_GPIO_I2S8_ON,40MT8192_AFE_GPIO_I2S9_OFF,41MT8192_AFE_GPIO_I2S9_ON,42MT8192_AFE_GPIO_VOW_DAT_OFF,43MT8192_AFE_GPIO_VOW_DAT_ON,44MT8192_AFE_GPIO_VOW_CLK_OFF,45MT8192_AFE_GPIO_VOW_CLK_ON,46MT8192_AFE_GPIO_CLK_MOSI_OFF,47MT8192_AFE_GPIO_CLK_MOSI_ON,48MT8192_AFE_GPIO_TDM_OFF,49MT8192_AFE_GPIO_TDM_ON,50MT8192_AFE_GPIO_GPIO_NUM51};5253struct audio_gpio_attr {54const char *name;55bool gpio_prepare;56struct pinctrl_state *gpioctrl;57};5859static struct audio_gpio_attr aud_gpios[MT8192_AFE_GPIO_GPIO_NUM] = {60[MT8192_AFE_GPIO_DAT_MISO_OFF] = {"aud_dat_miso_off", false, NULL},61[MT8192_AFE_GPIO_DAT_MISO_ON] = {"aud_dat_miso_on", false, NULL},62[MT8192_AFE_GPIO_DAT_MOSI_OFF] = {"aud_dat_mosi_off", false, NULL},63[MT8192_AFE_GPIO_DAT_MOSI_ON] = {"aud_dat_mosi_on", false, NULL},64[MT8192_AFE_GPIO_I2S0_OFF] = {"aud_gpio_i2s0_off", false, NULL},65[MT8192_AFE_GPIO_I2S0_ON] = {"aud_gpio_i2s0_on", false, NULL},66[MT8192_AFE_GPIO_I2S1_OFF] = {"aud_gpio_i2s1_off", false, NULL},67[MT8192_AFE_GPIO_I2S1_ON] = {"aud_gpio_i2s1_on", false, NULL},68[MT8192_AFE_GPIO_I2S2_OFF] = {"aud_gpio_i2s2_off", false, NULL},69[MT8192_AFE_GPIO_I2S2_ON] = {"aud_gpio_i2s2_on", false, NULL},70[MT8192_AFE_GPIO_I2S3_OFF] = {"aud_gpio_i2s3_off", false, NULL},71[MT8192_AFE_GPIO_I2S3_ON] = {"aud_gpio_i2s3_on", false, NULL},72[MT8192_AFE_GPIO_I2S5_OFF] = {"aud_gpio_i2s5_off", false, NULL},73[MT8192_AFE_GPIO_I2S5_ON] = {"aud_gpio_i2s5_on", false, NULL},74[MT8192_AFE_GPIO_I2S6_OFF] = {"aud_gpio_i2s6_off", false, NULL},75[MT8192_AFE_GPIO_I2S6_ON] = {"aud_gpio_i2s6_on", false, NULL},76[MT8192_AFE_GPIO_I2S7_OFF] = {"aud_gpio_i2s7_off", false, NULL},77[MT8192_AFE_GPIO_I2S7_ON] = {"aud_gpio_i2s7_on", false, NULL},78[MT8192_AFE_GPIO_I2S8_OFF] = {"aud_gpio_i2s8_off", false, NULL},79[MT8192_AFE_GPIO_I2S8_ON] = {"aud_gpio_i2s8_on", false, NULL},80[MT8192_AFE_GPIO_I2S9_OFF] = {"aud_gpio_i2s9_off", false, NULL},81[MT8192_AFE_GPIO_I2S9_ON] = {"aud_gpio_i2s9_on", false, NULL},82[MT8192_AFE_GPIO_TDM_OFF] = {"aud_gpio_tdm_off", false, NULL},83[MT8192_AFE_GPIO_TDM_ON] = {"aud_gpio_tdm_on", false, NULL},84[MT8192_AFE_GPIO_VOW_DAT_OFF] = {"vow_dat_miso_off", false, NULL},85[MT8192_AFE_GPIO_VOW_DAT_ON] = {"vow_dat_miso_on", false, NULL},86[MT8192_AFE_GPIO_VOW_CLK_OFF] = {"vow_clk_miso_off", false, NULL},87[MT8192_AFE_GPIO_VOW_CLK_ON] = {"vow_clk_miso_on", false, NULL},88[MT8192_AFE_GPIO_DAT_MISO_CH34_OFF] = {"aud_dat_miso_ch34_off",89false, NULL},90[MT8192_AFE_GPIO_DAT_MISO_CH34_ON] = {"aud_dat_miso_ch34_on",91false, NULL},92[MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF] = {"aud_dat_mosi_ch34_off",93false, NULL},94[MT8192_AFE_GPIO_DAT_MOSI_CH34_ON] = {"aud_dat_mosi_ch34_on",95false, NULL},96[MT8192_AFE_GPIO_CLK_MOSI_OFF] = {"aud_clk_mosi_off", false, NULL},97[MT8192_AFE_GPIO_CLK_MOSI_ON] = {"aud_clk_mosi_on", false, NULL},98};99100static DEFINE_MUTEX(gpio_request_mutex);101102static int mt8192_afe_gpio_select(struct device *dev,103enum mt8192_afe_gpio type)104{105int ret;106107if (type < 0 || type >= MT8192_AFE_GPIO_GPIO_NUM) {108dev_err(dev, "%s(), error, invalid gpio type %d\n",109__func__, type);110return -EINVAL;111}112113if (!aud_gpios[type].gpio_prepare) {114dev_warn(dev, "%s(), error, gpio type %d not prepared\n",115__func__, type);116return -EIO;117}118119ret = pinctrl_select_state(aud_pinctrl,120aud_gpios[type].gpioctrl);121if (ret) {122dev_dbg(dev, "%s(), error, can not set gpio type %d\n",123__func__, type);124}125126return ret;127}128129int mt8192_afe_gpio_init(struct device *dev)130{131int i, ret;132133aud_pinctrl = devm_pinctrl_get(dev);134if (IS_ERR(aud_pinctrl)) {135ret = PTR_ERR(aud_pinctrl);136dev_err(dev, "%s(), ret %d, cannot get aud_pinctrl!\n",137__func__, ret);138return ret;139}140141for (i = 0; i < ARRAY_SIZE(aud_gpios); i++) {142aud_gpios[i].gpioctrl = pinctrl_lookup_state(aud_pinctrl,143aud_gpios[i].name);144if (IS_ERR(aud_gpios[i].gpioctrl)) {145ret = PTR_ERR(aud_gpios[i].gpioctrl);146dev_dbg(dev, "%s(), pinctrl_lookup_state %s fail, ret %d\n",147__func__, aud_gpios[i].name, ret);148} else {149aud_gpios[i].gpio_prepare = true;150}151}152153mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_CLK_MOSI_ON);154155/* gpio status init */156mt8192_afe_gpio_request(dev, false, MT8192_DAI_ADDA, 0);157mt8192_afe_gpio_request(dev, false, MT8192_DAI_ADDA, 1);158159return 0;160}161EXPORT_SYMBOL(mt8192_afe_gpio_init);162163static int mt8192_afe_gpio_adda_dl(struct device *dev, bool enable)164{165if (enable) {166return mt8192_afe_gpio_select(dev,167MT8192_AFE_GPIO_DAT_MOSI_ON);168} else {169return mt8192_afe_gpio_select(dev,170MT8192_AFE_GPIO_DAT_MOSI_OFF);171}172}173174static int mt8192_afe_gpio_adda_ul(struct device *dev, bool enable)175{176if (enable) {177return mt8192_afe_gpio_select(dev,178MT8192_AFE_GPIO_DAT_MISO_ON);179} else {180return mt8192_afe_gpio_select(dev,181MT8192_AFE_GPIO_DAT_MISO_OFF);182}183}184185static int mt8192_afe_gpio_adda_ch34_dl(struct device *dev, bool enable)186{187if (enable) {188return mt8192_afe_gpio_select(dev,189MT8192_AFE_GPIO_DAT_MOSI_CH34_ON);190} else {191return mt8192_afe_gpio_select(dev,192MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF);193}194}195196static int mt8192_afe_gpio_adda_ch34_ul(struct device *dev, bool enable)197{198if (enable) {199return mt8192_afe_gpio_select(dev,200MT8192_AFE_GPIO_DAT_MISO_CH34_ON);201} else {202return mt8192_afe_gpio_select(dev,203MT8192_AFE_GPIO_DAT_MISO_CH34_OFF);204}205}206207int mt8192_afe_gpio_request(struct device *dev, bool enable,208int dai, int uplink)209{210mutex_lock(&gpio_request_mutex);211switch (dai) {212case MT8192_DAI_ADDA:213if (uplink)214mt8192_afe_gpio_adda_ul(dev, enable);215else216mt8192_afe_gpio_adda_dl(dev, enable);217break;218case MT8192_DAI_ADDA_CH34:219if (uplink)220mt8192_afe_gpio_adda_ch34_ul(dev, enable);221else222mt8192_afe_gpio_adda_ch34_dl(dev, enable);223break;224case MT8192_DAI_I2S_0:225if (enable)226mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S0_ON);227else228mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S0_OFF);229break;230case MT8192_DAI_I2S_1:231if (enable)232mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S1_ON);233else234mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S1_OFF);235break;236case MT8192_DAI_I2S_2:237if (enable)238mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S2_ON);239else240mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S2_OFF);241break;242case MT8192_DAI_I2S_3:243if (enable)244mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S3_ON);245else246mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S3_OFF);247break;248case MT8192_DAI_I2S_5:249if (enable)250mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S5_ON);251else252mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S5_OFF);253break;254case MT8192_DAI_I2S_6:255if (enable)256mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S6_ON);257else258mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S6_OFF);259break;260case MT8192_DAI_I2S_7:261if (enable)262mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S7_ON);263else264mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S7_OFF);265break;266case MT8192_DAI_I2S_8:267if (enable)268mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S8_ON);269else270mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S8_OFF);271break;272case MT8192_DAI_I2S_9:273if (enable)274mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S9_ON);275else276mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S9_OFF);277break;278case MT8192_DAI_TDM:279if (enable)280mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_TDM_ON);281else282mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_TDM_OFF);283break;284case MT8192_DAI_VOW:285if (enable) {286mt8192_afe_gpio_select(dev,287MT8192_AFE_GPIO_VOW_CLK_ON);288mt8192_afe_gpio_select(dev,289MT8192_AFE_GPIO_VOW_DAT_ON);290} else {291mt8192_afe_gpio_select(dev,292MT8192_AFE_GPIO_VOW_CLK_OFF);293mt8192_afe_gpio_select(dev,294MT8192_AFE_GPIO_VOW_DAT_OFF);295}296break;297default:298mutex_unlock(&gpio_request_mutex);299dev_warn(dev, "%s(), invalid dai %d\n", __func__, dai);300return -EINVAL;301}302mutex_unlock(&gpio_request_mutex);303304return 0;305}306EXPORT_SYMBOL(mt8192_afe_gpio_request);307308309