]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branches 'asoc/topic/cs4265', 'asoc/topic/cs4271', 'asoc/topic...
authorMark Brown <broonie@kernel.org>
Mon, 8 Dec 2014 13:11:54 +0000 (13:11 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 8 Dec 2014 13:11:54 +0000 (13:11 +0000)
sound/soc/cirrus/Kconfig
sound/soc/codecs/Kconfig
sound/soc/codecs/Makefile
sound/soc/codecs/cs4265.c
sound/soc/codecs/cs4271-i2c.c [new file with mode: 0644]
sound/soc/codecs/cs4271-spi.c [new file with mode: 0644]
sound/soc/codecs/cs4271.c
sound/soc/codecs/cs4271.h [new file with mode: 0644]
sound/soc/codecs/cs42l51.c
sound/soc/codecs/cs42l73.c

index 5477c54759230e7783af1fd6df7bb1a20bcfb122..7b7fbcd49e5e424c25e47d9e6a1aee77065358d5 100644 (file)
@@ -36,7 +36,8 @@ config SND_EP93XX_SOC_EDB93XX
        tristate "SoC Audio support for Cirrus Logic EDB93xx boards"
        depends on SND_EP93XX_SOC && (MACH_EDB9301 || MACH_EDB9302 || MACH_EDB9302A || MACH_EDB9307A || MACH_EDB9315A)
        select SND_EP93XX_SOC_I2S
-       select SND_SOC_CS4271
+       select SND_SOC_CS4271_I2C if I2C
+       select SND_SOC_CS4271_SPI if SPI_MASTER
        help
          Say Y or M here if you want to add support for I2S audio on the
          Cirrus Logic EDB93xx boards.
index 6a66216a9c0fb5d59fc3da33ef85dbafbee110c1..1362edd380e5379f4f281aa84f124dd7a5e0d687 100644 (file)
@@ -50,7 +50,8 @@ config SND_SOC_ALL_CODECS
        select SND_SOC_CS42L73 if I2C
        select SND_SOC_CS4265 if I2C
        select SND_SOC_CS4270 if I2C
-       select SND_SOC_CS4271 if SND_SOC_I2C_AND_SPI
+       select SND_SOC_CS4271_I2C if I2C
+       select SND_SOC_CS4271_SPI if SPI_MASTER
        select SND_SOC_CS42XX8_I2C if I2C
        select SND_SOC_CX20442 if TTY
        select SND_SOC_DA7210 if I2C
@@ -337,7 +338,8 @@ config SND_SOC_CS42L51
        tristate
 
 config SND_SOC_CS42L51_I2C
-       tristate
+       tristate "Cirrus Logic CS42L51 CODEC (I2C)"
+       depends on I2C
        select SND_SOC_CS42L51
 
 config SND_SOC_CS42L52
@@ -371,8 +373,19 @@ config SND_SOC_CS4270_VD33_ERRATA
        depends on SND_SOC_CS4270
 
 config SND_SOC_CS4271
-       tristate "Cirrus Logic CS4271 CODEC"
-       depends on SND_SOC_I2C_AND_SPI
+       tristate
+
+config SND_SOC_CS4271_I2C
+       tristate "Cirrus Logic CS4271 CODEC (I2C)"
+       depends on I2C
+       select SND_SOC_CS4271
+       select REGMAP_I2C
+
+config SND_SOC_CS4271_SPI
+       tristate "Cirrus Logic CS4271 CODEC (SPI)"
+       depends on SPI_MASTER
+       select SND_SOC_CS4271
+       select REGMAP_SPI
 
 config SND_SOC_CS42XX8
        tristate
index 5dce451661e47813bb0b95b8b0121ae2545a2dab..ac7ec31f8cbe7c195a9bbc20b27a6ac20eaf1602 100644 (file)
@@ -41,6 +41,8 @@ snd-soc-cs42l73-objs := cs42l73.o
 snd-soc-cs4265-objs := cs4265.o
 snd-soc-cs4270-objs := cs4270.o
 snd-soc-cs4271-objs := cs4271.o
+snd-soc-cs4271-i2c-objs := cs4271-i2c.o
+snd-soc-cs4271-spi-objs := cs4271-spi.o
 snd-soc-cs42xx8-objs := cs42xx8.o
 snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o
 snd-soc-cx20442-objs := cx20442.o
@@ -217,6 +219,8 @@ obj-$(CONFIG_SND_SOC_CS42L73)       += snd-soc-cs42l73.o
 obj-$(CONFIG_SND_SOC_CS4265)   += snd-soc-cs4265.o
 obj-$(CONFIG_SND_SOC_CS4270)   += snd-soc-cs4270.o
 obj-$(CONFIG_SND_SOC_CS4271)   += snd-soc-cs4271.o
+obj-$(CONFIG_SND_SOC_CS4271_I2C)       += snd-soc-cs4271-i2c.o
+obj-$(CONFIG_SND_SOC_CS4271_SPI)       += snd-soc-cs4271-spi.o
 obj-$(CONFIG_SND_SOC_CS42XX8)  += snd-soc-cs42xx8.o
 obj-$(CONFIG_SND_SOC_CS42XX8_I2C) += snd-soc-cs42xx8-i2c.o
 obj-$(CONFIG_SND_SOC_CX20442)  += snd-soc-cx20442.o
index 4fdd47d700e325ac290fe118c9d3dd58d71b7ec9..ce6086835ebdbea24df543cf0f7c271d3bf64a1b 100644 (file)
@@ -32,7 +32,6 @@
 #include "cs4265.h"
 
 struct cs4265_private {
-       struct device *dev;
        struct regmap *regmap;
        struct gpio_desc *reset_gpio;
        u8 format;
@@ -598,7 +597,6 @@ static int cs4265_i2c_probe(struct i2c_client *i2c_client,
                               GFP_KERNEL);
        if (cs4265 == NULL)
                return -ENOMEM;
-       cs4265->dev = &i2c_client->dev;
 
        cs4265->regmap = devm_regmap_init_i2c(i2c_client, &cs4265_regmap);
        if (IS_ERR(cs4265->regmap)) {
diff --git a/sound/soc/codecs/cs4271-i2c.c b/sound/soc/codecs/cs4271-i2c.c
new file mode 100644 (file)
index 0000000..b264da0
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * CS4271 I2C audio driver
+ *
+ * Copyright (c) 2010 Alexander Sverdlin <subaparts@yandex.ru>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/regmap.h>
+#include <sound/soc.h>
+#include "cs4271.h"
+
+static int cs4271_i2c_probe(struct i2c_client *client,
+                            const struct i2c_device_id *id)
+{
+       struct regmap_config config;
+
+       config = cs4271_regmap_config;
+       config.reg_bits = 8;
+       config.val_bits = 8;
+
+       return cs4271_probe(&client->dev,
+                           devm_regmap_init_i2c(client, &config));
+}
+
+static int cs4271_i2c_remove(struct i2c_client *client)
+{
+       snd_soc_unregister_codec(&client->dev);
+       return 0;
+}
+
+static const struct i2c_device_id cs4271_i2c_id[] = {
+       { "cs4271", 0 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, cs4271_i2c_id);
+
+static struct i2c_driver cs4271_i2c_driver = {
+       .driver = {
+               .name = "cs4271",
+               .owner = THIS_MODULE,
+               .of_match_table = of_match_ptr(cs4271_dt_ids),
+       },
+       .probe = cs4271_i2c_probe,
+       .remove = cs4271_i2c_remove,
+       .id_table = cs4271_i2c_id,
+};
+module_i2c_driver(cs4271_i2c_driver);
+
+MODULE_DESCRIPTION("ASoC CS4271 I2C Driver");
+MODULE_AUTHOR("Alexander Sverdlin <subaparts@yandex.ru>");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/cs4271-spi.c b/sound/soc/codecs/cs4271-spi.c
new file mode 100644 (file)
index 0000000..acd49d8
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * CS4271 SPI audio driver
+ *
+ * Copyright (c) 2010 Alexander Sverdlin <subaparts@yandex.ru>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/spi/spi.h>
+#include <linux/regmap.h>
+#include <sound/soc.h>
+#include "cs4271.h"
+
+static int cs4271_spi_probe(struct spi_device *spi)
+{
+       struct regmap_config config;
+
+       config = cs4271_regmap_config;
+       config.reg_bits = 16;
+       config.val_bits = 8;
+       config.read_flag_mask = 0x21;
+       config.write_flag_mask = 0x20;
+
+       return cs4271_probe(&spi->dev, devm_regmap_init_spi(spi, &config));
+}
+
+static int cs4271_spi_remove(struct spi_device *spi)
+{
+       snd_soc_unregister_codec(&spi->dev);
+       return 0;
+}
+
+static struct spi_driver cs4271_spi_driver = {
+       .driver = {
+               .name   = "cs4271",
+               .owner  = THIS_MODULE,
+               .of_match_table = of_match_ptr(cs4271_dt_ids),
+       },
+       .probe          = cs4271_spi_probe,
+       .remove         = cs4271_spi_remove,
+};
+module_spi_driver(cs4271_spi_driver);
+
+MODULE_DESCRIPTION("ASoC CS4271 SPI Driver");
+MODULE_AUTHOR("Alexander Sverdlin <subaparts@yandex.ru>");
+MODULE_LICENSE("GPL");
index 93cec52f473332fbd37cc28be97c03c4696d1780..79a4efcb894c192c763c649083081e4c75fbece3 100644 (file)
@@ -23,8 +23,6 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/gpio.h>
-#include <linux/i2c.h>
-#include <linux/spi/spi.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_gpio.h>
@@ -32,6 +30,7 @@
 #include <sound/soc.h>
 #include <sound/tlv.h>
 #include <sound/cs4271.h>
+#include "cs4271.h"
 
 #define CS4271_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
                            SNDRV_PCM_FMTBIT_S24_LE | \
@@ -527,14 +526,15 @@ static int cs4271_soc_resume(struct snd_soc_codec *codec)
 #endif /* CONFIG_PM */
 
 #ifdef CONFIG_OF
-static const struct of_device_id cs4271_dt_ids[] = {
+const struct of_device_id cs4271_dt_ids[] = {
        { .compatible = "cirrus,cs4271", },
        { }
 };
 MODULE_DEVICE_TABLE(of, cs4271_dt_ids);
+EXPORT_SYMBOL_GPL(cs4271_dt_ids);
 #endif
 
-static int cs4271_probe(struct snd_soc_codec *codec)
+static int cs4271_codec_probe(struct snd_soc_codec *codec)
 {
        struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec);
        struct cs4271_platform_data *cs4271plat = codec->dev->platform_data;
@@ -587,7 +587,7 @@ static int cs4271_probe(struct snd_soc_codec *codec)
        return 0;
 }
 
-static int cs4271_remove(struct snd_soc_codec *codec)
+static int cs4271_codec_remove(struct snd_soc_codec *codec)
 {
        struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec);
 
@@ -599,8 +599,8 @@ static int cs4271_remove(struct snd_soc_codec *codec)
 };
 
 static struct snd_soc_codec_driver soc_codec_dev_cs4271 = {
-       .probe                  = cs4271_probe,
-       .remove                 = cs4271_remove,
+       .probe                  = cs4271_codec_probe,
+       .remove                 = cs4271_codec_remove,
        .suspend                = cs4271_soc_suspend,
        .resume                 = cs4271_soc_resume,
 
@@ -642,14 +642,8 @@ static int cs4271_common_probe(struct device *dev,
        return 0;
 }
 
-#if defined(CONFIG_SPI_MASTER)
-
-static const struct regmap_config cs4271_spi_regmap = {
-       .reg_bits = 16,
-       .val_bits = 8,
+const struct regmap_config cs4271_regmap_config = {
        .max_register = CS4271_LASTREG,
-       .read_flag_mask = 0x21,
-       .write_flag_mask = 0x20,
 
        .reg_defaults = cs4271_reg_defaults,
        .num_reg_defaults = ARRAY_SIZE(cs4271_reg_defaults),
@@ -657,140 +651,27 @@ static const struct regmap_config cs4271_spi_regmap = {
 
        .volatile_reg = cs4271_volatile_reg,
 };
+EXPORT_SYMBOL_GPL(cs4271_regmap_config);
 
-static int cs4271_spi_probe(struct spi_device *spi)
+int cs4271_probe(struct device *dev, struct regmap *regmap)
 {
        struct cs4271_private *cs4271;
        int ret;
 
-       ret = cs4271_common_probe(&spi->dev, &cs4271);
-       if (ret < 0)
-               return ret;
-
-       spi_set_drvdata(spi, cs4271);
-       cs4271->regmap = devm_regmap_init_spi(spi, &cs4271_spi_regmap);
-       if (IS_ERR(cs4271->regmap))
-               return PTR_ERR(cs4271->regmap);
-
-       return snd_soc_register_codec(&spi->dev, &soc_codec_dev_cs4271,
-               &cs4271_dai, 1);
-}
-
-static int cs4271_spi_remove(struct spi_device *spi)
-{
-       snd_soc_unregister_codec(&spi->dev);
-       return 0;
-}
-
-static struct spi_driver cs4271_spi_driver = {
-       .driver = {
-               .name   = "cs4271",
-               .owner  = THIS_MODULE,
-               .of_match_table = of_match_ptr(cs4271_dt_ids),
-       },
-       .probe          = cs4271_spi_probe,
-       .remove         = cs4271_spi_remove,
-};
-#endif /* defined(CONFIG_SPI_MASTER) */
-
-#if IS_ENABLED(CONFIG_I2C)
-static const struct i2c_device_id cs4271_i2c_id[] = {
-       {"cs4271", 0},
-       {}
-};
-MODULE_DEVICE_TABLE(i2c, cs4271_i2c_id);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
 
-static const struct regmap_config cs4271_i2c_regmap = {
-       .reg_bits = 8,
-       .val_bits = 8,
-       .max_register = CS4271_LASTREG,
-
-       .reg_defaults = cs4271_reg_defaults,
-       .num_reg_defaults = ARRAY_SIZE(cs4271_reg_defaults),
-       .cache_type = REGCACHE_RBTREE,
-
-       .volatile_reg = cs4271_volatile_reg,
-};
-
-static int cs4271_i2c_probe(struct i2c_client *client,
-                           const struct i2c_device_id *id)
-{
-       struct cs4271_private *cs4271;
-       int ret;
-
-       ret = cs4271_common_probe(&client->dev, &cs4271);
+       ret = cs4271_common_probe(dev, &cs4271);
        if (ret < 0)
                return ret;
 
-       i2c_set_clientdata(client, cs4271);
-       cs4271->regmap = devm_regmap_init_i2c(client, &cs4271_i2c_regmap);
-       if (IS_ERR(cs4271->regmap))
-               return PTR_ERR(cs4271->regmap);
+       dev_set_drvdata(dev, cs4271);
+       cs4271->regmap = regmap;
 
-       return snd_soc_register_codec(&client->dev, &soc_codec_dev_cs4271,
-               &cs4271_dai, 1);
-}
-
-static int cs4271_i2c_remove(struct i2c_client *client)
-{
-       snd_soc_unregister_codec(&client->dev);
-       return 0;
-}
-
-static struct i2c_driver cs4271_i2c_driver = {
-       .driver = {
-               .name   = "cs4271",
-               .owner  = THIS_MODULE,
-               .of_match_table = of_match_ptr(cs4271_dt_ids),
-       },
-       .id_table       = cs4271_i2c_id,
-       .probe          = cs4271_i2c_probe,
-       .remove         = cs4271_i2c_remove,
-};
-#endif /* IS_ENABLED(CONFIG_I2C) */
-
-/*
- * We only register our serial bus driver here without
- * assignment to particular chip. So if any of the below
- * fails, there is some problem with I2C or SPI subsystem.
- * In most cases this module will be compiled with support
- * of only one serial bus.
- */
-static int __init cs4271_modinit(void)
-{
-       int ret;
-
-#if IS_ENABLED(CONFIG_I2C)
-       ret = i2c_add_driver(&cs4271_i2c_driver);
-       if (ret) {
-               pr_err("Failed to register CS4271 I2C driver: %d\n", ret);
-               return ret;
-       }
-#endif
-
-#if defined(CONFIG_SPI_MASTER)
-       ret = spi_register_driver(&cs4271_spi_driver);
-       if (ret) {
-               pr_err("Failed to register CS4271 SPI driver: %d\n", ret);
-               return ret;
-       }
-#endif
-
-       return 0;
-}
-module_init(cs4271_modinit);
-
-static void __exit cs4271_modexit(void)
-{
-#if defined(CONFIG_SPI_MASTER)
-       spi_unregister_driver(&cs4271_spi_driver);
-#endif
-
-#if IS_ENABLED(CONFIG_I2C)
-       i2c_del_driver(&cs4271_i2c_driver);
-#endif
+       return snd_soc_register_codec(dev, &soc_codec_dev_cs4271, &cs4271_dai,
+                                     1);
 }
-module_exit(cs4271_modexit);
+EXPORT_SYMBOL_GPL(cs4271_probe);
 
 MODULE_AUTHOR("Alexander Sverdlin <subaparts@yandex.ru>");
 MODULE_DESCRIPTION("Cirrus Logic CS4271 ALSA SoC Codec Driver");
diff --git a/sound/soc/codecs/cs4271.h b/sound/soc/codecs/cs4271.h
new file mode 100644 (file)
index 0000000..9adad8e
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _CS4271_PRIV_H
+#define _CS4271_PRIV_H
+
+#include <linux/regmap.h>
+
+extern const struct of_device_id cs4271_dt_ids[];
+extern const struct regmap_config cs4271_regmap_config;
+
+int cs4271_probe(struct device *dev, struct regmap *regmap);
+
+#endif
index 669c38fc303468d51dd6bbd3dfa16e935c030e8c..b3951524339f90cdf8f90dbc23cbadd46a874af9 100644 (file)
@@ -153,15 +153,17 @@ static const struct snd_kcontrol_new cs42l51_snd_controls[] = {
 static int cs42l51_pdn_event(struct snd_soc_dapm_widget *w,
                struct snd_kcontrol *kcontrol, int event)
 {
+       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
+
        switch (event) {
        case SND_SOC_DAPM_PRE_PMD:
-               snd_soc_update_bits(w->codec, CS42L51_POWER_CTL1,
+               snd_soc_update_bits(codec, CS42L51_POWER_CTL1,
                                    CS42L51_POWER_CTL1_PDN,
                                    CS42L51_POWER_CTL1_PDN);
                break;
        default:
        case SND_SOC_DAPM_POST_PMD:
-               snd_soc_update_bits(w->codec, CS42L51_POWER_CTL1,
+               snd_soc_update_bits(codec, CS42L51_POWER_CTL1,
                                    CS42L51_POWER_CTL1_PDN, 0);
                break;
        }
index 2f8b94683e83054febd1642719e5ecb61df99725..7c55537c69cf0804bcb03a3afa573660fbaee304 100644 (file)
@@ -584,7 +584,7 @@ static const struct snd_kcontrol_new cs42l73_snd_controls[] = {
 static int cs42l73_spklo_spk_amp_event(struct snd_soc_dapm_widget *w,
        struct snd_kcontrol *kcontrol, int event)
 {
-       struct snd_soc_codec *codec = w->codec;
+       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
        struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec);
        switch (event) {
        case SND_SOC_DAPM_POST_PMD:
@@ -600,7 +600,7 @@ static int cs42l73_spklo_spk_amp_event(struct snd_soc_dapm_widget *w,
 static int cs42l73_ear_amp_event(struct snd_soc_dapm_widget *w,
        struct snd_kcontrol *kcontrol, int event)
 {
-       struct snd_soc_codec *codec = w->codec;
+       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
        struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec);
        switch (event) {
        case SND_SOC_DAPM_POST_PMD:
@@ -618,7 +618,7 @@ static int cs42l73_ear_amp_event(struct snd_soc_dapm_widget *w,
 static int cs42l73_hp_amp_event(struct snd_soc_dapm_widget *w,
        struct snd_kcontrol *kcontrol, int event)
 {
-       struct snd_soc_codec *codec = w->codec;
+       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
        struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec);
        switch (event) {
        case SND_SOC_DAPM_POST_PMD: