arm: tegra: roth: Fix TFA device patch header.
[linux-2.6.git] / drivers / misc / tfa9887.c
index 507994f..c2cbca4 100644 (file)
@@ -9,6 +9,12 @@
 #include <sound/initval.h>
 #include <linux/sysfs.h>
 #include <linux/miscdevice.h>
+#include <linux/delay.h>
+
+#define STATUS_OK 0
+
+void tegra_asoc_enable_clocks(void);
+void tegra_asoc_disable_clocks(void);
 
 static ssize_t tfa9887_cal_show(struct kobject *kobj,
                struct kobj_attribute *attr, char *buf);
@@ -42,7 +48,11 @@ static struct kobject *tfa9887_kobj;
 
 static struct tfa9887_priv *tfa9887R, *tfa9887L, *tfa9887R_byte, *tfa9887L_byte;
 
-static int eq_mode, preset_mode;
+static int eq_mode, preset_mode, srate;
+
+static char calibdata[16];
+
+static int calibration_need = 0;
 
 unsigned int volume_step[5] = {0,2,4,6,12};
 
@@ -54,306 +64,309 @@ unsigned char coldpatch_data[] = {/* 10 */
 
 /* begin binary data: */
 
-char n1d2_data[] = { /* 2200 */
-
+/* begin binary data: */
+char n1d2_data[] = {/* 2380 */
 0x03, 0x00, 0x70, 0x00, 0x01, 0xFB, 0x00, 0x71, 0x40
-, 0x00, 0x6A, 0x7E, 0xFD, 0x04, 0x3A, 0x91, 0x00, 0xC7, 0x6A, 0x3F, 0x42, 0x90, 0x3A, 0x92
-, 0xFF, 0xE9, 0x71, 0x24, 0x58, 0x7F, 0x30, 0x60, 0x00, 0x80, 0x3B, 0x80, 0x00, 0xB6, 0xB8
-, 0xA2, 0xD5, 0x7C, 0xB5, 0x00, 0x54, 0xBE, 0x38, 0x20, 0x0A, 0x6F, 0xB5, 0x00, 0x76, 0x08
-, 0x30, 0x12, 0x00, 0x00, 0xB5, 0x00, 0x40, 0x00, 0xA0, 0x00, 0xD5, 0x3C, 0xB5, 0x00, 0x40
-, 0x40, 0x3A, 0x9A, 0xFF, 0x50, 0xB5, 0x00, 0x44, 0x18, 0x38, 0x08, 0x22, 0x13, 0xB5, 0x00
-, 0x42, 0x90, 0x3A, 0x80, 0x00, 0x3E, 0xD0, 0x24, 0x42, 0x80, 0xB5, 0x00, 0x7E, 0x9C, 0x82
-, 0x14, 0x7E, 0x9C, 0x3B, 0x47, 0x40, 0x1F, 0x3A, 0x83, 0x00, 0x07, 0x9B, 0xC5, 0x61, 0x40
-, 0x9B, 0xC6, 0x55, 0x3D, 0x3A, 0x92, 0x00, 0x09, 0xB5, 0x00, 0x42, 0x10, 0xD0, 0x24, 0x7E
-, 0x9C, 0x70, 0xA0, 0x7E, 0x9C, 0xB5, 0x00, 0x42, 0x00, 0x3A, 0x80, 0x00, 0x9B, 0xD0, 0x24
-, 0x54, 0x7C, 0x30, 0x70, 0x00, 0x80, 0xB5, 0x00, 0x61, 0x40, 0x3B, 0x80, 0x00, 0xA9, 0x90
-, 0xD9, 0x62, 0x09, 0x7F, 0x4E, 0x54, 0xBC, 0x6A, 0x1F, 0x4C, 0x08, 0x3B, 0x80, 0x01, 0x0E
-, 0x30, 0x50, 0x00, 0x80, 0xB5, 0x00, 0x58, 0x3F, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D
-, 0x7C, 0xB5, 0x00, 0x7E, 0x9C, 0x98, 0x99, 0xFD, 0x06, 0x9B, 0x0C, 0x52, 0x7B, 0xA6, 0x18
-, 0x58, 0x7A, 0x39, 0x02, 0x22, 0x1C, 0x30, 0x90, 0x00, 0xD8, 0x30, 0xB0, 0x20, 0x94, 0x30
-, 0xA0, 0x00, 0xE4, 0x20, 0x03, 0x40, 0x40, 0xA8, 0x00, 0xD4, 0xFC, 0xB5, 0x00, 0x5A, 0x7D
-, 0x62, 0x08, 0x66, 0x0B, 0x3A, 0x31, 0xFF, 0xFE, 0x3B, 0x80, 0x02, 0x08, 0x9B, 0xC0, 0xD5
-, 0x7F, 0x80, 0xB0, 0x54, 0xBC, 0x3A, 0x89, 0x00, 0x04, 0xFB, 0x00, 0x71, 0x40, 0x3E, 0x6A
-, 0x9F, 0xD5, 0xBE, 0x6A, 0x7E, 0x44, 0x51, 0x3A, 0x9B, 0x00, 0x05, 0xB5, 0x00, 0x52, 0xFC
-, 0x30, 0x90, 0x00, 0xD8, 0x30, 0xA0, 0x00, 0xE4, 0x30, 0xB0, 0x20, 0x94, 0x20, 0x03, 0x40
-, 0x50, 0x6A, 0x7E, 0xD2, 0x3D, 0x80, 0xB0, 0x66, 0x0B, 0xB5, 0x00, 0x44, 0x10, 0x3A, 0x31
-, 0xFF, 0xFE, 0x3B, 0x80, 0x02, 0x08, 0x9B, 0xC0, 0xD5, 0x7F, 0x6A, 0xDF, 0x54, 0xBD, 0x3A
-, 0x89, 0x00, 0x04, 0x62, 0x28, 0xD5, 0x3F, 0x3A, 0x9B, 0x00, 0x05, 0xB5, 0x00, 0x54, 0xFD
-, 0x9B, 0xAC, 0x52, 0x3C, 0xA6, 0x12, 0xD2, 0x3B, 0x39, 0x02, 0x22, 0x1C, 0xA6, 0x52, 0xD8
-, 0x3A, 0xA8, 0x00, 0xFE, 0x9C, 0x3C, 0xD8, 0x03, 0x00, 0xA9, 0x01, 0x7D, 0x7A, 0xB5, 0x00
-, 0x61, 0x34, 0x71, 0x44, 0x7D, 0x03, 0x6A, 0x7E, 0xC4, 0x08, 0xB5, 0x00, 0x58, 0x7F, 0x30
-, 0x50, 0x00, 0x80, 0x3B, 0x80, 0x01, 0x25, 0xB5, 0x00, 0x55, 0x7E, 0x6A, 0xDE, 0xD5, 0x3E
-, 0x62, 0x4C, 0xC4, 0x11, 0x38, 0x20, 0x0A, 0x6F, 0x6A, 0xFE, 0xE1, 0x50, 0xB5, 0x00, 0x55
-, 0x7E, 0x30, 0x40, 0x00, 0x80, 0x3B, 0x80, 0x01, 0x00, 0xB0, 0xB2, 0xF6, 0x00, 0x6A, 0x1F
-, 0x54, 0xBD, 0x3B, 0x80, 0x01, 0x00, 0x9B, 0xA6, 0xFE, 0x9C, 0xB5, 0x00, 0x58, 0x3F, 0x3C
-, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7D, 0xB5, 0x00, 0x7E, 0x9C, 0x38, 0x08, 0x0A, 0x6F
-, 0x9B, 0xA6, 0x7D, 0x04, 0xB0, 0xB6, 0x62, 0x88, 0x69, 0x7E, 0xC4, 0x08, 0x6A, 0xBF, 0x54
-, 0xFC, 0xB5, 0x00, 0x58, 0x7F, 0x3B, 0x80, 0x01, 0x25, 0x30, 0x50, 0x00, 0x80, 0x69, 0x5E
-, 0xD5, 0x3C, 0x72, 0x02, 0xC4, 0x11, 0x6A, 0x1F, 0x76, 0x40, 0x30, 0x40, 0x00, 0x80, 0x3B
-, 0x80, 0x01, 0x00, 0xB0, 0xB2, 0xD5, 0x7C, 0xFB, 0x00, 0x71, 0x40, 0x7C, 0x9B, 0xA6, 0xD4
-, 0x3E, 0xB5, 0x00, 0x54, 0xBC, 0x3B, 0x80, 0x01, 0x00, 0x3A, 0x80, 0x00, 0x80, 0xB5, 0x00
-, 0x58, 0x3F, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7C, 0xB5, 0x00, 0x7E, 0x9C, 0x9B
-, 0x86, 0x7D, 0x04, 0x38, 0x0A, 0x0A, 0x6F, 0xB0, 0xB2, 0xD4, 0x7E, 0x6A, 0x7E, 0x52, 0xFD
-, 0x71, 0x04, 0xD8, 0x7F, 0x3B, 0x80, 0x01, 0x25, 0x30, 0x50, 0x00, 0x80, 0x69, 0x5E, 0xD5
-, 0x3E, 0x72, 0x02, 0xC4, 0x11, 0x6A, 0xBE, 0xD4, 0xBC, 0x30, 0x40, 0x00, 0x80, 0x3B, 0x80
-, 0x01, 0x00, 0xB0, 0xB2, 0xF6, 0x00, 0xB5, 0x00, 0x54, 0x3C, 0x3A, 0x88, 0x00, 0x80, 0xB5
-, 0x00, 0x54, 0x3D, 0x3B, 0x80, 0x01, 0x00, 0x9B, 0xA6, 0xFE, 0x9C, 0xB5, 0x00, 0x58, 0x3F
-, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7C, 0xB5, 0x00, 0x7E, 0x9C, 0x3A, 0x88, 0x00
-, 0x0A, 0x9B, 0x8C, 0x42, 0x88, 0xA6, 0x56, 0x7D, 0x05, 0x39, 0x02, 0x22, 0x20, 0xAA, 0x08
-, 0xC4, 0x00, 0x3A, 0x89, 0x00, 0xA6, 0xBA, 0x41, 0x58, 0x7B, 0x6E, 0x3F, 0x54, 0x7C, 0x3B
-, 0x80, 0x13, 0x20, 0xBA, 0x20, 0xDA, 0x7D, 0x6D, 0x5E, 0xD0, 0xBE, 0x3A, 0x81, 0x00, 0x18
-, 0x82, 0x04, 0x7E, 0x40, 0x3A, 0x90, 0xFF, 0xFA, 0xBF, 0x10, 0x4C, 0x90, 0xBB, 0x00, 0x55
-, 0x7D, 0x31, 0x80, 0x20, 0xAF, 0x3B, 0x80, 0x01, 0x07, 0x9B, 0xA2, 0xCA, 0x48, 0x7F, 0x4E
-, 0x54, 0xBD, 0xB5, 0x00, 0x4C, 0x88, 0x3A, 0x91, 0xFF, 0x43, 0xB5, 0x00, 0x42, 0x90, 0x96
-, 0xF4, 0xD5, 0xBC, 0x3A, 0x81, 0xFF, 0x41, 0x3A, 0x93, 0x00, 0x29, 0x61, 0x48, 0xFD, 0xA9
-, 0x3A, 0x88, 0x00, 0xAF, 0x61, 0x8A, 0x72, 0xE8, 0x6A, 0x7E, 0xC4, 0x00, 0x30, 0x40, 0x00
-, 0x80, 0x30, 0x70, 0x02, 0xBC, 0xFB, 0x00, 0x71, 0x40, 0xBA, 0x3B, 0x80, 0x1C, 0x5A, 0xB5
-, 0x00, 0x55, 0x7C, 0xB5, 0x00, 0x54, 0x3D, 0x3A, 0x88, 0x00, 0x0F, 0x62, 0x24, 0x44, 0x0A
-, 0x3A, 0x91, 0xFF, 0x4F, 0x30, 0x50, 0x00, 0x80, 0x3B, 0x80, 0x01, 0x25, 0xB5, 0x00, 0x55
-, 0x7D, 0x6A, 0xDE, 0x54, 0xBD, 0x3A, 0x81, 0xFF, 0xF3, 0x72, 0x22, 0xC2, 0x84, 0x30, 0xA0
-, 0x0A, 0x70, 0x61, 0x04, 0x42, 0x98, 0x7F, 0x2C, 0x76, 0x91, 0x38, 0x00, 0x22, 0x08, 0x61
-, 0x88, 0x40, 0x48, 0x69, 0x3F, 0x54, 0x7D, 0xB5, 0x00, 0x52, 0xFF, 0x3B, 0x80, 0x1B, 0x5B
-, 0x38, 0x0D, 0x0A, 0x6F, 0x30, 0x00, 0x00, 0x20, 0xB9, 0x00, 0x54, 0x3D, 0x9B, 0x2B, 0x55
-, 0x3C, 0xB0, 0x04, 0x52, 0xBE, 0x38, 0x08, 0x22, 0x01, 0xA6, 0xD0, 0x52, 0x3F, 0x3A, 0x80
-, 0x00, 0x0F, 0x8B, 0x80, 0x42, 0x50, 0x9B, 0xA2, 0x42, 0xC0, 0x3A, 0x88, 0x00, 0xB4, 0xB5
-, 0x00, 0x53, 0x7C, 0x31, 0x1F, 0xFF, 0xE9, 0x69, 0x3F, 0x44, 0x0D, 0x3B, 0x80, 0x01, 0x25
-, 0xB5, 0x00, 0x54, 0xFD, 0x7F, 0x4E, 0x54, 0x3D, 0xB5, 0x00, 0x44, 0x00, 0x3B, 0x80, 0x01
-, 0x25, 0x9B, 0xA7, 0x7E, 0x9C, 0x7D, 0x8C, 0x54, 0x3D, 0x7C, 0x24, 0xC4, 0x85, 0x6A, 0x3E
-, 0xD2, 0xBC, 0x61, 0x64, 0x44, 0x00, 0x3B, 0x80, 0x02, 0xE4, 0x30, 0x50, 0x00, 0x80, 0x9B
-, 0xA2, 0x52, 0x3E, 0x90, 0x90, 0xD4, 0xBD, 0xA2, 0x12, 0xFB, 0x24, 0xB5, 0x00, 0x4C, 0x8D
-, 0x3B, 0x44, 0x40, 0xDA, 0x31, 0x10, 0x00, 0x1C, 0xB5, 0x00, 0x4C, 0xCD, 0xB5, 0x00, 0x58
-, 0x3B, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7B, 0xB5, 0x00, 0x7E, 0x9C, 0x6C, 0x3F
-, 0xFD, 0x02, 0x3B, 0x80, 0x10, 0xA5, 0xB5, 0x00, 0x54, 0x7E, 0xB5, 0x00, 0x54, 0x3E, 0x3A
-, 0x98, 0x00, 0x5C, 0xFB, 0x00, 0x71, 0x40, 0xF8, 0x30, 0x40, 0x00, 0x82, 0x7F, 0x2C, 0xC2
-, 0x59, 0x3A, 0xAB, 0xFF, 0xDE, 0x7F, 0x2C, 0x78, 0x6B, 0x39, 0x00, 0x22, 0x20, 0x64, 0x24
-, 0x4A, 0x49, 0x3A, 0x91, 0xFF, 0xFA, 0x7F, 0x30, 0x79, 0x14, 0x3A, 0x84, 0x00, 0x1A, 0x3A
-, 0xB0, 0xFF, 0xC4, 0x30, 0x45, 0x00, 0x00, 0x61, 0x20, 0x78, 0xF5, 0x30, 0x11, 0x00, 0x00
-, 0x38, 0x04, 0x22, 0x01, 0x38, 0x10, 0x26, 0x91, 0x60, 0xA8, 0x40, 0xE8, 0x7F, 0x2C, 0x42
-, 0x70, 0x3B, 0x80, 0x40, 0x59, 0x3A, 0x8B, 0xFF, 0xF2, 0xB5, 0x00, 0x58, 0x3F, 0x3C, 0xD8
-, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7E, 0xB5, 0x00, 0x7E, 0x9C, 0x3C, 0xD0, 0x00, 0x8E, 0x3C
-, 0xCB, 0xFF, 0xB4, 0x82, 0x14, 0x52, 0xF6, 0x6C, 0x3C, 0xD4, 0x78, 0xB5, 0x00, 0x55, 0xFA
-, 0x3B, 0x46, 0x41, 0x1C, 0x95, 0xD4, 0xF9, 0x1A, 0xB5, 0x00, 0x53, 0x77, 0xB5, 0x00, 0x52
-, 0xB6, 0x3C, 0xC5, 0x41, 0x1B, 0x6A, 0x5C, 0x62, 0x0C, 0x61, 0x84, 0xFE, 0x9C, 0x7F, 0x20
-, 0xC3, 0x41, 0x3C, 0xC9, 0xFF, 0x72, 0x30, 0xA0, 0x02, 0x17, 0x9B, 0xA0, 0xE2, 0x0B, 0x9B
+, 0x00, 0x38, 0x08, 0x0A, 0x6F, 0x9B, 0xA6, 0x7D, 0x04, 0xB0, 0xB6, 0x62, 0x88, 0x69, 0x7E
+, 0xC4, 0x08, 0x6A, 0xBF, 0x54, 0xFC, 0xB5, 0x00, 0x58, 0x7F, 0x3B, 0x80, 0x01, 0x25, 0x30
+, 0x50, 0x00, 0x80, 0x69, 0x5E, 0xD4, 0x3C, 0x3A, 0x90, 0x00, 0x0D, 0x72, 0x02, 0xC4, 0x80
+, 0x6A, 0xBE, 0xD4, 0x3E, 0x30, 0x40, 0x00, 0x80, 0x3B, 0x80, 0x01, 0x00, 0xB0, 0xB2, 0xF6
+, 0x48, 0x6A, 0x5E, 0x54, 0x3E, 0x3A, 0x80, 0x00, 0x80, 0x3B, 0x80, 0x01, 0x00, 0x9B, 0xA6
+, 0xF8, 0x49, 0x39, 0x84, 0x80, 0x80, 0x92, 0x19, 0xFE, 0x9C, 0x3B, 0x62, 0x40, 0x1C, 0x9B
+, 0x84, 0x54, 0x3D, 0x61, 0x40, 0x7E, 0x9C, 0x3B, 0x80, 0x07, 0xF1, 0xA6, 0xB6, 0x7E, 0x9C
+, 0x3B, 0x00, 0x40, 0x21, 0xB5, 0x00, 0x58, 0x3F, 0x3B, 0x80, 0x08, 0x00, 0x9B, 0xA4, 0x7E
+, 0x9C, 0x9B, 0xA4, 0x54, 0x3D, 0xA5, 0xB2, 0xD8, 0x3F, 0xB5, 0x00, 0x42, 0xC0, 0x3C, 0xD8
+, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7C, 0xB5, 0x00, 0x7E, 0x9C, 0x9B, 0x86, 0x7D, 0x04, 0x38
+, 0x0A, 0x0A, 0x6F, 0xB0, 0xB2, 0xD4, 0x7E, 0x6A, 0x7E, 0x52, 0xFD, 0x71, 0x04, 0xD8, 0x7F
+, 0x3B, 0x80, 0x01, 0x25, 0x30, 0x50, 0x00, 0x80, 0x69, 0x5E, 0xD5, 0x3E, 0x72, 0x02, 0xC4
+, 0x11, 0x6A, 0xBE, 0xD4, 0xBC, 0x30, 0x40, 0x00, 0x80, 0x3B, 0x80, 0x01, 0x00, 0xB0, 0xB2
+, 0xF6, 0x00, 0xB5, 0x00, 0x54, 0x3C, 0x3A, 0x88, 0x00, 0x80, 0xB5, 0x00, 0x54, 0x3D, 0x3B
+, 0x80, 0x01, 0x00, 0x9B, 0xA6, 0xFE, 0x9C, 0xB5, 0x00, 0x58, 0x3F, 0x3C, 0xD8, 0x03, 0x00
+, 0x8B, 0x80, 0x7D, 0x7C, 0xB5, 0x00, 0x7E, 0x9C, 0x3A, 0x88, 0x00, 0x0A, 0x9B, 0x8C, 0x42
+, 0x88, 0xA6, 0x56, 0x7D, 0x05, 0x39, 0x02, 0x22, 0x20, 0xFB, 0x00, 0x71, 0x40, 0x3E, 0xAA
+, 0x08, 0xC4, 0x00, 0x3A, 0x89, 0x00, 0xA6, 0xBA, 0x41, 0x58, 0x7B, 0xB5, 0x00, 0x5C, 0x7D
+, 0x3B, 0x80, 0x13, 0x20, 0xBA, 0x20, 0xDA, 0x7C, 0x6D, 0x5E, 0x50, 0xBD, 0x3A, 0x91, 0x00
+, 0x18, 0x82, 0x04, 0x7E, 0x50, 0x3A, 0x80, 0x00, 0x29, 0x3A, 0x9A, 0xFF, 0xFA, 0x38, 0x08
+, 0x0B, 0x68, 0x38, 0x0C, 0x0B, 0x6D, 0xBF, 0x10, 0x42, 0x40, 0x38, 0x0D, 0x0B, 0x6A, 0xBB
+, 0x00, 0x4C, 0x98, 0x6A, 0x3E, 0xD5, 0xFC, 0x31, 0x80, 0x20, 0xAF, 0x3B, 0x80, 0x01, 0x07
+, 0x9B, 0xA2, 0xCA, 0x48, 0x7F, 0x4E, 0x54, 0xBC, 0xB5, 0x00, 0x4C, 0x88, 0x3A, 0x91, 0xFF
+, 0x43, 0xB5, 0x00, 0x42, 0x90, 0x96, 0xF4, 0xD5, 0x3D, 0x3A, 0x81, 0xFF, 0x41, 0x61, 0x48
+, 0xFD, 0xA9, 0x3A, 0x88, 0x00, 0xAF, 0x61, 0x8A, 0x72, 0xE8, 0x6A, 0x7E, 0xC4, 0x00, 0x30
+, 0x40, 0x00, 0x80, 0x30, 0x70, 0x02, 0xBC, 0x3B, 0x80, 0x1C, 0x5A, 0xB5, 0x00, 0x55, 0x7C
+, 0xB5, 0x00, 0x54, 0x3D, 0x3A, 0x88, 0x00, 0x0F, 0x62, 0x24, 0x44, 0x0A, 0x3A, 0x91, 0xFF
+, 0x4F, 0x30, 0x50, 0x00, 0x80, 0x3B, 0x80, 0x01, 0x25, 0xB5, 0x00, 0x55, 0x7D, 0x6A, 0xDE
+, 0x54, 0xBD, 0x3A, 0x81, 0xFF, 0xF3, 0x72, 0x22, 0xC2, 0x84, 0x30, 0xA0, 0x0A, 0x70, 0x61
+, 0x04, 0x42, 0x98, 0x7F, 0x2C, 0x76, 0x91, 0x38, 0x0C, 0x22, 0x08, 0x60, 0x08, 0x43, 0x48
+, 0x69, 0x3F, 0x54, 0x7D, 0xB5, 0x00, 0x52, 0xFF, 0x3B, 0x80, 0x1B, 0x5B, 0x38, 0x01, 0x0A
+, 0x6F, 0x30, 0x00, 0x00, 0x20, 0xB9, 0x00, 0x54, 0x3D, 0x9B, 0x2B, 0x55, 0x3C, 0xB0, 0x04
+, 0x52, 0xBE, 0x38, 0x08, 0x22, 0x01, 0xA6, 0xD0, 0x52, 0x3F, 0x3A, 0x80, 0x00, 0x0F, 0x8B
+, 0x80, 0x42, 0x50, 0x9B, 0xA2, 0x42, 0xC0, 0xFB, 0x00, 0x71, 0x40, 0x7C, 0x3A, 0x88, 0x00
+, 0xB4, 0xB5, 0x00, 0x53, 0x7C, 0x31, 0x1F, 0xFF, 0xE9, 0x69, 0x3F, 0x44, 0x0D, 0x3B, 0x80
+, 0x01, 0x25, 0xB5, 0x00, 0x54, 0xFD, 0x7F, 0x4E, 0x54, 0x3D, 0xB5, 0x00, 0x44, 0x00, 0x3B
+, 0x80, 0x01, 0x25, 0x9B, 0xA7, 0x7E, 0x9C, 0x7D, 0x8C, 0x54, 0x3D, 0x7C, 0x24, 0xC4, 0x85
+, 0x6A, 0x3E, 0xD2, 0xBC, 0x61, 0x64, 0x44, 0x00, 0x3B, 0x80, 0x02, 0xE4, 0x30, 0x50, 0x00
+, 0x80, 0x9B, 0xA2, 0x52, 0x3E, 0x90, 0x90, 0xD4, 0xBD, 0xA2, 0x12, 0xFB, 0x24, 0xB5, 0x00
+, 0x4C, 0x8D, 0x3B, 0x44, 0x40, 0x7E, 0x31, 0x10, 0x00, 0x1C, 0xB5, 0x00, 0x4C, 0xCD, 0xB5
+, 0x00, 0x58, 0x3B, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7B, 0xB5, 0x00, 0x7E, 0x9C
+, 0x6C, 0x3F, 0xFD, 0x02, 0x3B, 0x80, 0x10, 0xA5, 0xB5, 0x00, 0x54, 0x7E, 0xB5, 0x00, 0x54
+, 0x3E, 0x3A, 0x90, 0x00, 0x5C, 0x30, 0x40, 0x00, 0x82, 0x7F, 0x28, 0xC2, 0x51, 0x3A, 0x9A
+, 0xFF, 0xDE, 0x3A, 0xA3, 0x00, 0x14, 0x30, 0x41, 0x00, 0x00, 0x38, 0x10, 0x26, 0x91, 0x61
+, 0x2C, 0x7E, 0x50, 0x3A, 0x8C, 0xFF, 0xB3, 0x30, 0x05, 0x00, 0x00, 0x3B, 0x80, 0x0A, 0x71
+, 0xB5, 0x00, 0x40, 0x60, 0xB5, 0x00, 0x58, 0x3F, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D
+, 0x7E, 0xB5, 0x00, 0x7E, 0x9C, 0x3C, 0xD0, 0x00, 0x8E, 0x3C, 0xCB, 0xFF, 0xB4, 0x82, 0x14
+, 0x52, 0xF6, 0x6C, 0x3C, 0xD4, 0x78, 0xB5, 0x00, 0x55, 0xFA, 0x3B, 0x46, 0x40, 0xB8, 0x95
+, 0xD4, 0xF9, 0x1A, 0xB5, 0x00, 0x53, 0x77, 0xB5, 0x00, 0x52, 0xB6, 0x3C, 0xC5, 0x40, 0xB7
+, 0x6A, 0x5C, 0x62, 0x0C, 0x61, 0x84, 0xFE, 0x9C, 0x7F, 0x20, 0xC3, 0x41, 0x3C, 0xC9, 0xFF
+, 0x72, 0x30, 0xA0, 0x02, 0x17, 0xFB, 0x00, 0x71, 0x40, 0xBA, 0x9B, 0xA0, 0xE2, 0x0B, 0x9B
 , 0xC0, 0xD6, 0x7B, 0x9B, 0x00, 0xD4, 0xFC, 0x8B, 0x80, 0x55, 0x7D, 0x30, 0xB0, 0x21, 0x2C
 , 0x73, 0x05, 0xD3, 0xB7, 0xB5, 0x00, 0x52, 0x7F, 0x3B, 0x80, 0x01, 0xDA, 0x3A, 0x31, 0xFF
 , 0xFE, 0x6A, 0x1E, 0x54, 0xBA, 0x7C, 0x01, 0x78, 0x4A, 0x6A, 0x7E, 0x52, 0xB7, 0x3B, 0x80
 , 0x01, 0x00, 0xB5, 0x00, 0x54, 0x7A, 0x9B, 0xC0, 0xD2, 0xBF, 0x90, 0x94, 0xD5, 0x3D, 0x3A
 , 0x92, 0x00, 0x04, 0x92, 0x11, 0xD5, 0xBE, 0x6A, 0x1E, 0x54, 0xBA, 0x3A, 0x9B, 0x00, 0x05
-, 0x7C, 0x27, 0x78, 0x06, 0xB5, 0x00, 0x55, 0x7D, 0x3B, 0x44, 0x41, 0x23, 0x80, 0x18, 0x54
-, 0x7A, 0xFB, 0x00, 0x71, 0x41, 0x36, 0x80, 0xB8, 0x54, 0xFC, 0xB5, 0x00, 0x52, 0xB6, 0x82
-, 0x14, 0x7E, 0x9C, 0x3B, 0x46, 0x41, 0x42, 0x6A, 0x5D, 0xD4, 0x38, 0x3C, 0xC5, 0x41, 0x3F
-, 0xB5, 0x00, 0x43, 0x0B, 0x94, 0x18, 0xFE, 0x9C, 0xB5, 0x00, 0x43, 0x0B, 0x94, 0x18, 0xC0
-, 0x41, 0x3B, 0x00, 0x41, 0x43, 0xB5, 0x00, 0x58, 0x39, 0xB5, 0x00, 0x58, 0x39, 0x3C, 0xD8
-, 0x03, 0x00, 0x8B, 0x80, 0x7E, 0x9C, 0x3C, 0xD0, 0xFF, 0x72, 0x6A, 0x7B, 0xFD, 0x2B, 0x30
-, 0x60, 0x0D, 0x5B, 0x39, 0x85, 0x03, 0x09, 0x6A, 0xBC, 0x62, 0x4A, 0x69, 0x7D, 0x42, 0x91
-, 0x30, 0x60, 0x41, 0xC4, 0x39, 0x85, 0x03, 0x0A, 0x6C, 0x3E, 0x54, 0x7B, 0x3B, 0x80, 0x16
-, 0x94, 0xB5, 0x00, 0x55, 0x79, 0x7C, 0x44, 0xD4, 0xBA, 0x6A, 0x1C, 0xC2, 0x91, 0x61, 0xC0
-, 0x7E, 0x9C, 0x6A, 0xBE, 0xD4, 0xB7, 0x3B, 0x80, 0x00, 0xA9, 0x9B, 0xC3, 0x62, 0x09, 0x6A
-, 0xDC, 0xD4, 0x3D, 0x3A, 0x90, 0x00, 0x10, 0x61, 0xCC, 0x42, 0x80, 0x6A, 0xBE, 0xD4, 0xBB
-, 0x3B, 0x80, 0x00, 0xA9, 0x9B, 0xC3, 0x62, 0x09, 0x9B, 0xA0, 0xD4, 0x39, 0x3A, 0x88, 0x00
-, 0x96, 0x66, 0x04, 0x45, 0x0A, 0x79, 0x40, 0xC3, 0x80, 0x3A, 0x89, 0xFF, 0x6B, 0x80, 0x18
-, 0x54, 0x3B, 0xB5, 0x00, 0x54, 0xFE, 0x3B, 0x80, 0x02, 0x8F, 0x80, 0xD4, 0x74, 0x57, 0x7F
-, 0x4E, 0x54, 0xBE, 0xB5, 0x00, 0x42, 0x88, 0x3A, 0x81, 0x00, 0x5B, 0x6A, 0x3F, 0xD4, 0xBB
-, 0x3B, 0x80, 0x01, 0x00, 0x3C, 0xC8, 0xFF, 0xD7, 0x7F, 0x4E, 0x54, 0xBF, 0xB5, 0x00, 0x42
-, 0x88, 0x82, 0x14, 0x54, 0x38, 0x3A, 0x80, 0x00, 0x5C, 0x3B, 0x43, 0x41, 0x7F, 0x6A, 0x3C
-, 0xD5, 0x39, 0x3A, 0x8A, 0x00, 0x95, 0x31, 0x1F, 0xFF, 0x6A, 0x9B, 0xA0, 0xCC, 0x0D, 0xFB
-, 0x00, 0x71, 0x41, 0x74, 0x6A, 0x7F, 0xC3, 0x90, 0x6A, 0x1B, 0xF2, 0x81, 0xB5, 0x00, 0x74
-, 0x57, 0x30, 0xA0, 0x0E, 0xBA, 0x3B, 0x80, 0x02, 0x8F, 0x80, 0x18, 0x61, 0x85, 0x6A, 0x5D
-, 0xD5, 0x3F, 0x3B, 0x80, 0x1A, 0x0A, 0x3C, 0xC8, 0xFF, 0xD7, 0x3B, 0x00, 0x41, 0x80, 0xB5
-, 0x00, 0x54, 0xBD, 0xB5, 0x00, 0x54, 0xBD, 0x61, 0x44, 0x7E, 0x9C, 0x98, 0xB5, 0x54, 0xBE
-, 0xB5, 0x00, 0x7E, 0x9C, 0x82, 0x14, 0x43, 0x08, 0x3B, 0x63, 0x41, 0x89, 0xB5, 0x00, 0x54
-, 0x37, 0x3B, 0x80, 0x01, 0x00, 0x80, 0xB8, 0x74, 0x57, 0x3B, 0x20, 0x41, 0x92, 0x6A, 0x1C
-, 0x54, 0xBA, 0x3A, 0x89, 0x00, 0x22, 0x3A, 0x80, 0x00, 0x14, 0x61, 0xC4, 0x42, 0x80, 0xD0
-, 0x6C, 0x74, 0x57, 0x30, 0xA0, 0x07, 0xA1, 0x94, 0x03, 0xD4, 0x37, 0x3B, 0x80, 0x00, 0x14
-, 0xB5, 0x00, 0x61, 0x40, 0x9B, 0xA0, 0xD4, 0xBE, 0x3A, 0x81, 0x00, 0x97, 0x61, 0xC4, 0x45
-, 0x04, 0x31, 0x0F, 0xFF, 0x6A, 0x6A, 0x3D, 0x4C, 0x05, 0x6A, 0x5B, 0xF2, 0x81, 0xB5, 0x00
-, 0x74, 0x17, 0x3B, 0x80, 0x02, 0x8F, 0x80, 0x18, 0x61, 0x85, 0x6A, 0x5D, 0xD5, 0x3A, 0xB5
-, 0x00, 0x54, 0x37, 0x3B, 0x80, 0x17, 0x99, 0xB5, 0x00, 0x7E, 0x9C, 0x92, 0x13, 0xD4, 0xB9
-, 0x3B, 0x62, 0x41, 0xB7, 0x8B, 0x80, 0x42, 0x88, 0x90, 0xB7, 0xF8, 0x0B, 0xB2, 0xD2, 0xC2
-, 0x80, 0x92, 0x17, 0xC3, 0x48, 0x3B, 0x42, 0x41, 0xB5, 0xB5, 0x00, 0x54, 0x38, 0x3A, 0x90
-, 0x00, 0x5D, 0xB5, 0x00, 0x43, 0x10, 0x82, 0x18, 0x7E, 0x9C, 0x3B, 0x66, 0x41, 0xB5, 0x3A
-, 0x88, 0x00, 0x5E, 0xB5, 0x00, 0x43, 0x08, 0x90, 0xD8, 0xFE, 0x9C, 0xA2, 0x1A, 0xC3, 0x48
-, 0x3B, 0x66, 0x41, 0xB3, 0x6C, 0x1E, 0x7E, 0x4A, 0x3B, 0x00, 0x41, 0xB8, 0x23, 0x00, 0x71
-, 0x41, 0xB2, 0xB5, 0x00, 0x7E, 0x48, 0x3B, 0x00, 0x41, 0xB8, 0xB5, 0x00, 0x58, 0x3C, 0x3B
-, 0x00, 0x41, 0xB8, 0xB5, 0x00, 0x58, 0x3C, 0x9B, 0x9F, 0xD8, 0x3C, 0x3C, 0xD8, 0x03, 0x00
-, 0x7F, 0x4E, 0x7D, 0x55, 0xA3, 0x00, 0x71, 0x41, 0xC4, 0x6A, 0x7F, 0x7D, 0x22, 0x71, 0x44
-, 0xD8, 0x7F, 0x3B, 0x80, 0x13, 0xF7, 0x9B, 0xA1, 0x74, 0x5E, 0x7A, 0x2F, 0x54, 0x3E, 0x3A
-, 0x80, 0x00, 0x2F, 0x6A, 0x3F, 0x42, 0x80, 0x3B, 0x80, 0x00, 0x82, 0xB5, 0x00, 0x62, 0x09
-, 0x7F, 0x4E, 0x54, 0x3E, 0xB5, 0x00, 0x42, 0x80, 0x3A, 0x88, 0x00, 0x56, 0xB5, 0x00, 0x54
-, 0xFE, 0x3B, 0x80, 0x00, 0x51, 0x3C, 0xC8, 0xFF, 0xDE, 0x6A, 0x1F, 0x58, 0x3F, 0xB5, 0x00
-, 0x7D, 0x5E, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0xA0, 0x42, 0x42, 0x80, 0x94, 0x7E, 0x40, 0x6C
-, 0x3F, 0xFD, 0x01, 0x3B, 0x80, 0x03, 0x64, 0x38, 0x0A, 0x00, 0xEF, 0xB5, 0x00, 0x58, 0x3F
-, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7F, 0xB5, 0x00, 0x7E, 0x9C, 0x39, 0x84, 0x80
-, 0x02, 0x39, 0x86, 0x80, 0x02, 0x30, 0x40, 0x01, 0x00, 0xA8, 0x1E, 0x7E, 0x9C, 0xA2, 0x02
-, 0x7E, 0x9C, 0x3B, 0x43, 0x41, 0xE9, 0x30, 0x10, 0x01, 0xFF, 0xA8, 0x38, 0xFE, 0x9C, 0x30
-, 0x4F, 0xFE, 0x00, 0xA9, 0x26, 0x7E, 0x9C, 0x3C, 0xD8, 0x03, 0x00, 0x9B, 0x99, 0x7E, 0x9C
-, 0xA0, 0x86, 0x7E, 0x9C, 0x03, 0x00, 0x70, 0x00, 0x03, 0x21, 0x00, 0x71, 0x0A, 0x6F, 0x00
-, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00
-, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x03
+, 0x7C, 0x27, 0x78, 0x06, 0xB5, 0x00, 0x55, 0x7D, 0x3B, 0x44, 0x40, 0xBF, 0x80, 0x18, 0x54
+, 0x7A, 0x80, 0xB8, 0x54, 0xFC, 0xB5, 0x00, 0x52, 0xB6, 0x82, 0x14, 0x7E, 0x9C, 0x3B, 0x46
+, 0x40, 0xDE, 0x6A, 0x5D, 0xD4, 0x38, 0x3C, 0xC5, 0x40, 0xDB, 0xB5, 0x00, 0x43, 0x0B, 0x94
+, 0x18, 0xFE, 0x9C, 0xB5, 0x00, 0x43, 0x0B, 0x94, 0x18, 0xC0, 0x41, 0x3B, 0x00, 0x40, 0xDF
+, 0xB5, 0x00, 0x58, 0x39, 0xB5, 0x00, 0x58, 0x39, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7E
+, 0x9C, 0x3C, 0xD0, 0xFF, 0x72, 0x71, 0x65, 0x7D, 0x2B, 0x6A, 0x7B, 0x42, 0x91, 0x6A, 0xBB
+, 0xE2, 0x4B, 0x6A, 0x3D, 0x52, 0xF8, 0xB5, 0x00, 0x58, 0x7B, 0x3B, 0x80, 0x16, 0x94, 0xB5
+, 0x00, 0x54, 0xF9, 0x7C, 0x44, 0xD4, 0xB8, 0x6A, 0x1B, 0xC2, 0x91, 0x61, 0xC0, 0x7E, 0x9C
+, 0x6A, 0xBE, 0x54, 0xB6, 0x3B, 0x80, 0x00, 0xA9, 0x9B, 0xC3, 0x62, 0x09, 0x6A, 0xDB, 0xD4
+, 0x3C, 0x3A, 0x90, 0x00, 0x25, 0x61, 0xCC, 0x42, 0x80, 0x6A, 0xBE, 0x54, 0xBA, 0x3B, 0x80
+, 0x00, 0xA9, 0x9B, 0xC3, 0x62, 0x09, 0x9B, 0xA0, 0xD4, 0x37, 0x3A, 0x88, 0x00, 0x96, 0x66
+, 0x04, 0x45, 0x0A, 0xFB, 0x00, 0x71, 0x40, 0xF8, 0x3A, 0x99, 0xFF, 0x6B, 0xB5, 0x00, 0x72
+, 0x81, 0x80, 0x18, 0x43, 0x80, 0x6A, 0xFE, 0xD4, 0xBA, 0x3B, 0x80, 0x02, 0x8F, 0x80, 0xD4
+, 0x62, 0x09, 0x7F, 0x4E, 0x54, 0xBD, 0xB5, 0x00, 0x43, 0x08, 0x38, 0x10, 0x00, 0xCF, 0x3B
+, 0x80, 0x01, 0x33, 0x9B, 0xA2, 0x74, 0x56, 0x7F, 0x4E, 0x55, 0x3D, 0xB5, 0x00, 0x43, 0x10
+, 0x3A, 0x82, 0x00, 0xC7, 0x7A, 0x2B, 0x54, 0x7D, 0x30, 0xA0, 0x12, 0x00, 0x30, 0xB0, 0x0B
+, 0x66, 0x30, 0x50, 0x00, 0x80, 0x3B, 0x80, 0x02, 0xBE, 0xB5, 0x00, 0x62, 0x09, 0x7F, 0x4E
+, 0x55, 0x3C, 0xB5, 0x00, 0x43, 0x10, 0x90, 0xDB, 0x54, 0xBD, 0x61, 0x44, 0x7E, 0x9C, 0xA2
+, 0x17, 0x55, 0x39, 0x3A, 0x92, 0x00, 0xC8, 0x3A, 0x89, 0xFF, 0xBE, 0x3B, 0x43, 0x41, 0x49
+, 0x6A, 0xBF, 0x54, 0xFD, 0x38, 0x12, 0x0B, 0x66, 0x30, 0x60, 0x00, 0x80, 0x30, 0x80, 0x12
+, 0x00, 0x30, 0xA0, 0x01, 0x80, 0x3B, 0x80, 0x01, 0x1C, 0xB5, 0x00, 0x61, 0x46, 0xB5, 0x00
+, 0x54, 0xB9, 0x30, 0x80, 0x01, 0x00, 0x30, 0x50, 0x01, 0x00, 0x30, 0x70, 0x00, 0x80, 0x3B
+, 0x80, 0x1C, 0x3E, 0x38, 0x0C, 0x0B, 0x6B, 0x30, 0x90, 0x01, 0x80, 0x38, 0x0A, 0x22, 0x01
+, 0x20, 0x80, 0x41, 0x28, 0x30, 0xA0, 0x01, 0x00, 0xB5, 0x00, 0x42, 0x11, 0xB5, 0x00, 0x43
+, 0x08, 0xD4, 0xC8, 0x42, 0x11, 0x60, 0x24, 0xFE, 0x9C, 0x30, 0x90, 0x01, 0x00, 0x30, 0x50
+, 0x00, 0x80, 0x30, 0xA0, 0x22, 0x29, 0x3B, 0x80, 0x02, 0x60, 0x30, 0x80, 0x01, 0x80, 0x30
+, 0x80, 0x01, 0x00, 0x30, 0x50, 0x00, 0x80, 0x3B, 0x80, 0x00, 0xC1, 0x30, 0x90, 0x01, 0x00
+, 0x30, 0x90, 0x01, 0x00, 0xB5, 0x00, 0x78, 0x09, 0x30, 0x50, 0x00, 0x3F, 0x3B, 0x80, 0x00
+, 0x51, 0xFB, 0x00, 0x71, 0x41, 0x36, 0xB5, 0x00, 0x54, 0x7F, 0x38, 0x0A, 0x0B, 0x60, 0xD0
+, 0x0C, 0x54, 0x3F, 0x30, 0x60, 0x00, 0x3F, 0x3B, 0x80, 0x00, 0x7A, 0xB5, 0x00, 0x61, 0x40
+, 0x9B, 0xA8, 0x74, 0x55, 0xA5, 0xF2, 0xE2, 0x09, 0x38, 0x09, 0x0B, 0x69, 0x38, 0x0A, 0x0B
+, 0x61, 0x38, 0x0C, 0x0A, 0x7C, 0x30, 0xA0, 0x0B, 0x67, 0x3B, 0x80, 0x00, 0x89, 0x9B, 0xE0
+, 0xD3, 0xD5, 0x38, 0x0C, 0x0B, 0x67, 0x9B, 0xA8, 0x54, 0xBD, 0xA6, 0x1A, 0xFE, 0x9C, 0x3B
+, 0x00, 0x41, 0x4A, 0x38, 0x01, 0x0B, 0x69, 0x9B, 0xA8, 0x54, 0xBD, 0x61, 0x84, 0x7E, 0x9C
+, 0x92, 0x1B, 0xFE, 0x9C, 0x3B, 0x63, 0x41, 0x52, 0x38, 0x08, 0x0B, 0x6C, 0x9B, 0xDF, 0xD4
+, 0xBE, 0xA5, 0xB2, 0xC3, 0x48, 0x38, 0x0B, 0x0B, 0x67, 0x38, 0x09, 0x0B, 0x69, 0x3B, 0x80
+, 0x41, 0xD0, 0xB5, 0x00, 0x7E, 0x9C, 0x7F, 0x4E, 0x54, 0xBD, 0xB5, 0x00, 0x42, 0x88, 0x3A
+, 0x91, 0xFF, 0x7A, 0x31, 0x20, 0x00, 0xC8, 0x82, 0x14, 0x44, 0x95, 0x3B, 0x44, 0x41, 0x60
+, 0x38, 0x0A, 0x0B, 0x6A, 0x3A, 0x81, 0x00, 0x29, 0x38, 0x0C, 0x0B, 0x69, 0x38, 0x0E, 0x0B
+, 0x62, 0xA2, 0x1B, 0xFE, 0x9C, 0x3B, 0x66, 0x41, 0x6F, 0x38, 0x0C, 0x0A, 0x7A, 0xA2, 0x13
+, 0x7E, 0x9C, 0x3B, 0x64, 0x41, 0x6F, 0x38, 0x0C, 0x0A, 0x79, 0xA2, 0x13, 0x7E, 0x9C, 0x3B
+, 0x67, 0x41, 0x6F, 0x38, 0x0C, 0x0B, 0x63, 0xD0, 0x35, 0x54, 0xB9, 0x3A, 0x89, 0x00, 0x50
+, 0xB5, 0x00, 0x1A, 0x61, 0x38, 0x00, 0x0B, 0x68, 0x95, 0xD8, 0xC0, 0x40, 0xB3, 0xB7, 0x7E
+, 0x9C, 0x3B, 0x00, 0x41, 0x76, 0x38, 0x0B, 0x0B, 0x6A, 0x38, 0x0C, 0x0B, 0x64, 0xD0, 0x34
+, 0x54, 0xBE, 0x38, 0x0A, 0x0B, 0x65, 0x9B, 0x1F, 0xE1, 0x80, 0x95, 0xD8, 0xFE, 0x40, 0xFB
+, 0x00, 0x71, 0x41, 0x74, 0xB2, 0xB7, 0x40, 0x48, 0x38, 0x0B, 0x0B, 0x6A, 0x61, 0x08, 0x54
+, 0xBC, 0xB5, 0x00, 0x43, 0x08, 0xA2, 0x13, 0x54, 0x3E, 0x3A, 0x92, 0xFF, 0x94, 0x3B, 0x46
+, 0x41, 0x7E, 0x3A, 0x89, 0xFF, 0xEB, 0x9B, 0xBF, 0xD4, 0xFC, 0xB5, 0x00, 0x42, 0xC0, 0xB5
+, 0x00, 0x42, 0x90, 0x3A, 0x8A, 0xFF, 0xA5, 0x82, 0x14, 0x7E, 0x9C, 0x3B, 0x43, 0x41, 0x91
+, 0x6A, 0x7B, 0xD5, 0x37, 0x3A, 0x8A, 0x00, 0x95, 0x31, 0x1F, 0xFF, 0x6A, 0x9B, 0xA0, 0xCC
+, 0x0D, 0x6A, 0x7E, 0xC3, 0x90, 0x6A, 0x1B, 0x72, 0x81, 0xB5, 0x00, 0x74, 0x56, 0x30, 0xA0
+, 0x0E, 0xBA, 0x3B, 0x80, 0x02, 0x8F, 0x80, 0x18, 0x61, 0x85, 0x6A, 0x5D, 0x55, 0x3D, 0x3B
+, 0x80, 0x1A, 0x0A, 0x3C, 0xC8, 0xFF, 0xD6, 0x3B, 0x00, 0x41, 0x92, 0xB5, 0x00, 0x54, 0xBC
+, 0xB5, 0x00, 0x54, 0xBC, 0x61, 0x44, 0x7E, 0x9C, 0x98, 0xB5, 0x7E, 0x9C, 0x82, 0x14, 0x7E
+, 0x9C, 0x3B, 0x62, 0x41, 0xA3, 0x6A, 0x9C, 0x54, 0xB9, 0x3A, 0x81, 0x00, 0x14, 0x3A, 0x8A
+, 0x00, 0x22, 0x61, 0x40, 0x43, 0x08, 0x3A, 0x90, 0xFF, 0xED, 0xD0, 0x4C, 0x43, 0x10, 0xB5
+, 0x00, 0x54, 0xB6, 0x94, 0x03, 0xE2, 0x09, 0x30, 0xA0, 0x07, 0xA1, 0x3B, 0x80, 0x00, 0x14
+, 0xB5, 0x00, 0x61, 0x40, 0x3B, 0x00, 0x41, 0xA4, 0xB5, 0x00, 0x55, 0xB7, 0xB5, 0x00, 0x55
+, 0xB7, 0x3A, 0x83, 0x00, 0x97, 0x9B, 0xA0, 0xC5, 0x04, 0x31, 0x0F, 0xFF, 0x6A, 0x7F, 0x4E
+, 0x4C, 0x05, 0xB5, 0x00, 0x72, 0x81, 0x80, 0x18, 0x43, 0x98, 0x6A, 0x3B, 0xD4, 0xB6, 0x3B
+, 0x80, 0x02, 0x8F, 0x80, 0xD4, 0x62, 0x09, 0x6A, 0x5D, 0x55, 0x37, 0xB5, 0x00, 0x54, 0x36
+, 0x3B, 0x80, 0x17, 0x99, 0xB5, 0x00, 0x7E, 0x9C, 0x8B, 0x80, 0x54, 0xB7, 0xFB, 0x00, 0x71
+, 0x41, 0xB2, 0x3A, 0x89, 0x00, 0x5C, 0x3A, 0x91, 0xFF, 0xF2, 0x60, 0x00, 0x78, 0x11, 0x38
+, 0x0A, 0x0B, 0x6A, 0xB5, 0x00, 0x4A, 0x10, 0xB3, 0x02, 0xC3, 0x08, 0x90, 0xDB, 0xCA, 0x50
+, 0x3A, 0x98, 0x00, 0x10, 0xB2, 0xD3, 0x42, 0x98, 0x92, 0x17, 0xC3, 0x48, 0xB5, 0x00, 0x48
+, 0x40, 0x3B, 0x42, 0x41, 0xCD, 0xB5, 0x00, 0x55, 0x39, 0x3A, 0x9A, 0x00, 0x5D, 0xB5, 0x00
+, 0x43, 0x18, 0x82, 0x18, 0x7E, 0x9C, 0x3B, 0x66, 0x41, 0xCD, 0x3A, 0x8A, 0x00, 0x5E, 0xB5
+, 0x00, 0x43, 0x08, 0x90, 0xD8, 0xFE, 0x9C, 0xA2, 0x1A, 0xC3, 0x48, 0x3B, 0x66, 0x41, 0xCB
+, 0x6C, 0x1D, 0xFE, 0x4A, 0x3B, 0x00, 0x41, 0xCE, 0xB5, 0x00, 0x7E, 0x48, 0x3B, 0x00, 0x41
+, 0xCE, 0xB5, 0x00, 0x58, 0x3B, 0xB5, 0x00, 0x58, 0x3B, 0x3C, 0xD8, 0x03, 0x00, 0x7F, 0x4E
+, 0x7D, 0x55, 0x39, 0x84, 0x80, 0x02, 0x39, 0x86, 0x80, 0x02, 0x30, 0x40, 0x01, 0x00, 0xA8
+, 0x1E, 0x7E, 0x9C, 0xA2, 0x02, 0x7E, 0x9C, 0x3B, 0x43, 0x41, 0xDA, 0x30, 0x10, 0x01, 0xFF
+, 0xA8, 0x38, 0xFE, 0x9C, 0x30, 0x4F, 0xFE, 0x00, 0xA9, 0x26, 0x7E, 0x9C, 0x3C, 0xD8, 0x03
+, 0x00, 0x9B, 0x99, 0x7E, 0x9C, 0xA0, 0x86, 0x7E, 0x9C, 0x3A, 0x89, 0x00, 0xC7, 0x7E, 0x81
+, 0xC2, 0x88, 0x3A, 0x89, 0xFF, 0xE9, 0x6A, 0x3F, 0x54, 0xFD, 0xB5, 0x00, 0x58, 0x7F, 0x30
+, 0x60, 0x00, 0x80, 0x3B, 0x80, 0x00, 0xB6, 0xB8, 0xA2, 0xE2, 0x48, 0xB5, 0x00, 0x54, 0xBE
+, 0x38, 0x20, 0x0A, 0x6F, 0xB5, 0x00, 0x76, 0x88, 0x30, 0x62, 0x00, 0x00, 0xB5, 0x00, 0x42
+, 0x90, 0xA0, 0xB7, 0x55, 0xBD, 0xB5, 0x00, 0x42, 0xD0, 0x38, 0x0C, 0x22, 0x13, 0xB5, 0x00
+, 0x42, 0x98, 0xD0, 0x35, 0x7E, 0x9C, 0x3A, 0x83, 0xFF, 0x57, 0x3F, 0x00, 0x71, 0x41, 0xF0
+, 0xB5, 0x00, 0x18, 0x61, 0x3A, 0x90, 0x00, 0x9B, 0xD0, 0x4C, 0x62, 0x09, 0x30, 0x70, 0x00
+, 0x80, 0xB5, 0x00, 0x55, 0x7D, 0x3B, 0x80, 0x00, 0xA9, 0x9B, 0xC6, 0x61, 0x40, 0x7F, 0x4E
+, 0x54, 0xBD, 0x6A, 0x1F, 0x4C, 0x08, 0x3B, 0x80, 0x01, 0x0E, 0x30, 0x50, 0x00, 0x80, 0xB5
+, 0x00, 0x58, 0x3F, 0x3C, 0xD8, 0x03, 0x00, 0x8B, 0x80, 0x7D, 0x7D, 0xB5, 0x00, 0x7E, 0x9C
+, 0x03, 0x00, 0x70, 0x00, 0x03, 0x21, 0x00, 0x71, 0x0A, 0x6F, 0x00, 0x00, 0x01, 0x00, 0x00
+, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00
+, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x2D, 0x00, 0x71, 0x0B, 0x60
+, 0x00, 0xB8, 0x45, 0x7F, 0xEA, 0x29, 0x00, 0x00, 0x07, 0x40, 0x0F, 0x26, 0x3F, 0xFF, 0x9F
+, 0x02, 0xCC, 0xCD, 0x00, 0x12, 0x00, 0x40, 0x00, 0x00, 0x01, 0x47, 0xAE, 0x00, 0x00, 0x00
+, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x0F, 0x00, 0x71
+, 0x0A, 0x79, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x7E, 0x4D, 0xFE, 0x03
 , 0x00, 0x70, 0x00, 0x05, 0x03, 0x00, 0x70, 0x00, 0x07, 0x7B, 0x00, 0x71, 0x03, 0x00, 0x00
-, 0x00, 0x01, 0x00, 0x1B, 0xA7, 0x00, 0x40, 0x00, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00
-, 0x03, 0xE7, 0x00, 0x40, 0x2E, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x05, 0x7B, 0x00
-, 0x41, 0xDF, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x0B, 0x23, 0x00, 0x40, 0x6E, 0x00
-, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x0B, 0xAB, 0x00, 0x40, 0x84, 0x00, 0x3B, 0x80, 0x00
-, 0x00, 0x01, 0x00, 0x0D, 0xF5, 0x00, 0x40, 0x9A, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00
-, 0x0D, 0x24, 0x00, 0x41, 0x46, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x6B, 0x00
-, 0x40, 0xF3, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x07, 0x6C, 0x00, 0x41, 0xD8, 0x00
-, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x05, 0xC6, 0x00, 0x41, 0x0F, 0x00, 0x3B, 0x80, 0x03
+, 0x00, 0x01, 0x00, 0x0B, 0x23, 0x00, 0x40, 0x00, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00
+, 0x0B, 0xAB, 0x00, 0x40, 0x24, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x0D, 0xF5, 0x00
+, 0x40, 0x3A, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x6B, 0x00, 0x40, 0x97, 0x00
+, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x05, 0xC6, 0x00, 0x40, 0xAB, 0x00, 0x3B, 0x80, 0x00
+, 0x00, 0x01, 0x00, 0x0D, 0x24, 0x00, 0x40, 0xE2, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00
+, 0x12, 0x3A, 0x00, 0x7E, 0x9C, 0x00, 0xB5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x7B, 0x00
+, 0x41, 0xD0, 0x00, 0x3B, 0x80, 0x00, 0x00, 0x01, 0x00, 0x1B, 0xA7, 0x00, 0x41, 0xDD, 0x00
+, 0x3B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
 , 0x00, 0x70, 0x00, 0x00, 0x23, 0x00, 0x70, 0x00, 0x02, 0x00, 0x01, 0x00, 0x80, 0x03, 0xFF
 , 0xFF, 0xF9, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x1B, 0x00
 , 0x00, 0x1B, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x70, 0x01
 , 0x12
 };
+/* end binary data. size = 2380bytes */
 
-/* end binary data. size = 2200 bytes */
+/* begin binary data: */
+char speaker_data[] = {/* 423 */
+0x00, 0x00, 0xD1, 0xFF, 0xFE, 0x06, 0xFF, 0xFE, 0x55, 0x00, 0x03, 0x2F, 0xFF, 0xFA, 0xF9
+, 0x00, 0x05, 0x77, 0xFF, 0xFC, 0x89, 0xFF, 0xFC, 0x9A, 0x00, 0x00, 0x0B, 0xFF, 0xFA, 0x84
+, 0x00, 0x02, 0x39, 0xFF, 0xFA, 0xD6, 0x00, 0x02, 0x98, 0xFF, 0xFC, 0xF7, 0x00, 0x00, 0xFE
+, 0xFF, 0xFB, 0xD6, 0xFF, 0xFF, 0x47, 0x00, 0x02, 0x0A, 0xFF, 0xFD, 0x0F, 0x00, 0x01, 0x40
+, 0xFF, 0xFD, 0xE5, 0xFF, 0xFE, 0x9D, 0xFF, 0xFE, 0xD6, 0xFF, 0xFE, 0x68, 0xFF, 0xFD, 0x59
+, 0xFF, 0xFE, 0xAB, 0xFF, 0xFE, 0x65, 0x00, 0x00, 0x2E, 0xFF, 0xFB, 0x78, 0xFF, 0xFF, 0x2C
+, 0x00, 0x00, 0x28, 0xFF, 0xFA, 0x9D, 0x00, 0x01, 0x7D, 0xFF, 0xFC, 0x9E, 0xFF, 0xFC, 0x0C
+, 0x00, 0x01, 0x97, 0xFF, 0xF9, 0x25, 0x00, 0x00, 0xA5, 0xFF, 0xFC, 0x5B, 0xFF, 0xFF, 0x1B
+, 0x00, 0x01, 0xCE, 0xFF, 0xF9, 0xE0, 0x00, 0x03, 0x9B, 0x00, 0x00, 0x98, 0xFF, 0xFC, 0x5D
+, 0x00, 0x01, 0x7A, 0xFF, 0xFA, 0x43, 0xFF, 0xFF, 0x82, 0xFF, 0xFF, 0x66, 0xFF, 0xF8, 0xD6
+, 0xFF, 0xFD, 0xE7, 0x00, 0x01, 0x04, 0xFF, 0xF7, 0xF3, 0xFF, 0xFE, 0x79, 0xFF, 0xFD, 0x5B
+, 0xFF, 0xFB, 0xC4, 0xFF, 0xFE, 0xF5, 0xFF, 0xFA, 0x9B, 0xFF, 0xFF, 0x87, 0xFF, 0xFB, 0xC1
+, 0xFF, 0xFD, 0xF3, 0x00, 0x00, 0x12, 0x00, 0x01, 0x8C, 0xFF, 0xF6, 0x37, 0x00, 0x05, 0x49
+, 0xFF, 0xFA, 0x1F, 0xFF, 0xFC, 0x9E, 0x00, 0x00, 0xD8, 0xFF, 0xF7, 0x74, 0xFF, 0xFE, 0x29
+, 0xFF, 0xFD, 0x42, 0xFF, 0xF3, 0x14, 0x00, 0x02, 0x1B, 0xFF, 0xF5, 0x86, 0xFF, 0xF7, 0x64
+, 0xFF, 0xF6, 0x6D, 0xFF, 0xF3, 0x81, 0x00, 0x00, 0x2F, 0xFF, 0xF0, 0x35, 0xFF, 0xFC, 0xFA
+, 0x00, 0x03, 0x5E, 0xFF, 0xF9, 0xA2, 0x00, 0x09, 0x46, 0xFF, 0xFE, 0x88, 0x00, 0x09, 0x61
+, 0x00, 0x04, 0x3E, 0x00, 0x07, 0x57, 0x00, 0x09, 0xA2, 0xFF, 0xFD, 0x53, 0x00, 0x10, 0xD6
+, 0xFF, 0xF7, 0xEE, 0xFF, 0xFC, 0xDC, 0x00, 0x04, 0x42, 0xFF, 0xF4, 0x9B, 0xFF, 0xF4, 0xA3
+, 0xFF, 0xF0, 0x54, 0xFF, 0xF0, 0x30, 0xFF, 0xFB, 0x3B, 0xFF, 0xF2, 0x47, 0x00, 0x0E, 0xBA
+, 0xFF, 0xF7, 0x96, 0x00, 0x22, 0x85, 0x00, 0x13, 0xA9, 0x00, 0x57, 0x54, 0x00, 0x13, 0x9B
+, 0x00, 0x69, 0xD8, 0x00, 0x2B, 0xD5, 0x00, 0x73, 0x6B, 0x00, 0x40, 0x09, 0x00, 0x40, 0x8E
+, 0xFF, 0xD6, 0x1D, 0xFF, 0xEA, 0x06, 0xFF, 0xB0, 0xD7, 0xFF, 0x5F, 0x5B, 0xFF, 0xA0, 0xAA
+, 0x07, 0x36, 0x2D, 0xFF, 0xAA, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xCC, 0xCD
+, 0x66, 0x66, 0x66, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x19, 0x99, 0x9A
+, 0x00, 0x01, 0x76, 0x00, 0x01, 0x77, 0x04, 0x00, 0x00, 0x00, 0x67, 0xAE, 0x1C, 0xC0, 0x00
+, 0x00, 0x6F, 0x69
+};
+/* end binary data. size = 423 bytes */
 
+/* begin binary data: */
+char config_data[] = {/* 165 */
+0x09, 0xF3, 0x33, 0x01, 0x3E, 0x66, 0x00, 0x54, 0xCD, 0x00, 0x00, 0x14, 0x00, 0x00, 0x02
+, 0x1A, 0xE6, 0x40, 0x1B, 0x40, 0xD4, 0x1C, 0x59, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4B, 0x00, 0x01, 0x4B
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01
+, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x47
+, 0x01, 0x47, 0xAE, 0x00, 0x19, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x02, 0x80, 0x00
+, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x50, 0x00, 0x00
+, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x19, 0x9A, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02
+, 0x00, 0x00, 0x01, 0x01, 0x47, 0xAE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x19, 0x99, 0x9A
+, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x30, 0x00, 0x00, 0x02, 0x00, 0x00, 0x18
+, 0xEC, 0x00, 0x00, 0x00, 0x03, 0xD7, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00
+};
+/* end binary data. size = 165 bytes */
 
 /* begin binary data: */
-unsigned char preset_data[] = { /* 87 */
-0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
-, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x01, 0x47, 0xAE, 0x00, 0x2B, 0xB1, 0x00, 0x00, 0x9D
-, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00
-, 0x08, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x40, 0x00
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x01, 0x48
-, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03
+char eq_data_hand[] = {/* 180 */
+0x00, 0x00, 0x01, 0xC2, 0x90, 0xA8, 0x7D, 0x5E, 0x28, 0x3E, 0xB3, 0x60, 0x82, 0x99, 0x40
+, 0x3E, 0xB3, 0x60, 0x00, 0x00, 0x01, 0xC2, 0x90, 0xA8, 0x7D, 0x5E, 0x28, 0x3E, 0xB3, 0x60
+, 0x82, 0x99, 0x40, 0x3E, 0xB3, 0x60, 0x00, 0x00, 0x01, 0xC8, 0xCF, 0x48, 0x76, 0x89, 0x90
+, 0x34, 0xDC, 0x58, 0x89, 0xF4, 0xCC, 0x42, 0xD2, 0xBC, 0x00, 0x00, 0x01, 0xEE, 0x00, 0x24
+, 0x31, 0xEB, 0x08, 0x29, 0x55, 0x8C, 0x8C, 0x6F, 0x80, 0x6A, 0x4F, 0xC8, 0x00, 0x00, 0x01
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00
+, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00
 };
-/* end binary data. size = 87 bytes */
+/* end binary data. size = 180 bytes */
 
+/* begin binary data: */
+char eq_data_table[] = {/* 180 */
+0x00, 0x00, 0x01, 0xC2, 0x90, 0xA8, 0x7D, 0x5E, 0x28, 0x3E, 0xB3, 0x60, 0x82, 0x99, 0x40
+, 0x3E, 0xB3, 0x60, 0x00, 0x00, 0x01, 0xC2, 0x90, 0xA8, 0x7D, 0x5E, 0x28, 0x3E, 0xB3, 0x60
+, 0x82, 0x99, 0x40, 0x3E, 0xB3, 0x60, 0x00, 0x00, 0x01, 0xC8, 0xCF, 0x48, 0x76, 0x89, 0x90
+, 0x36, 0x25, 0x30, 0x89, 0xA7, 0x50, 0x41, 0x3C, 0x6C, 0x00, 0x00, 0x01, 0xEE, 0x00, 0x24
+, 0x31, 0xEB, 0x08, 0x29, 0x55, 0x8C, 0x8C, 0x6F, 0x80, 0x6A, 0x4F, 0xC8, 0x00, 0x00, 0x01
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00
+, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01
+, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00
+};
+
+/* end binary data. size = 180 bytes */
 
 /* begin binary data: */
-char preset_data4[] = /* 87 */
-{0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
+char preset_data0[] = {/* 87 */
+0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
 , 0x00, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x01, 0x47, 0xAE, 0x00, 0x2B, 0xB1, 0x00, 0x00, 0x9D
-, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x08, 0x00, 0x00
+, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x08, 0x00, 0x00
 , 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x40, 0x00
 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x01, 0x48
-, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03};
+, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03
+};
 /* end binary data. size = 87 bytes */
 
-
 /* begin binary data: */
-char preset_data3[] = /* 87 */
-{0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
+char preset_data1[] = {/* 87 */
+0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
 , 0x00, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x01, 0x47, 0xAE, 0x00, 0x2B, 0xB1, 0x00, 0x00, 0x9D
-, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00
+, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00
 , 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x40, 0x00
 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x01, 0x48
-, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03};
+, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03
+};
 /* end binary data. size = 87 bytes */
 
-/* begin binary data: */
-char preset_data2[] = /* 87 */
-{0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
+char preset_data2[] = {/* 87 */
+0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
 , 0x00, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x01, 0x47, 0xAE, 0x00, 0x2B, 0xB1, 0x00, 0x00, 0x9D
-, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00
+, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x08, 0x00, 0x00
 , 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x40, 0x00
 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x01, 0x48
-, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03};
+, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03
+};
 /* end binary data. size = 87 bytes */
 
 /* begin binary data: */
-char preset_data1[] = /* 87 */
-{0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
+char preset_data3[] = {/* 87 */
+0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
 , 0x00, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x01, 0x47, 0xAE, 0x00, 0x2B, 0xB1, 0x00, 0x00, 0x9D
-, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00
+, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00
 , 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x40, 0x00
 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x01, 0x48
-, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03};
+, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03
+};
 /* end binary data. size = 87 bytes */
 
 /* begin binary data: */
-
-char preset_data0[] = /* 87 */
-{0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
+char preset_data4[] = {/* 87 */
+0x00, 0x00, 0x07, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40
 , 0x00, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x01, 0x47, 0xAE, 0x00, 0x2B, 0xB1, 0x00, 0x00, 0x9D
-, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00
+, 0x00, 0x0D, 0x1B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x08, 0x00, 0x00
 , 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x40, 0x00
 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x01, 0x48
-, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03};
-/* end binary data. size = 87 bytes */
-
-/* begin binary data: */
-unsigned char config_data[] = { /* 165 */
-0x09, 0xF3, 0x33, 0x01, 0x3E, 0x66, 0x00, 0x54, 0xCD, 0x00, 0x00, 0x14, 0x00, 0x00, 0x02
-, 0x1A, 0xE6, 0x40, 0x1B, 0x40, 0xD4, 0x1C, 0x59, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
-, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4B, 0x00, 0x01, 0x4B
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01
-, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x00, 0x03, 0x47
-, 0x01, 0x47, 0xAE, 0x00, 0x19, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00
-, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0x07, 0xC2, 0x8F
-, 0x00, 0x03, 0xE8, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01
-, 0x00, 0x00, 0x01, 0x01, 0x47, 0xAE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x19, 0x99, 0x9A
-, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x30, 0x00, 0x00, 0x02, 0x00, 0x00, 0x30
-, 0xEC, 0x00, 0x00, 0x00, 0x03, 0xD7, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00
-};
-/* end binary data. size = 165 bytes */
-
-/* begin binary data: */
-
-unsigned char speaker_data[] = { /*423*/
-0x00, 0x03, 0x42, 0x00, 0x02, 0x0F, 0x00, 0x03, 0xB1, 0x00, 0x03, 0x9E, 0x00, 0x03, 0x13
-, 0x00, 0x02, 0xDE, 0x00, 0x02, 0xC8, 0x00, 0x03, 0x2B, 0x00, 0x02, 0x72, 0xFF, 0xFF, 0x98
-, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x90, 0xFF, 0xFF, 0x92, 0xFF, 0xFD, 0xDB, 0xFF, 0xFE, 0xCE
-, 0xFF, 0xFD, 0x65, 0xFF, 0xFC, 0xFB, 0xFF, 0xFD, 0x42, 0xFF, 0xFE, 0x2F, 0xFF, 0xFE, 0x35
-, 0xFF, 0xFC, 0xB7, 0xFF, 0xF9, 0xB8, 0xFF, 0xFB, 0x78, 0xFF, 0xFA, 0xC3, 0xFF, 0xFB, 0x22
-, 0xFF, 0xF8, 0x91, 0xFF, 0xFA, 0xC3, 0xFF, 0xF9, 0xF6, 0xFF, 0xF9, 0xF1, 0xFF, 0xF9, 0x5B
-, 0xFF, 0xFC, 0xA4, 0xFF, 0xFB, 0xC8, 0xFF, 0xFD, 0x26, 0xFF, 0xFB, 0xEA, 0xFF, 0xFE, 0x8A
-, 0xFF, 0xFE, 0x4C, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 0x28, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xCA
-, 0x00, 0x00, 0x51, 0x00, 0x00, 0x9D, 0x00, 0x04, 0x7D, 0x00, 0x03, 0x0D, 0x00, 0x02, 0x76
-, 0x00, 0x01, 0xAF, 0x00, 0x03, 0x51, 0x00, 0x02, 0xB2, 0x00, 0x01, 0x64, 0x00, 0x00, 0x9D
-, 0x00, 0x01, 0x8A, 0x00, 0x00, 0xB1, 0xFF, 0xFF, 0x1C, 0xFF, 0xFD, 0x65, 0xFF, 0xFE, 0x56
-, 0xFF, 0xFD, 0x62, 0xFF, 0xFA, 0x83, 0xFF, 0xF9, 0x97, 0xFF, 0xFA, 0x0B, 0xFF, 0xF8, 0x0C
-, 0xFF, 0xF7, 0xA7, 0xFF, 0xF7, 0xBE, 0xFF, 0xF7, 0x6B, 0xFF, 0xF6, 0xFC, 0xFF, 0xF6, 0x89
-, 0xFF, 0xF7, 0x08, 0xFF, 0xF8, 0x47, 0xFF, 0xF7, 0x57, 0xFF, 0xF5, 0x1F, 0xFF, 0xF5, 0xA8
-, 0xFF, 0xF7, 0x58, 0xFF, 0xF7, 0x1E, 0xFF, 0xF5, 0x16, 0xFF, 0xF8, 0x62, 0xFF, 0xF9, 0xAF
-, 0xFF, 0xFB, 0x21, 0xFF, 0xFA, 0xFC, 0xFF, 0xFF, 0xC6, 0x00, 0x01, 0xFC, 0x00, 0x04, 0x3F
-, 0x00, 0x06, 0x73, 0x00, 0x09, 0x90, 0x00, 0x0D, 0xC8, 0x00, 0x0D, 0x3D, 0x00, 0x11, 0x06
-, 0x00, 0x0D, 0xD4, 0x00, 0x11, 0xF3, 0x00, 0x0B, 0x5B, 0x00, 0x0E, 0x83, 0x00, 0x06, 0xCF
-, 0x00, 0x0D, 0x4B, 0x00, 0x01, 0x58, 0x00, 0x02, 0x01, 0xFF, 0xF7, 0xE8, 0xFF, 0xFF, 0x41
-, 0xFF, 0xF1, 0x00, 0xFF, 0xF9, 0xDD, 0xFF, 0xEE, 0xB3, 0xFF, 0xF7, 0x58, 0xFF, 0xE5, 0xCC
-, 0xFF, 0xFB, 0x88, 0xFF, 0xEC, 0xD3, 0x00, 0x0D, 0x59, 0x00, 0x00, 0x7B, 0x00, 0x2F, 0xAA
-, 0x00, 0x21, 0x53, 0x00, 0x5F, 0x23, 0x00, 0x3C, 0xC3, 0x00, 0x7B, 0xBD, 0x00, 0x32, 0xD1
-, 0x00, 0x62, 0xF7, 0xFF, 0xDA, 0x6D, 0xFF, 0xF9, 0x15, 0xFF, 0x07, 0x73, 0xFF, 0xBD, 0x20
-, 0x07, 0x73, 0xC2, 0xFF, 0xD8, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x33, 0x33
-, 0x79, 0x99, 0x9A, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0xF5, 0xC3
-, 0x00, 0x01, 0xB2, 0x00, 0x01, 0x7C, 0x04, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x1C, 0xC0, 0x00
-, 0x00, 0x6F, 0x69
-};
-
-unsigned char eq_data_hand[] = { /*180*/
-0x00, 0x00, 0x01, 0xC2, 0x59, 0x70, 0x7D, 0x9B, 0x88, 0x3E, 0xD0, 0x84, 0x82, 0x5E, 0xF0
-, 0x3E, 0xD0, 0x84, 0x00, 0x00, 0x01, 0xC2, 0x59, 0x70, 0x7D, 0x9B, 0x88, 0x3E, 0xD0, 0x84
-, 0x82, 0x5E, 0xF0, 0x3E, 0xD0, 0x84, 0x00, 0x00, 0x01, 0xCA, 0xD0, 0xCC, 0x74, 0x2E, 0x8C
-, 0x34, 0x44, 0xB4, 0x8C, 0x06, 0x64, 0x41, 0x1F, 0x70, 0x00, 0x00, 0x01, 0xC4, 0x03, 0xE4
-, 0x7B, 0xDA, 0xCC, 0x3B, 0x9E, 0xA8, 0x84, 0x2C, 0x10, 0x40, 0x64, 0x50, 0x00, 0x00, 0x01
-, 0xF0, 0x9D, 0x28, 0x27, 0xB1, 0x6C, 0x17, 0x15, 0xDC, 0xBF, 0xBE, 0xA0, 0x50, 0xDC, 0xF4
-, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00
-
-};
-
-unsigned char eq_data_desk[] = { /*180*/
-0x00, 0x00, 0x01, 0xD1, 0xD2, 0x90, 0x6A, 0x6C, 0x5C, 0x36, 0x26, 0x74, 0x93, 0xB3, 0x1C
-, 0x36, 0x26, 0x74, 0x00, 0x00, 0x01, 0xD1, 0xD2, 0x90, 0x6A, 0x6C, 0x5C, 0x36, 0x26, 0x74
-, 0x93, 0xB3, 0x1C, 0x36, 0x26, 0x74, 0x00, 0x00, 0x01, 0xCA, 0xD0, 0xCC, 0x74, 0x2E, 0x8C
-, 0x34, 0x44, 0xB4, 0x8C, 0x06, 0x64, 0x41, 0x1F, 0x70, 0x00, 0x00, 0x01, 0xC4, 0x03, 0xE4
-, 0x7B, 0xDA, 0xCC, 0x3B, 0x9E, 0xA8, 0x84, 0x2C, 0x10, 0x40, 0x64, 0x50, 0x00, 0x00, 0x01
-, 0xF0, 0x9D, 0x28, 0x27, 0xB1, 0x6C, 0x17, 0x15, 0xDC, 0xBF, 0xBE, 0xA0, 0x50, 0xDC, 0xF4
-, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01
-, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00
-
+, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0xCD, 0x00, 0x00, 0x03
 };
+/* end binary data. size = 87 bytes */
 
 void convertBytes2Data(int num_bytes, const unsigned char bytes[], int data[])
 {
@@ -386,9 +399,9 @@ int ProcessPatchFile(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_
                        error = -1;
                }
        }
-       pr_info("tfa status %u\n",status);
+       //pr_info("tfa status %u\n",status);
        error = DspReadMem(tfa9887, tfa9887_byte, 0x2210, 1, &value);
-       pr_info("tfa Version  %x\n",value);
+       //pr_info("tfa Version  %x\n",value);
        while (index < length) {
                /* extract little endian length */
                size = bytes[index] + bytes[index+1] * 256;
@@ -399,6 +412,7 @@ int ProcessPatchFile(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_
                }
                memcpy(buffer, bytes + index, size);
                error = regmap_raw_write(tfa9887_byte->regmap, buffer[0], &buffer[1] , (size -1));
+               //pr_info("%d %d\n",buffer[0],size -1);
                if (error != Tfa9887_Error_Ok) {
                        pr_info("ProcessPatchFile error\n");
                        break;
@@ -458,21 +472,43 @@ int DspSetParam(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_byte,
        unsigned int cf_ctrl = 0x0002; /* the value to be sent to the CF_CONTROLS register: cf_req=00000000, cf_int=0, cf_aif=0, cf_dmem=XMEM=01, cf_rst_dsp=0 */
        unsigned int cf_mad = 0x0001; /* memory address to be accessed (0 : Status, 1 : ID, 2 : parameters) */
        unsigned int cf_status; /* the contents of the CF_STATUS register */
-       unsigned char id[3];
        unsigned char mem[3];
+       int rpcStatus = STATUS_OK;
        int tries = 0;
+
+#if 1
+    {
+        /* minimize the number of I2C transactions by making use of the autoincrement in I2C */
+        unsigned char buffer[7];
+        /* first the data for CF_CONTROLS */
+        buffer[0] = (unsigned char)((cf_ctrl >> 8) & 0xFF);
+        buffer[1] = (unsigned char)(cf_ctrl & 0xFF);
+        /* write the contents of CF_MAD which is the subaddress following CF_CONTROLS */
+        buffer[2] = (unsigned char)((cf_mad >> 8) & 0xFF);
+        buffer[3] = (unsigned char)(cf_mad & 0xFF);
+        /* write the module and RPC id into CF_MEM, which follows CF_MAD */
+        buffer[4] = 0;
+        buffer[5] = module_id + 128;
+        buffer[6] = param_id;
+        error =
+            regmap_raw_write(tfa9887_byte->regmap, TFA9887_CF_CONTROLS,
+                             buffer, sizeof(buffer));
+    }
+#else
        error = Tfa9887_WriteRegister(tfa9887, TFA9887_CF_CONTROLS, cf_ctrl);
        if (error == Tfa9887_Error_Ok) {
                error = Tfa9887_WriteRegister(tfa9887, TFA9887_CF_MAD, cf_mad);
        }
        if (error == Tfa9887_Error_Ok) {
+               unsigned char id[3];
                id[0] = 0;
                id[1] = module_id+128;
                id[2] = param_id;
                error = regmap_raw_write(tfa9887_byte->regmap, TFA9887_CF_MEM,&id, 3);
        }
+#endif
 
-               error = regmap_raw_write(tfa9887_byte->regmap, TFA9887_CF_MEM, data, num_bytes);
+       error = regmap_raw_write(tfa9887_byte->regmap, TFA9887_CF_MEM, data, num_bytes);
 
        if (error == Tfa9887_Error_Ok) {
                cf_ctrl |= (1<<8) | (1<<4); /* set the cf_req1 and cf_int bit */
@@ -481,11 +517,12 @@ int DspSetParam(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_byte,
                do {
                        error = Tfa9887_ReadRegister(tfa9887, TFA9887_CF_STATUS, &cf_status);
                        tries++;
+                       udelay(100);
                } while ( (error==Tfa9887_Error_Ok) && ((cf_status & 0x0100) == 0) && (tries < 10) ); /* don't wait forever, DSP is pretty quick to respond (< 1ms) */
 
-               if (tries >= 10) {
+               if (tries >= 100) {
                        /* something wrong with communication with DSP */
-                       pr_info("Setparam failed\n");
+                       //pr_info("Setparam failed\n");
                        error = -1;
                }
        }
@@ -493,6 +530,70 @@ int DspSetParam(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_byte,
        cf_mad = 0x0000;
        if (error == Tfa9887_Error_Ok) {
                error = Tfa9887_WriteRegister(tfa9887, TFA9887_CF_CONTROLS,cf_ctrl);
+    }
+    if (error == Tfa9887_Error_Ok) {
+            error = Tfa9887_WriteRegister(tfa9887, TFA9887_CF_MAD, cf_mad);
+    }
+    if (error == Tfa9887_Error_Ok) {
+               error = regmap_raw_read(tfa9887_byte->regmap, TFA9887_CF_MEM,&mem,3);
+               rpcStatus = (int)((mem[0] << 16) | (mem[1] << 8) | mem[2]);
+    }
+    if (error == Tfa9887_Error_Ok) {
+               if (rpcStatus != STATUS_OK) {
+                       error = rpcStatus+100;
+                       //pr_info("RPC rpcStatus =%d\n",error);
+               }
+    }
+       return error;
+}
+
+int DspGetParam(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_byte,
+                       unsigned char module_id, unsigned char param_id, int num_bytes, unsigned char *data)
+{
+        int error;
+        unsigned int cf_ctrl = 0x0002;        /* the value to be sent to the CF_CONTROLS register: cf_req=00000000, cf_int=0, cf_aif=0, cf_dmem=XMEM=01, cf_rst_dsp=0 */
+        unsigned int cf_mad = 0x0001; /* memory address to be accessed (0 : Status, 1 : ID, 2 : parameters) */
+        unsigned int cf_status;       /* the contents of the CF_STATUS register */
+               unsigned char mem[3];
+               unsigned char id[3];
+               int tries = 0;
+        /* 1) write the id and data to the DSP XMEM */
+                error =
+                    Tfa9887_WriteRegister(tfa9887, TFA9887_CF_CONTROLS,
+                                            cf_ctrl);
+                error = Tfa9887_WriteRegister(tfa9887, TFA9887_CF_MAD, cf_mad);
+                id[0] = 0;
+                id[1] = module_id + 128;
+                id[2] = param_id;
+                /* only try MEM once, if error, need to resend mad as well */
+                error = regmap_raw_write(tfa9887_byte->regmap, TFA9887_CF_MEM, id, 3);
+        /* 2) wake up the DSP and let it process the data */
+        if (error == 0) {
+                cf_ctrl |= (1 << 8) | (1 << 4); /* set the cf_req1 and cf_int bit */
+                error =
+                    Tfa9887_WriteRegister(tfa9887, TFA9887_CF_CONTROLS,
+                                            cf_ctrl);
+        }
+        /* 3) wait for the ack */
+        if (error == Tfa9887_Error_Ok) {
+                do {
+                        error =
+                            Tfa9887_ReadRegister(tfa9887, TFA9887_CF_STATUS,
+                                                   &cf_status);
+                        tries++;
+                }
+                while ((error == 0) && ((cf_status & 0x0100) == 0) && (tries < 10));     /* don't wait forever, DSP is pretty quick to respond (< 1ms) */
+                if (tries >= 10) {
+                        /* something wrong with communication with DSP */
+                       pr_info("something wrong with communication with DSP\n");
+                        return -1;
+                }
+        }
+        /* 4) check the RPC return value */
+        cf_ctrl = 0x0002;
+        cf_mad = 0x0000;
+        if (error == Tfa9887_Error_Ok) {
+                error = Tfa9887_WriteRegister(tfa9887, TFA9887_CF_CONTROLS,cf_ctrl);
         }
         if (error == Tfa9887_Error_Ok) {
                 error = Tfa9887_WriteRegister(tfa9887, TFA9887_CF_MAD, cf_mad);
@@ -503,14 +604,22 @@ int DspSetParam(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_byte,
 
         }
         if (error != Tfa9887_Error_Ok) {
-                //pr_info("RPC error\n");
+                pr_info("RPC error\n");
 
         }
 
-       return error;
+        /* 5) read the resulting data */
+        if (error == 0) {
+                cf_mad = 0x0002;        /* memory address to be accessed (0 : Status, 1 : ID, 2 : parameters) */
+                error = Tfa9887_WriteRegister(tfa9887, TFA9887_CF_MAD, cf_mad);
+        }
+        if (error == 0) {
+                        error =
+                            regmap_raw_read(tfa9887_byte->regmap, TFA9887_CF_MEM, data, num_bytes);
+                }
+        return error;
 }
 
-
 int Tfa9887_WriteRegister(struct tfa9887_priv *tfa9887, unsigned int subaddress, unsigned int value)
 {
         int error = regmap_write(tfa9887->regmap,subaddress,value);
@@ -523,13 +632,127 @@ int Tfa9887_ReadRegister(struct tfa9887_priv *tfa9887, unsigned int subaddress,
         return error;
 }
 
+void calibrate (struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_byte, char *calibdata)
+{
+
+       int error;
+       int calibrateDone;
+       unsigned int status, value;
+       unsigned char bytes[3];
+       int data[2];
+       int tries = 0;
+
+       if(calibration_need) {
+               SetMute(tfa9887, Tfa9887_Mute_Digital);
+               pr_info("Inside calib\n");
+               error = DspReadMem(tfa9887, tfa9887_byte, 231, 1, &calibrateDone);
+               if (calibrateDone)
+               {
+                       DspGetParam(tfa9887, tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_GET_RE0, 3, bytes);
+                       convertBytes2Data(3, bytes, &data[0]);
+               }
+               speaker_data[420] = 0;
+               speaker_data[421] = 0;
+               speaker_data[422] = 0;
+               error = loadSettings(tfa9887, tfa9887_byte);
+       }
+
+         //SetConfigured
+        error = Tfa9887_ReadRegister(tfa9887, TFA9887_SYSTEM_CONTROL, &value);
+
+        if(error == Tfa9887_Error_Ok)
+        {
+                value |= TFA9887_SYSCTRL_CONFIGURED;
+                error = Tfa9887_WriteRegister(tfa9887, TFA9887_SYSTEM_CONTROL, value);
+        }
+
+       error = DspReadMem(tfa9887, tfa9887_byte, 231, 1, &calibrateDone);
+       while ((calibrateDone == 0) && (tries < 1000)) {
+               error = DspReadMem(tfa9887, tfa9887_byte, 231, 1, &calibrateDone);
+               tries++;
+       }
+        if(tries >= 1000)
+                pr_info("Calibrate failed1\n");
+
+       tries = 0;
+       do {
+               error = Tfa9887_ReadRegister(tfa9887, TFA9887_STATUS, &status);
+               tries++;
+       } while ( ((status & TFA9887_STATUS_MTPB) == TFA9887_STATUS_MTPB) && (tries < 100));
+       if(tries >= 100)
+               pr_info("Calibrate failed\n");
+        DspGetParam(tfa9887, tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_GET_RE0, 3, bytes);
+        convertBytes2Data(3, bytes, &data[0]);
+       DspReadMem(tfa9887, tfa9887_byte, 232, 1, &data[1]);
+       pr_info("%d %d\n",data[0], data[1]);
+       memcpy(calibdata, (char *)data, 8);
+}
+
+void resetMtpEx(struct tfa9887_priv *tfa9887)
+{
+       int err;
+       unsigned int mtp, status;
+       int tries = 0;
+       err = Tfa9887_ReadRegister(tfa9887, TFA9887_MTP, &mtp);
+
+       pr_info("%d****************1",mtp);
+       /* all settings loaded, signal the DSP to start calibration, only needed once after cold boot */
+       /* reset MTPEX bit if needed */
+       err = Tfa9887_WriteRegister(tfa9887, 0x0B, 0x5A); /* unlock key2 */
+       err = Tfa9887_WriteRegister(tfa9887, TFA9887_MTP, 1); /* MTPOTC=1, MTPEX=0 */
+
+       err = Tfa9887_WriteRegister(tfa9887, 0x62, 1<<11); /* CIMTP=1 */
+
+        do {
+                err = Tfa9887_ReadRegister(tfa9887, TFA9887_STATUS, &status);
+               tries++;
+        } while ( ((status & TFA9887_STATUS_MTPB) == TFA9887_STATUS_MTPB) && (tries < 100));
+
+}
+
+int checkMTPEX(struct tfa9887_priv *tfa9887)
+{
+       unsigned int mtp;
+       int err;
+
+       err = Tfa9887_ReadRegister(tfa9887, TFA9887_MTP, &mtp);
+       if ( mtp & (1<<1))      /* check MTP bit1 (MTPEX) */
+               return 1;                                       /* MTPEX is 1, calibration is done */
+       else
+               return 0;                                       /* MTPEX is 0, calibration is not done yet */
+}
+
 int Tfa9887_Init(int sRate)
 {
        int error = 0;
-       if((tfa9887R) && (tfa9887R->deviceInit))
-               error = Init(tfa9887R,tfa9887R_byte, sRate);
-       if((tfa9887L) && (tfa9887L->deviceInit))
-               error = Init(tfa9887L,tfa9887L_byte, sRate);
+       srate = sRate;
+       if((tfa9887R) && (tfa9887R->deviceInit)) {
+               coldStartup(tfa9887R, tfa9887R_byte, srate);
+                        //Tfa9887_WriteRegister(tfa9887R, 0x0B, 0x5A); /* unlock key2 */
+                        //Tfa9887_WriteRegister(tfa9887R, TFA9887_MTP, 0); /* MTPOTC=1, MTPEX=0 */
+
+               if((checkMTPEX(tfa9887R) == 0)) {
+                       calibration_need = 1;
+                        calibrate(tfa9887R, tfa9887R_byte, &calibdata[0]);
+               }
+               else {
+                       error = Init(tfa9887R,tfa9887R_byte, sRate);
+
+               }
+       }
+       if((tfa9887L) && (tfa9887L->deviceInit)) {
+               coldStartup(tfa9887L, tfa9887L_byte, srate);
+                        //Tfa9887_WriteRegister(tfa9887L, 0x0B, 0x5A); /* unlock key2 */
+                        //Tfa9887_WriteRegister(tfa9887L, TFA9887_MTP, 0); /* MTPOTC=1, MTPEX=0 */
+               if((checkMTPEX(tfa9887L) == 0)) {
+                       calibration_need = 1;
+                       calibrate(tfa9887L, tfa9887L_byte, &calibdata[8]);
+               }
+               else {
+                       error = Init(tfa9887L,tfa9887L_byte, sRate);
+
+               }
+       }
         if (error != 0)
                pr_info("Failed to Init tfa\n");
        return error;
@@ -538,16 +761,18 @@ int Tfa9887_Init(int sRate)
 int Tfa9887_SetEq(void)
 {
         int error = 0;
-               if((tfa9887R) && (tfa9887R->deviceInit))
-                       error = SetEq(tfa9887R,tfa9887R_byte);
-       if((tfa9887L) && (tfa9887L->deviceInit))
-                       error = SetEq(tfa9887L,tfa9887L_byte);
+       if((tfa9887R) && (tfa9887R->deviceInit))
+               error = SetEq(tfa9887R,tfa9887R_byte);
+       if((tfa9887L) && (tfa9887L->deviceInit))
+               error = SetEq(tfa9887L,tfa9887L_byte);
         return error;
 }
 
 int Tfa9887_SetPreset(void)
 {
         int error = 0;
+        unsigned short status;
+
         if((tfa9887R) && (tfa9887R->deviceInit))
                 error = SetPreset(tfa9887R,tfa9887R_byte);
         if((tfa9887L) && (tfa9887L->deviceInit))
@@ -663,14 +888,14 @@ int coldStartup(struct tfa9887_priv *tfa9887, struct tfa9887_priv *tfa9887_byte,
                do {
                        error = Tfa9887_ReadRegister(tfa9887, TFA9887_STATUS, &value);
                        tries++;
-               } while ((error == Tfa9887_Error_Ok) && ((value & TFA9887_STATUS_PLLS) == 0) && (tries < 10));
+               } while ((error == Tfa9887_Error_Ok) && ((value & TFA9887_STATUS_PLLS) == 0) && (tries < 100));
 
         //Firmware
         error = ProcessPatchFile(tfa9887, tfa9887_byte, 10, coldpatch_data);
                error = Tfa9887_ReadRegister(tfa9887, TFA9887_STATUS, &value);
                if(value & TFA9887_STATUS_ACS)
-                       pr_info("TFA COLD BOOTED\n");
-        error = ProcessPatchFile(tfa9887, tfa9887_byte, 2200, n1d2_data);
+                       //pr_info("TFA COLD BOOTED\n");
+        error = ProcessPatchFile(tfa9887, tfa9887_byte, sizeof(n1d2_data), n1d2_data);
 
        return error;
 }
@@ -680,11 +905,6 @@ int Init(struct tfa9887_priv *tfa9887,struct tfa9887_priv *tfa9887_byte, int sRa
        int error;
        unsigned int value;
 
-       error = coldStartup(tfa9887,tfa9887_byte, sRate);
-        if(error != Tfa9887_Error_Ok) {
-               pr_info("ColdStartup Failed\n");
-       }
-
         error = loadSettings(tfa9887, tfa9887_byte);
         if(error != Tfa9887_Error_Ok) {
                 pr_info("Loading Settings Failed\n");
@@ -703,15 +923,17 @@ int Init(struct tfa9887_priv *tfa9887,struct tfa9887_priv *tfa9887_byte, int sRa
                 value |= TFA9887_SYSCTRL_CONFIGURED;
                 error = Tfa9887_WriteRegister(tfa9887, TFA9887_SYSTEM_CONTROL, value);
         }
+       if (!calibration_need) {
+               SetMute(tfa9887, Tfa9887_Mute_Amplifier);
+               //PowerDown
+               if(error == Tfa9887_Error_Ok)
+               {
+                       error = Tfa9887_ReadRegister(tfa9887, TFA9887_SYSTEM_CONTROL, &value);
+                       value |= TFA9887_SYSCTRL_POWERDOWN;
+                       error = Tfa9887_WriteRegister(tfa9887, TFA9887_SYSTEM_CONTROL, value);
+               }
+       }
 
-       SetMute(tfa9887, Tfa9887_Mute_Amplifier);
-       //PowerDown
-        if(error == Tfa9887_Error_Ok)
-        {
-                error = Tfa9887_ReadRegister(tfa9887, TFA9887_SYSTEM_CONTROL, &value);
-                value |= TFA9887_SYSCTRL_POWERDOWN;
-                error = Tfa9887_WriteRegister(tfa9887, TFA9887_SYSTEM_CONTROL, value);
-        }
         return error;
 }
 
@@ -719,47 +941,48 @@ int SetEq(struct tfa9887_priv *tfa9887,struct tfa9887_priv *tfa9887_byte)
 {
        int error = 0;
        if (eq_mode == IN_HAND_MODE) {
-               pr_info("Setting hand mode\n");
+               //pr_info("Setting hand mode\n");
                error = DspSetParam(tfa9887,tfa9887_byte, MODULE_BIQUADFILTERBANK,0, 180, eq_data_hand);
        } else if (eq_mode == ON_DESK_MODE) {
-               pr_info("setting deskmode\n");
-               error = DspSetParam(tfa9887,tfa9887_byte, MODULE_BIQUADFILTERBANK,0, 180, eq_data_desk);
+               //pr_info("setting deskmode\n");
+               error = DspSetParam(tfa9887,tfa9887_byte, MODULE_BIQUADFILTERBANK,0, 180, eq_data_table);
        }
        return error;
 }
 
 int SetPreset(struct tfa9887_priv *tfa9887,struct tfa9887_priv *tfa9887_byte)
 {
-        int error = 0;
+       int error = 0;
        unsigned int value = 0;
        unsigned int volume_value = 0;
-        switch(preset_mode) {
-                case 0:
-                       error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data0);
-                        break;
-                case 1:
-                       error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data1);
-                        break;
-                case 2:
-                        error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data2);
-                        break;
-                case 3:
-                        error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data3);
-                        break;
-                case 4:
-                        error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data4);
-                        break;
-                default:
-                return -1;
-        }
-       //volume_value = volume_step[preset_mode];
-       volume_value = volume_step[PRESET_DEFAULT];
-       pr_info("%u %u\n",preset_mode,volume_value);
+
+    switch(preset_mode) {
+            case 0:
+                                       error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data0);
+                    break;
+            case 1:
+                                       error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data1);
+                    break;
+            case 2:
+                                       error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data2);
+                    break;
+            case 3:
+                                       error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data3);
+                    break;
+            case 4:
+                                       error = DspSetParam(tfa9887,tfa9887_byte, MODULE_SPEAKERBOOST, PARAM_SET_PRESET, 87, preset_data4);
+                    break;
+            default:
+            return -1;
+    }
+       volume_value = volume_step[preset_mode];
+       //volume_value = volume_step[PRESET_DEFAULT];
+       //pr_info("%u %u\n",preset_mode,volume_value);
        error = Tfa9887_ReadRegister(tfa9887, TFA9887_AUDIO_CONTROL, &value);
-        if(error == Tfa9887_Error_Ok) {
-                value = (value&0x00FF) | (unsigned int)(volume_value<<8);
-                error = Tfa9887_WriteRegister(tfa9887, TFA9887_AUDIO_CONTROL, value);
-        }
+    if(error == Tfa9887_Error_Ok) {
+            value = (value&0x00FF) | (unsigned int)(volume_value<<8);
+            error = Tfa9887_WriteRegister(tfa9887, TFA9887_AUDIO_CONTROL, value);
+    }
        return error;
 }
 
@@ -804,7 +1027,7 @@ int stereoRouting(struct tfa9887_priv *tfa9887)
                 value |=(0<<TFA9887_I2SSEL_I2SOUT_RIGHT_SHIFT);
                 error = Tfa9887_WriteRegister(tfa9887, TFA9887_I2S_SEL, value);
                 error = Tfa9887_WriteRegister(tfa9887, TFA9887_I2S_SEL, value);
-                pr_info("Tfa inside left\n");
+                //pr_info("Tfa inside left\n");
 
          }
          else if (tfa9887 == tfa9887R) {
@@ -829,7 +1052,7 @@ int stereoRouting(struct tfa9887_priv *tfa9887)
                 value &= ~(0x7<<TFA9887_I2SSEL_I2SOUT_LEFT_SHIFT);
                 value |=(0<<TFA9887_I2SSEL_I2SOUT_LEFT_SHIFT);
                 error = Tfa9887_WriteRegister(tfa9887, TFA9887_I2S_SEL, value);
-                pr_info("tfa inside right\n");
+                //pr_info("tfa inside right\n");
 
         }
         else
@@ -950,7 +1173,7 @@ static const struct regmap_config tfa9887_regmap = {
        .val_bits = 16,
        .volatile_reg = tfa9887_volatile_register,
        .readable_reg = tfa9887_readable_register,
-       .cache_type = REGCACHE_RBTREE,
+       .cache_type = REGCACHE_NONE,
 };
 
 static const struct regmap_config tfa9887_regmap_byte = {
@@ -958,26 +1181,55 @@ static const struct regmap_config tfa9887_regmap_byte = {
         .val_bits = 8,
         .volatile_reg = tfa9887_volatile_register,
         .readable_reg = tfa9887_readable_register,
-        .cache_type = REGCACHE_RBTREE,
+        .cache_type = REGCACHE_NONE,
 };
 static ssize_t tfa9887_cal_show(struct kobject *kobj,
                struct kobj_attribute *attr, char *buf)
 {
-       printk("!tfa9887_cal_show\n");
-       return 0;
+       //printk("!tfa9887_cal_show\n");
+       if(calibration_need) {
+               memcpy(buf, calibdata, 16);
+               //pr_info("copying data\n");
+       }
+       return 16;
 }
 
 static ssize_t tfa9887_cal_store(struct kobject *kobj,
        struct kobj_attribute *attr, const char *buf, size_t count)
 {
        ssize_t ret = count;
-
-       printk("+tfa9887_cal_store: %p, %d\n", buf, count);
+       unsigned int value;
+       //printk("+tfa9887_cal_store: %p, %d\n", buf, count);
 
        if (!buf || !count) {
                ret = -EINVAL;
                goto fail;
        }
+       if (count == 6) {
+               if(calibration_need) {
+                       memcpy(&speaker_data[420],buf,3);
+                       memcpy(&speaker_data[420],buf+3,3);
+                       tegra_asoc_enable_clocks();
+                       resetMtpEx(tfa9887R);
+                       resetMtpEx(tfa9887L);
+                       SetMute(tfa9887R, Tfa9887_Mute_Amplifier);
+                       SetMute(tfa9887L, Tfa9887_Mute_Amplifier);
+                       coldStartup(tfa9887R, tfa9887R_byte, srate);
+                       Init(tfa9887R,tfa9887R_byte, srate);
+                       coldStartup(tfa9887L, tfa9887L_byte, srate);
+                       Init(tfa9887L,tfa9887L_byte, srate);
+                       calibration_need = 0;
+                       calibrate(tfa9887R, tfa9887R_byte, &calibdata[0]);
+                       calibrate(tfa9887L, tfa9887L_byte, &calibdata[0]);
+                        Tfa9887_ReadRegister(tfa9887R, TFA9887_SYSTEM_CONTROL, &value);
+                        value |= TFA9887_SYSCTRL_POWERDOWN;
+                        Tfa9887_WriteRegister(tfa9887R, TFA9887_SYSTEM_CONTROL, value);
+                        Tfa9887_ReadRegister(tfa9887L, TFA9887_SYSTEM_CONTROL, &value);
+                        value |= TFA9887_SYSCTRL_POWERDOWN;
+                        Tfa9887_WriteRegister(tfa9887L, TFA9887_SYSTEM_CONTROL, value);
+                       tegra_asoc_disable_clocks();
+               }
+       }
 
 fail:
        //printk("-tfa9887_cal_store: %d\n", count);
@@ -989,7 +1241,16 @@ static ssize_t tfa9887_config_show(struct kobject *kobj,
                struct kobj_attribute *attr, char *buf)
 {
        printk("!tfa9887_config_show\n");
-       return 0;
+
+       if (buf) {
+               if (eq_mode == 1)
+                       memcpy(buf, '1', 1);
+               else if (eq_mode == 2)
+                       memcpy(buf, '2', 1);
+               else
+                       return -EINVAL;
+       }
+       return 1;
 }
 
 static ssize_t tfa9887_config_store(struct kobject *kobj,
@@ -997,7 +1258,7 @@ static ssize_t tfa9887_config_store(struct kobject *kobj,
 {
        ssize_t ret = count;
 
-       printk("+tfa9887_config_store: %p, %d\n", buf, count);
+       //printk("+tfa9887_config_store: %p, %d\n", buf, count);
 
        if (!buf || !count) {
                ret = -EINVAL;
@@ -1029,7 +1290,13 @@ static ssize_t tfa9887_vol_store(struct kobject *kobj,
 {
        ssize_t ret = count;
 
-       printk("+tfa9887_vol_store: %d, %d\n", *buf, count);
+       //printk("+tfa9887_vol_store: %d, %d\n", *buf, count);
+       if (!tfa9887R || !tfa9887L ||
+               !tfa9887R->deviceInit || !tfa9887L->deviceInit) {
+               ret = -EINVAL;
+               goto fail;
+       }
+
        if (!buf || !count) {
                ret = -EINVAL;
                goto fail;