Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/sound/soc/mediatek/mt8192/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 8 kB image not shown  

Quelle  mt8192-afe-gpio.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
//
// mt8192-afe-gpio.c  --  Mediatek 8192 afe gpio ctrl
//
// Copyright (c) 2020 MediaTek Inc.
// Author: Shane Chien <shane.chien@mediatek.com>
//

#include <linux/pinctrl/consumer.h>

#include "mt8192-afe-common.h"
#include "mt8192-afe-gpio.h"

static struct pinctrl *aud_pinctrl;

enum mt8192_afe_gpio {
 MT8192_AFE_GPIO_DAT_MISO_OFF,
 MT8192_AFE_GPIO_DAT_MISO_ON,
 MT8192_AFE_GPIO_DAT_MOSI_OFF,
 MT8192_AFE_GPIO_DAT_MOSI_ON,
 MT8192_AFE_GPIO_DAT_MISO_CH34_OFF,
 MT8192_AFE_GPIO_DAT_MISO_CH34_ON,
 MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF,
 MT8192_AFE_GPIO_DAT_MOSI_CH34_ON,
 MT8192_AFE_GPIO_I2S0_OFF,
 MT8192_AFE_GPIO_I2S0_ON,
 MT8192_AFE_GPIO_I2S1_OFF,
 MT8192_AFE_GPIO_I2S1_ON,
 MT8192_AFE_GPIO_I2S2_OFF,
 MT8192_AFE_GPIO_I2S2_ON,
 MT8192_AFE_GPIO_I2S3_OFF,
 MT8192_AFE_GPIO_I2S3_ON,
 MT8192_AFE_GPIO_I2S5_OFF,
 MT8192_AFE_GPIO_I2S5_ON,
 MT8192_AFE_GPIO_I2S6_OFF,
 MT8192_AFE_GPIO_I2S6_ON,
 MT8192_AFE_GPIO_I2S7_OFF,
 MT8192_AFE_GPIO_I2S7_ON,
 MT8192_AFE_GPIO_I2S8_OFF,
 MT8192_AFE_GPIO_I2S8_ON,
 MT8192_AFE_GPIO_I2S9_OFF,
 MT8192_AFE_GPIO_I2S9_ON,
 MT8192_AFE_GPIO_VOW_DAT_OFF,
 MT8192_AFE_GPIO_VOW_DAT_ON,
 MT8192_AFE_GPIO_VOW_CLK_OFF,
 MT8192_AFE_GPIO_VOW_CLK_ON,
 MT8192_AFE_GPIO_CLK_MOSI_OFF,
 MT8192_AFE_GPIO_CLK_MOSI_ON,
 MT8192_AFE_GPIO_TDM_OFF,
 MT8192_AFE_GPIO_TDM_ON,
 MT8192_AFE_GPIO_GPIO_NUM
};

struct audio_gpio_attr {
 const char *name;
 bool gpio_prepare;
 struct pinctrl_state *gpioctrl;
};

static struct audio_gpio_attr aud_gpios[MT8192_AFE_GPIO_GPIO_NUM] = {
 [MT8192_AFE_GPIO_DAT_MISO_OFF] = {"aud_dat_miso_off"false, NULL},
 [MT8192_AFE_GPIO_DAT_MISO_ON] = {"aud_dat_miso_on"false, NULL},
 [MT8192_AFE_GPIO_DAT_MOSI_OFF] = {"aud_dat_mosi_off"false, NULL},
 [MT8192_AFE_GPIO_DAT_MOSI_ON] = {"aud_dat_mosi_on"false, NULL},
 [MT8192_AFE_GPIO_I2S0_OFF] = {"aud_gpio_i2s0_off"false, NULL},
 [MT8192_AFE_GPIO_I2S0_ON] = {"aud_gpio_i2s0_on"false, NULL},
 [MT8192_AFE_GPIO_I2S1_OFF] = {"aud_gpio_i2s1_off"false, NULL},
 [MT8192_AFE_GPIO_I2S1_ON] = {"aud_gpio_i2s1_on"false, NULL},
 [MT8192_AFE_GPIO_I2S2_OFF] = {"aud_gpio_i2s2_off"false, NULL},
 [MT8192_AFE_GPIO_I2S2_ON] = {"aud_gpio_i2s2_on"false, NULL},
 [MT8192_AFE_GPIO_I2S3_OFF] = {"aud_gpio_i2s3_off"false, NULL},
 [MT8192_AFE_GPIO_I2S3_ON] = {"aud_gpio_i2s3_on"false, NULL},
 [MT8192_AFE_GPIO_I2S5_OFF] = {"aud_gpio_i2s5_off"false, NULL},
 [MT8192_AFE_GPIO_I2S5_ON] = {"aud_gpio_i2s5_on"false, NULL},
 [MT8192_AFE_GPIO_I2S6_OFF] = {"aud_gpio_i2s6_off"false, NULL},
 [MT8192_AFE_GPIO_I2S6_ON] = {"aud_gpio_i2s6_on"false, NULL},
 [MT8192_AFE_GPIO_I2S7_OFF] = {"aud_gpio_i2s7_off"false, NULL},
 [MT8192_AFE_GPIO_I2S7_ON] = {"aud_gpio_i2s7_on"false, NULL},
 [MT8192_AFE_GPIO_I2S8_OFF] = {"aud_gpio_i2s8_off"false, NULL},
 [MT8192_AFE_GPIO_I2S8_ON] = {"aud_gpio_i2s8_on"false, NULL},
 [MT8192_AFE_GPIO_I2S9_OFF] = {"aud_gpio_i2s9_off"false, NULL},
 [MT8192_AFE_GPIO_I2S9_ON] = {"aud_gpio_i2s9_on"false, NULL},
 [MT8192_AFE_GPIO_TDM_OFF] = {"aud_gpio_tdm_off"false, NULL},
 [MT8192_AFE_GPIO_TDM_ON] = {"aud_gpio_tdm_on"false, NULL},
 [MT8192_AFE_GPIO_VOW_DAT_OFF] = {"vow_dat_miso_off"false, NULL},
 [MT8192_AFE_GPIO_VOW_DAT_ON] = {"vow_dat_miso_on"false, NULL},
 [MT8192_AFE_GPIO_VOW_CLK_OFF] = {"vow_clk_miso_off"false, NULL},
 [MT8192_AFE_GPIO_VOW_CLK_ON] = {"vow_clk_miso_on"false, NULL},
 [MT8192_AFE_GPIO_DAT_MISO_CH34_OFF] = {"aud_dat_miso_ch34_off",
            false, NULL},
 [MT8192_AFE_GPIO_DAT_MISO_CH34_ON] = {"aud_dat_miso_ch34_on",
           false, NULL},
 [MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF] = {"aud_dat_mosi_ch34_off",
            false, NULL},
 [MT8192_AFE_GPIO_DAT_MOSI_CH34_ON] = {"aud_dat_mosi_ch34_on",
           false, NULL},
 [MT8192_AFE_GPIO_CLK_MOSI_OFF] = {"aud_clk_mosi_off"false, NULL},
 [MT8192_AFE_GPIO_CLK_MOSI_ON] = {"aud_clk_mosi_on"false, NULL},
};

static DEFINE_MUTEX(gpio_request_mutex);

static int mt8192_afe_gpio_select(struct device *dev,
      enum mt8192_afe_gpio type)
{
 int ret;

 if (type < 0 || type >= MT8192_AFE_GPIO_GPIO_NUM) {
  dev_err(dev, "%s(), error, invalid gpio type %d\n",
   __func__, type);
  return -EINVAL;
 }

 if (!aud_gpios[type].gpio_prepare) {
  dev_warn(dev, "%s(), error, gpio type %d not prepared\n",
    __func__, type);
  return -EIO;
 }

 ret = pinctrl_select_state(aud_pinctrl,
       aud_gpios[type].gpioctrl);
 if (ret) {
  dev_dbg(dev, "%s(), error, can not set gpio type %d\n",
   __func__, type);
 }

 return ret;
}

int mt8192_afe_gpio_init(struct device *dev)
{
 int i, ret;

 aud_pinctrl = devm_pinctrl_get(dev);
 if (IS_ERR(aud_pinctrl)) {
  ret = PTR_ERR(aud_pinctrl);
  dev_err(dev, "%s(), ret %d, cannot get aud_pinctrl!\n",
   __func__, ret);
  return ret;
 }

 for (i = 0; i < ARRAY_SIZE(aud_gpios); i++) {
  aud_gpios[i].gpioctrl = pinctrl_lookup_state(aud_pinctrl,
            aud_gpios[i].name);
  if (IS_ERR(aud_gpios[i].gpioctrl)) {
   ret = PTR_ERR(aud_gpios[i].gpioctrl);
   dev_dbg(dev, "%s(), pinctrl_lookup_state %s fail, ret %d\n",
    __func__, aud_gpios[i].name, ret);
  } else {
   aud_gpios[i].gpio_prepare = true;
  }
 }

 mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_CLK_MOSI_ON);

 /* gpio status init */
 mt8192_afe_gpio_request(dev, false, MT8192_DAI_ADDA, 0);
 mt8192_afe_gpio_request(dev, false, MT8192_DAI_ADDA, 1);

 return 0;
}
EXPORT_SYMBOL(mt8192_afe_gpio_init);

static int mt8192_afe_gpio_adda_dl(struct device *dev, bool enable)
{
 if (enable) {
  return mt8192_afe_gpio_select(dev,
           MT8192_AFE_GPIO_DAT_MOSI_ON);
 } else {
  return mt8192_afe_gpio_select(dev,
           MT8192_AFE_GPIO_DAT_MOSI_OFF);
 }
}

static int mt8192_afe_gpio_adda_ul(struct device *dev, bool enable)
{
 if (enable) {
  return mt8192_afe_gpio_select(dev,
           MT8192_AFE_GPIO_DAT_MISO_ON);
 } else {
  return mt8192_afe_gpio_select(dev,
           MT8192_AFE_GPIO_DAT_MISO_OFF);
 }
}

static int mt8192_afe_gpio_adda_ch34_dl(struct device *dev, bool enable)
{
 if (enable) {
  return mt8192_afe_gpio_select(dev,
   MT8192_AFE_GPIO_DAT_MOSI_CH34_ON);
 } else {
  return mt8192_afe_gpio_select(dev,
   MT8192_AFE_GPIO_DAT_MOSI_CH34_OFF);
 }
}

static int mt8192_afe_gpio_adda_ch34_ul(struct device *dev, bool enable)
{
 if (enable) {
  return mt8192_afe_gpio_select(dev,
   MT8192_AFE_GPIO_DAT_MISO_CH34_ON);
 } else {
  return mt8192_afe_gpio_select(dev,
   MT8192_AFE_GPIO_DAT_MISO_CH34_OFF);
 }
}

int mt8192_afe_gpio_request(struct device *dev, bool enable,
       int dai, int uplink)
{
 mutex_lock(&gpio_request_mutex);
 switch (dai) {
 case MT8192_DAI_ADDA:
  if (uplink)
   mt8192_afe_gpio_adda_ul(dev, enable);
  else
   mt8192_afe_gpio_adda_dl(dev, enable);
  break;
 case MT8192_DAI_ADDA_CH34:
  if (uplink)
   mt8192_afe_gpio_adda_ch34_ul(dev, enable);
  else
   mt8192_afe_gpio_adda_ch34_dl(dev, enable);
  break;
 case MT8192_DAI_I2S_0:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S0_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S0_OFF);
  break;
 case MT8192_DAI_I2S_1:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S1_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S1_OFF);
  break;
 case MT8192_DAI_I2S_2:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S2_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S2_OFF);
  break;
 case MT8192_DAI_I2S_3:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S3_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S3_OFF);
  break;
 case MT8192_DAI_I2S_5:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S5_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S5_OFF);
  break;
 case MT8192_DAI_I2S_6:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S6_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S6_OFF);
  break;
 case MT8192_DAI_I2S_7:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S7_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S7_OFF);
  break;
 case MT8192_DAI_I2S_8:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S8_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S8_OFF);
  break;
 case MT8192_DAI_I2S_9:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S9_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_I2S9_OFF);
  break;
 case MT8192_DAI_TDM:
  if (enable)
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_TDM_ON);
  else
   mt8192_afe_gpio_select(dev, MT8192_AFE_GPIO_TDM_OFF);
  break;
 case MT8192_DAI_VOW:
  if (enable) {
   mt8192_afe_gpio_select(dev,
            MT8192_AFE_GPIO_VOW_CLK_ON);
   mt8192_afe_gpio_select(dev,
            MT8192_AFE_GPIO_VOW_DAT_ON);
  } else {
   mt8192_afe_gpio_select(dev,
            MT8192_AFE_GPIO_VOW_CLK_OFF);
   mt8192_afe_gpio_select(dev,
            MT8192_AFE_GPIO_VOW_DAT_OFF);
  }
  break;
 default:
  mutex_unlock(&gpio_request_mutex);
  dev_warn(dev, "%s(), invalid dai %d\n", __func__, dai);
  return -EINVAL;
 }
 mutex_unlock(&gpio_request_mutex);

 return 0;
}
EXPORT_SYMBOL(mt8192_afe_gpio_request);

Messung V0.5
C=96 H=96 G=95

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.