struct regulator_bulk_data supplies[TPA6130A2_NUM_SUPPLIES];
        int power_gpio;
        unsigned char power_state;
+       enum tpa_model id;
 };
 
 static int tpa6130a2_i2c_read(int reg)
                       tpa6130_tlv),
 };
 
+static const unsigned int tpa6140_tlv[] = {
+       TLV_DB_RANGE_HEAD(3),
+       0, 8, TLV_DB_SCALE_ITEM(-5900, 400, 0),
+       9, 16, TLV_DB_SCALE_ITEM(-2500, 200, 0),
+       17, 31, TLV_DB_SCALE_ITEM(-1000, 100, 0),
+};
+
+static const struct snd_kcontrol_new tpa6140a2_controls[] = {
+       SOC_SINGLE_EXT_TLV("TPA6140A2 Headphone Playback Volume",
+                      TPA6130A2_REG_VOL_MUTE, 1, 0x1f, 0,
+                      tpa6130a2_get_reg, tpa6130a2_set_reg,
+                      tpa6140_tlv),
+};
+
 /*
  * Enable or disable channel (left or right)
  * The bit number for mute and amplifier are the same per channel:
 
 int tpa6130a2_add_controls(struct snd_soc_codec *codec)
 {
+       struct  tpa6130a2_data *data;
+
+       BUG_ON(tpa6130a2_client == NULL);
+       data = i2c_get_clientdata(tpa6130a2_client);
+
        snd_soc_dapm_new_controls(codec, tpa6130a2_dapm_widgets,
                                ARRAY_SIZE(tpa6130a2_dapm_widgets));
 
        snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
 
-       return snd_soc_add_controls(codec, tpa6130a2_controls,
-                               ARRAY_SIZE(tpa6130a2_controls));
+       if (data->id == TPA6140A2)
+               return snd_soc_add_controls(codec, tpa6140a2_controls,
+                                               ARRAY_SIZE(tpa6140a2_controls));
+       else
+               return snd_soc_add_controls(codec, tpa6130a2_controls,
+                                               ARRAY_SIZE(tpa6130a2_controls));
 
 }
 EXPORT_SYMBOL_GPL(tpa6130a2_add_controls);
 
        pdata = client->dev.platform_data;
        data->power_gpio = pdata->power_gpio;
+       data->id = pdata->id;
 
        mutex_init(&data->mutex);
 
                gpio_direction_output(data->power_gpio, 0);
        }
 
-       switch (pdata->id) {
+       switch (data->id) {
        case TPA6130A2:
                for (i = 0; i < ARRAY_SIZE(data->supplies); i++)
                        data->supplies[i].supply = tpa6130a2_supply_names[i];