1717#include <linux/init.h>
1818#include <linux/slab.h>
1919#include <linux/module.h>
20+ #include <linux/of.h>
2021
2122#include "bcm2835.h"
2223
@@ -81,13 +82,96 @@ static int snd_bcm2835_create(struct snd_card *card,
8182 return 0 ;
8283}
8384
85+ static int snd_bcm2835_alsa_probe_dt (struct platform_device * pdev )
86+ {
87+ struct device * dev = & pdev -> dev ;
88+ bcm2835_chip_t * chip ;
89+ struct snd_card * card ;
90+ u32 numchans ;
91+ int err , i ;
92+
93+ err = of_property_read_u32 (dev -> of_node , "brcm,pwm-channels" ,
94+ & numchans );
95+ if (err ) {
96+ dev_err (dev , "Failed to get DT property 'brcm,pwm-channels'" );
97+ return err ;
98+ }
99+
100+ if (numchans == 0 || numchans > MAX_SUBSTREAMS ) {
101+ numchans = MAX_SUBSTREAMS ;
102+ dev_warn (dev , "Illegal 'brcm,pwm-channels' value, will use %u\n" ,
103+ numchans );
104+ }
105+
106+ err = snd_card_new (NULL , -1 , NULL , THIS_MODULE , 0 , & card );
107+ if (err ) {
108+ dev_err (dev , "Failed to create soundcard structure\n" );
109+ return err ;
110+ }
111+
112+ snd_card_set_dev (card , dev );
113+ strcpy (card -> driver , "bcm2835" );
114+ strcpy (card -> shortname , "bcm2835 ALSA" );
115+ sprintf (card -> longname , "%s" , card -> shortname );
116+
117+ err = snd_bcm2835_create (card , pdev , & chip );
118+ if (err < 0 ) {
119+ dev_err (dev , "Failed to create bcm2835 chip\n" );
120+ goto err_free ;
121+ }
122+
123+ err = snd_bcm2835_new_pcm (chip );
124+ if (err < 0 ) {
125+ dev_err (dev , "Failed to create new bcm2835 pcm device\n" );
126+ goto err_free ;
127+ }
128+
129+ err = snd_bcm2835_new_spdif_pcm (chip );
130+ if (err < 0 ) {
131+ dev_err (dev , "Failed to create new bcm2835 spdif pcm device\n" );
132+ goto err_free ;
133+ }
134+
135+ err = snd_bcm2835_new_ctl (chip );
136+ if (err < 0 ) {
137+ dev_err (dev , "Failed to create new bcm2835 ctl\n" );
138+ goto err_free ;
139+ }
140+
141+ for (i = 0 ; i < numchans ; i ++ ) {
142+ chip -> avail_substreams |= (1 << i );
143+ chip -> pdev [i ] = pdev ;
144+ }
145+
146+ err = snd_card_register (card );
147+ if (err ) {
148+ dev_err (dev , "Failed to register bcm2835 ALSA card \n" );
149+ goto err_free ;
150+ }
151+
152+ g_card = card ;
153+ g_chip = chip ;
154+ platform_set_drvdata (pdev , card );
155+ audio_info ("bcm2835 ALSA card created with %u channels\n" , numchans );
156+
157+ return 0 ;
158+
159+ err_free :
160+ snd_card_free (card );
161+
162+ return err ;
163+ }
164+
84165static int snd_bcm2835_alsa_probe (struct platform_device * pdev )
85166{
86167 static int dev ;
87168 bcm2835_chip_t * chip ;
88169 struct snd_card * card ;
89170 int err ;
90171
172+ if (pdev -> dev .of_node )
173+ return snd_bcm2835_alsa_probe_dt (pdev );
174+
91175 if (dev >= MAX_SUBSTREAMS )
92176 return - ENODEV ;
93177
@@ -224,6 +308,12 @@ static int snd_bcm2835_alsa_resume(struct platform_device *pdev)
224308
225309#endif
226310
311+ static const struct of_device_id snd_bcm2835_of_match_table [] = {
312+ { .compatible = "brcm,bcm2835-audio" , },
313+ {},
314+ };
315+ MODULE_DEVICE_TABLE (of , snd_bcm2835_of_match_table );
316+
227317static struct platform_driver bcm2835_alsa0_driver = {
228318 .probe = snd_bcm2835_alsa_probe ,
229319 .remove = snd_bcm2835_alsa_remove ,
@@ -234,6 +324,7 @@ static struct platform_driver bcm2835_alsa0_driver = {
234324 .driver = {
235325 .name = "bcm2835_AUD0" ,
236326 .owner = THIS_MODULE ,
327+ .of_match_table = snd_bcm2835_of_match_table ,
237328 },
238329};
239330
0 commit comments