From 0b2c5e6de9be82d6f8362d61c52a76d504fea9d3 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Fri, 4 May 2012 08:45:54 +0200 Subject: linux-mainline 3.2: add ASoC fixes for beagleboard Signed-off-by: Koen Kooi Signed-off-by: Denys Dmytriyenko --- ...add-MODULE_ALIAS-to-mcbsp-and-pcm-drivers.patch | 37 + ...onvert-per-board-modules-to-platform-driv.patch | 1119 ++++++++++++++++++++ recipes-kernel/linux/linux-mainline_3.2.bb | 4 +- 3 files changed, 1159 insertions(+), 1 deletion(-) create mode 100644 recipes-kernel/linux/linux-mainline-3.2/beagle/0015-ASoC-omap-add-MODULE_ALIAS-to-mcbsp-and-pcm-drivers.patch create mode 100644 recipes-kernel/linux/linux-mainline-3.2/beagle/0016-ASoC-omap-convert-per-board-modules-to-platform-driv.patch diff --git a/recipes-kernel/linux/linux-mainline-3.2/beagle/0015-ASoC-omap-add-MODULE_ALIAS-to-mcbsp-and-pcm-drivers.patch b/recipes-kernel/linux/linux-mainline-3.2/beagle/0015-ASoC-omap-add-MODULE_ALIAS-to-mcbsp-and-pcm-drivers.patch new file mode 100644 index 00000000..cffdeb90 --- /dev/null +++ b/recipes-kernel/linux/linux-mainline-3.2/beagle/0015-ASoC-omap-add-MODULE_ALIAS-to-mcbsp-and-pcm-drivers.patch @@ -0,0 +1,37 @@ +From d36c69551d168b2860cd216a8554740157a606f7 Mon Sep 17 00:00:00 2001 +From: Robert Nelson +Date: Tue, 3 Jan 2012 11:06:07 -0600 +Subject: [PATCH 15/16] ASoC: omap: add MODULE_ALIAS to mcbsp and pcm drivers + +This adds MODULE_ALIAS directives to the omap-mcbsp-dai and +omap-pcm-audio drivers so they can be auto-loaded when platform +devices are scanned. + +Signed-off-by: Mans Rullgard +Signed-off-by: Robert Nelson +--- + sound/soc/omap/omap-mcbsp.c | 1 + + sound/soc/omap/omap-pcm.c | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c +index 4314647..a13eb34 100644 +--- a/sound/soc/omap/omap-mcbsp.c ++++ b/sound/soc/omap/omap-mcbsp.c +@@ -800,3 +800,4 @@ module_exit(snd_omap_mcbsp_exit); + MODULE_AUTHOR("Jarkko Nikula "); + MODULE_DESCRIPTION("OMAP I2S SoC Interface"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:omap-mcbsp-dai"); +diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c +index 6ede7dc..d5cffcf 100644 +--- a/sound/soc/omap/omap-pcm.c ++++ b/sound/soc/omap/omap-pcm.c +@@ -448,3 +448,4 @@ module_exit(snd_omap_pcm_exit); + MODULE_AUTHOR("Jarkko Nikula "); + MODULE_DESCRIPTION("OMAP PCM DMA module"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:omap-pcm-audio"); +-- +1.7.10 + diff --git a/recipes-kernel/linux/linux-mainline-3.2/beagle/0016-ASoC-omap-convert-per-board-modules-to-platform-driv.patch b/recipes-kernel/linux/linux-mainline-3.2/beagle/0016-ASoC-omap-convert-per-board-modules-to-platform-driv.patch new file mode 100644 index 00000000..78657349 --- /dev/null +++ b/recipes-kernel/linux/linux-mainline-3.2/beagle/0016-ASoC-omap-convert-per-board-modules-to-platform-driv.patch @@ -0,0 +1,1119 @@ +From c5ae7182911a49960d2b7775c941244ac41c105c Mon Sep 17 00:00:00 2001 +From: Robert Nelson +Date: Tue, 3 Jan 2012 11:03:32 -0600 +Subject: [PATCH 16/16] ASoC: omap: convert per-board modules to platform + drivers + +This converts the per-board modules to platform drivers for a +device created by in main platform setup. These drivers call +snd_soc_register_card() directly instead of going via a "soc-audio" +device and the corresponding driver in soc-core. + +Signed-off-by: Mans Rullgard +Signed-off-by: Robert Nelson +--- + arch/arm/mach-omap2/devices.c | 34 ++++++++++++++++++++ + sound/soc/omap/am3517evm.c | 52 ++++++++++++++++++------------ + sound/soc/omap/igep0020.c | 49 ++++++++++++++++++----------- + sound/soc/omap/n810.c | 70 +++++++++++++++++++++++++---------------- + sound/soc/omap/omap3beagle.c | 52 ++++++++++++++++++------------ + sound/soc/omap/omap3evm.c | 53 +++++++++++++++++++------------ + sound/soc/omap/omap3pandora.c | 67 +++++++++++++++++++++++---------------- + sound/soc/omap/overo.c | 53 ++++++++++++++++++------------- + sound/soc/omap/rx51.c | 52 +++++++++++++++++++----------- + sound/soc/omap/sdp3430.c | 62 +++++++++++++++++++++--------------- + sound/soc/omap/sdp4430.c | 53 +++++++++++++++++++------------ + sound/soc/omap/zoom2.c | 65 ++++++++++++++++++++++++-------------- + 12 files changed, 423 insertions(+), 239 deletions(-) + +diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c +index c15cfad..0f0b320 100644 +--- a/arch/arm/mach-omap2/devices.c ++++ b/arch/arm/mach-omap2/devices.c +@@ -285,6 +285,10 @@ static struct platform_device omap_pcm = { + .id = -1, + }; + ++static struct platform_device omap_soc_audio = { ++ .id = -1, ++}; ++ + /* + * OMAP2420 has 2 McBSP ports + * OMAP2430 has 5 McBSP ports +@@ -297,8 +301,30 @@ OMAP_MCBSP_PLATFORM_DEVICE(3); + OMAP_MCBSP_PLATFORM_DEVICE(4); + OMAP_MCBSP_PLATFORM_DEVICE(5); + ++static struct { ++ int machine; ++ const char *name; ++} soc_device_names[] = { ++ { MACH_TYPE_OMAP3517EVM, "am3517evm-soc-audio" }, ++ { MACH_TYPE_IGEP0020, "igep2-soc-audio" }, ++ { MACH_TYPE_NOKIA_N810, "n8x1-soc-audio" }, ++ { MACH_TYPE_NOKIA_N810_WIMAX, "n8x1-soc-audio" }, ++ { MACH_TYPE_OMAP3_BEAGLE, "omap3beagle-soc-audio" }, ++ { MACH_TYPE_DEVKIT8000, "omap3beagle-soc-audio" }, ++ { MACH_TYPE_OMAP3EVM, "omap3evm-soc-audio" }, ++ { MACH_TYPE_OMAP3_PANDORA, "pandora-soc-audio" }, ++ { MACH_TYPE_OVERO, "overo-soc-audio", }, ++ { MACH_TYPE_CM_T35, "overo-soc-audio", }, ++ { MACH_TYPE_NOKIA_RX51, "rx51-soc-audio", }, ++ { MACH_TYPE_OMAP_3430SDP, "sdp3430-soc-audio", }, ++ { MACH_TYPE_OMAP_4430SDP, "sdp4430-soc-audio", }, ++ { MACH_TYPE_OMAP_ZOOM2, "zoom2-soc-audio", }, ++}; ++ + static void omap_init_audio(void) + { ++ int i; ++ + platform_device_register(&omap_mcbsp1); + platform_device_register(&omap_mcbsp2); + if (cpu_is_omap243x() || cpu_is_omap34xx() || cpu_is_omap44xx()) { +@@ -309,6 +335,14 @@ static void omap_init_audio(void) + platform_device_register(&omap_mcbsp5); + + platform_device_register(&omap_pcm); ++ ++ for (i = 0; i < ARRAY_SIZE(soc_device_names); i++) { ++ if (machine_arch_type == soc_device_names[i].machine) { ++ omap_soc_audio.name = soc_device_names[i].name; ++ platform_device_register(&omap_soc_audio); ++ break; ++ } ++ } + } + + #else +diff --git a/sound/soc/omap/am3517evm.c b/sound/soc/omap/am3517evm.c +index c1cd4a0..df8f795 100644 +--- a/sound/soc/omap/am3517evm.c ++++ b/sound/soc/omap/am3517evm.c +@@ -116,45 +116,57 @@ static struct snd_soc_card snd_soc_am3517evm = { + .num_dapm_routes = ARRAY_SIZE(audio_map), + }; + +-static struct platform_device *am3517evm_snd_device; +- +-static int __init am3517evm_soc_init(void) ++static int __devinit am3517evm_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_am3517evm; + int ret; + +- if (!machine_is_omap3517evm()) +- return -ENODEV; + pr_info("OMAP3517 / AM3517 EVM SoC init\n"); + +- am3517evm_snd_device = platform_device_alloc("soc-audio", -1); +- if (!am3517evm_snd_device) { +- printk(KERN_ERR "Platform device allocation failed\n"); +- return -ENOMEM; ++ card->dev = &pdev->dev; ++ ++ ret = snd_soc_register_card(card); ++ if (ret) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ return ret; + } + +- platform_set_drvdata(am3517evm_snd_device, &snd_soc_am3517evm); ++ return 0; ++} ++ ++static int __devexit am3517evm_soc_remove(struct platform_device *pdev) ++{ ++ struct snd_soc_card *card = platform_get_drvdata(pdev); + +- ret = platform_device_add(am3517evm_snd_device); +- if (ret) +- goto err1; ++ snd_soc_unregister_card(card); + + return 0; ++} ++ ++static struct platform_driver am3517evm_driver = { ++ .driver = { ++ .name = "am3517evm-soc-audio", ++ .owner = THIS_MODULE, ++ }, + +-err1: +- printk(KERN_ERR "Unable to add platform device\n"); +- platform_device_put(am3517evm_snd_device); ++ .probe = am3517evm_soc_probe, ++ .remove = __devexit_p(am3517evm_soc_remove), ++}; + +- return ret; ++static int __init am3517evm_soc_init(void) ++{ ++ return platform_driver_register(&am3517evm_driver); + } ++module_init(am3517evm_soc_init); + + static void __exit am3517evm_soc_exit(void) + { +- platform_device_unregister(am3517evm_snd_device); ++ platform_driver_unregister(&am3517evm_driver); + } +- +-module_init(am3517evm_soc_init); + module_exit(am3517evm_soc_exit); + + MODULE_AUTHOR("Anuj Aggarwal "); + MODULE_DESCRIPTION("ALSA SoC OMAP3517 / AM3517 EVM"); + MODULE_LICENSE("GPL v2"); ++MODULE_ALIAS("platform:am3517evm-soc-audio"); +diff --git a/sound/soc/omap/igep0020.c b/sound/soc/omap/igep0020.c +index 591fbf8..6446532 100644 +--- a/sound/soc/omap/igep0020.c ++++ b/sound/soc/omap/igep0020.c +@@ -76,44 +76,57 @@ static struct snd_soc_card snd_soc_card_igep2 = { + .num_links = 1, + }; + +-static struct platform_device *igep2_snd_device; +- +-static int __init igep2_soc_init(void) ++static int __devinit igep2_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_card_igep2; + int ret; + +- if (!machine_is_igep0020()) +- return -ENODEV; + printk(KERN_INFO "IGEP v2 SoC init\n"); + +- igep2_snd_device = platform_device_alloc("soc-audio", -1); +- if (!igep2_snd_device) { +- printk(KERN_ERR "Platform device allocation failed\n"); +- return -ENOMEM; ++ card->dev = &pdev->dev; ++ ++ ret = snd_soc_register_card(card); ++ if (ret) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ return ret; + } + +- platform_set_drvdata(igep2_snd_device, &snd_soc_card_igep2); ++ return 0; ++} + +- ret = platform_device_add(igep2_snd_device); +- if (ret) +- goto err1; ++static int __devexit igep2_soc_remove(struct platform_device *pdev) ++{ ++ struct snd_soc_card *card = platform_get_drvdata(pdev); ++ ++ snd_soc_unregister_card(card); + + return 0; ++} ++ ++static struct platform_driver igep2_driver = { ++ .driver = { ++ .name = "igep2-soc-audio", ++ .owner = THIS_MODULE, ++ }, + +-err1: +- printk(KERN_ERR "Unable to add platform device\n"); +- platform_device_put(igep2_snd_device); ++ .probe = igep2_soc_probe, ++ .remove = __devexit_p(igep2_soc_remove), ++}; + +- return ret; ++static int __init igep2_soc_init(void) ++{ ++ return platform_driver_register(&igep2_driver); + } + module_init(igep2_soc_init); + + static void __exit igep2_soc_exit(void) + { +- platform_device_unregister(igep2_snd_device); ++ platform_driver_unregister(&igep2_driver); + } + module_exit(igep2_soc_exit); + + MODULE_AUTHOR("Enric Balletbo i Serra "); + MODULE_DESCRIPTION("ALSA SoC IGEP v2"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:igep2-soc-audio"); +diff --git a/sound/soc/omap/n810.c b/sound/soc/omap/n810.c +index fc6209b..1db768c 100644 +--- a/sound/soc/omap/n810.c ++++ b/sound/soc/omap/n810.c +@@ -300,38 +300,25 @@ static struct snd_soc_card snd_soc_n810 = { + .num_dapm_routes = ARRAY_SIZE(audio_map), + }; + +-static struct platform_device *n810_snd_device; +- +-static int __init n810_soc_init(void) ++static int __devinit n810_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_n810; ++ struct device *dev = &pdev->dev; + int err; +- struct device *dev; +- +- if (!(machine_is_nokia_n810() || machine_is_nokia_n810_wimax())) +- return -ENODEV; +- +- n810_snd_device = platform_device_alloc("soc-audio", -1); +- if (!n810_snd_device) +- return -ENOMEM; + +- platform_set_drvdata(n810_snd_device, &snd_soc_n810); +- err = platform_device_add(n810_snd_device); +- if (err) +- goto err1; +- +- dev = &n810_snd_device->dev; ++ card->dev = dev; + + sys_clkout2_src = clk_get(dev, "sys_clkout2_src"); + if (IS_ERR(sys_clkout2_src)) { + dev_err(dev, "Could not get sys_clkout2_src clock\n"); + err = PTR_ERR(sys_clkout2_src); +- goto err2; ++ return err; + } + sys_clkout2 = clk_get(dev, "sys_clkout2"); + if (IS_ERR(sys_clkout2)) { + dev_err(dev, "Could not get sys_clkout2\n"); + err = PTR_ERR(sys_clkout2); +- goto err3; ++ goto err1; + } + /* + * Configure 12 MHz output on SYS_CLKOUT2. Therefore we must use +@@ -341,7 +328,7 @@ static int __init n810_soc_init(void) + if (IS_ERR(func96m_clk)) { + dev_err(dev, "Could not get func 96M clock\n"); + err = PTR_ERR(func96m_clk); +- goto err4; ++ goto err2; + } + clk_set_parent(sys_clkout2_src, func96m_clk); + clk_set_rate(sys_clkout2, 12000000); +@@ -352,33 +339,62 @@ static int __init n810_soc_init(void) + gpio_direction_output(N810_HEADSET_AMP_GPIO, 0); + gpio_direction_output(N810_SPEAKER_AMP_GPIO, 0); + ++ err = snd_soc_register_card(card); ++ if (err) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ err); ++ goto err3; ++ } ++ + return 0; +-err4: +- clk_put(sys_clkout2); + err3: +- clk_put(sys_clkout2_src); ++ clk_put(func96m_clk); + err2: +- platform_device_del(n810_snd_device); ++ clk_put(sys_clkout2); + err1: +- platform_device_put(n810_snd_device); ++ clk_put(sys_clkout2_src); + + return err; + } + +-static void __exit n810_soc_exit(void) ++static int __devexit n810_soc_remove(struct platform_device *pdev) + { ++ struct snd_soc_card *card = platform_get_drvdata(pdev); ++ + gpio_free(N810_SPEAKER_AMP_GPIO); + gpio_free(N810_HEADSET_AMP_GPIO); + clk_put(sys_clkout2_src); + clk_put(sys_clkout2); + clk_put(func96m_clk); + +- platform_device_unregister(n810_snd_device); ++ snd_soc_unregister_card(card); ++ ++ return 0; + } + ++static struct platform_driver n810_driver = { ++ .driver = { ++ .name = "n8x0-soc-audio", ++ .owner = THIS_MODULE, ++ }, ++ ++ .probe = n810_soc_probe, ++ .remove = __devexit_p(n810_soc_remove), ++}; ++ ++static int __init n810_soc_init(void) ++{ ++ return platform_driver_register(&n810_driver); ++} + module_init(n810_soc_init); ++ ++static void __exit n810_soc_exit(void) ++{ ++ platform_driver_unregister(&n810_driver); ++} + module_exit(n810_soc_exit); + + MODULE_AUTHOR("Jarkko Nikula "); + MODULE_DESCRIPTION("ALSA SoC Nokia N810"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:n8x0-soc-audio"); +diff --git a/sound/soc/omap/omap3beagle.c b/sound/soc/omap/omap3beagle.c +index 3357dcc..10b51d8 100644 +--- a/sound/soc/omap/omap3beagle.c ++++ b/sound/soc/omap/omap3beagle.c +@@ -106,45 +106,57 @@ static struct snd_soc_card snd_soc_omap3beagle = { + .num_links = 1, + }; + +-static struct platform_device *omap3beagle_snd_device; +- +-static int __init omap3beagle_soc_init(void) ++static int __devinit omap3beagle_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_omap3beagle; + int ret; + +- if (!(machine_is_omap3_beagle() || machine_is_devkit8000())) +- return -ENODEV; + pr_info("OMAP3 Beagle/Devkit8000 SoC init\n"); + +- omap3beagle_snd_device = platform_device_alloc("soc-audio", -1); +- if (!omap3beagle_snd_device) { +- printk(KERN_ERR "Platform device allocation failed\n"); +- return -ENOMEM; ++ card->dev = &pdev->dev; ++ ++ ret = snd_soc_register_card(card); ++ if (ret) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ return ret; + } + +- platform_set_drvdata(omap3beagle_snd_device, &snd_soc_omap3beagle); ++ return 0; ++} ++ ++static int __devexit omap3beagle_soc_remove(struct platform_device *pdev) ++{ ++ struct snd_soc_card *card = platform_get_drvdata(pdev); + +- ret = platform_device_add(omap3beagle_snd_device); +- if (ret) +- goto err1; ++ snd_soc_unregister_card(card); + + return 0; ++} ++ ++static struct platform_driver omap3beagle_driver = { ++ .driver = { ++ .name = "omap3beagle-soc-audio", ++ .owner = THIS_MODULE, ++ }, + +-err1: +- printk(KERN_ERR "Unable to add platform device\n"); +- platform_device_put(omap3beagle_snd_device); ++ .probe = omap3beagle_soc_probe, ++ .remove = __devexit_p(omap3beagle_soc_remove), ++}; + +- return ret; ++static int __init omap3beagle_soc_init(void) ++{ ++ return platform_driver_register(&omap3beagle_driver); + } ++module_init(omap3beagle_soc_init); + + static void __exit omap3beagle_soc_exit(void) + { +- platform_device_unregister(omap3beagle_snd_device); ++ platform_driver_unregister(&omap3beagle_driver); + } +- +-module_init(omap3beagle_soc_init); + module_exit(omap3beagle_soc_exit); + + MODULE_AUTHOR("Steve Sakoman "); + MODULE_DESCRIPTION("ALSA SoC OMAP3 Beagle"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:omap3beagle-soc-audio"); +diff --git a/sound/soc/omap/omap3evm.c b/sound/soc/omap/omap3evm.c +index 6857895..3b95cea 100644 +--- a/sound/soc/omap/omap3evm.c ++++ b/sound/soc/omap/omap3evm.c +@@ -74,44 +74,57 @@ static struct snd_soc_card snd_soc_omap3evm = { + .num_links = 1, + }; + +-static struct platform_device *omap3evm_snd_device; +- +-static int __init omap3evm_soc_init(void) ++static int __devinit omap3evm_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_omap3evm; + int ret; + +- if (!machine_is_omap3evm()) +- return -ENODEV; + pr_info("OMAP3 EVM SoC init\n"); + +- omap3evm_snd_device = platform_device_alloc("soc-audio", -1); +- if (!omap3evm_snd_device) { +- printk(KERN_ERR "Platform device allocation failed\n"); +- return -ENOMEM; ++ card->dev = &pdev->dev; ++ ++ ret = snd_soc_register_card(card); ++ if (ret) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ return ret; + } + +- platform_set_drvdata(omap3evm_snd_device, &snd_soc_omap3evm); +- ret = platform_device_add(omap3evm_snd_device); +- if (ret) +- goto err1; ++ return 0; ++} ++ ++static int __devexit omap3evm_soc_remove(struct platform_device *pdev) ++{ ++ struct snd_soc_card *card = platform_get_drvdata(pdev); ++ ++ snd_soc_unregister_card(card); + + return 0; ++} ++ ++static struct platform_driver omap3evm_driver = { ++ .driver = { ++ .name = "omap3evm-soc-audio", ++ .owner = THIS_MODULE, ++ }, + +-err1: +- printk(KERN_ERR "Unable to add platform device\n"); +- platform_device_put(omap3evm_snd_device); ++ .probe = omap3evm_soc_probe, ++ .remove = __devexit_p(omap3evm_soc_remove), ++}; + +- return ret; ++static int __init omap3evm_soc_init(void) ++{ ++ return platform_driver_register(&omap3evm_driver); + } ++module_init(omap3evm_soc_init); + + static void __exit omap3evm_soc_exit(void) + { +- platform_device_unregister(omap3evm_snd_device); ++ platform_driver_unregister(&omap3evm_driver); + } +- +-module_init(omap3evm_soc_init); + module_exit(omap3evm_soc_exit); + + MODULE_AUTHOR("Anuj Aggarwal "); + MODULE_DESCRIPTION("ALSA SoC OMAP3 EVM"); + MODULE_LICENSE("GPL v2"); ++MODULE_ALIAS("platform:omap3evm-soc-audio"); +diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c +index 7605c37..fd289a4 100644 +--- a/sound/soc/omap/omap3pandora.c ++++ b/sound/soc/omap/omap3pandora.c +@@ -237,17 +237,15 @@ static struct snd_soc_card snd_soc_card_omap3pandora = { + .num_links = ARRAY_SIZE(omap3pandora_dai), + }; + +-static struct platform_device *omap3pandora_snd_device; +- +-static int __init omap3pandora_soc_init(void) ++static int __devinit omap3pandora_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_card_omap3pandora; + int ret; + +- if (!machine_is_omap3_pandora()) +- return -ENODEV; +- + pr_info("OMAP3 Pandora SoC init\n"); + ++ card->dev = &pdev->dev; ++ + ret = gpio_request(OMAP3_PANDORA_DAC_POWER_GPIO, "dac_power"); + if (ret) { + pr_err(PREFIX "Failed to get DAC power GPIO\n"); +@@ -272,53 +270,68 @@ static int __init omap3pandora_soc_init(void) + goto fail1; + } + +- omap3pandora_snd_device = platform_device_alloc("soc-audio", -1); +- if (omap3pandora_snd_device == NULL) { +- pr_err(PREFIX "Platform device allocation failed\n"); +- ret = -ENOMEM; +- goto fail1; +- } +- +- platform_set_drvdata(omap3pandora_snd_device, &snd_soc_card_omap3pandora); +- +- ret = platform_device_add(omap3pandora_snd_device); ++ ret = snd_soc_register_card(card); + if (ret) { +- pr_err(PREFIX "Unable to add platform device\n"); +- goto fail2; ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ goto fail1; + } + +- omap3pandora_dac_reg = regulator_get(&omap3pandora_snd_device->dev, "vcc"); ++ omap3pandora_dac_reg = regulator_get(card->dev, "vcc"); + if (IS_ERR(omap3pandora_dac_reg)) { + pr_err(PREFIX "Failed to get DAC regulator from %s: %ld\n", +- dev_name(&omap3pandora_snd_device->dev), ++ dev_name(card->dev), + PTR_ERR(omap3pandora_dac_reg)); + ret = PTR_ERR(omap3pandora_dac_reg); +- goto fail3; ++ goto fail2; + } + + return 0; + +-fail3: +- platform_device_del(omap3pandora_snd_device); + fail2: +- platform_device_put(omap3pandora_snd_device); ++ snd_soc_unregister_card(card); + fail1: + gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO); + fail0: + gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO); + return ret; + } +-module_init(omap3pandora_soc_init); + +-static void __exit omap3pandora_soc_exit(void) ++static int __devexit omap3pandora_soc_remove(struct platform_device *pdev) + { ++ struct snd_soc_card *card = platform_get_drvdata(pdev); ++ + regulator_put(omap3pandora_dac_reg); +- platform_device_unregister(omap3pandora_snd_device); ++ snd_soc_unregister_card(card); + gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO); + gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO); ++ ++ return 0; ++} ++ ++static struct platform_driver omap3pandora_driver = { ++ .driver = { ++ .name = "pandora-soc-audio", ++ .owner = THIS_MODULE, ++ }, ++ ++ .probe = omap3pandora_soc_probe, ++ .remove = __devexit_p(omap3pandora_soc_remove), ++}; ++ ++static int __init omap3pandora_soc_init(void) ++{ ++ return platform_driver_register(&omap3pandora_driver); ++} ++module_init(omap3pandora_soc_init); ++ ++static void __exit omap3pandora_soc_exit(void) ++{ ++ platform_driver_unregister(&omap3pandora_driver); + } + module_exit(omap3pandora_soc_exit); + + MODULE_AUTHOR("Grazvydas Ignotas "); + MODULE_DESCRIPTION("ALSA SoC OMAP3 Pandora"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:pandora-soc-audio"); +diff --git a/sound/soc/omap/overo.c b/sound/soc/omap/overo.c +index c3550ae..fe8fd5e 100644 +--- a/sound/soc/omap/overo.c ++++ b/sound/soc/omap/overo.c +@@ -76,46 +76,57 @@ static struct snd_soc_card snd_soc_card_overo = { + .num_links = 1, + }; + +-static struct platform_device *overo_snd_device; +- +-static int __init overo_soc_init(void) ++static int __devinit overo_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_card_overo; + int ret; + +- if (!(machine_is_overo() || machine_is_cm_t35())) { +- pr_debug("Incomatible machine!\n"); +- return -ENODEV; +- } +- printk(KERN_INFO "overo SoC init\n"); ++ pr_info("overo SoC init\n"); ++ ++ card->dev = &pdev->dev; + +- overo_snd_device = platform_device_alloc("soc-audio", -1); +- if (!overo_snd_device) { +- printk(KERN_ERR "Platform device allocation failed\n"); +- return -ENOMEM; ++ ret = snd_soc_register_card(card); ++ if (ret) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ return ret; + } + +- platform_set_drvdata(overo_snd_device, &snd_soc_card_overo); ++ return 0; ++} ++ ++static int __devexit overo_soc_remove(struct platform_device *pdev) ++{ ++ struct snd_soc_card *card = platform_get_drvdata(pdev); + +- ret = platform_device_add(overo_snd_device); +- if (ret) +- goto err1; ++ snd_soc_unregister_card(card); + + return 0; ++} + +-err1: +- printk(KERN_ERR "Unable to add platform device\n"); +- platform_device_put(overo_snd_device); ++static struct platform_driver overo_driver = { ++ .driver = { ++ .name = "overo-soc-audio", ++ .owner = THIS_MODULE, ++ }, + +- return ret; ++ .probe = overo_soc_probe, ++ .remove = __devexit_p(overo_soc_remove), ++}; ++ ++static int __init overo_soc_init(void) ++{ ++ return platform_driver_register(&overo_driver); + } + module_init(overo_soc_init); + + static void __exit overo_soc_exit(void) + { +- platform_device_unregister(overo_snd_device); ++ platform_driver_unregister(&overo_driver); + } + module_exit(overo_soc_exit); + + MODULE_AUTHOR("Steve Sakoman "); + MODULE_DESCRIPTION("ALSA SoC overo"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:overo-soc-audio"); +diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c +index 4cabb74..aca084d 100644 +--- a/sound/soc/omap/rx51.c ++++ b/sound/soc/omap/rx51.c +@@ -391,14 +391,12 @@ static struct snd_soc_card rx51_sound_card = { + .num_configs = ARRAY_SIZE(rx51_codec_conf), + }; + +-static struct platform_device *rx51_snd_device; +- +-static int __init rx51_soc_init(void) ++static int __devinit rx51_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &rx51_sound_card; + int err; + +- if (!machine_is_nokia_rx51()) +- return -ENODEV; ++ card->dev = &pdev->dev; + + err = gpio_request_one(RX51_TVOUT_SEL_GPIO, + GPIOF_DIR_OUT | GPIOF_INIT_LOW, "tvout_sel"); +@@ -409,21 +407,14 @@ static int __init rx51_soc_init(void) + if (err) + goto err_gpio_eci_sw; + +- rx51_snd_device = platform_device_alloc("soc-audio", -1); +- if (!rx51_snd_device) { +- err = -ENOMEM; ++ err = snd_soc_register_card(card); ++ if (err) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ err); + goto err1; + } + +- platform_set_drvdata(rx51_snd_device, &rx51_sound_card); +- +- err = platform_device_add(rx51_snd_device); +- if (err) +- goto err2; +- + return 0; +-err2: +- platform_device_put(rx51_snd_device); + err1: + gpio_free(RX51_ECI_SW_GPIO); + err_gpio_eci_sw: +@@ -433,19 +424,44 @@ err_gpio_tvout_sel: + return err; + } + +-static void __exit rx51_soc_exit(void) ++static int __devexit rx51_soc_remove(struct platform_device *pdev) + { ++ struct snd_soc_card *card = platform_get_drvdata(pdev); ++ + snd_soc_jack_free_gpios(&rx51_av_jack, ARRAY_SIZE(rx51_av_jack_gpios), + rx51_av_jack_gpios); + +- platform_device_unregister(rx51_snd_device); ++ snd_soc_unregister_card(card); ++ + gpio_free(RX51_ECI_SW_GPIO); + gpio_free(RX51_TVOUT_SEL_GPIO); ++ ++ return 0; + } + ++static struct platform_driver rx51_driver = { ++ .driver = { ++ .name = "rx51-soc-audio", ++ .owner = THIS_MODULE, ++ }, ++ ++ .probe = rx51_soc_probe, ++ .remove = __devexit_p(rx51_soc_remove), ++}; ++ ++static int __init rx51_soc_init(void) ++{ ++ return platform_driver_register(&rx51_driver); ++} + module_init(rx51_soc_init); ++ ++static void __exit rx51_soc_exit(void) ++{ ++ platform_driver_unregister(&rx51_driver); ++} + module_exit(rx51_soc_exit); + + MODULE_AUTHOR("Nokia Corporation"); + MODULE_DESCRIPTION("ALSA SoC Nokia RX-51"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:rx51-soc-audio"); +diff --git a/sound/soc/omap/sdp3430.c b/sound/soc/omap/sdp3430.c +index e8fbf8e..09fd5bd 100644 +--- a/sound/soc/omap/sdp3430.c ++++ b/sound/soc/omap/sdp3430.c +@@ -222,24 +222,15 @@ static struct snd_soc_card snd_soc_sdp3430 = { + .num_dapm_routes = ARRAY_SIZE(audio_map), + }; + +-static struct platform_device *sdp3430_snd_device; +- +-static int __init sdp3430_soc_init(void) ++static int __devinit sdp3430_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_sdp3430; + int ret; + u8 pin_mux; + +- if (!machine_is_omap_3430sdp()) +- return -ENODEV; +- printk(KERN_INFO "SDP3430 SoC init\n"); +- +- sdp3430_snd_device = platform_device_alloc("soc-audio", -1); +- if (!sdp3430_snd_device) { +- printk(KERN_ERR "Platform device allocation failed\n"); +- return -ENOMEM; +- } ++ pr_info("SDP3430 SoC init\n"); + +- platform_set_drvdata(sdp3430_snd_device, &snd_soc_sdp3430); ++ card->dev = &pdev->dev; + + /* Set TWL4030 GPIO6 as EXTMUTE signal */ + twl_i2c_read_u8(TWL4030_MODULE_INTBR, &pin_mux, +@@ -249,30 +240,51 @@ static int __init sdp3430_soc_init(void) + twl_i2c_write_u8(TWL4030_MODULE_INTBR, pin_mux, + TWL4030_INTBR_PMBR1); + +- ret = platform_device_add(sdp3430_snd_device); +- if (ret) +- goto err1; ++ ret = snd_soc_register_card(card); ++ if (ret) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ return ret; ++ } + + return 0; ++} + +-err1: +- printk(KERN_ERR "Unable to add platform device\n"); +- platform_device_put(sdp3430_snd_device); ++static int __devexit sdp3430_soc_remove(struct platform_device *pdev) ++{ ++ struct snd_soc_card *card = platform_get_drvdata(pdev); + +- return ret; ++ snd_soc_jack_free_gpios(&hs_jack, ARRAY_SIZE(hs_jack_gpios), ++ hs_jack_gpios); ++ ++ snd_soc_unregister_card(card); ++ ++ return 0; ++} ++ ++static struct platform_driver sdp3430_driver = { ++ .driver = { ++ .name = "sdp3430-soc-audio", ++ .owner = THIS_MODULE, ++ }, ++ ++ .probe = sdp3430_soc_probe, ++ .remove = __devexit_p(sdp3430_soc_remove), ++}; ++ ++static int __init sdp3430_soc_init(void) ++{ ++ return platform_driver_register(&sdp3430_driver); + } + module_init(sdp3430_soc_init); + + static void __exit sdp3430_soc_exit(void) + { +- snd_soc_jack_free_gpios(&hs_jack, ARRAY_SIZE(hs_jack_gpios), +- hs_jack_gpios); +- +- platform_device_unregister(sdp3430_snd_device); ++ platform_driver_unregister(&sdp3430_driver); + } + module_exit(sdp3430_soc_exit); + + MODULE_AUTHOR("Misael Lopez Cruz "); + MODULE_DESCRIPTION("ALSA SoC SDP3430"); + MODULE_LICENSE("GPL"); +- ++MODULE_ALIAS("platform:sdp3430-soc-audio"); +diff --git a/sound/soc/omap/sdp4430.c b/sound/soc/omap/sdp4430.c +index 03d9fa4..b3a05b1 100644 +--- a/sound/soc/omap/sdp4430.c ++++ b/sound/soc/omap/sdp4430.c +@@ -172,44 +172,57 @@ static struct snd_soc_card snd_soc_sdp4430 = { + .num_dapm_routes = ARRAY_SIZE(audio_map), + }; + +-static struct platform_device *sdp4430_snd_device; +- +-static int __init sdp4430_soc_init(void) ++static int __devinit sdp4430_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_sdp4430; + int ret; + +- if (!machine_is_omap_4430sdp()) +- return -ENODEV; +- printk(KERN_INFO "SDP4430 SoC init\n"); ++ pr_info("SDP4430 SoC init\n"); ++ ++ card->dev = &pdev->dev; + +- sdp4430_snd_device = platform_device_alloc("soc-audio", -1); +- if (!sdp4430_snd_device) { +- printk(KERN_ERR "Platform device allocation failed\n"); +- return -ENOMEM; ++ ret = snd_soc_register_card(card); ++ if (ret) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ return ret; + } + +- platform_set_drvdata(sdp4430_snd_device, &snd_soc_sdp4430); ++ return 0; ++} + +- ret = platform_device_add(sdp4430_snd_device); +- if (ret) +- goto err; ++static int __devexit sdp4430_soc_remove(struct platform_device *pdev) ++{ ++ struct snd_soc_card *card = platform_get_drvdata(pdev); ++ ++ snd_soc_unregister_card(card); + + return 0; ++} + +-err: +- printk(KERN_ERR "Unable to add platform device\n"); +- platform_device_put(sdp4430_snd_device); +- return ret; ++static struct platform_driver sdp4430_driver = { ++ .driver = { ++ .name = "sdp4430-soc-audio", ++ .owner = THIS_MODULE, ++ }, ++ ++ .probe = sdp4430_soc_probe, ++ .remove = __devexit_p(sdp4430_soc_remove), ++}; ++ ++static int __init sdp4430_soc_init(void) ++{ ++ return platform_driver_register(&sdp4430_driver); + } + module_init(sdp4430_soc_init); + + static void __exit sdp4430_soc_exit(void) + { +- platform_device_unregister(sdp4430_snd_device); ++ platform_driver_unregister(&sdp4430_driver); + } + module_exit(sdp4430_soc_exit); + + MODULE_AUTHOR("Misael Lopez Cruz "); + MODULE_DESCRIPTION("ALSA SoC SDP4430"); + MODULE_LICENSE("GPL"); +- ++MODULE_ALIAS("platform:sdp4430-soc-audio"); +diff --git a/sound/soc/omap/zoom2.c b/sound/soc/omap/zoom2.c +index 7641a7f..8db8e10 100644 +--- a/sound/soc/omap/zoom2.c ++++ b/sound/soc/omap/zoom2.c +@@ -166,26 +166,14 @@ static struct snd_soc_card snd_soc_zoom2 = { + .num_dapm_routes = ARRAY_SIZE(audio_map), + }; + +-static struct platform_device *zoom2_snd_device; +- +-static int __init zoom2_soc_init(void) ++static int __devinit zoom2_soc_probe(struct platform_device *pdev) + { ++ struct snd_soc_card *card = &snd_soc_zoom2; + int ret; + +- if (!machine_is_omap_zoom2()) +- return -ENODEV; +- printk(KERN_INFO "Zoom2 SoC init\n"); +- +- zoom2_snd_device = platform_device_alloc("soc-audio", -1); +- if (!zoom2_snd_device) { +- printk(KERN_ERR "Platform device allocation failed\n"); +- return -ENOMEM; +- } ++ pr_info("Zoom2 SoC init\n"); + +- platform_set_drvdata(zoom2_snd_device, &snd_soc_zoom2); +- ret = platform_device_add(zoom2_snd_device); +- if (ret) +- goto err1; ++ card->dev = &pdev->dev; + + BUG_ON(gpio_request(ZOOM2_HEADSET_MUX_GPIO, "hs_mux") < 0); + gpio_direction_output(ZOOM2_HEADSET_MUX_GPIO, 0); +@@ -193,26 +181,57 @@ static int __init zoom2_soc_init(void) + BUG_ON(gpio_request(ZOOM2_HEADSET_EXTMUTE_GPIO, "ext_mute") < 0); + gpio_direction_output(ZOOM2_HEADSET_EXTMUTE_GPIO, 0); + ++ ret = snd_soc_register_card(card); ++ if (ret) { ++ dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ++ ret); ++ goto err; ++ } ++ + return 0; + +-err1: +- printk(KERN_ERR "Unable to add platform device\n"); +- platform_device_put(zoom2_snd_device); ++err: ++ gpio_free(ZOOM2_HEADSET_MUX_GPIO); ++ gpio_free(ZOOM2_HEADSET_EXTMUTE_GPIO); + + return ret; + } +-module_init(zoom2_soc_init); + +-static void __exit zoom2_soc_exit(void) ++static int __devexit zoom2_soc_remove(struct platform_device *pdev) + { ++ struct snd_soc_card *card = platform_get_drvdata(pdev); ++ ++ snd_soc_unregister_card(card); ++ + gpio_free(ZOOM2_HEADSET_MUX_GPIO); + gpio_free(ZOOM2_HEADSET_EXTMUTE_GPIO); + +- platform_device_unregister(zoom2_snd_device); ++ return 0; ++} ++ ++static struct platform_driver zoom2_driver = { ++ .driver = { ++ .name = "zoom2-soc-audio", ++ .owner = THIS_MODULE, ++ }, ++ ++ .probe = zoom2_soc_probe, ++ .remove = __devexit_p(zoom2_soc_remove), ++}; ++ ++static int __init zoom2_soc_init(void) ++{ ++ return platform_driver_register(&zoom2_driver); ++} ++module_init(zoom2_soc_init); ++ ++static void __exit zoom2_soc_exit(void) ++{ ++ platform_driver_unregister(&zoom2_driver); + } + module_exit(zoom2_soc_exit); + + MODULE_AUTHOR("Misael Lopez Cruz "); + MODULE_DESCRIPTION("ALSA SoC Zoom2"); + MODULE_LICENSE("GPL"); +- ++MODULE_ALIAS("platform:zoom2-soc-audio"); +-- +1.7.10 + diff --git a/recipes-kernel/linux/linux-mainline_3.2.bb b/recipes-kernel/linux/linux-mainline_3.2.bb index 3e57ccf2..72a06e32 100644 --- a/recipes-kernel/linux/linux-mainline_3.2.bb +++ b/recipes-kernel/linux/linux-mainline_3.2.bb @@ -10,7 +10,7 @@ PV = "3.2.16" SRCREV_pn-${PN} = "b1be7dd1ec231ae751d0ce3acd0d2e5760704a6f" # The main PR is now using MACHINE_KERNEL_PR, for omap3 see conf/machine/include/omap3.inc -MACHINE_KERNEL_PR_append = "b" +MACHINE_KERNEL_PR_append = "c" FILESPATH =. "${FILE_DIRNAME}/linux-mainline-3.2:${FILE_DIRNAME}/linux-mainline-3.2/${MACHINE}:" @@ -58,6 +58,8 @@ SRC_URI += "git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.gi file://beagle/0012-backlight-Add-TLC59108-backlight-control-driver.patch \ file://beagle/0013-tlc59108-adjust-for-beagleboard-uLCD7.patch \ file://beagle/0014-expansion-add-wifi.patch \ + file://beagle/0015-ASoC-omap-add-MODULE_ALIAS-to-mcbsp-and-pcm-drivers.patch \ + file://beagle/0016-ASoC-omap-convert-per-board-modules-to-platform-driv.patch \ file://devkit8000/0001-arm-omap-devkit8000-for-lcd-use-samsung_lte_panel.patch \ file://touchbook/0001-omap3-touchbook-remove-mmc-gpio_wp.patch \ file://touchbook/0002-omap3-touchbook-drop-u-boot-readonly.patch \ -- cgit v1.2.3-54-g00ecf