Merge tag 'ntb-4.3' of git://github.com/jonmason/ntb
[deliverable/linux.git] / sound / soc / codecs / cs4349.c
index 9273b06e918b218f73255ebad01d32155549ecff..0ac8fc5ed4ae4ac23940d19fce9079a52b0f0976 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/i2c.h>
@@ -45,7 +46,6 @@ static const struct reg_default cs4349_reg_defaults[] = {
 /* Private data for the CS4349 */
 struct  cs4349_private {
        struct regmap                   *regmap;
-       struct cs4349_platform_data     pdata;
        struct gpio_desc                *reset_gpio;
        unsigned int                    mode;
        int                             rate;
@@ -54,14 +54,17 @@ struct  cs4349_private {
 static bool cs4349_readable_register(struct device *dev, unsigned int reg)
 {
        switch (reg) {
-       case CS4349_CHIPID:
-       case CS4349_MODE:
-       case CS4349_VMI:
-       case CS4349_MUTE:
-       case CS4349_VOLA:
-       case CS4349_VOLB:
-       case CS4349_RMPFLT:
-       case CS4349_MISC:
+       case CS4349_CHIPID ... CS4349_MISC:
+               return true;
+       default:
+               return false;
+       }
+}
+
+static bool cs4349_writeable_register(struct device *dev, unsigned int reg)
+{
+       switch (reg) {
+       case CS4349_MODE ...  CS4349_MISC:
                return true;
        default:
                return false;
@@ -94,20 +97,18 @@ static int cs4349_pcm_hw_params(struct snd_pcm_substream *substream,
                            struct snd_pcm_hw_params *params,
                            struct snd_soc_dai *dai)
 {
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_codec *codec = rtd->codec;
+       struct snd_soc_codec *codec = dai->codec;
        struct cs4349_private *cs4349 = snd_soc_codec_get_drvdata(codec);
-       int mode, fmt, ret;
+       int fmt, ret;
 
-       mode = snd_soc_read(codec, CS4349_MODE);
        cs4349->rate = params_rate(params);
 
        switch (cs4349->mode) {
        case SND_SOC_DAIFMT_I2S:
-               mode |= MODE_FORMAT(DIF_I2S);
+               fmt = DIF_I2S;
                break;
        case SND_SOC_DAIFMT_LEFT_J:
-               mode |= MODE_FORMAT(DIF_LEFT_JST);
+               fmt = DIF_LEFT_JST;
                break;
        case SND_SOC_DAIFMT_RIGHT_J:
                switch (params_width(params)) {
@@ -120,13 +121,13 @@ static int cs4349_pcm_hw_params(struct snd_pcm_substream *substream,
                default:
                        return -EINVAL;
                }
-               mode |= MODE_FORMAT(fmt);
                break;
        default:
                return -EINVAL;
        }
 
-       ret = snd_soc_write(codec, CS4349_MODE, mode);
+       ret = snd_soc_update_bits(codec, CS4349_MODE, DIF_MASK,
+                                 MODE_FORMAT(fmt));
        if (ret < 0)
                return ret;
 
@@ -264,7 +265,7 @@ static struct snd_soc_codec_driver soc_codec_dev_cs4349 = {
        .num_dapm_routes        = ARRAY_SIZE(cs4349_routes),
 };
 
-static struct regmap_config cs4349_regmap = {
+static const struct regmap_config cs4349_regmap = {
        .reg_bits               = 8,
        .val_bits               = 8,
 
@@ -272,6 +273,7 @@ static struct regmap_config cs4349_regmap = {
        .reg_defaults           = cs4349_reg_defaults,
        .num_reg_defaults       = ARRAY_SIZE(cs4349_reg_defaults),
        .readable_reg           = cs4349_readable_register,
+       .writeable_reg          = cs4349_writeable_register,
        .cache_type             = REGCACHE_RBTREE,
 };
 
@@ -279,8 +281,7 @@ static int cs4349_i2c_probe(struct i2c_client *client,
                                      const struct i2c_device_id *id)
 {
        struct cs4349_private *cs4349;
-       struct cs4349_platform_data *pdata = dev_get_platdata(&client->dev);
-       int ret = 0;
+       int ret;
 
        cs4349 = devm_kzalloc(&client->dev, sizeof(*cs4349), GFP_KERNEL);
        if (!cs4349)
@@ -293,17 +294,13 @@ static int cs4349_i2c_probe(struct i2c_client *client,
                return ret;
        }
 
-       if (pdata)
-               cs4349->pdata = *pdata;
-
        /* Reset the Device */
        cs4349->reset_gpio = devm_gpiod_get_optional(&client->dev,
                "reset", GPIOD_OUT_LOW);
        if (IS_ERR(cs4349->reset_gpio))
                return PTR_ERR(cs4349->reset_gpio);
 
-       if (cs4349->reset_gpio)
-               gpiod_set_value_cansleep(cs4349->reset_gpio, 1);
+       gpiod_set_value_cansleep(cs4349->reset_gpio, 1);
 
        i2c_set_clientdata(client, cs4349);
 
@@ -318,8 +315,7 @@ static int cs4349_i2c_remove(struct i2c_client *client)
        snd_soc_unregister_codec(&client->dev);
 
        /* Hold down reset */
-       if (cs4349->reset_gpio)
-               gpiod_set_value_cansleep(cs4349->reset_gpio, 0);
+       gpiod_set_value_cansleep(cs4349->reset_gpio, 0);
 
        return 0;
 }
@@ -328,18 +324,16 @@ static int cs4349_i2c_remove(struct i2c_client *client)
 static int cs4349_runtime_suspend(struct device *dev)
 {
        struct cs4349_private *cs4349 = dev_get_drvdata(dev);
-       struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
        int ret;
 
-       ret = snd_soc_update_bits(rtd->codec, CS4349_MISC, PWR_DWN, 1);
+       ret = regmap_update_bits(cs4349->regmap, CS4349_MISC, PWR_DWN, PWR_DWN);
        if (ret < 0)
                return ret;
 
        regcache_cache_only(cs4349->regmap, true);
 
        /* Hold down reset */
-       if (cs4349->reset_gpio)
-               gpiod_set_value_cansleep(cs4349->reset_gpio, 0);
+       gpiod_set_value_cansleep(cs4349->reset_gpio, 0);
 
        return 0;
 }
@@ -347,15 +341,13 @@ static int cs4349_runtime_suspend(struct device *dev)
 static int cs4349_runtime_resume(struct device *dev)
 {
        struct cs4349_private *cs4349 = dev_get_drvdata(dev);
-       struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
        int ret;
 
-       ret = snd_soc_update_bits(rtd->codec, CS4349_MISC, PWR_DWN, 0);
+       ret = regmap_update_bits(cs4349->regmap, CS4349_MISC, PWR_DWN, 0);
        if (ret < 0)
                return ret;
 
-       if (cs4349->reset_gpio)
-               gpiod_set_value_cansleep(cs4349->reset_gpio, 1);
+       gpiod_set_value_cansleep(cs4349->reset_gpio, 1);
 
        regcache_cache_only(cs4349->regmap, false);
        regcache_sync(cs4349->regmap);
@@ -386,7 +378,6 @@ MODULE_DEVICE_TABLE(i2c, cs4349_i2c_id);
 static struct i2c_driver cs4349_i2c_driver = {
        .driver = {
                .name           = "cs4349",
-               .owner          = THIS_MODULE,
                .of_match_table = cs4349_of_match,
        },
        .id_table       = cs4349_i2c_id,
This page took 0.035664 seconds and 5 git commands to generate.