diff --git a/arch/arm/mach-msm/board-8930-pmic.c b/arch/arm/mach-msm/board-8930-pmic.c index e3479eb092d..cadd6764ccb 100644 --- a/arch/arm/mach-msm/board-8930-pmic.c +++ b/arch/arm/mach-msm/board-8930-pmic.c @@ -336,8 +336,22 @@ static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = { .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 712a772da95..9815f6e8a00 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 @@ static const struct resource resources_spk[] __devinitconst = { [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 2de70f44c8f..a88c06c9286 100644 --- a/drivers/mfd/pm8xxx-spk.c +++ b/drivers/mfd/pm8xxx-spk.c @@ -22,8 +22,11 @@ #include #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 @@ static int __devinit pm8xxx_spk_probe(struct platform_device *pdev) { 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 @@ static int __devinit pm8xxx_spk_probe(struct platform_device *pdev) 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 1155d2f3cf2..2905a1d04da 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; }; /*