mfd: pm8xxx-spk: Fix settings for the class D audio amplifier
Test results based on noise gate recommended the following settings
0x254=0xC8 (Threshold=110, preamp bias=01)
0x255=0xC1 (Hold=110, max attn=0000, mute=1)
0x256=0xB0 (decay=101, attack=10, delay=0)
CRs-Fixed: 385187
Change-Id: I7276a6d0689ffb475aa8c58214fd2b00fe62f81c
Signed-off-by: Asish Bhattacharya <asishb@codeaurora.org>
(cherry picked from commit 59442e223dcd616d7a244c85d8e0acccf4df9651)
diff --git a/arch/arm/mach-msm/board-8930-pmic.c b/arch/arm/mach-msm/board-8930-pmic.c
index e3479eb..cadd676 100644
--- a/arch/arm/mach-msm/board-8930-pmic.c
+++ b/arch/arm/mach-msm/board-8930-pmic.c
@@ -336,8 +336,22 @@
.priority = 0,
};
+/*
+ * 0x254=0xC8 (Threshold=110, preamp bias=01)
+ * 0x255=0xC1 (Hold=110, max attn=0000, mute=1)
+ * 0x256=0xB0 (decay=101, attack=10, delay=0)
+ */
+
static struct pm8xxx_spk_platform_data pm8xxx_spk_pdata = {
.spk_add_enable = false,
+ .cd_ng_threshold = 0x6,
+ .cd_nf_preamp_bias = 0x1,
+ .cd_ng_hold = 0x6,
+ .cd_ng_max_atten = 0x0,
+ .noise_mute = 1,
+ .cd_ng_decay_rate = 0x5,
+ .cd_ng_attack_rate = 0x2,
+ .cd_delay = 0x0,
};
static struct pm8921_bms_platform_data pm8921_bms_pdata __devinitdata = {
diff --git a/drivers/mfd/pm8038-core.c b/drivers/mfd/pm8038-core.c
index 712a772..9815f6e 100644
--- a/drivers/mfd/pm8038-core.c
+++ b/drivers/mfd/pm8038-core.c
@@ -34,7 +34,7 @@
#define REG_IRQ_BASE 0x1BB
#define REG_SPK_BASE 0x253
-#define REG_SPK_REGISTERS 3
+#define REG_SPK_REGISTERS 6
#define REG_TEMP_ALARM_CTRL 0x01B
#define REG_TEMP_ALARM_PWM 0x09B
@@ -293,7 +293,7 @@
[0] = {
.name = PM8XXX_SPK_DEV_NAME,
.start = REG_SPK_BASE,
- .end = REG_SPK_BASE + REG_SPK_REGISTERS,
+ .end = REG_SPK_BASE + REG_SPK_REGISTERS - 1,
.flags = IORESOURCE_IO,
},
};
diff --git a/drivers/mfd/pm8xxx-spk.c b/drivers/mfd/pm8xxx-spk.c
index 2de70f4..a88c06c 100644
--- a/drivers/mfd/pm8xxx-spk.c
+++ b/drivers/mfd/pm8xxx-spk.c
@@ -22,8 +22,11 @@
#include <linux/mfd/pm8xxx/spk.h>
#define PM8XXX_SPK_CTL1_REG_OFF 0
-#define PM8XXX_SPK_TEST_REG_1_OFF 1
-#define PM8XXX_SPK_TEST_REG_2_OFF 2
+#define PM8XXX_SPK_CTL2_REG_OFF 1
+#define PM8XXX_SPK_CTL3_REG_OFF 2
+#define PM8XXX_SPK_CTL4_REG_OFF 3
+#define PM8XXX_SPK_TEST_REG_1_OFF 4
+#define PM8XXX_SPK_TEST_REG_2_OFF 5
#define PM8XXX_SPK_BANK_SEL 4
#define PM8XXX_SPK_BANK_WRITE 0x80
@@ -194,6 +197,7 @@
{
const struct pm8xxx_spk_platform_data *pdata = pdev->dev.platform_data;
int ret = 0;
+ u8 value = 0;
if (!pdata) {
pr_err("missing platform data\n");
@@ -236,6 +240,23 @@
if (ret < 0)
goto err_handle;
}
+ value = ((the_spk_chip->pdata.cd_ng_threshold << 5) |
+ the_spk_chip->pdata.cd_nf_preamp_bias << 3);
+ pr_debug("Setting SPK_CTL2_REG = %02x\n", value);
+ pm8xxx_spk_write(PM8XXX_SPK_CTL2_REG_OFF, value);
+
+ value = ((the_spk_chip->pdata.cd_ng_hold << 5) |
+ (the_spk_chip->pdata.cd_ng_max_atten << 1) |
+ the_spk_chip->pdata.noise_mute);
+ pr_debug("Setting SPK_CTL3_REG = %02x\n", value);
+ pm8xxx_spk_write(PM8XXX_SPK_CTL3_REG_OFF, value);
+
+ value = ((the_spk_chip->pdata.cd_ng_decay_rate << 5) |
+ (the_spk_chip->pdata.cd_ng_attack_rate << 3) |
+ the_spk_chip->pdata.cd_delay << 2);
+ pr_debug("Setting SPK_CTL4_REG = %02x\n", value);
+ pm8xxx_spk_write(PM8XXX_SPK_CTL4_REG_OFF, value);
+
return pm8xxx_spk_config();
err_handle:
pr_err("pm8xxx_spk_probe failed."
diff --git a/include/linux/mfd/pm8xxx/spk.h b/include/linux/mfd/pm8xxx/spk.h
index 1155d2f..2905a1d 100644
--- a/include/linux/mfd/pm8xxx/spk.h
+++ b/include/linux/mfd/pm8xxx/spk.h
@@ -21,6 +21,14 @@
*/
struct pm8xxx_spk_platform_data {
bool spk_add_enable;
+ int cd_ng_threshold;
+ int cd_nf_preamp_bias;
+ int cd_ng_hold;
+ int cd_ng_max_atten;
+ int noise_mute;
+ int cd_ng_decay_rate;
+ int cd_ng_attack_rate;
+ int cd_delay;
};
/*