snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030);
        snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00);
 
-       switch (snd_soc_read(codec, RT5640_RESET)) {
-       case RT5640_RESET_ID:
+       switch (snd_soc_read(codec, RT5640_RESET) & RT5640_ID_MASK) {
+       case RT5640_ID_5640:
+       case RT5640_ID_5642:
                snd_soc_add_codec_controls(codec,
                        rt5640_specific_snd_controls,
                        ARRAY_SIZE(rt5640_specific_snd_controls));
                        rt5640_specific_dapm_routes,
                        ARRAY_SIZE(rt5640_specific_dapm_routes));
                break;
-       case RT5639_RESET_ID:
+       case RT5640_ID_5639:
                snd_soc_dapm_new_controls(&codec->dapm,
                        rt5639_specific_dapm_widgets,
                        ARRAY_SIZE(rt5639_specific_dapm_widgets));
 static const struct i2c_device_id rt5640_i2c_id[] = {
        { "rt5640", 0 },
        { "rt5639", 0 },
+       { "rt5642", 0 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, rt5640_i2c_id);
 
 
 #include <sound/rt5640.h>
 
-#define RT5639_RESET_ID                                0x0008
-#define RT5640_RESET_ID                                0x000c
-
 /* Info */
 #define RT5640_RESET                           0x00
 #define RT5640_VENDOR_ID                       0xfd
 #define RT5640_R_VOL_MASK                      (0x3f)
 #define RT5640_R_VOL_SFT                       0
 
+/* SW Reset & Device ID (0x00) */
+#define RT5640_ID_MASK                         (0x3 << 1)
+#define RT5640_ID_5639                         (0x0 << 1)
+#define RT5640_ID_5640                         (0x1 << 1)
+#define RT5640_ID_5642                         (0x3 << 1)
+
+
 /* IN1 and IN2 Control (0x0d) */
 /* IN3 and IN4 Control (0x0e) */
 #define RT5640_BST_SFT1                                12