Merge tag 'ntb-4.3' of git://github.com/jonmason/ntb
[deliverable/linux.git] / sound / soc / codecs / cs4349.c
index ab071675357ee6fcb5de750f23ff568eca25693e..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;
@@ -96,17 +99,16 @@ static int cs4349_pcm_hw_params(struct snd_pcm_substream *substream,
 {
        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)) {
@@ -119,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;
 
@@ -271,6 +273,7 @@ static const 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,
 };
 
@@ -278,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)
@@ -292,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);
 
@@ -317,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;
 }
@@ -329,15 +326,14 @@ static int cs4349_runtime_suspend(struct device *dev)
        struct cs4349_private *cs4349 = dev_get_drvdata(dev);
        int ret;
 
-       ret = regmap_update_bits(cs4349->regmap, 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;
 }
@@ -351,8 +347,7 @@ static int cs4349_runtime_resume(struct device *dev)
        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);
@@ -383,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.031678 seconds and 5 git commands to generate.