Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
[pandora-kernel.git] / sound / soc / codecs / sgtl5000.c
index 7e4066e..bbcf921 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
 #include <linux/regulator/consumer.h>
+#include <linux/of_device.h>
 #include <sound/core.h>
 #include <sound/tlv.h>
 #include <sound/pcm.h>
@@ -130,16 +131,13 @@ static int mic_bias_event(struct snd_soc_dapm_widget *w,
        case SND_SOC_DAPM_POST_PMU:
                /* change mic bias resistor to 4Kohm */
                snd_soc_update_bits(w->codec, SGTL5000_CHIP_MIC_CTRL,
-                               SGTL5000_BIAS_R_4k, SGTL5000_BIAS_R_4k);
+                               SGTL5000_BIAS_R_MASK,
+                               SGTL5000_BIAS_R_4k << SGTL5000_BIAS_R_SHIFT);
                break;
 
        case SND_SOC_DAPM_PRE_PMD:
-               /*
-                * SGTL5000_BIAS_R_8k as mask to clean the two bits
-                * of mic bias and output impedance
-                */
                snd_soc_update_bits(w->codec, SGTL5000_CHIP_MIC_CTRL,
-                               SGTL5000_BIAS_R_8k, 0);
+                               SGTL5000_BIAS_R_MASK, 0);
                break;
        }
        return 0;
@@ -367,7 +365,7 @@ static const DECLARE_TLV_DB_SCALE(capture_6db_attenuate, -600, 600, 0);
 
 /* tlv for mic gain, 0db 20db 30db 40db */
 static const unsigned int mic_gain_tlv[] = {
-       TLV_DB_RANGE_HEAD(4),
+       TLV_DB_RANGE_HEAD(2),
        0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
        1, 3, TLV_DB_SCALE_ITEM(2000, 1000, 0),
 };
@@ -725,7 +723,9 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream,
                return -EINVAL;
        }
 
-       snd_soc_update_bits(codec, SGTL5000_CHIP_I2S_CTRL, i2s_ctl, i2s_ctl);
+       snd_soc_update_bits(codec, SGTL5000_CHIP_I2S_CTRL,
+                           SGTL5000_I2S_DLEN_MASK | SGTL5000_I2S_SCLKFREQ_MASK,
+                           i2s_ctl);
 
        return 0;
 }
@@ -756,7 +756,7 @@ static int ldo_regulator_enable(struct regulator_dev *dev)
 
        /* set voltage to register */
        snd_soc_update_bits(codec, SGTL5000_CHIP_LINREG_CTRL,
-                               (0x1 << 4) - 1, reg);
+                               SGTL5000_LINREG_VDDD_MASK, reg);
 
        snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
                                SGTL5000_LINEREG_D_POWERUP,
@@ -782,7 +782,7 @@ static int ldo_regulator_disable(struct regulator_dev *dev)
 
        /* clear voltage info */
        snd_soc_update_bits(codec, SGTL5000_CHIP_LINREG_CTRL,
-                               (0x1 << 4) - 1, 0);
+                               SGTL5000_LINREG_VDDD_MASK, 0);
 
        ldo->enabled = 0;
 
@@ -808,6 +808,7 @@ static int ldo_regulator_register(struct snd_soc_codec *codec,
                                int voltage)
 {
        struct ldo_regulator *ldo;
+       struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
 
        ldo = kzalloc(sizeof(struct ldo_regulator), GFP_KERNEL);
 
@@ -842,6 +843,7 @@ static int ldo_regulator_register(struct snd_soc_codec *codec,
 
                return ret;
        }
+       sgtl5000->ldo = ldo;
 
        return 0;
 }
@@ -1115,7 +1117,7 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec)
 
        /* set voltage to register */
        snd_soc_update_bits(codec, SGTL5000_CHIP_LINREG_CTRL,
-                               (0x1 << 4) - 1, 0x8);
+                               SGTL5000_LINREG_VDDD_MASK, 0x8);
 
        /*
         * if vddd linear reg has been enabled,
@@ -1146,8 +1148,7 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec)
                vag = (vag - SGTL5000_ANA_GND_BASE) / SGTL5000_ANA_GND_STP;
 
        snd_soc_update_bits(codec, SGTL5000_CHIP_REF_CTRL,
-                       vag << SGTL5000_ANA_GND_SHIFT,
-                       vag << SGTL5000_ANA_GND_SHIFT);
+                       SGTL5000_ANA_GND_MASK, vag << SGTL5000_ANA_GND_SHIFT);
 
        /* set line out VAG to vddio / 2, in range (0.8v, 1.675v) */
        vag = vddio / 2;
@@ -1161,9 +1162,8 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec)
                    SGTL5000_LINE_OUT_GND_STP;
 
        snd_soc_update_bits(codec, SGTL5000_CHIP_LINE_OUT_CTRL,
-                       vag << SGTL5000_LINE_OUT_GND_SHIFT |
-                       SGTL5000_LINE_OUT_CURRENT_360u <<
-                               SGTL5000_LINE_OUT_CURRENT_SHIFT,
+                       SGTL5000_LINE_OUT_CURRENT_MASK |
+                       SGTL5000_LINE_OUT_GND_MASK,
                        vag << SGTL5000_LINE_OUT_GND_SHIFT |
                        SGTL5000_LINE_OUT_CURRENT_360u <<
                                SGTL5000_LINE_OUT_CURRENT_SHIFT);
@@ -1436,10 +1436,17 @@ static const struct i2c_device_id sgtl5000_id[] = {
 
 MODULE_DEVICE_TABLE(i2c, sgtl5000_id);
 
+static const struct of_device_id sgtl5000_dt_ids[] = {
+       { .compatible = "fsl,sgtl5000", },
+       { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, sgtl5000_dt_ids);
+
 static struct i2c_driver sgtl5000_i2c_driver = {
        .driver = {
                   .name = "sgtl5000",
                   .owner = THIS_MODULE,
+                  .of_match_table = sgtl5000_dt_ids,
                   },
        .probe = sgtl5000_i2c_probe,
        .remove = __devexit_p(sgtl5000_i2c_remove),