From 477f211b8a6418bc3614b8b5e2e834cff8a9c26a Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Wed, 29 Aug 2018 12:28:57 +0530 Subject: [PATCH] ASoC: sm6150: Add logic to parse micbias from dt Add logic to parse micbias info if it is specified in dt. CRs-Fixed: 2281591 Change-Id: I943cedcadeceaa4a7da3422cf427d5679fe703b6 Signed-off-by: Vatsal Bucha --- asoc/codecs/wcd937x/internal.h | 2 ++ asoc/codecs/wcd937x/wcd937x.c | 65 ++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/asoc/codecs/wcd937x/internal.h b/asoc/codecs/wcd937x/internal.h index b693f6a9bc..2ad7165674 100644 --- a/asoc/codecs/wcd937x/internal.h +++ b/asoc/codecs/wcd937x/internal.h @@ -77,7 +77,9 @@ struct wcd937x_priv { struct wcd937x_micbias_setting { u8 ldoh_v; u32 cfilt1_mv; + u32 micb1_mv; u32 micb2_mv; + u32 micb3_mv; u8 bias1_cfilt_sel; }; diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c index f445540eb3..d6135dd460 100644 --- a/asoc/codecs/wcd937x/wcd937x.c +++ b/asoc/codecs/wcd937x/wcd937x.c @@ -1725,6 +1725,65 @@ int wcd937x_reset(struct device *dev) return rc; } +static int wcd937x_read_of_property_u32(struct device *dev, const char *name, + u32 *val) +{ + int rc = 0; + + rc = of_property_read_u32(dev->of_node, name, val); + if (rc) + dev_err(dev, "%s: Looking up %s property in node %s failed\n", + __func__, name, dev->of_node->full_name); + + return rc; +} + +static void wcd937x_dt_parse_micbias_info(struct device *dev, + struct wcd937x_micbias_setting *mb) +{ + u32 prop_val = 0; + int rc = 0; + + /* MB1 */ + if (of_find_property(dev->of_node, "qcom,cdc-micbias1-mv", + NULL)) { + rc = wcd937x_read_of_property_u32(dev, + "qcom,cdc-micbias1-mv", + &prop_val); + if (!rc) + mb->micb1_mv = prop_val; + } else { + dev_info(dev, "%s: Micbias1 DT property not found\n", + __func__); + } + + /* MB2 */ + if (of_find_property(dev->of_node, "qcom,cdc-micbias2-mv", + NULL)) { + rc = wcd937x_read_of_property_u32(dev, + "qcom,cdc-micbias2-mv", + &prop_val); + if (!rc) + mb->micb2_mv = prop_val; + } else { + dev_info(dev, "%s: Micbias2 DT property not found\n", + __func__); + } + + /* MB3 */ + if (of_find_property(dev->of_node, "qcom,cdc-micbias3-mv", + NULL)) { + rc = wcd937x_read_of_property_u32(dev, + "qcom,cdc-micbias3-mv", + &prop_val); + if (!rc) + mb->micb3_mv = prop_val; + } else { + dev_info(dev, "%s: Micbias3 DT property not found\n", + __func__); + } +} + struct wcd937x_pdata *wcd937x_populate_dt_data(struct device *dev) { struct wcd937x_pdata *pdata = NULL; @@ -1755,6 +1814,7 @@ struct wcd937x_pdata *wcd937x_populate_dt_data(struct device *dev) pdata->rx_slave = of_parse_phandle(dev->of_node, "qcom,rx-slave", 0); pdata->tx_slave = of_parse_phandle(dev->of_node, "qcom,tx-slave", 0); + wcd937x_dt_parse_micbias_info(dev, &pdata->micbias); return pdata; } @@ -1776,7 +1836,8 @@ static int wcd937x_bind(struct device *dev) dev_err(dev, "%s: Fail to obtain platform data\n", __func__); return -EINVAL; } - + wcd937x->dev = dev; + wcd937x->dev->platform_data = pdata; wcd937x->rst_np = pdata->rst_np; ret = msm_cdc_init_supplies(dev, &wcd937x->supplies, pdata->regulator, pdata->num_supplies); @@ -1854,7 +1915,7 @@ static int wcd937x_bind(struct device *dev) ret = wcd_irq_init(wcd937x->irq_info, &wcd937x->virq); if (ret) { - dev_err(wcd937x->dev, "%s: IRQ init failed: %d\n", + dev_err(dev, "%s: IRQ init failed: %d\n", __func__, ret); goto err; }