summaryrefslogtreecommitdiffstats
path: root/firmware/drivers/audio/wm8978.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2008-05-03 16:10:46 +0000
committerMichael Sevakis <jethead71@rockbox.org>2008-05-03 16:10:46 +0000
commit8f0a1b3e6cd466b8016e79ee49fc342986a787ad (patch)
tree8b99f65380c447c93407ada021041ba8799c6ab5 /firmware/drivers/audio/wm8978.c
parent28df6bf869353d9a288f7a11cb7341177cc6b386 (diff)
downloadrockbox-8f0a1b3e6cd466b8016e79ee49fc342986a787ad.tar.gz
rockbox-8f0a1b3e6cd466b8016e79ee49fc342986a787ad.zip
It's better not to use fixed constants since the lower volume limit may not be constant.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17329 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers/audio/wm8978.c')
-rw-r--r--firmware/drivers/audio/wm8978.c42
1 files changed, 24 insertions, 18 deletions
diff --git a/firmware/drivers/audio/wm8978.c b/firmware/drivers/audio/wm8978.c
index f94f1db87f..9ebfeca820 100644
--- a/firmware/drivers/audio/wm8978.c
+++ b/firmware/drivers/audio/wm8978.c
@@ -26,9 +26,15 @@
//#define LOGF_ENABLE
#include "logf.h"
-#define HW_VOL_MIN 0
-#define HW_VOL_MUTE 0
-#define HW_VOL_MAX 96
+/* #define to help adjust lower volume limit */
+#define HW_VOL_MIN 0
+#define HW_VOL_MUTE 0
+#define HW_VOL_MAX 96
+#define HW_VOL_ANA_MIN 0
+#define HW_VOL_ANA_MAX 63
+#define HW_VOL_DIG_MAX 255
+#define HW_VOL_DIG_THRESHOLD (HW_VOL_MAX - HW_VOL_ANA_MAX)
+#define HW_VOL_DIG_MIN (HW_VOL_DIG_MAX - 2*HW_VOL_DIG_THRESHOLD)
/* TODO: Define/refine an API for special hardware steps outside the
* main codec driver such as special GPIO handling. */
@@ -119,7 +125,7 @@ struct
bool ahw_mute;
} wmc_vol =
{
- 0, 0, false
+ HW_VOL_MUTE, HW_VOL_MUTE, false
};
static void wmc_write(unsigned int reg, unsigned int val)
@@ -222,10 +228,10 @@ void audiohw_postinit(void)
wmc_write(WMC_ADDITIONAL_CTRL, WMC_SR_48KHZ); /* 44.1 */
/* Initialize to minimum volume */
- wmc_write_masked(WMC_LEFT_DAC_DIGITAL_VOL, 189, WMC_DVOL);
- wmc_write_masked(WMC_LOUT1_HP_VOLUME_CTRL, 0, WMC_AVOL);
- wmc_write_masked(WMC_RIGHT_DAC_DIGITAL_VOL, 189, WMC_DVOL);
- wmc_write_masked(WMC_ROUT1_HP_VOLUME_CTRL, 0, WMC_AVOL);
+ wmc_write_masked(WMC_LEFT_DAC_DIGITAL_VOL, HW_VOL_DIG_MIN, WMC_DVOL);
+ wmc_write_masked(WMC_LOUT1_HP_VOLUME_CTRL, HW_VOL_ANA_MIN, WMC_AVOL);
+ wmc_write_masked(WMC_RIGHT_DAC_DIGITAL_VOL, HW_VOL_DIG_MIN, WMC_DVOL);
+ wmc_write_masked(WMC_ROUT1_HP_VOLUME_CTRL, HW_VOL_ANA_MIN, WMC_AVOL);
/* ADC silenced */
wmc_write_masked(WMC_LEFT_ADC_DIGITAL_VOL, 0x00, WMC_DVOL);
@@ -245,38 +251,38 @@ void audiohw_set_headphone_vol(int vol_l, int vol_r)
/* When analogue volume falls below -57dB (0x00) start attenuating the
* DAC volume */
- if (vol_l >= 33)
+ if (vol_l >= HW_VOL_DIG_THRESHOLD)
{
if (vol_l > HW_VOL_MAX)
vol_l = HW_VOL_MAX;
- dac_l = 255;
- vol_l -= 33;
+ dac_l = HW_VOL_DIG_MAX;
+ vol_l -= HW_VOL_DIG_THRESHOLD;
}
else
{
if (vol_l < HW_VOL_MIN)
vol_l = HW_VOL_MIN;
- dac_l = 2*vol_l + 189;
- vol_l = 0;
+ dac_l = 2*vol_l + HW_VOL_DIG_MIN;
+ vol_l = HW_VOL_ANA_MIN;
}
- if (vol_r >= 33)
+ if (vol_r >= HW_VOL_DIG_THRESHOLD)
{
if (vol_r > HW_VOL_MAX)
vol_r = HW_VOL_MAX;
- dac_r = 255;
- vol_r -= 33;
+ dac_r = HW_VOL_DIG_MAX;
+ vol_r -= HW_VOL_DIG_THRESHOLD;
}
else
{
if (vol_r < HW_VOL_MIN)
vol_r = HW_VOL_MIN;
- dac_r = 2*vol_r + 189;
- vol_r = 0;
+ dac_r = 2*vol_r + HW_VOL_DIG_MIN;
+ vol_r = HW_VOL_ANA_MIN;
}
/* Have to write both channels always to have the latching work */