xref: /linux/sound/soc/codecs/wcd-common.c (revision 4f16b6351bbff629e1a2a9d902b96210a50d65f0)
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (c) 2025, Qualcomm Technologies, Inc. and/or its subsidiaries.
3 
4 #include <linux/export.h>
5 #include <linux/module.h>
6 #include <linux/init.h>
7 #include <linux/device.h>
8 #include <linux/of.h>
9 #include <linux/printk.h>
10 
11 #include "wcd-common.h"
12 
13 #define WCD_MIN_MICBIAS_MV	1000
14 #define WCD_DEF_MICBIAS_MV	1800
15 #define WCD_MAX_MICBIAS_MV	2850
16 
17 int wcd_get_micb_vout_ctl_val(struct device *dev, u32 micb_mv)
18 {
19 	/* min micbias voltage is 1V and maximum is 2.85V */
20 	if (micb_mv < WCD_MIN_MICBIAS_MV || micb_mv > WCD_MAX_MICBIAS_MV) {
21 		dev_err(dev, "Unsupported micbias voltage (%u mV)\n", micb_mv);
22 		return -EINVAL;
23 	}
24 
25 	return (micb_mv - WCD_MIN_MICBIAS_MV) / 50;
26 }
27 EXPORT_SYMBOL_GPL(wcd_get_micb_vout_ctl_val);
28 
29 static int wcd_get_micbias_val(struct device *dev, int micb_num, u32 *micb_mv)
30 {
31 	char micbias[64];
32 	int mv;
33 
34 	sprintf(micbias, "qcom,micbias%d-microvolt", micb_num);
35 
36 	if (of_property_read_u32(dev->of_node, micbias, &mv)) {
37 		dev_err(dev, "%s value not found, using default\n", micbias);
38 		mv = WCD_DEF_MICBIAS_MV;
39 	} else {
40 		/* convert it to milli volts */
41 		mv = mv/1000;
42 	}
43 	if (micb_mv)
44 		*micb_mv = mv;
45 
46 	mv = wcd_get_micb_vout_ctl_val(dev, mv);
47 	if (mv < 0) {
48 		dev_err(dev, "Unsupported %s voltage (%d mV), falling back to default (%d mV)\n",
49 				micbias, mv, WCD_DEF_MICBIAS_MV);
50 		return wcd_get_micb_vout_ctl_val(dev, WCD_DEF_MICBIAS_MV);
51 	}
52 
53 	return mv;
54 }
55 
56 int wcd_dt_parse_micbias_info(struct wcd_common *common)
57 {
58 	int i;
59 
60 	for (i = 0; i < common->max_bias; i++) {
61 		common->micb_vout[i] = wcd_get_micbias_val(common->dev, i + 1, &common->micb_mv[i]);
62 		if (common->micb_vout[i] < 0)
63 			return -EINVAL;
64 	}
65 
66 	return 0;
67 }
68 EXPORT_SYMBOL_GPL(wcd_dt_parse_micbias_info);
69 MODULE_DESCRIPTION("Common Qualcomm WCD Codec helpers driver");
70 MODULE_LICENSE("GPL");
71