aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.4/950-0397-pisound-Added-reading-Pisound-board-hardware-revisio.patch
blob: df6f526e2e41e6b2502ad699a758b2621c2637ba (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
From 21dace2c687d45819cb0dfc4f32f005da82d9197 Mon Sep 17 00:00:00 2001
From: gtrainavicius <gtrainavicius@users.noreply.github.com>
Date: Tue, 28 Jan 2020 14:16:37 +0200
Subject: [PATCH] pisound: Added reading Pisound board hardware
 revision and exposing it (#3425)

pisound: Added reading Pisound board hardware revision and exposing it in kernel log and sysfs file:

/sys/kernel/pisound/hw_version

Signed-off-by: Giedrius <giedrius@blokas.io>
---
 sound/soc/bcm/pisound.c | 86 ++++++++++++++++++++++++++++-------------
 1 file changed, 59 insertions(+), 27 deletions(-)

--- a/sound/soc/bcm/pisound.c
+++ b/sound/soc/bcm/pisound.c
@@ -51,7 +51,8 @@ static void pisnd_spi_set_callback(pisnd
 
 static const char *pisnd_spi_get_serial(void);
 static const char *pisnd_spi_get_id(void);
-static const char *pisnd_spi_get_version(void);
+static const char *pisnd_spi_get_fw_version(void);
+static const char *pisnd_spi_get_hw_version(void);
 
 static int pisnd_midi_init(struct snd_card *card);
 static void pisnd_midi_uninit(void);
@@ -222,7 +223,9 @@ static pisnd_spi_recv_cb g_recvCallback;
 
 static char g_serial_num[11];
 static char g_id[25];
-static char g_version[5];
+enum { MAX_VERSION_STR_LEN = 6 };
+static char g_fw_version[MAX_VERSION_STR_LEN];
+static char g_hw_version[MAX_VERSION_STR_LEN];
 
 static uint8_t g_ledFlashDuration;
 static bool    g_ledFlashDurationChanged;
@@ -558,7 +561,8 @@ static int spi_read_info(void)
 	char *p;
 
 	memset(g_serial_num, 0, sizeof(g_serial_num));
-	memset(g_version, 0, sizeof(g_version));
+	memset(g_fw_version, 0, sizeof(g_fw_version));
+	strcpy(g_hw_version, "1.0"); // Assume 1.0 hw version.
 	memset(g_id, 0, sizeof(g_id));
 
 	tmp = spi_transfer16(0);
@@ -581,12 +585,28 @@ static int spi_read_info(void)
 				return -EINVAL;
 
 			snprintf(
-				g_version,
-				sizeof(g_version),
+				g_fw_version,
+				MAX_VERSION_STR_LEN,
 				"%x.%02x",
 				buffer[0],
 				buffer[1]
 				);
+
+			g_fw_version[MAX_VERSION_STR_LEN-1] = '\0';
+			break;
+		case 3:
+			if (n != 2)
+				return -EINVAL;
+
+			snprintf(
+				g_hw_version,
+				MAX_VERSION_STR_LEN,
+				"%x.%x",
+				buffer[0],
+				buffer[1]
+			);
+
+			g_hw_version[MAX_VERSION_STR_LEN-1] = '\0';
 			break;
 		case 1:
 			if (n >= sizeof(g_serial_num))
@@ -596,12 +616,14 @@ static int spi_read_info(void)
 			break;
 		case 2:
 			{
-				if (n >= sizeof(g_id))
+				if (n*2 >= sizeof(g_id))
 					return -EINVAL;
 
 				p = g_id;
 				for (j = 0; j < n; ++j)
 					p += sprintf(p, "%02x", buffer[j]);
+
+				*p = '\0';
 			}
 			break;
 		default:
@@ -619,7 +641,8 @@ static int pisnd_spi_init(struct device
 
 	memset(g_serial_num, 0, sizeof(g_serial_num));
 	memset(g_id, 0, sizeof(g_id));
-	memset(g_version, 0, sizeof(g_version));
+	memset(g_fw_version, 0, sizeof(g_fw_version));
+	memset(g_hw_version, 0, sizeof(g_hw_version));
 
 	spi = pisnd_spi_find_device();
 
@@ -729,26 +752,22 @@ static void pisnd_spi_set_callback(pisnd
 
 static const char *pisnd_spi_get_serial(void)
 {
-	if (strlen(g_serial_num))
-		return g_serial_num;
-
-	return "";
+	return g_serial_num;
 }
 
 static const char *pisnd_spi_get_id(void)
 {
-	if (strlen(g_id))
-		return g_id;
-
-	return "";
+	return g_id;
 }
 
-static const char *pisnd_spi_get_version(void)
+static const char *pisnd_spi_get_fw_version(void)
 {
-	if (strlen(g_version))
-		return g_version;
+	return g_fw_version;
+}
 
-	return "";
+static const char *pisnd_spi_get_hw_version(void)
+{
+	return g_hw_version;
 }
 
 static const struct of_device_id pisound_of_match[] = {
@@ -1056,13 +1075,22 @@ static ssize_t pisnd_id_show(
 	return sprintf(buf, "%s\n", pisnd_spi_get_id());
 }
 
-static ssize_t pisnd_version_show(
+static ssize_t pisnd_fw_version_show(
 	struct kobject *kobj,
 	struct kobj_attribute *attr,
 	char *buf
 	)
 {
-	return sprintf(buf, "%s\n", pisnd_spi_get_version());
+	return sprintf(buf, "%s\n", pisnd_spi_get_fw_version());
+}
+
+static ssize_t pisnd_hw_version_show(
+	struct kobject *kobj,
+	struct kobj_attribute *attr,
+	char *buf
+)
+{
+	return sprintf(buf, "%s\n", pisnd_spi_get_hw_version());
 }
 
 static ssize_t pisnd_led_store(
@@ -1087,15 +1115,18 @@ static struct kobj_attribute pisnd_seria
 	__ATTR(serial, 0444, pisnd_serial_show, NULL);
 static struct kobj_attribute pisnd_id_attribute =
 	__ATTR(id, 0444, pisnd_id_show, NULL);
-static struct kobj_attribute pisnd_version_attribute =
-	__ATTR(version, 0444, pisnd_version_show, NULL);
+static struct kobj_attribute pisnd_fw_version_attribute =
+	__ATTR(version, 0444, pisnd_fw_version_show, NULL);
+static struct kobj_attribute pisnd_hw_version_attribute =
+__ATTR(hw_version, 0444, pisnd_hw_version_show, NULL);
 static struct kobj_attribute pisnd_led_attribute =
 	__ATTR(led, 0644, NULL, pisnd_led_store);
 
 static struct attribute *attrs[] = {
 	&pisnd_serial_attribute.attr,
 	&pisnd_id_attribute.attr,
-	&pisnd_version_attribute.attr,
+	&pisnd_fw_version_attribute.attr,
+	&pisnd_hw_version_attribute.attr,
 	&pisnd_led_attribute.attr,
 	NULL
 };
@@ -1114,9 +1145,10 @@ static int pisnd_probe(struct platform_d
 	}
 
 	printi("Detected Pisound card:\n");
-	printi("\tSerial:  %s\n", pisnd_spi_get_serial());
-	printi("\tVersion: %s\n", pisnd_spi_get_version());
-	printi("\tId:      %s\n", pisnd_spi_get_id());
+	printi("\tSerial:           %s\n", pisnd_spi_get_serial());
+	printi("\tFirmware Version: %s\n", pisnd_spi_get_fw_version());
+	printi("\tHardware Version: %s\n", pisnd_spi_get_hw_version());
+	printi("\tId:               %s\n", pisnd_spi_get_id());
 
 	pisnd_kobj = kobject_create_and_add("pisound", kernel_kobj);
 	if (!pisnd_kobj) {