brcm2708: update to v3.18
[openwrt/svn-archive/archive.git] / target / linux / brcm2708 / patches-3.18 / 0064-Adding-Device-Tree-support-for-some-RPi-audio-cards.patch
1 From 5f17e24bea60b696815d2c6cb578e1e23f61cd57 Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Wed, 12 Nov 2014 17:07:02 +0000
4 Subject: [PATCH 064/114] Adding Device Tree support for some RPi audio cards
5
6 ---
7 arch/arm/boot/dts/Makefile | 2 +
8 arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 81 +++++++++++++++++++++++++
9 arch/arm/boot/dts/bcm2708-rpi-b.dts | 19 +++++-
10 arch/arm/boot/dts/bcm2708.dtsi | 18 ++++--
11 arch/arm/boot/dts/hifiberry-dac-overlay.dts | 34 +++++++++++
12 arch/arm/boot/dts/hifiberry-dacplus-overlay.dts | 39 ++++++++++++
13 arch/arm/boot/dts/hifiberry-digi-overlay.dts | 39 ++++++++++++
14 arch/arm/boot/dts/iqaudio-dac-overlay.dts | 39 ++++++++++++
15 arch/arm/boot/dts/iqaudio-dacplus-overlay.dts | 39 ++++++++++++
16 sound/soc/bcm/hifiberry_dac.c | 22 +++++++
17 sound/soc/bcm/hifiberry_dacplus.c | 22 +++++++
18 sound/soc/bcm/hifiberry_digi.c | 22 +++++++
19 sound/soc/bcm/iqaudio-dac.c | 16 +++++
20 sound/soc/codecs/pcm5102a.c | 7 +++
21 14 files changed, 393 insertions(+), 6 deletions(-)
22 create mode 100644 arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
23 create mode 100644 arch/arm/boot/dts/hifiberry-dac-overlay.dts
24 create mode 100644 arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
25 create mode 100644 arch/arm/boot/dts/hifiberry-digi-overlay.dts
26 create mode 100644 arch/arm/boot/dts/iqaudio-dac-overlay.dts
27 create mode 100644 arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
28
29 diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
30 index c727f71..adaebbb 100644
31 --- a/arch/arm/boot/dts/Makefile
32 +++ b/arch/arm/boot/dts/Makefile
33 @@ -54,6 +54,7 @@ dtb-$(CONFIG_ARCH_AT91) += at91-sama5d4ek.dtb
34 dtb-$(CONFIG_ARCH_ATLAS6) += atlas6-evb.dtb
35 dtb-$(CONFIG_ARCH_AXXIA) += axm5516-amarillo.dtb
36 dtb-$(CONFIG_BCM2708_DT) += bcm2708-rpi-b.dtb
37 +dtb-$(CONFIG_BCM2708_DT) += bcm2708-rpi-b-plus.dtb
38 dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb
39 dtb-$(CONFIG_ARCH_BCM_5301X) += bcm4708-netgear-r6250.dtb
40 dtb-$(CONFIG_ARCH_BCM_63XX) += bcm963138dvt.dtb
41 @@ -520,6 +521,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt6589-aquaris5.dtb
42
43 targets += dtbs dtbs_install
44 targets += $(dtb-y)
45 +
46 endif
47
48 # *.dtb used to be generated in the directory above. Clean out the
49 diff --git a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
50 new file mode 100644
51 index 0000000..983c23f
52 --- /dev/null
53 +++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
54 @@ -0,0 +1,81 @@
55 +/dts-v1/;
56 +
57 +/include/ "bcm2708.dtsi"
58 +
59 +/ {
60 + compatible = "brcm,bcm2708";
61 + model = "Raspberry Pi Model B+";
62 +
63 + aliases {
64 + spi0 = &spi0;
65 + i2c0 = &i2c0;
66 + i2c1 = &i2c1;
67 + i2s = &i2s;
68 + gpio = &gpio;
69 + sound = &sound;
70 + };
71 +
72 + sound: sound {
73 + };
74 +};
75 +
76 +&gpio {
77 + spi0_pins: spi0_pins {
78 + brcm,pins = <7 8 9 10 11>;
79 + brcm,function = <4>; /* alt0 */
80 + };
81 +
82 + i2c0_pins: i2c0 {
83 + brcm,pins = <0 1>;
84 + brcm,function = <4>;
85 + };
86 +
87 + i2c1_pins: i2c1 {
88 + brcm,pins = <2 3>;
89 + brcm,function = <4>;
90 + };
91 +
92 + i2s_pins: i2s {
93 + brcm,pins = <18 19 20 21>;
94 + brcm,function = <4>; /* alt0 */
95 + };
96 +};
97 +
98 +&spi0 {
99 + pinctrl-names = "default";
100 + pinctrl-0 = <&spi0_pins>;
101 +
102 + spidev@0{
103 + compatible = "spidev";
104 + reg = <0>; /* CE0 */
105 + #address-cells = <1>;
106 + #size-cells = <0>;
107 + spi-max-frequency = <500000>;
108 + };
109 +
110 + spidev@1{
111 + compatible = "spidev";
112 + reg = <1>; /* CE1 */
113 + #address-cells = <1>;
114 + #size-cells = <0>;
115 + spi-max-frequency = <500000>;
116 + };
117 +};
118 +
119 +&i2c0 {
120 + pinctrl-names = "default";
121 + pinctrl-0 = <&i2c0_pins>;
122 + clock-frequency = <100000>;
123 +};
124 +
125 +&i2c1 {
126 + pinctrl-names = "default";
127 + pinctrl-0 = <&i2c1_pins>;
128 + clock-frequency = <100000>;
129 +};
130 +
131 +&i2s {
132 + #sound-dai-cells = <0>;
133 + pinctrl-names = "default";
134 + pinctrl-0 = <&i2s_pins>;
135 +};
136 diff --git a/arch/arm/boot/dts/bcm2708-rpi-b.dts b/arch/arm/boot/dts/bcm2708-rpi-b.dts
137 index 5893122..d8c6d15 100644
138 --- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
139 +++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
140 @@ -4,12 +4,18 @@
141
142 / {
143 compatible = "brcm,bcm2708";
144 - model = "Raspberry Pi";
145 + model = "Raspberry Pi Model B";
146
147 aliases {
148 spi0 = &spi0;
149 i2c0 = &i2c0;
150 i2c1 = &i2c1;
151 + i2s = &i2s;
152 + gpio = &gpio;
153 + sound = &sound;
154 + };
155 +
156 + sound: sound {
157 };
158 };
159
160 @@ -28,6 +34,11 @@
161 brcm,pins = <2 3>;
162 brcm,function = <4>;
163 };
164 +
165 + i2s_pins: i2s {
166 + brcm,pins = <28 29 30 31>;
167 + brcm,function = <4>; /* alt0 */
168 + };
169 };
170
171 &spi0 {
172 @@ -62,3 +73,9 @@
173 pinctrl-0 = <&i2c1_pins>;
174 clock-frequency = <100000>;
175 };
176 +
177 +&i2s {
178 + #sound-dai-cells = <0>;
179 + pinctrl-names = "default";
180 + pinctrl-0 = <&i2s_pins>;
181 +};
182 diff --git a/arch/arm/boot/dts/bcm2708.dtsi b/arch/arm/boot/dts/bcm2708.dtsi
183 index 2ca6d63..6b36128 100644
184 --- a/arch/arm/boot/dts/bcm2708.dtsi
185 +++ b/arch/arm/boot/dts/bcm2708.dtsi
186 @@ -7,11 +7,8 @@
187 interrupt-parent = <&intc>;
188
189 chosen {
190 - /*
191 - bootargs must be 1024 characters long because the
192 - VC bootloader can't expand it
193 - */
194 - bootargs = "console=ttyAMA0 ";
195 + /* No padding required - the boot loader can do that. */
196 + bootargs = "";
197 };
198
199 soc {
200 @@ -39,6 +36,17 @@
201 #interrupt-cells = <2>;
202 };
203
204 + i2s: i2s@7e203000 {
205 + compatible = "brcm,bcm2708-i2s";
206 + reg = <0x7e203000 0x20>,
207 + <0x7e101098 0x02>;
208 +
209 + //dmas = <&dma 2>,
210 + // <&dma 3>;
211 + dma-names = "tx", "rx";
212 + status = "disabled";
213 + };
214 +
215 spi0: spi@7e204000 {
216 compatible = "brcm,bcm2708-spi";
217 reg = <0x7e204000 0x1000>;
218 diff --git a/arch/arm/boot/dts/hifiberry-dac-overlay.dts b/arch/arm/boot/dts/hifiberry-dac-overlay.dts
219 new file mode 100644
220 index 0000000..5e7633a
221 --- /dev/null
222 +++ b/arch/arm/boot/dts/hifiberry-dac-overlay.dts
223 @@ -0,0 +1,34 @@
224 +// Definitions for HiFiBerry DAC
225 +/dts-v1/;
226 +/plugin/;
227 +
228 +/ {
229 + compatible = "brcm,bcm2708";
230 +
231 + fragment@0 {
232 + target = <&sound>;
233 + __overlay__ {
234 + compatible = "hifiberry,hifiberry-dac";
235 + i2s-controller = <&i2s>;
236 + status = "okay";
237 + };
238 + };
239 +
240 + fragment@1 {
241 + target = <&i2s>;
242 + __overlay__ {
243 + status = "okay";
244 + };
245 + };
246 +
247 + fragment@2 {
248 + target-path = "/";
249 + __overlay__ {
250 + pcm5102a-codec {
251 + #sound-dai-cells = <0>;
252 + compatible = "ti,pcm5102a";
253 + status = "okay";
254 + };
255 + };
256 + };
257 +};
258 diff --git a/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts b/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
259 new file mode 100644
260 index 0000000..deb9c62
261 --- /dev/null
262 +++ b/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
263 @@ -0,0 +1,39 @@
264 +// Definitions for HiFiBerry DAC+
265 +/dts-v1/;
266 +/plugin/;
267 +
268 +/ {
269 + compatible = "brcm,bcm2708";
270 +
271 + fragment@0 {
272 + target = <&sound>;
273 + __overlay__ {
274 + compatible = "hifiberry,hifiberry-dacplus";
275 + i2s-controller = <&i2s>;
276 + status = "okay";
277 + };
278 + };
279 +
280 + fragment@1 {
281 + target = <&i2s>;
282 + __overlay__ {
283 + status = "okay";
284 + };
285 + };
286 +
287 + fragment@2 {
288 + target = <&i2c1>;
289 + __overlay__ {
290 + #address-cells = <1>;
291 + #size-cells = <0>;
292 + status = "okay";
293 +
294 + pcm5122@4d {
295 + #sound-dai-cells = <0>;
296 + compatible = "ti,pcm5122";
297 + reg = <0x4d>;
298 + status = "okay";
299 + };
300 + };
301 + };
302 +};
303 diff --git a/arch/arm/boot/dts/hifiberry-digi-overlay.dts b/arch/arm/boot/dts/hifiberry-digi-overlay.dts
304 new file mode 100644
305 index 0000000..d0e0d8a
306 --- /dev/null
307 +++ b/arch/arm/boot/dts/hifiberry-digi-overlay.dts
308 @@ -0,0 +1,39 @@
309 +// Definitions for HiFiBerry Digi
310 +/dts-v1/;
311 +/plugin/;
312 +
313 +/ {
314 + compatible = "brcm,bcm2708";
315 +
316 + fragment@0 {
317 + target = <&sound>;
318 + __overlay__ {
319 + compatible = "hifiberry,hifiberry-digi";
320 + i2s-controller = <&i2s>;
321 + status = "okay";
322 + };
323 + };
324 +
325 + fragment@1 {
326 + target = <&i2s>;
327 + __overlay__ {
328 + status = "okay";
329 + };
330 + };
331 +
332 + fragment@2 {
333 + target = <&i2c1>;
334 + __overlay__ {
335 + #address-cells = <1>;
336 + #size-cells = <0>;
337 + status = "okay";
338 +
339 + wm8804@3b {
340 + #sound-dai-cells = <0>;
341 + compatible = "wlf,wm8804";
342 + reg = <0x3b>;
343 + status = "okay";
344 + };
345 + };
346 + };
347 +};
348 diff --git a/arch/arm/boot/dts/iqaudio-dac-overlay.dts b/arch/arm/boot/dts/iqaudio-dac-overlay.dts
349 new file mode 100644
350 index 0000000..ea8173e
351 --- /dev/null
352 +++ b/arch/arm/boot/dts/iqaudio-dac-overlay.dts
353 @@ -0,0 +1,39 @@
354 +// Definitions for IQaudIO DAC
355 +/dts-v1/;
356 +/plugin/;
357 +
358 +/ {
359 + compatible = "brcm,bcm2708";
360 +
361 + fragment@0 {
362 + target = <&sound>;
363 + __overlay__ {
364 + compatible = "iqaudio,iqaudio-dac";
365 + i2s-controller = <&i2s>;
366 + status = "okay";
367 + };
368 + };
369 +
370 + fragment@1 {
371 + target = <&i2s>;
372 + __overlay__ {
373 + status = "okay";
374 + };
375 + };
376 +
377 + fragment@2 {
378 + target = <&i2c1>;
379 + __overlay__ {
380 + #address-cells = <1>;
381 + #size-cells = <0>;
382 + status = "okay";
383 +
384 + pcm5122@4c {
385 + #sound-dai-cells = <0>;
386 + compatible = "ti,pcm5122";
387 + reg = <0x4c>;
388 + status = "okay";
389 + };
390 + };
391 + };
392 +};
393 diff --git a/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts b/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
394 new file mode 100644
395 index 0000000..735d8ab
396 --- /dev/null
397 +++ b/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
398 @@ -0,0 +1,39 @@
399 +// Definitions for IQaudIO DAC+
400 +/dts-v1/;
401 +/plugin/;
402 +
403 +/ {
404 + compatible = "brcm,bcm2708";
405 +
406 + fragment@0 {
407 + target = <&sound>;
408 + __overlay__ {
409 + compatible = "iqaudio,iqaudio-dac";
410 + i2s-controller = <&i2s>;
411 + status = "okay";
412 + };
413 + };
414 +
415 + fragment@1 {
416 + target = <&i2s>;
417 + __overlay__ {
418 + status = "okay";
419 + };
420 + };
421 +
422 + fragment@2 {
423 + target = <&i2c1>;
424 + __overlay__ {
425 + #address-cells = <1>;
426 + #size-cells = <0>;
427 + status = "okay";
428 +
429 + pcm5122@4c {
430 + #sound-dai-cells = <0>;
431 + compatible = "ti,pcm5122";
432 + reg = <0x4c>;
433 + status = "okay";
434 + };
435 + };
436 + };
437 +};
438 diff --git a/sound/soc/bcm/hifiberry_dac.c b/sound/soc/bcm/hifiberry_dac.c
439 index 4b70b45..3ab0f47 100644
440 --- a/sound/soc/bcm/hifiberry_dac.c
441 +++ b/sound/soc/bcm/hifiberry_dac.c
442 @@ -72,6 +72,21 @@ static int snd_rpi_hifiberry_dac_probe(struct platform_device *pdev)
443 int ret = 0;
444
445 snd_rpi_hifiberry_dac.dev = &pdev->dev;
446 +
447 + if (pdev->dev.of_node) {
448 + struct device_node *i2s_node;
449 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_dac_dai[0];
450 + i2s_node = of_parse_phandle(pdev->dev.of_node,
451 + "i2s-controller", 0);
452 +
453 + if (i2s_node) {
454 + dai->cpu_dai_name = NULL;
455 + dai->cpu_of_node = i2s_node;
456 + dai->platform_name = NULL;
457 + dai->platform_of_node = i2s_node;
458 + }
459 + }
460 +
461 ret = snd_soc_register_card(&snd_rpi_hifiberry_dac);
462 if (ret)
463 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
464 @@ -84,10 +99,17 @@ static int snd_rpi_hifiberry_dac_remove(struct platform_device *pdev)
465 return snd_soc_unregister_card(&snd_rpi_hifiberry_dac);
466 }
467
468 +static const struct of_device_id snd_rpi_hifiberry_dac_of_match[] = {
469 + { .compatible = "hifiberry,hifiberry-dac", },
470 + {},
471 +};
472 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dac_of_match);
473 +
474 static struct platform_driver snd_rpi_hifiberry_dac_driver = {
475 .driver = {
476 .name = "snd-hifiberry-dac",
477 .owner = THIS_MODULE,
478 + .of_match_table = snd_rpi_hifiberry_dac_of_match,
479 },
480 .probe = snd_rpi_hifiberry_dac_probe,
481 .remove = snd_rpi_hifiberry_dac_remove,
482 diff --git a/sound/soc/bcm/hifiberry_dacplus.c b/sound/soc/bcm/hifiberry_dacplus.c
483 index c63387b..11e4f39 100644
484 --- a/sound/soc/bcm/hifiberry_dacplus.c
485 +++ b/sound/soc/bcm/hifiberry_dacplus.c
486 @@ -90,6 +90,21 @@ static int snd_rpi_hifiberry_dacplus_probe(struct platform_device *pdev)
487 int ret = 0;
488
489 snd_rpi_hifiberry_dacplus.dev = &pdev->dev;
490 +
491 + if (pdev->dev.of_node) {
492 + struct device_node *i2s_node;
493 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_dacplus_dai[0];
494 + i2s_node = of_parse_phandle(pdev->dev.of_node,
495 + "i2s-controller", 0);
496 +
497 + if (i2s_node) {
498 + dai->cpu_dai_name = NULL;
499 + dai->cpu_of_node = i2s_node;
500 + dai->platform_name = NULL;
501 + dai->platform_of_node = i2s_node;
502 + }
503 + }
504 +
505 ret = snd_soc_register_card(&snd_rpi_hifiberry_dacplus);
506 if (ret)
507 dev_err(&pdev->dev,
508 @@ -103,10 +118,17 @@ static int snd_rpi_hifiberry_dacplus_remove(struct platform_device *pdev)
509 return snd_soc_unregister_card(&snd_rpi_hifiberry_dacplus);
510 }
511
512 +static const struct of_device_id snd_rpi_hifiberry_dacplus_of_match[] = {
513 + { .compatible = "hifiberry,hifiberry-dacplus", },
514 + {},
515 +};
516 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dacplus_of_match);
517 +
518 static struct platform_driver snd_rpi_hifiberry_dacplus_driver = {
519 .driver = {
520 .name = "snd-rpi-hifiberry-dacplus",
521 .owner = THIS_MODULE,
522 + .of_match_table = snd_rpi_hifiberry_dacplus_of_match,
523 },
524 .probe = snd_rpi_hifiberry_dacplus_probe,
525 .remove = snd_rpi_hifiberry_dacplus_remove,
526 diff --git a/sound/soc/bcm/hifiberry_digi.c b/sound/soc/bcm/hifiberry_digi.c
527 index e4f769d..76af8a6 100644
528 --- a/sound/soc/bcm/hifiberry_digi.c
529 +++ b/sound/soc/bcm/hifiberry_digi.c
530 @@ -125,6 +125,21 @@ static int snd_rpi_hifiberry_digi_probe(struct platform_device *pdev)
531 int ret = 0;
532
533 snd_rpi_hifiberry_digi.dev = &pdev->dev;
534 +
535 + if (pdev->dev.of_node) {
536 + struct device_node *i2s_node;
537 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_digi_dai[0];
538 + i2s_node = of_parse_phandle(pdev->dev.of_node,
539 + "i2s-controller", 0);
540 +
541 + if (i2s_node) {
542 + dai->cpu_dai_name = NULL;
543 + dai->cpu_of_node = i2s_node;
544 + dai->platform_name = NULL;
545 + dai->platform_of_node = i2s_node;
546 + }
547 + }
548 +
549 ret = snd_soc_register_card(&snd_rpi_hifiberry_digi);
550 if (ret)
551 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
552 @@ -137,10 +152,17 @@ static int snd_rpi_hifiberry_digi_remove(struct platform_device *pdev)
553 return snd_soc_unregister_card(&snd_rpi_hifiberry_digi);
554 }
555
556 +static const struct of_device_id snd_rpi_hifiberry_digi_of_match[] = {
557 + { .compatible = "hifiberry,hifiberry-digi", },
558 + {},
559 +};
560 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_digi_of_match);
561 +
562 static struct platform_driver snd_rpi_hifiberry_digi_driver = {
563 .driver = {
564 .name = "snd-hifiberry-digi",
565 .owner = THIS_MODULE,
566 + .of_match_table = snd_rpi_hifiberry_digi_of_match,
567 },
568 .probe = snd_rpi_hifiberry_digi_probe,
569 .remove = snd_rpi_hifiberry_digi_remove,
570 diff --git a/sound/soc/bcm/iqaudio-dac.c b/sound/soc/bcm/iqaudio-dac.c
571 index 8d0e2ae..ee8cd6e 100644
572 --- a/sound/soc/bcm/iqaudio-dac.c
573 +++ b/sound/soc/bcm/iqaudio-dac.c
574 @@ -76,6 +76,21 @@ static int snd_rpi_iqaudio_dac_probe(struct platform_device *pdev)
575 int ret = 0;
576
577 snd_rpi_iqaudio_dac.dev = &pdev->dev;
578 +
579 + if (pdev->dev.of_node) {
580 + struct device_node *i2s_node;
581 + struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_dac_dai[0];
582 + i2s_node = of_parse_phandle(pdev->dev.of_node,
583 + "i2s-controller", 0);
584 +
585 + if (i2s_node) {
586 + dai->cpu_dai_name = NULL;
587 + dai->cpu_of_node = i2s_node;
588 + dai->platform_name = NULL;
589 + dai->platform_of_node = i2s_node;
590 + }
591 + }
592 +
593 ret = snd_soc_register_card(&snd_rpi_iqaudio_dac);
594 if (ret)
595 dev_err(&pdev->dev,
596 @@ -93,6 +108,7 @@ static const struct of_device_id iqaudio_of_match[] = {
597 { .compatible = "iqaudio,iqaudio-dac", },
598 {},
599 };
600 +MODULE_DEVICE_TABLE(of, iqaudio_of_match);
601
602 static struct platform_driver snd_rpi_iqaudio_dac_driver = {
603 .driver = {
604 diff --git a/sound/soc/codecs/pcm5102a.c b/sound/soc/codecs/pcm5102a.c
605 index 126f1e9..7c6598e 100644
606 --- a/sound/soc/codecs/pcm5102a.c
607 +++ b/sound/soc/codecs/pcm5102a.c
608 @@ -47,12 +47,19 @@ static int pcm5102a_remove(struct platform_device *pdev)
609 return 0;
610 }
611
612 +static const struct of_device_id pcm5102a_of_match[] = {
613 + { .compatible = "ti,pcm5102a", },
614 + { }
615 +};
616 +MODULE_DEVICE_TABLE(of, pcm5102a_of_match);
617 +
618 static struct platform_driver pcm5102a_codec_driver = {
619 .probe = pcm5102a_probe,
620 .remove = pcm5102a_remove,
621 .driver = {
622 .name = "pcm5102a-codec",
623 .owner = THIS_MODULE,
624 + .of_match_table = pcm5102a_of_match,
625 },
626 };
627
628 --
629 1.8.3.2
630