Update to 3.4-final.
[linux-flexiantxendom0-3.2.10.git] / sound / soc / codecs / cs42l73.c
index 9f52a94..3686417 100644 (file)
@@ -42,7 +42,7 @@ struct  cs42l73_private {
        u32 mclk;
 };
 
-struct reg_default cs42l73_reg_defaults[] = {
+static const struct reg_default cs42l73_reg_defaults[] = {
        { 1, 0x42 },    /* r01  - Device ID A&B */
        { 2, 0xA7 },    /* r02  - Device ID C&D */
        { 3, 0x30 },    /* r03  - Device ID E */
@@ -568,22 +568,22 @@ static const struct snd_kcontrol_new cs42l73_snd_controls[] = {
                        attn_tlv),
 
        SOC_SINGLE_TLV("SPK-IP Mono Volume",
-                       CS42L73_SPKMIPMA, 0, 0x3E, 1, attn_tlv),
+                       CS42L73_SPKMIPMA, 0, 0x3F, 1, attn_tlv),
        SOC_SINGLE_TLV("SPK-XSP Mono Volume",
-                       CS42L73_SPKMXSPA, 0, 0x3E, 1, attn_tlv),
+                       CS42L73_SPKMXSPA, 0, 0x3F, 1, attn_tlv),
        SOC_SINGLE_TLV("SPK-ASP Mono Volume",
-                       CS42L73_SPKMASPA, 0, 0x3E, 1, attn_tlv),
+                       CS42L73_SPKMASPA, 0, 0x3F, 1, attn_tlv),
        SOC_SINGLE_TLV("SPK-VSP Mono Volume",
-                       CS42L73_SPKMVSPMA, 0, 0x3E, 1, attn_tlv),
+                       CS42L73_SPKMVSPMA, 0, 0x3F, 1, attn_tlv),
 
        SOC_SINGLE_TLV("ESL-IP Mono Volume",
-                       CS42L73_ESLMIPMA, 0, 0x3E, 1, attn_tlv),
+                       CS42L73_ESLMIPMA, 0, 0x3F, 1, attn_tlv),
        SOC_SINGLE_TLV("ESL-XSP Mono Volume",
-                       CS42L73_ESLMXSPA, 0, 0x3E, 1, attn_tlv),
+                       CS42L73_ESLMXSPA, 0, 0x3F, 1, attn_tlv),
        SOC_SINGLE_TLV("ESL-ASP Mono Volume",
-                       CS42L73_ESLMASPA, 0, 0x3E, 1, attn_tlv),
+                       CS42L73_ESLMASPA, 0, 0x3F, 1, attn_tlv),
        SOC_SINGLE_TLV("ESL-VSP Mono Volume",
-                       CS42L73_ESLMVSPMA, 0, 0x3E, 1, attn_tlv),
+                       CS42L73_ESLMVSPMA, 0, 0x3F, 1, attn_tlv),
 
        SOC_ENUM("IP Digital Swap/Mono Select", ip_swap_enum),
 
@@ -929,6 +929,8 @@ static int cs42l73_set_mclk(struct snd_soc_dai *dai, unsigned int freq)
 
        /* MCLKX -> MCLK */
        mclkx_coeff = cs42l73_get_mclkx_coeff(freq);
+       if (mclkx_coeff < 0)
+               return mclkx_coeff;
 
        mclk = cs42l73_mclkx_coeffs[mclkx_coeff].mclkx /
                cs42l73_mclkx_coeffs[mclkx_coeff].ratio;
@@ -1024,7 +1026,8 @@ static int cs42l73_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
        }
 
        if (spc & SPDIF_PCM) {
-               spc &= (31 << 3);       /* Clear PCM mode, set MSB->LSB */
+               /* Clear PCM mode, clear PCM_BIT_ORDER bit for MSB->LSB */
+               spc &= ~(PCM_MODE_MASK | PCM_BIT_ORDER);
                switch (format) {
                case SND_SOC_DAIFMT_DSP_B:
                        if (inv == SND_SOC_DAIFMT_IB_IF)
@@ -1112,7 +1115,7 @@ static int cs42l73_pcm_hw_params(struct snd_pcm_substream *substream,
                priv->config[id].mmcc &= 0xC0;
                priv->config[id].mmcc |= cs42l73_mclk_coeffs[mclk_coeff].mmcc;
                priv->config[id].spc &= 0xFC;
-               priv->config[id].spc &= MCK_SCLK_64FS;
+               priv->config[id].spc |= MCK_SCLK_MCLK;
        } else {
                /* CS42L73 Slave */
                priv->config[id].spc &= 0xFC;
@@ -1261,7 +1264,7 @@ static struct snd_soc_dai_driver cs42l73_dai[] = {
         }
 };
 
-static int cs42l73_suspend(struct snd_soc_codec *codec, pm_message_t state)
+static int cs42l73_suspend(struct snd_soc_codec *codec)
 {
        cs42l73_set_bias_level(codec, SND_SOC_BIAS_OFF);
 
@@ -1339,7 +1342,8 @@ static __devinit int cs42l73_i2c_probe(struct i2c_client *i2c_client,
        unsigned int devid = 0;
        unsigned int reg;
 
-       cs42l73 = kzalloc((sizeof *cs42l73), GFP_KERNEL);
+       cs42l73 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs42l73_private),
+                              GFP_KERNEL);
        if (!cs42l73) {
                dev_err(&i2c_client->dev, "could not allocate codec\n");
                return -ENOMEM;
@@ -1394,8 +1398,6 @@ err_regmap:
        regmap_exit(cs42l73->regmap);
 
 err:
-       kfree(cs42l73);
-
        return ret;
 }
 
@@ -1406,7 +1408,6 @@ static __devexit int cs42l73_i2c_remove(struct i2c_client *client)
        snd_soc_unregister_codec(&client->dev);
        regmap_exit(cs42l73->regmap);
 
-       kfree(cs42l73);
        return 0;
 }