|
@@ -16,6 +16,7 @@
|
|
#include <linux/device.h>
|
|
#include <linux/device.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/clk.h>
|
|
#include <linux/clk.h>
|
|
|
|
+#include <linux/platform_device.h>
|
|
#include <sound/core.h>
|
|
#include <sound/core.h>
|
|
#include <sound/pcm.h>
|
|
#include <sound/pcm.h>
|
|
#include <sound/initval.h>
|
|
#include <sound/initval.h>
|
|
@@ -81,7 +82,6 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream)
|
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
|
|
struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
|
|
|
|
|
|
- clk_i2s = clk_get(NULL, "I2SCLK");
|
|
|
|
if (IS_ERR(clk_i2s))
|
|
if (IS_ERR(clk_i2s))
|
|
return PTR_ERR(clk_i2s);
|
|
return PTR_ERR(clk_i2s);
|
|
|
|
|
|
@@ -152,6 +152,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
|
|
pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx);
|
|
pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx);
|
|
pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm);
|
|
pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm);
|
|
pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk);
|
|
pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk);
|
|
|
|
+ BUG_ON(IS_ERR(clk_i2s));
|
|
clk_enable(clk_i2s);
|
|
clk_enable(clk_i2s);
|
|
pxa_i2s_wait();
|
|
pxa_i2s_wait();
|
|
|
|
|
|
@@ -317,6 +318,43 @@ struct snd_soc_dai pxa_i2s_dai = {
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(pxa_i2s_dai);
|
|
EXPORT_SYMBOL_GPL(pxa_i2s_dai);
|
|
|
|
|
|
|
|
+static int pxa2xx_i2s_probe(struct platform_device *dev)
|
|
|
|
+{
|
|
|
|
+ clk_i2s = clk_get(&dev->dev, "I2SCLK");
|
|
|
|
+ return IS_ERR(clk_i2s) ? PTR_ERR(clk_i2s) : 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int __devexit pxa2xx_i2s_remove(struct platform_device *dev)
|
|
|
|
+{
|
|
|
|
+ clk_put(clk_i2s);
|
|
|
|
+ clk_i2s = ERR_PTR(-ENOENT);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct platform_driver pxa2xx_i2s_driver = {
|
|
|
|
+ .probe = pxa2xx_i2s_probe,
|
|
|
|
+ .remove = __devexit_p(pxa2xx_i2s_remove),
|
|
|
|
+
|
|
|
|
+ .driver = {
|
|
|
|
+ .name = "pxa2xx-i2s",
|
|
|
|
+ .owner = THIS_MODULE,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int __init pxa2xx_i2s_init(void)
|
|
|
|
+{
|
|
|
|
+ clk_i2s = ERR_PTR(-ENOENT);
|
|
|
|
+ return platform_driver_register(&pxa2xx_i2s_driver);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void __exit pxa2xx_i2s_exit(void)
|
|
|
|
+{
|
|
|
|
+ platform_driver_unregister(&pxa2xx_i2s_driver);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+module_init(pxa2xx_i2s_init);
|
|
|
|
+module_exit(pxa2xx_i2s_exit);
|
|
|
|
+
|
|
/* Module information */
|
|
/* Module information */
|
|
MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
|
|
MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
|
|
MODULE_DESCRIPTION("pxa2xx I2S SoC Interface");
|
|
MODULE_DESCRIPTION("pxa2xx I2S SoC Interface");
|