Merge remote-tracking branches 'asoc/fix/max98371', 'asoc/fix/nau8825', 'asoc/fix/omap', 'asoc/fix/samsung', 'asoc/fix/simple' and 'asoc/fix/wm2000' into asoc-linus
This commit is contained in:
commit
cfb89f2e75
|
@ -8,8 +8,6 @@ Required properties:
|
||||||
- interrupts: Interrupt number for McPDM
|
- interrupts: Interrupt number for McPDM
|
||||||
- interrupt-parent: The parent interrupt controller
|
- interrupt-parent: The parent interrupt controller
|
||||||
- ti,hwmods: Name of the hwmod associated to the McPDM
|
- ti,hwmods: Name of the hwmod associated to the McPDM
|
||||||
- clocks: phandle for the pdmclk provider, likely <&twl6040>
|
|
||||||
- clock-names: Must be "pdmclk"
|
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
@ -21,11 +19,3 @@ mcpdm: mcpdm@40132000 {
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
ti,hwmods = "mcpdm";
|
ti,hwmods = "mcpdm";
|
||||||
};
|
};
|
||||||
|
|
||||||
In board DTS file the pdmclk needs to be added:
|
|
||||||
|
|
||||||
&mcpdm {
|
|
||||||
clocks = <&twl6040>;
|
|
||||||
clock-names = "pdmclk";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
|
@ -412,6 +412,7 @@ static int max98371_i2c_remove(struct i2c_client *client)
|
||||||
|
|
||||||
static const struct i2c_device_id max98371_i2c_id[] = {
|
static const struct i2c_device_id max98371_i2c_id[] = {
|
||||||
{ "max98371", 0 },
|
{ "max98371", 0 },
|
||||||
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(i2c, max98371_i2c_id);
|
MODULE_DEVICE_TABLE(i2c, max98371_i2c_id);
|
||||||
|
|
|
@ -212,31 +212,6 @@ static const unsigned short logtable[256] = {
|
||||||
0xfa2f, 0xfaea, 0xfba5, 0xfc60, 0xfd1a, 0xfdd4, 0xfe8e, 0xff47
|
0xfa2f, 0xfaea, 0xfba5, 0xfc60, 0xfd1a, 0xfdd4, 0xfe8e, 0xff47
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct snd_soc_dai *nau8825_get_codec_dai(struct nau8825 *nau8825)
|
|
||||||
{
|
|
||||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(nau8825->dapm);
|
|
||||||
struct snd_soc_component *component = &codec->component;
|
|
||||||
struct snd_soc_dai *codec_dai, *_dai;
|
|
||||||
|
|
||||||
list_for_each_entry_safe(codec_dai, _dai, &component->dai_list, list) {
|
|
||||||
if (!strncmp(codec_dai->name, NUVOTON_CODEC_DAI,
|
|
||||||
strlen(NUVOTON_CODEC_DAI)))
|
|
||||||
return codec_dai;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool nau8825_dai_is_active(struct nau8825 *nau8825)
|
|
||||||
{
|
|
||||||
struct snd_soc_dai *codec_dai = nau8825_get_codec_dai(nau8825);
|
|
||||||
|
|
||||||
if (codec_dai) {
|
|
||||||
if (codec_dai->playback_active || codec_dai->capture_active)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nau8825_sema_acquire - acquire the semaphore of nau88l25
|
* nau8825_sema_acquire - acquire the semaphore of nau88l25
|
||||||
* @nau8825: component to register the codec private data with
|
* @nau8825: component to register the codec private data with
|
||||||
|
@ -250,19 +225,26 @@ static bool nau8825_dai_is_active(struct nau8825 *nau8825)
|
||||||
* Acquires the semaphore without jiffies. If no more tasks are allowed
|
* Acquires the semaphore without jiffies. If no more tasks are allowed
|
||||||
* to acquire the semaphore, calling this function will put the task to
|
* to acquire the semaphore, calling this function will put the task to
|
||||||
* sleep until the semaphore is released.
|
* sleep until the semaphore is released.
|
||||||
* It returns if the semaphore was acquired.
|
* If the semaphore is not released within the specified number of jiffies,
|
||||||
|
* this function returns -ETIME.
|
||||||
|
* If the sleep is interrupted by a signal, this function will return -EINTR.
|
||||||
|
* It returns 0 if the semaphore was acquired successfully.
|
||||||
*/
|
*/
|
||||||
static void nau8825_sema_acquire(struct nau8825 *nau8825, long timeout)
|
static int nau8825_sema_acquire(struct nau8825 *nau8825, long timeout)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (timeout)
|
if (timeout) {
|
||||||
ret = down_timeout(&nau8825->xtalk_sem, timeout);
|
ret = down_timeout(&nau8825->xtalk_sem, timeout);
|
||||||
else
|
if (ret < 0)
|
||||||
|
dev_warn(nau8825->dev, "Acquire semaphone timeout\n");
|
||||||
|
} else {
|
||||||
ret = down_interruptible(&nau8825->xtalk_sem);
|
ret = down_interruptible(&nau8825->xtalk_sem);
|
||||||
|
if (ret < 0)
|
||||||
|
dev_warn(nau8825->dev, "Acquire semaphone fail\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
return ret;
|
||||||
dev_warn(nau8825->dev, "Acquire semaphone fail\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1205,6 +1187,8 @@ static int nau8825_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||||
unsigned int val_len = 0;
|
unsigned int val_len = 0;
|
||||||
|
|
||||||
|
nau8825_sema_acquire(nau8825, 2 * HZ);
|
||||||
|
|
||||||
switch (params_width(params)) {
|
switch (params_width(params)) {
|
||||||
case 16:
|
case 16:
|
||||||
val_len |= NAU8825_I2S_DL_16;
|
val_len |= NAU8825_I2S_DL_16;
|
||||||
|
@ -1225,6 +1209,9 @@ static int nau8825_hw_params(struct snd_pcm_substream *substream,
|
||||||
regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL1,
|
regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL1,
|
||||||
NAU8825_I2S_DL_MASK, val_len);
|
NAU8825_I2S_DL_MASK, val_len);
|
||||||
|
|
||||||
|
/* Release the semaphone. */
|
||||||
|
nau8825_sema_release(nau8825);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1234,6 +1221,8 @@ static int nau8825_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||||
unsigned int ctrl1_val = 0, ctrl2_val = 0;
|
unsigned int ctrl1_val = 0, ctrl2_val = 0;
|
||||||
|
|
||||||
|
nau8825_sema_acquire(nau8825, 2 * HZ);
|
||||||
|
|
||||||
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||||
case SND_SOC_DAIFMT_CBM_CFM:
|
case SND_SOC_DAIFMT_CBM_CFM:
|
||||||
ctrl2_val |= NAU8825_I2S_MS_MASTER;
|
ctrl2_val |= NAU8825_I2S_MS_MASTER;
|
||||||
|
@ -1282,6 +1271,9 @@ static int nau8825_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||||
regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2,
|
regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2,
|
||||||
NAU8825_I2S_MS_MASK, ctrl2_val);
|
NAU8825_I2S_MS_MASK, ctrl2_val);
|
||||||
|
|
||||||
|
/* Release the semaphone. */
|
||||||
|
nau8825_sema_release(nau8825);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1611,8 +1603,11 @@ static irqreturn_t nau8825_interrupt(int irq, void *data)
|
||||||
* cess and restore changes if process
|
* cess and restore changes if process
|
||||||
* is ongoing when ejection.
|
* is ongoing when ejection.
|
||||||
*/
|
*/
|
||||||
|
int ret;
|
||||||
nau8825->xtalk_protect = true;
|
nau8825->xtalk_protect = true;
|
||||||
nau8825_sema_acquire(nau8825, 0);
|
ret = nau8825_sema_acquire(nau8825, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
nau8825->xtalk_protect = false;
|
||||||
}
|
}
|
||||||
/* Startup cross talk detection process */
|
/* Startup cross talk detection process */
|
||||||
nau8825->xtalk_state = NAU8825_XTALK_PREPARE;
|
nau8825->xtalk_state = NAU8825_XTALK_PREPARE;
|
||||||
|
@ -2238,23 +2233,14 @@ static int __maybe_unused nau8825_suspend(struct snd_soc_codec *codec)
|
||||||
static int __maybe_unused nau8825_resume(struct snd_soc_codec *codec)
|
static int __maybe_unused nau8825_resume(struct snd_soc_codec *codec)
|
||||||
{
|
{
|
||||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||||
|
int ret;
|
||||||
|
|
||||||
regcache_cache_only(nau8825->regmap, false);
|
regcache_cache_only(nau8825->regmap, false);
|
||||||
regcache_sync(nau8825->regmap);
|
regcache_sync(nau8825->regmap);
|
||||||
if (nau8825_is_jack_inserted(nau8825->regmap)) {
|
nau8825->xtalk_protect = true;
|
||||||
/* If the jack is inserted, we need to check whether the play-
|
ret = nau8825_sema_acquire(nau8825, 0);
|
||||||
* back is active before suspend. If active, the driver has to
|
if (ret < 0)
|
||||||
* raise the protection for cross talk function to avoid the
|
nau8825->xtalk_protect = false;
|
||||||
* playback recovers before cross talk process finish. Other-
|
|
||||||
* wise, the playback will be interfered by cross talk func-
|
|
||||||
* tion. It is better to apply hardware related parameters
|
|
||||||
* before starting playback or record.
|
|
||||||
*/
|
|
||||||
if (nau8825_dai_is_active(nau8825)) {
|
|
||||||
nau8825->xtalk_protect = true;
|
|
||||||
nau8825_sema_acquire(nau8825, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
enable_irq(nau8825->irq);
|
enable_irq(nau8825->irq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -581,7 +581,7 @@ static int wm2000_anc_transition(struct wm2000_priv *wm2000,
|
||||||
if (anc_transitions[i].dest == ANC_OFF)
|
if (anc_transitions[i].dest == ANC_OFF)
|
||||||
clk_disable_unprepare(wm2000->mclk);
|
clk_disable_unprepare(wm2000->mclk);
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wm2000_anc_set_mode(struct wm2000_priv *wm2000)
|
static int wm2000_anc_set_mode(struct wm2000_priv *wm2000)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
obj-$(CONFIG_SND_SIMPLE_CARD_UTILS) := simple-card-utils.o
|
snd-soc-simple-card-utils-objs := simple-card-utils.o
|
||||||
|
|
||||||
snd-soc-simple-card-objs := simple-card.o
|
snd-soc-simple-card-objs := simple-card.o
|
||||||
|
|
||||||
obj-$(CONFIG_SND_SIMPLE_CARD) += snd-soc-simple-card.o
|
obj-$(CONFIG_SND_SIMPLE_CARD_UTILS) += snd-soc-simple-card-utils.o
|
||||||
|
obj-$(CONFIG_SND_SIMPLE_CARD) += snd-soc-simple-card.o
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
#include <linux/module.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <sound/simple_card_utils.h>
|
#include <sound/simple_card_utils.h>
|
||||||
|
|
||||||
|
@ -95,3 +96,8 @@ int asoc_simple_card_parse_card_name(struct snd_soc_card *card,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(asoc_simple_card_parse_card_name);
|
EXPORT_SYMBOL_GPL(asoc_simple_card_parse_card_name);
|
||||||
|
|
||||||
|
/* Module information */
|
||||||
|
MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
|
||||||
|
MODULE_DESCRIPTION("ALSA SoC Simple Card Utils");
|
||||||
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
|
@ -38,10 +38,10 @@
|
||||||
struct abe_twl6040 {
|
struct abe_twl6040 {
|
||||||
int jack_detection; /* board can detect jack events */
|
int jack_detection; /* board can detect jack events */
|
||||||
int mclk_freq; /* MCLK frequency speed for twl6040 */
|
int mclk_freq; /* MCLK frequency speed for twl6040 */
|
||||||
|
|
||||||
struct platform_device *dmic_codec_dev;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct platform_device *dmic_codec_dev;
|
||||||
|
|
||||||
static int omap_abe_hw_params(struct snd_pcm_substream *substream,
|
static int omap_abe_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_pcm_hw_params *params)
|
struct snd_pcm_hw_params *params)
|
||||||
{
|
{
|
||||||
|
@ -258,8 +258,6 @@ static int omap_abe_probe(struct platform_device *pdev)
|
||||||
if (priv == NULL)
|
if (priv == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
priv->dmic_codec_dev = ERR_PTR(-EINVAL);
|
|
||||||
|
|
||||||
if (snd_soc_of_parse_card_name(card, "ti,model")) {
|
if (snd_soc_of_parse_card_name(card, "ti,model")) {
|
||||||
dev_err(&pdev->dev, "Card name is not provided\n");
|
dev_err(&pdev->dev, "Card name is not provided\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -284,13 +282,6 @@ static int omap_abe_probe(struct platform_device *pdev)
|
||||||
num_links = 2;
|
num_links = 2;
|
||||||
abe_twl6040_dai_links[1].cpu_of_node = dai_node;
|
abe_twl6040_dai_links[1].cpu_of_node = dai_node;
|
||||||
abe_twl6040_dai_links[1].platform_of_node = dai_node;
|
abe_twl6040_dai_links[1].platform_of_node = dai_node;
|
||||||
|
|
||||||
priv->dmic_codec_dev = platform_device_register_simple(
|
|
||||||
"dmic-codec", -1, NULL, 0);
|
|
||||||
if (IS_ERR(priv->dmic_codec_dev)) {
|
|
||||||
dev_err(&pdev->dev, "Can't instantiate dmic-codec\n");
|
|
||||||
return PTR_ERR(priv->dmic_codec_dev);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
num_links = 1;
|
num_links = 1;
|
||||||
}
|
}
|
||||||
|
@ -299,16 +290,14 @@ static int omap_abe_probe(struct platform_device *pdev)
|
||||||
of_property_read_u32(node, "ti,mclk-freq", &priv->mclk_freq);
|
of_property_read_u32(node, "ti,mclk-freq", &priv->mclk_freq);
|
||||||
if (!priv->mclk_freq) {
|
if (!priv->mclk_freq) {
|
||||||
dev_err(&pdev->dev, "MCLK frequency not provided\n");
|
dev_err(&pdev->dev, "MCLK frequency not provided\n");
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
goto err_unregister;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
card->fully_routed = 1;
|
card->fully_routed = 1;
|
||||||
|
|
||||||
if (!priv->mclk_freq) {
|
if (!priv->mclk_freq) {
|
||||||
dev_err(&pdev->dev, "MCLK frequency missing\n");
|
dev_err(&pdev->dev, "MCLK frequency missing\n");
|
||||||
ret = -ENODEV;
|
return -ENODEV;
|
||||||
goto err_unregister;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
card->dai_link = abe_twl6040_dai_links;
|
card->dai_link = abe_twl6040_dai_links;
|
||||||
|
@ -317,17 +306,9 @@ static int omap_abe_probe(struct platform_device *pdev)
|
||||||
snd_soc_card_set_drvdata(card, priv);
|
snd_soc_card_set_drvdata(card, priv);
|
||||||
|
|
||||||
ret = snd_soc_register_card(card);
|
ret = snd_soc_register_card(card);
|
||||||
if (ret) {
|
if (ret)
|
||||||
dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
|
dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
|
||||||
ret);
|
ret);
|
||||||
goto err_unregister;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
err_unregister:
|
|
||||||
if (!IS_ERR(priv->dmic_codec_dev))
|
|
||||||
platform_device_unregister(priv->dmic_codec_dev);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -335,13 +316,9 @@ err_unregister:
|
||||||
static int omap_abe_remove(struct platform_device *pdev)
|
static int omap_abe_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||||
struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card);
|
|
||||||
|
|
||||||
snd_soc_unregister_card(card);
|
snd_soc_unregister_card(card);
|
||||||
|
|
||||||
if (!IS_ERR(priv->dmic_codec_dev))
|
|
||||||
platform_device_unregister(priv->dmic_codec_dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,7 +338,33 @@ static struct platform_driver omap_abe_driver = {
|
||||||
.remove = omap_abe_remove,
|
.remove = omap_abe_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
module_platform_driver(omap_abe_driver);
|
static int __init omap_abe_init(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
dmic_codec_dev = platform_device_register_simple("dmic-codec", -1, NULL,
|
||||||
|
0);
|
||||||
|
if (IS_ERR(dmic_codec_dev)) {
|
||||||
|
pr_err("%s: dmic-codec device registration failed\n", __func__);
|
||||||
|
return PTR_ERR(dmic_codec_dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = platform_driver_register(&omap_abe_driver);
|
||||||
|
if (ret) {
|
||||||
|
pr_err("%s: platform driver registration failed\n", __func__);
|
||||||
|
platform_device_unregister(dmic_codec_dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
module_init(omap_abe_init);
|
||||||
|
|
||||||
|
static void __exit omap_abe_exit(void)
|
||||||
|
{
|
||||||
|
platform_driver_unregister(&omap_abe_driver);
|
||||||
|
platform_device_unregister(dmic_codec_dev);
|
||||||
|
}
|
||||||
|
module_exit(omap_abe_exit);
|
||||||
|
|
||||||
MODULE_AUTHOR("Misael Lopez Cruz <misael.lopez@ti.com>");
|
MODULE_AUTHOR("Misael Lopez Cruz <misael.lopez@ti.com>");
|
||||||
MODULE_DESCRIPTION("ALSA SoC for OMAP boards with ABE and twl6040 codec");
|
MODULE_DESCRIPTION("ALSA SoC for OMAP boards with ABE and twl6040 codec");
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/clk.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
|
@ -55,7 +54,6 @@ struct omap_mcpdm {
|
||||||
unsigned long phys_base;
|
unsigned long phys_base;
|
||||||
void __iomem *io_base;
|
void __iomem *io_base;
|
||||||
int irq;
|
int irq;
|
||||||
struct clk *pdmclk;
|
|
||||||
|
|
||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
|
|
||||||
|
@ -390,15 +388,14 @@ static int omap_mcpdm_probe(struct snd_soc_dai *dai)
|
||||||
struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai);
|
struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
clk_prepare_enable(mcpdm->pdmclk);
|
|
||||||
pm_runtime_enable(mcpdm->dev);
|
pm_runtime_enable(mcpdm->dev);
|
||||||
|
|
||||||
/* Disable lines while request is ongoing */
|
/* Disable lines while request is ongoing */
|
||||||
pm_runtime_get_sync(mcpdm->dev);
|
pm_runtime_get_sync(mcpdm->dev);
|
||||||
omap_mcpdm_write(mcpdm, MCPDM_REG_CTRL, 0x00);
|
omap_mcpdm_write(mcpdm, MCPDM_REG_CTRL, 0x00);
|
||||||
|
|
||||||
ret = devm_request_irq(mcpdm->dev, mcpdm->irq, omap_mcpdm_irq_handler,
|
ret = request_irq(mcpdm->irq, omap_mcpdm_irq_handler, 0, "McPDM",
|
||||||
0, "McPDM", (void *)mcpdm);
|
(void *)mcpdm);
|
||||||
|
|
||||||
pm_runtime_put_sync(mcpdm->dev);
|
pm_runtime_put_sync(mcpdm->dev);
|
||||||
|
|
||||||
|
@ -423,9 +420,9 @@ static int omap_mcpdm_remove(struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai);
|
struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai);
|
||||||
|
|
||||||
|
free_irq(mcpdm->irq, (void *)mcpdm);
|
||||||
pm_runtime_disable(mcpdm->dev);
|
pm_runtime_disable(mcpdm->dev);
|
||||||
|
|
||||||
clk_disable_unprepare(mcpdm->pdmclk);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,8 +442,6 @@ static int omap_mcpdm_suspend(struct snd_soc_dai *dai)
|
||||||
mcpdm->pm_active_count++;
|
mcpdm->pm_active_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk_disable_unprepare(mcpdm->pdmclk);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,8 +449,6 @@ static int omap_mcpdm_resume(struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai);
|
struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai);
|
||||||
|
|
||||||
clk_prepare_enable(mcpdm->pdmclk);
|
|
||||||
|
|
||||||
if (mcpdm->pm_active_count) {
|
if (mcpdm->pm_active_count) {
|
||||||
while (mcpdm->pm_active_count--)
|
while (mcpdm->pm_active_count--)
|
||||||
pm_runtime_get_sync(mcpdm->dev);
|
pm_runtime_get_sync(mcpdm->dev);
|
||||||
|
@ -549,15 +542,6 @@ static int asoc_mcpdm_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
mcpdm->dev = &pdev->dev;
|
mcpdm->dev = &pdev->dev;
|
||||||
|
|
||||||
mcpdm->pdmclk = devm_clk_get(&pdev->dev, "pdmclk");
|
|
||||||
if (IS_ERR(mcpdm->pdmclk)) {
|
|
||||||
if (PTR_ERR(mcpdm->pdmclk) == -EPROBE_DEFER)
|
|
||||||
return -EPROBE_DEFER;
|
|
||||||
dev_warn(&pdev->dev, "Error getting pdmclk (%ld)!\n",
|
|
||||||
PTR_ERR(mcpdm->pdmclk));
|
|
||||||
mcpdm->pdmclk = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = devm_snd_soc_register_component(&pdev->dev,
|
ret = devm_snd_soc_register_component(&pdev->dev,
|
||||||
&omap_mcpdm_component,
|
&omap_mcpdm_component,
|
||||||
&omap_mcpdm_dai, 1);
|
&omap_mcpdm_dai, 1);
|
||||||
|
|
|
@ -58,10 +58,12 @@ static struct platform_device *s3c24xx_uda134x_snd_device;
|
||||||
|
|
||||||
static int s3c24xx_uda134x_startup(struct snd_pcm_substream *substream)
|
static int s3c24xx_uda134x_startup(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
#ifdef ENFORCE_RATES
|
#ifdef ENFORCE_RATES
|
||||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||||
#endif
|
#endif
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
mutex_lock(&clk_lock);
|
mutex_lock(&clk_lock);
|
||||||
pr_debug("%s %d\n", __func__, clk_users);
|
pr_debug("%s %d\n", __func__, clk_users);
|
||||||
|
@ -71,8 +73,7 @@ static int s3c24xx_uda134x_startup(struct snd_pcm_substream *substream)
|
||||||
printk(KERN_ERR "%s cannot get xtal\n", __func__);
|
printk(KERN_ERR "%s cannot get xtal\n", __func__);
|
||||||
ret = PTR_ERR(xtal);
|
ret = PTR_ERR(xtal);
|
||||||
} else {
|
} else {
|
||||||
pclk = clk_get(&s3c24xx_uda134x_snd_device->dev,
|
pclk = clk_get(cpu_dai->dev, "iis");
|
||||||
"pclk");
|
|
||||||
if (IS_ERR(pclk)) {
|
if (IS_ERR(pclk)) {
|
||||||
printk(KERN_ERR "%s cannot get pclk\n",
|
printk(KERN_ERR "%s cannot get pclk\n",
|
||||||
__func__);
|
__func__);
|
||||||
|
|
Loading…
Reference in New Issue