summarylogtreecommitdiffstats
path: root/0007-check-AF01-for-init-data.patch
blob: cefc38b6c505c0f732274f7150b93d9737c10de5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
diff --git a/sound/soc/codecs/tas2783-sdw.c b/sound/soc/codecs/tas2783-sdw.c
index 04747acb2ed4..fb113ab693e6 100644
--- a/sound/soc/codecs/tas2783-sdw.c
+++ b/sound/soc/codecs/tas2783-sdw.c
@@ -696,22 +696,44 @@ static s32 tas_sa_func_data_init(struct tas2783_prv *tas_dev)
 	}
 
 	if (!sdca_func) {
-		/* Allocate memory for function data */
-		tas_dev->sa_func_data = devm_kzalloc(dev, sizeof(*tas_dev->sa_func_data), GFP_KERNEL);
-		if (!tas_dev->sa_func_data)
-			return dev_err_probe(dev, -ENOMEM,
-					     "failed to parse sdca functions");
-
-		/* Parse the function */
-		ret = sdca_parse_function(dev, peripheral, sdca_func,
-					  tas_dev->sa_func_data);
-		if (ret)
-			dev_warn(dev, "smartamp function parse failed:err%d, using defaults", ret);
+		dev_dbg(dev, "Missing Smart Amp function; checking AF01\n");
+		af01_node = device_get_named_child_node(dev, "AF01");
+		if (!af01_node) {
+			dev_dbg(dev, "AF01 node not found, using defaults\n");
+			return 0;
+		}
+
+		if (!fwnode_property_present(af01_node, "mipi-sdca-function-initialization-table")) {
+			dev_warn(dev, "AF01 found but missing init table, using defaults\n");
+			ret = 0;
+			goto out;
+		}
+
+		af01_desc.node = af01_node;
+		af01_desc.type = SDCA_FUNCTION_TYPE_SMART_AMP;
+		af01_desc.name = "tas-smart-amp";
+		sdca_func = &af01_desc;
 	}
 
-	return 0;
-}
+	/* Allocate memory for function data */
+	tas_dev->sa_func_data = devm_kzalloc(dev, sizeof(*tas_dev->sa_func_data), GFP_KERNEL);
+	if (!tas_dev->sa_func_data) {
+		ret = -ENOMEM;
+		goto out;
+	}
 
+	ret = sdca_parse_function(dev, peripheral, sdca_func, tas_dev->sa_func_data);
+	
+	if (ret) {
+		dev_warn(dev, "smartamp function parse failed:err %d, using defaults", ret);
+		ret = 0;
+	}
+out:
+	if (af01_node)
+		fwnode_handle_put(af01_node);
+	
+	return ret;
+}
 static s32 tas_fw_read_hdr(const u8 *data, struct tas_fw_hdr *hdr)
 {
 	hdr->size = get_unaligned_le32(data);
-- 
2.54.0