|
@@ -21,12 +21,6 @@
|
|
|
|
|
|
#include "bcm2835.h"
|
|
|
|
|
|
-/* module parameters (see "Module Parameters") */
|
|
|
-/* SNDRV_CARDS: maximum number of cards supported by this module */
|
|
|
-static int index[MAX_SUBSTREAMS] = {[0 ... (MAX_SUBSTREAMS - 1)] = -1};
|
|
|
-static char *id[MAX_SUBSTREAMS] = {[0 ... (MAX_SUBSTREAMS - 1)] = NULL};
|
|
|
-static int enable[MAX_SUBSTREAMS] = {[0 ... (MAX_SUBSTREAMS - 1)] = 1};
|
|
|
-
|
|
|
/* HACKY global pointers needed for successive probes to work : ssp
|
|
|
* But compared against the changes we will have to do in VC audio_ipc code
|
|
|
* to export 8 audio_ipc devices as a single IPC device and then monitor all
|
|
@@ -162,103 +156,6 @@ err_free:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int snd_bcm2835_alsa_probe(struct platform_device *pdev)
|
|
|
-{
|
|
|
- static int dev;
|
|
|
- struct bcm2835_chip *chip;
|
|
|
- struct snd_card *card;
|
|
|
- int err;
|
|
|
-
|
|
|
- if (pdev->dev.of_node)
|
|
|
- return snd_bcm2835_alsa_probe_dt(pdev);
|
|
|
-
|
|
|
- if (dev >= MAX_SUBSTREAMS)
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
- if (!enable[dev]) {
|
|
|
- dev++;
|
|
|
- return -ENOENT;
|
|
|
- }
|
|
|
-
|
|
|
- if (dev > 0)
|
|
|
- goto add_register_map;
|
|
|
-
|
|
|
- err = snd_card_new(&pdev->dev, index[dev], id[dev], THIS_MODULE, 0, &g_card);
|
|
|
- if (err < 0)
|
|
|
- goto out;
|
|
|
-
|
|
|
- snd_card_set_dev(g_card, &pdev->dev);
|
|
|
- strcpy(g_card->driver, "bcm2835");
|
|
|
- strcpy(g_card->shortname, "bcm2835 ALSA");
|
|
|
- sprintf(g_card->longname, "%s", g_card->shortname);
|
|
|
-
|
|
|
- err = snd_bcm2835_create(g_card, pdev, &chip);
|
|
|
- if (err < 0) {
|
|
|
- dev_err(&pdev->dev, "Failed to create bcm2835 chip\n");
|
|
|
- goto out_bcm2835_create;
|
|
|
- }
|
|
|
-
|
|
|
- g_chip = chip;
|
|
|
- err = snd_bcm2835_new_pcm(chip);
|
|
|
- if (err < 0) {
|
|
|
- dev_err(&pdev->dev, "Failed to create new BCM2835 pcm device\n");
|
|
|
- goto out_bcm2835_new_pcm;
|
|
|
- }
|
|
|
-
|
|
|
- err = snd_bcm2835_new_spdif_pcm(chip);
|
|
|
- if (err < 0) {
|
|
|
- dev_err(&pdev->dev, "Failed to create new BCM2835 spdif pcm device\n");
|
|
|
- goto out_bcm2835_new_spdif;
|
|
|
- }
|
|
|
-
|
|
|
- err = snd_bcm2835_new_ctl(chip);
|
|
|
- if (err < 0) {
|
|
|
- dev_err(&pdev->dev, "Failed to create new BCM2835 ctl\n");
|
|
|
- goto out_bcm2835_new_ctl;
|
|
|
- }
|
|
|
-
|
|
|
-add_register_map:
|
|
|
- card = g_card;
|
|
|
- chip = g_chip;
|
|
|
-
|
|
|
- BUG_ON(!(card && chip));
|
|
|
-
|
|
|
- chip->avail_substreams |= (1 << dev);
|
|
|
- chip->pdev[dev] = pdev;
|
|
|
-
|
|
|
- if (!dev) {
|
|
|
- err = snd_card_register(card);
|
|
|
- if (err < 0) {
|
|
|
- dev_err(&pdev->dev,
|
|
|
- "Failed to register bcm2835 ALSA card \n");
|
|
|
- goto out_card_register;
|
|
|
- }
|
|
|
- platform_set_drvdata(pdev, card);
|
|
|
- audio_info("bcm2835 ALSA card created!\n");
|
|
|
- } else {
|
|
|
- audio_info("bcm2835 ALSA chip created!\n");
|
|
|
- platform_set_drvdata(pdev, (void*)(long)dev);
|
|
|
- }
|
|
|
-
|
|
|
- dev++;
|
|
|
-
|
|
|
- return 0;
|
|
|
-
|
|
|
-out_card_register:
|
|
|
- out_bcm2835_new_ctl :
|
|
|
- out_bcm2835_new_spdif :
|
|
|
- out_bcm2835_new_pcm :
|
|
|
- out_bcm2835_create :
|
|
|
- BUG_ON(!g_card);
|
|
|
- if (snd_card_free(g_card))
|
|
|
- dev_err(&pdev->dev, "Failed to free Registered alsa card\n");
|
|
|
- g_card = NULL;
|
|
|
-out:
|
|
|
- dev = SNDRV_CARDS; /* stop more avail_substreams from being probed */
|
|
|
- dev_err(&pdev->dev, "BCM2835 ALSA Probe failed !!\n");
|
|
|
- return err;
|
|
|
-}
|
|
|
-
|
|
|
static int snd_bcm2835_alsa_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
int idx;
|
|
@@ -316,7 +213,7 @@ static const struct of_device_id snd_bcm2835_of_match_table[] = {
|
|
|
MODULE_DEVICE_TABLE(of, snd_bcm2835_of_match_table);
|
|
|
|
|
|
static struct platform_driver bcm2835_alsa0_driver = {
|
|
|
- .probe = snd_bcm2835_alsa_probe,
|
|
|
+ .probe = snd_bcm2835_alsa_probe_dt,
|
|
|
.remove = snd_bcm2835_alsa_remove,
|
|
|
#ifdef CONFIG_PM
|
|
|
.suspend = snd_bcm2835_alsa_suspend,
|
|
@@ -330,185 +227,21 @@ static struct platform_driver bcm2835_alsa0_driver = {
|
|
|
},
|
|
|
};
|
|
|
|
|
|
-static struct platform_driver bcm2835_alsa1_driver = {
|
|
|
- .probe = snd_bcm2835_alsa_probe,
|
|
|
- .remove = snd_bcm2835_alsa_remove,
|
|
|
-#ifdef CONFIG_PM
|
|
|
- .suspend = snd_bcm2835_alsa_suspend,
|
|
|
- .resume = snd_bcm2835_alsa_resume,
|
|
|
-#endif
|
|
|
- .driver =
|
|
|
- {
|
|
|
- .name = "bcm2835_AUD1",
|
|
|
- .owner = THIS_MODULE,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_driver bcm2835_alsa2_driver = {
|
|
|
- .probe = snd_bcm2835_alsa_probe,
|
|
|
- .remove = snd_bcm2835_alsa_remove,
|
|
|
-#ifdef CONFIG_PM
|
|
|
- .suspend = snd_bcm2835_alsa_suspend,
|
|
|
- .resume = snd_bcm2835_alsa_resume,
|
|
|
-#endif
|
|
|
- .driver =
|
|
|
- {
|
|
|
- .name = "bcm2835_AUD2",
|
|
|
- .owner = THIS_MODULE,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_driver bcm2835_alsa3_driver = {
|
|
|
- .probe = snd_bcm2835_alsa_probe,
|
|
|
- .remove = snd_bcm2835_alsa_remove,
|
|
|
-#ifdef CONFIG_PM
|
|
|
- .suspend = snd_bcm2835_alsa_suspend,
|
|
|
- .resume = snd_bcm2835_alsa_resume,
|
|
|
-#endif
|
|
|
- .driver =
|
|
|
- {
|
|
|
- .name = "bcm2835_AUD3",
|
|
|
- .owner = THIS_MODULE,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_driver bcm2835_alsa4_driver = {
|
|
|
- .probe = snd_bcm2835_alsa_probe,
|
|
|
- .remove = snd_bcm2835_alsa_remove,
|
|
|
-#ifdef CONFIG_PM
|
|
|
- .suspend = snd_bcm2835_alsa_suspend,
|
|
|
- .resume = snd_bcm2835_alsa_resume,
|
|
|
-#endif
|
|
|
- .driver =
|
|
|
- {
|
|
|
- .name = "bcm2835_AUD4",
|
|
|
- .owner = THIS_MODULE,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_driver bcm2835_alsa5_driver = {
|
|
|
- .probe = snd_bcm2835_alsa_probe,
|
|
|
- .remove = snd_bcm2835_alsa_remove,
|
|
|
-#ifdef CONFIG_PM
|
|
|
- .suspend = snd_bcm2835_alsa_suspend,
|
|
|
- .resume = snd_bcm2835_alsa_resume,
|
|
|
-#endif
|
|
|
- .driver =
|
|
|
- {
|
|
|
- .name = "bcm2835_AUD5",
|
|
|
- .owner = THIS_MODULE,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_driver bcm2835_alsa6_driver = {
|
|
|
- .probe = snd_bcm2835_alsa_probe,
|
|
|
- .remove = snd_bcm2835_alsa_remove,
|
|
|
-#ifdef CONFIG_PM
|
|
|
- .suspend = snd_bcm2835_alsa_suspend,
|
|
|
- .resume = snd_bcm2835_alsa_resume,
|
|
|
-#endif
|
|
|
- .driver =
|
|
|
- {
|
|
|
- .name = "bcm2835_AUD6",
|
|
|
- .owner = THIS_MODULE,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_driver bcm2835_alsa7_driver = {
|
|
|
- .probe = snd_bcm2835_alsa_probe,
|
|
|
- .remove = snd_bcm2835_alsa_remove,
|
|
|
-#ifdef CONFIG_PM
|
|
|
- .suspend = snd_bcm2835_alsa_suspend,
|
|
|
- .resume = snd_bcm2835_alsa_resume,
|
|
|
-#endif
|
|
|
- .driver =
|
|
|
- {
|
|
|
- .name = "bcm2835_AUD7",
|
|
|
- .owner = THIS_MODULE,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
static int bcm2835_alsa_device_init(void)
|
|
|
{
|
|
|
int err;
|
|
|
err = platform_driver_register(&bcm2835_alsa0_driver);
|
|
|
if (err) {
|
|
|
pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- err = platform_driver_register(&bcm2835_alsa1_driver);
|
|
|
- if (err) {
|
|
|
- pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
|
|
|
- goto unregister_0;
|
|
|
- }
|
|
|
-
|
|
|
- err = platform_driver_register(&bcm2835_alsa2_driver);
|
|
|
- if (err) {
|
|
|
- pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
|
|
|
- goto unregister_1;
|
|
|
- }
|
|
|
-
|
|
|
- err = platform_driver_register(&bcm2835_alsa3_driver);
|
|
|
- if (err) {
|
|
|
- pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
|
|
|
- goto unregister_2;
|
|
|
- }
|
|
|
-
|
|
|
- err = platform_driver_register(&bcm2835_alsa4_driver);
|
|
|
- if (err) {
|
|
|
- pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
|
|
|
- goto unregister_3;
|
|
|
- }
|
|
|
-
|
|
|
- err = platform_driver_register(&bcm2835_alsa5_driver);
|
|
|
- if (err) {
|
|
|
- pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
|
|
|
- goto unregister_4;
|
|
|
- }
|
|
|
-
|
|
|
- err = platform_driver_register(&bcm2835_alsa6_driver);
|
|
|
- if (err) {
|
|
|
- pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
|
|
|
- goto unregister_5;
|
|
|
- }
|
|
|
-
|
|
|
- err = platform_driver_register(&bcm2835_alsa7_driver);
|
|
|
- if (err) {
|
|
|
- pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
|
|
|
- goto unregister_6;
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
-
|
|
|
-unregister_6:
|
|
|
- platform_driver_unregister(&bcm2835_alsa6_driver);
|
|
|
-unregister_5:
|
|
|
- platform_driver_unregister(&bcm2835_alsa5_driver);
|
|
|
-unregister_4:
|
|
|
- platform_driver_unregister(&bcm2835_alsa4_driver);
|
|
|
-unregister_3:
|
|
|
- platform_driver_unregister(&bcm2835_alsa3_driver);
|
|
|
-unregister_2:
|
|
|
- platform_driver_unregister(&bcm2835_alsa2_driver);
|
|
|
-unregister_1:
|
|
|
- platform_driver_unregister(&bcm2835_alsa1_driver);
|
|
|
-unregister_0:
|
|
|
- platform_driver_unregister(&bcm2835_alsa0_driver);
|
|
|
-out:
|
|
|
- return err;
|
|
|
}
|
|
|
|
|
|
static void bcm2835_alsa_device_exit(void)
|
|
|
{
|
|
|
platform_driver_unregister(&bcm2835_alsa0_driver);
|
|
|
- platform_driver_unregister(&bcm2835_alsa1_driver);
|
|
|
- platform_driver_unregister(&bcm2835_alsa2_driver);
|
|
|
- platform_driver_unregister(&bcm2835_alsa3_driver);
|
|
|
- platform_driver_unregister(&bcm2835_alsa4_driver);
|
|
|
- platform_driver_unregister(&bcm2835_alsa5_driver);
|
|
|
- platform_driver_unregister(&bcm2835_alsa6_driver);
|
|
|
- platform_driver_unregister(&bcm2835_alsa7_driver);
|
|
|
}
|
|
|
|
|
|
late_initcall(bcm2835_alsa_device_init);
|