From: Jia Lee Date: Wed, 30 Oct 2019 09:01:32 +0000 (+0900) Subject: [RAMEN9610-20799][ERD][NEUS7920-623] [NEUS7920-263][9610] nfc: control nfc pvdd for... X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=7f5a2112609c773fbfed3b2a121512c7f21cf1d7;p=GitHub%2FLineageOS%2Fandroid_kernel_motorola_exynos9610.git [RAMEN9610-20799][ERD][NEUS7920-623] [NEUS7920-263][9610] nfc: control nfc pvdd for low power mode nfc pvdd should be low during phone off and USB charging mode. Change-Id: I31aed59395e06d031895ad7cc2a4b82eccc75bd3 Signed-off-by: Jia Lee --- diff --git a/drivers/nfc/samsung/Kconfig b/drivers/nfc/samsung/Kconfig index d9e0b54078f3..7ea4c020283d 100644 --- a/drivers/nfc/samsung/Kconfig +++ b/drivers/nfc/samsung/Kconfig @@ -55,4 +55,7 @@ config SEC_NFC_CLK_REQ config SEC_NFC_LDO_EN bool "SEC NFC LDO" default y +config SEC_NFC_PMIC_LDO + bool "SEC NFC PMIC LDO" + default n endmenu diff --git a/drivers/nfc/samsung/sec_nfc.c b/drivers/nfc/samsung/sec_nfc.c index 3096a042cfde..f8a3830b4ad0 100644 --- a/drivers/nfc/samsung/sec_nfc.c +++ b/drivers/nfc/samsung/sec_nfc.c @@ -645,6 +645,10 @@ static int sec_nfc_parse_dt(struct device *dev, #ifdef CONFIG_SEC_NFC_LDO_EN pdata->pvdd_en = of_get_named_gpio(np, "sec-nfc,ldo_en",0); #endif +#ifdef CONFIG_SEC_NFC_PMIC_LDO + if (of_property_read_string(np, "sec-nfc,pmic-ldo", &pdata->pvdd_regulator_name)) + pr_err("%s: Failed to get %s regulator.\n", __func__, pdata->pvdd_regulator_name); +#endif #ifdef CONFIG_SEC_NFC_CLK_REQ pdata->clk_req = of_get_named_gpio(np, "sec-nfc,clk_req-gpio", 0); @@ -716,17 +720,28 @@ static int __sec_nfc_probe(struct device *dev) pr_err("failed to request about pvdd_en pin\n"); goto err_dev_reg; } - //if (!lpcharge) + if (!is_charging_mode) gpio_direction_output(pdata->pvdd_en, NFC_I2C_LDO_ON); pr_info("pvdd en: %d\n", gpio_get_value(pdata->pvdd_en)); } #endif +#ifdef CONFIG_SEC_NFC_PMIC_LDO + if (!is_charging_mode) { + pdata->pvdd_regulator = regulator_get(NULL, pdata->pvdd_regulator_name); + if (IS_ERR(pdata->pvdd_regulator)) + pr_err("%s: Failed to get %s pmic regulator.\n", __func__, pdata->pvdd_regulator); + ret = regulator_enable(pdata->pvdd_regulator); + pr_err("%s: Failed to enable pmic regulator: %d\n", __func__, ret); + } +#endif + ret = gpio_request(pdata->ven, "nfc_ven"); if (ret) { dev_err(dev, "failed to get gpio ven\n"); goto err_gpio_ven; } - gpio_direction_output(pdata->ven, SEC_NFC_PW_OFF); + if (!is_charging_mode) + gpio_direction_output(pdata->ven, SEC_NFC_PW_OFF); if (pdata->firm) { ret = gpio_request(pdata->firm, "nfc_firm"); @@ -863,6 +878,16 @@ static struct i2c_driver sec_nfc_driver = { }, }; +static int __init is_poweroff_charging_mode(char *str) +{ + if (strncmp("charger", str, 7) == 0) + is_charging_mode = true; + else { + is_charging_mode = false; + } + return 0; +} early_param("androidboot.mode", is_poweroff_charging_mode); + static int __init sec_nfc_init(void) { return SEC_NFC_INIT(&sec_nfc_driver); diff --git a/drivers/nfc/samsung/sec_nfc.h b/drivers/nfc/samsung/sec_nfc.h index 37fb80d0ca5e..750463030a3d 100644 --- a/drivers/nfc/samsung/sec_nfc.h +++ b/drivers/nfc/samsung/sec_nfc.h @@ -17,6 +17,10 @@ #ifdef CONFIG_SEC_NFC_CLK_REQ #include #endif +#ifdef CONFIG_SEC_NFC_PMIC_LDO +#include +#include +#endif #ifdef CONFIG_SEC_NFC_I2C /* support old driver configuration */ @@ -74,6 +78,10 @@ struct sec_nfc_platform_data { u32 firm_gpio_flags; u32 irq_gpio_flags; const char *nfc_pvdd; +#ifdef CONFIG_SEC_NFC_PMIC_LDO + const char *pvdd_regulator_name; + struct regulator *pvdd_regulator; +#endif }; enum sec_nfc_mode { @@ -105,7 +113,7 @@ enum sec_nfc_wake { SEC_NFC_WAKE_UP, }; -extern unsigned int lpcharge; +bool is_charging_mode; #define NFC_I2C_LDO_ON 1 #define NFC_I2C_LDO_OFF 0