| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- /*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /*******************************************************************************
- *
- * Filename:
- * ---------
- * AudDrv_Gpio.c
- *
- * Project:
- * --------
- * MT6580 Audio Driver GPIO
- *
- * Description:
- * ------------
- * Audio register
- *
- * Author:
- * -------
- * George
- *
- *------------------------------------------------------------------------------
- *
- *
- *******************************************************************************/
- /*****************************************************************************
- * C O M P I L E R F L A G S
- *****************************************************************************/
- /*****************************************************************************
- * E X T E R N A L R E F E R E N C E S
- *****************************************************************************/
- #if !defined(CONFIG_MTK_LEGACY)
- #include <linux/gpio.h>
- #include <linux/pinctrl/consumer.h>
- #else
- #include <mt-plat/mt_gpio.h>
- #endif
- #include "AudDrv_Gpio.h"
- #if !defined(CONFIG_MTK_LEGACY)
- struct pinctrl *pinctrlaud;
- enum audio_system_gpio_type {
- GPIO_DEFAULT = 0,
- GPIO_PMIC_MODE0,
- GPIO_PMIC_MODE1,
- GPIO_I2S_MODE0,
- GPIO_I2S_MODE1,
- GPIO_EXTAMP_HIGH,
- GPIO_EXTAMP_LOW,
- GPIO_EXTAMP_GAIN0,
- GPIO_EXTAMP_GAIN1,
- GPIO_EXTAMP_GAIN2,
- GPIO_EXTAMP_GAIN3,
- GPIO_HPSPK_SWITCH_HIGH,
- GPIO_HPSPK_SWITCH_LOW,
- GPIO_NUM
- };
- struct audio_gpio_attr {
- const char *name;
- bool gpio_prepare;
- struct pinctrl_state *gpioctrl;
- };
- static struct audio_gpio_attr aud_gpios[GPIO_NUM] = {
- [GPIO_DEFAULT] = {"default", false, NULL},
- [GPIO_PMIC_MODE0] = {"audpmicclk-mode0", false, NULL},
- [GPIO_PMIC_MODE1] = {"audpmicclk-mode1", false, NULL},
- [GPIO_I2S_MODE0] = {"audi2s1-mode0", false, NULL},
- [GPIO_I2S_MODE1] = {"audi2s1-mode1", false, NULL},
- [GPIO_EXTAMP_HIGH] = {"extamp-pullhigh", false, NULL},
- [GPIO_EXTAMP_LOW] = {"extamp-pulllow", false, NULL},
- [GPIO_EXTAMP_GAIN0] = {"extamp-gain0", false, NULL},
- [GPIO_EXTAMP_GAIN1] = {"extamp-gain1", false, NULL},
- [GPIO_EXTAMP_GAIN2] = {"extamp-gain2", false, NULL},
- [GPIO_EXTAMP_GAIN3] = {"extamp-gain3", false, NULL},
- [GPIO_HPSPK_SWITCH_HIGH] = {"hpspk-pullhigh", false, NULL},
- [GPIO_HPSPK_SWITCH_LOW] = {"hpspk-pulllow", false, NULL},
- };
- void AudDrv_GPIO_probe(void *dev)
- {
- int ret;
- int i = 0;
- pr_debug("%s\n", __func__);
- pinctrlaud = devm_pinctrl_get(dev);
- if (IS_ERR(pinctrlaud)) {
- ret = PTR_ERR(pinctrlaud);
- pr_err("Cannot find pinctrlaud!\n");
- return;
- }
- for (i = 0; i < ARRAY_SIZE(aud_gpios); i++) {
- aud_gpios[i].gpioctrl = pinctrl_lookup_state(pinctrlaud, aud_gpios[i].name);
- if (IS_ERR(aud_gpios[i].gpioctrl)) {
- ret = PTR_ERR(aud_gpios[i].gpioctrl);
- pr_err("%s pinctrl_lookup_state %s fail %d\n", __func__, aud_gpios[i].name,
- ret);
- } else {
- aud_gpios[i].gpio_prepare = true;
- pr_err("%s pinctrl_lookup_state %s success!\n", __func__, aud_gpios[i].name);
- }
- }
- }
- int AudDrv_GPIO_PMIC_Select(int bEnable)
- {
- int retval = 0;
- pr_debug("%s\n", __func__);
- if (bEnable == 1) {
- if (aud_gpios[GPIO_PMIC_MODE1].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_PMIC_MODE1].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_PMIC_MODE1] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_PMIC_MODE1] pins are not prepared!\n");
- retval = -1;
- }
- } else {
- if (aud_gpios[GPIO_PMIC_MODE0].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_PMIC_MODE0].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_PMIC_MODE0] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_PMIC_MODE0] pins are not prepared!\n");
- retval = -1;
- }
- }
- return retval;
- }
- int AudDrv_GPIO_I2S_Select(int bEnable)
- {
- int retval = 0;
- pr_debug("%s\n", __func__);
- if (bEnable == 1) {
- if (aud_gpios[GPIO_I2S_MODE1].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_I2S_MODE1].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_I2S_MODE1] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_I2S_MODE1] pins are not prepared!\n");
- retval = -1;
- }
- } else {
- if (aud_gpios[GPIO_I2S_MODE0].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_I2S_MODE0].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_I2S_MODE0] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_I2S_MODE0] pins are not prepared!\n");
- retval = -1;
- }
- }
- return retval;
- }
- int AudDrv_GPIO_EXTAMP_Select(int bEnable)
- {
- int retval = 0;
- pr_debug("%s\n", __func__);
- if (bEnable == 1) {
- if (aud_gpios[GPIO_EXTAMP_HIGH].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_HIGH].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_EXTAMP_HIGH] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_EXTAMP_HIGH] pins are not prepared!\n");
- retval = -1;
- }
- } else {
- if (aud_gpios[GPIO_EXTAMP_LOW].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_LOW].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_EXTAMP_LOW] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_EXTAMP_LOW] pins are not prepared!\n");
- retval = -1;
- }
- }
- return retval;
- }
- int AudDrv_GPIO_EXTAMP_Gain_Set(int value)
- {
- int retval = 0;
- pr_debug("%s value = %d\n", __func__, value);
- switch (value) {
- case 3:
- if (aud_gpios[GPIO_EXTAMP_GAIN3].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_GAIN3].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_EXTAMP_GAIN3] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_EXTAMP_GAIN3] pins are not prepared!\n");
- retval = -1;
- }
- break;
- case 2:
- if (aud_gpios[GPIO_EXTAMP_GAIN2].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_GAIN2].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_EXTAMP_GAIN2] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_EXTAMP_GAIN2] pins are not prepared!\n");
- retval = -1;
- }
- break;
- case 1:
- if (aud_gpios[GPIO_EXTAMP_GAIN1].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_GAIN1].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_EXTAMP_GAIN1] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_EXTAMP_GAIN1] pins are not prepared!\n");
- retval = -1;
- }
- break;
- case 0:
- if (aud_gpios[GPIO_EXTAMP_GAIN0].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_EXTAMP_GAIN0].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_EXTAMP_GAIN0] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_EXTAMP_GAIN0] pins are not prepared!\n");
- retval = -1;
- }
- break;
- default:
- pr_err("unsupported extamp gain mode!!!\n");
- return -1;
- }
- return retval;
- }
- int AudDrv_GPIO_HP_SPK_Switch_Select(int bEnable)
- {
- int retval = 0;
- pr_debug("%s bEnable = %d\n", __func__, bEnable);
- if (bEnable == 1) {
- if (aud_gpios[GPIO_HPSPK_SWITCH_HIGH].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_HPSPK_SWITCH_HIGH].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_HPSPK_SWITCH_HIGH] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_HPSPK_SWITCH_HIGH] pins are not prepared!\n");
- retval = -1;
- }
- } else {
- if (aud_gpios[GPIO_HPSPK_SWITCH_LOW].gpio_prepare) {
- retval =
- pinctrl_select_state(pinctrlaud, aud_gpios[GPIO_HPSPK_SWITCH_LOW].gpioctrl);
- if (retval)
- pr_err("could not set aud_gpios[GPIO_HPSPK_SWITCH_LOW] pins\n");
- } else {
- pr_err("aud_gpios[GPIO_HPSPK_SWITCH_LOW] pins are not prepared!\n");
- retval = -1;
- }
- }
- return retval;
- }
- #endif
|