diff --git a/firmware/drivers/tuner/rda5802.c b/firmware/drivers/tuner/rda5802.c
index 27166c5..fa66fe1 100644
--- a/firmware/drivers/tuner/rda5802.c
+++ b/firmware/drivers/tuner/rda5802.c
@@ -44,7 +44,9 @@
 #define SYSCONFIG1  0x4
 #define SYSCONFIG2  0x5
 #define SYSCONFIG3  0x6
-
+#define SYSCONFIG4  0x7 /* undocumented */
+#define SYSCONFIG5  0x8 /* undocumented */
+#define SYSCONFIG6  0x9 /* undocumented */
 #define READCHAN    0xA
 #define STATUSRSSI  0xB
 #define IDENT       0xC
@@ -92,21 +94,24 @@
     #define STATUSRSSI_RSSIr(x) (((x) & STATUSRSSI_RSSI) >> 9)
 #define STATUSRSSI_FM_TRUE  (0x1 << 8)
 
-static const uint16_t initvals[16] = {
-    0x0000, 0x0000, 0xC401, 0x1B80, 
-    0x0400, 0x866F, 0x8000, 0x4712, 
-    0x5EC6, 0x0000, 0x406E, 0x2D80, 
-    0x5803, 0x5804, 0x5804, 0x5804
-};
-
 static bool tuner_present = false;
-static uint16_t cache[16];
+
+static uint16_t cache[16] = {
+    [POWERCFG] =    0xC401, /* DHIZ, DMUTE, CLK_DIRECT_MODE, ENABLE */
+    [CHANNEL] =     0x0000, /* - */
+    [SYSCONFIG1] =  0x0200, /* SYSCONFIG1_SMUTE */
+    [SYSCONFIG2] =  0x867F, /* INT_MODE (def), SEEKTH=1100b, LNA_PORT_SEL=LNAN, LNA_ICSEL=3.0mA, VOLUME=max */
+    [SYSCONFIG3] =  0x8000, /* I2S slave mode */
+    [SYSCONFIG4] =  0x4712, /* undocumented, affects stereo blend */
+    [SYSCONFIG5] =  0x5EC6, /* undocumented */
+    [SYSCONFIG6] =  0x0000  /* undocumented */
+};
 
 /* reads <len> registers from radio at offset 0x0A into cache */
 static void rda5802_read(int len)
 {
     int i;
-    unsigned char buf[128];
+    unsigned char buf[sizeof(cache)];
     unsigned char *ptr = buf;
     uint16_t data;
     
@@ -122,7 +127,7 @@ static void rda5802_read(int len)
 static void rda5802_write(int len)
 {
     int i;
-    unsigned char buf[64];
+    unsigned char buf[sizeof(cache)];
     unsigned char *ptr = buf;
     uint16_t data;
 
@@ -186,14 +191,14 @@ void rda5802_init(void)
     if (rda5802_detect()) {
         tuner_present = true;
 
-        // soft-reset
-        rda5802_write_reg(POWERCFG, POWERCFG_SOFT_RESET);
+        /* soft-reset */
+        rda5802_write_set(POWERCFG, POWERCFG_SOFT_RESET);
         rda5802_write(1);
+        rda5802_write_clear(POWERCFG, POWERCFG_SOFT_RESET);
         sleep(HZ * 10 / 1000);
 
-        // write initialisation values
-        memcpy(cache, initvals, sizeof(cache));
-        rda5802_write(14);
+        /* write initialisation values */
+        rda5802_write(8);
         sleep(HZ * 70 / 1000);
     }
 }
@@ -284,8 +289,6 @@ int rda5802_set(int setting, int value)
     case RADIO_MUTE:
         rda5802_write_masked(POWERCFG, value ? 0 : POWERCFG_DMUTE,
                                 POWERCFG_DMUTE);
-        rda5802_write_masked(SYSCONFIG1, (3 << 9), (3 << 9));
-        rda5802_write_set(SYSCONFIG2, SYSCONFIG2_VOLUME);
         rda5802_write_cache();
         break;
 
