|
@@ -199,6 +199,47 @@ static void wm_hubs_dcs_cache_set(struct snd_soc_codec *codec, u16 dcs_cfg)
|
|
|
list_add_tail(&cache->list, &hubs->dcs_cache);
|
|
|
}
|
|
|
|
|
|
+static void wm_hubs_read_dc_servo(struct snd_soc_codec *codec,
|
|
|
+ u16 *reg_l, u16 *reg_r)
|
|
|
+{
|
|
|
+ struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);
|
|
|
+ u16 dcs_reg, reg;
|
|
|
+
|
|
|
+ switch (hubs->dcs_readback_mode) {
|
|
|
+ case 2:
|
|
|
+ dcs_reg = WM8994_DC_SERVO_4E;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ dcs_reg = WM8994_DC_SERVO_READBACK;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ dcs_reg = WM8993_DC_SERVO_3;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Different chips in the family support different readback
|
|
|
+ * methods.
|
|
|
+ */
|
|
|
+ switch (hubs->dcs_readback_mode) {
|
|
|
+ case 0:
|
|
|
+ *reg_l = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_1)
|
|
|
+ & WM8993_DCS_INTEG_CHAN_0_MASK;
|
|
|
+ *reg_r = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2)
|
|
|
+ & WM8993_DCS_INTEG_CHAN_1_MASK;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ case 1:
|
|
|
+ reg = snd_soc_read(codec, dcs_reg);
|
|
|
+ *reg_r = (reg & WM8993_DCS_DAC_WR_VAL_1_MASK)
|
|
|
+ >> WM8993_DCS_DAC_WR_VAL_1_SHIFT;
|
|
|
+ *reg_l = reg & WM8993_DCS_DAC_WR_VAL_0_MASK;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ WARN(1, "Unknown DCS readback method\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Startup calibration of the DC servo
|
|
|
*/
|
|
@@ -207,7 +248,7 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)
|
|
|
struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);
|
|
|
struct wm_hubs_dcs_cache *cache;
|
|
|
s8 offset;
|
|
|
- u16 reg, reg_l, reg_r, dcs_cfg, dcs_reg;
|
|
|
+ u16 reg_l, reg_r, dcs_cfg, dcs_reg;
|
|
|
|
|
|
switch (hubs->dcs_readback_mode) {
|
|
|
case 2:
|
|
@@ -245,27 +286,7 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)
|
|
|
WM8993_DCS_TRIG_STARTUP_1);
|
|
|
}
|
|
|
|
|
|
- /* Different chips in the family support different readback
|
|
|
- * methods.
|
|
|
- */
|
|
|
- switch (hubs->dcs_readback_mode) {
|
|
|
- case 0:
|
|
|
- reg_l = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_1)
|
|
|
- & WM8993_DCS_INTEG_CHAN_0_MASK;
|
|
|
- reg_r = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2)
|
|
|
- & WM8993_DCS_INTEG_CHAN_1_MASK;
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- case 1:
|
|
|
- reg = snd_soc_read(codec, dcs_reg);
|
|
|
- reg_r = (reg & WM8993_DCS_DAC_WR_VAL_1_MASK)
|
|
|
- >> WM8993_DCS_DAC_WR_VAL_1_SHIFT;
|
|
|
- reg_l = reg & WM8993_DCS_DAC_WR_VAL_0_MASK;
|
|
|
- break;
|
|
|
- default:
|
|
|
- WARN(1, "Unknown DCS readback method\n");
|
|
|
- return;
|
|
|
- }
|
|
|
+ wm_hubs_read_dc_servo(codec, ®_l, ®_r);
|
|
|
|
|
|
dev_dbg(codec->dev, "DCS input: %x %x\n", reg_l, reg_r);
|
|
|
|