[ALSA] oxygen: separate out hardware initialization code
authorClemens Ladisch <clemens@ladisch.de>
Tue, 13 May 2008 07:22:43 +0000 (09:22 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 19 May 2008 11:19:17 +0000 (13:19 +0200)
Create separate functions for the code that initializes the hardware, as
opposed to initializing internal driver state, so that they can be
reused for resume support.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
sound/pci/oxygen/hifier.c
sound/pci/oxygen/oxygen.c
sound/pci/oxygen/virtuoso.c

index 0e425d5..6e45a58 100644 (file)
@@ -68,15 +68,22 @@ static void update_ak4396_volume(struct oxygen *chip)
        ak4396_write(chip, AK4396_RCH_ATT, chip->dac_volume[1]);
 }
 
-static void hifier_init(struct oxygen *chip)
+static void hifier_registers_init(struct oxygen *chip)
 {
        struct hifier_data *data = chip->model_data;
 
-       data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL;
        ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN);
        ak4396_write(chip, AK4396_CONTROL_2, data->ak4396_ctl2);
        ak4396_write(chip, AK4396_CONTROL_3, AK4396_PCM);
        update_ak4396_volume(chip);
+}
+
+static void hifier_init(struct oxygen *chip)
+{
+       struct hifier_data *data = chip->model_data;
+
+       data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL;
+       hifier_registers_init(chip);
 
        snd_component_add(chip->card, "AK4396");
        snd_component_add(chip->card, "CS5340");
index ad8d950..800ae30 100644 (file)
@@ -124,12 +124,11 @@ static void update_ak4396_volume(struct oxygen *chip)
        }
 }
 
-static void ak4396_init(struct oxygen *chip)
+static void ak4396_registers_init(struct oxygen *chip)
 {
        struct generic_data *data = chip->model_data;
        unsigned int i;
 
-       data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL;
        for (i = 0; i < 4; ++i) {
                ak4396_write(chip, i,
                             AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN);
@@ -139,6 +138,14 @@ static void ak4396_init(struct oxygen *chip)
                             AK4396_CONTROL_3, AK4396_PCM);
        }
        update_ak4396_volume(chip);
+}
+
+static void ak4396_init(struct oxygen *chip)
+{
+       struct generic_data *data = chip->model_data;
+
+       data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL;
+       ak4396_registers_init(chip);
        snd_component_add(chip->card, "AK4396");
 }
 
@@ -149,18 +156,23 @@ static void ak5385_init(struct oxygen *chip)
        snd_component_add(chip->card, "AK5385");
 }
 
-static void wm8785_init(struct oxygen *chip)
+static void wm8785_registers_init(struct oxygen *chip)
 {
        struct generic_data *data = chip->model_data;
 
-       data->saved_wm8785_registers[0] = WM8785_MCR_SLAVE |
-               WM8785_OSR_SINGLE | WM8785_FORMAT_LJUST;
-       data->saved_wm8785_registers[1] = WM8785_WL_24;
-
        wm8785_write(chip, WM8785_R7, 0);
        wm8785_write(chip, WM8785_R0, data->saved_wm8785_registers[0]);
        wm8785_write(chip, WM8785_R1, data->saved_wm8785_registers[1]);
+}
 
+static void wm8785_init(struct oxygen *chip)
+{
+       struct generic_data *data = chip->model_data;
+
+       data->saved_wm8785_registers[0] = WM8785_MCR_SLAVE |
+               WM8785_OSR_SINGLE | WM8785_FORMAT_LJUST;
+       data->saved_wm8785_registers[1] = WM8785_WL_24;
+       wm8785_registers_init(chip);
        snd_component_add(chip->card, "WM8785");
 }
 
index bd9e285..e95dc57 100644 (file)
@@ -204,15 +204,11 @@ static void update_pcm1796_mute(struct oxygen *chip)
                pcm1796_write(chip, i, 18, value);
 }
 
-static void xonar_d2_init(struct oxygen *chip)
+static void pcm1796_init(struct oxygen *chip)
 {
        struct xonar_data *data = chip->model_data;
        unsigned int i;
 
-       data->anti_pop_delay = 300;
-       data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE;
-       data->pcm1796_oversampling = PCM1796_OS_64;
-
        for (i = 0; i < 4; ++i) {
                pcm1796_write(chip, i, 19, PCM1796_FLT_SHARP | PCM1796_ATS_1);
                pcm1796_write(chip, i, 20, data->pcm1796_oversampling);
@@ -220,6 +216,17 @@ static void xonar_d2_init(struct oxygen *chip)
        }
        update_pcm1796_mute(chip); /* set ATLD before ATL/ATR */
        update_pcm1796_volume(chip);
+}
+
+static void xonar_d2_init(struct oxygen *chip)
+{
+       struct xonar_data *data = chip->model_data;
+
+       data->anti_pop_delay = 300;
+       data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE;
+       data->pcm1796_oversampling = PCM1796_OS_64;
+
+       pcm1796_init(chip);
 
        oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT);
        oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT);
@@ -272,24 +279,10 @@ static void update_cs43xx_mute(struct oxygen *chip)
        update_cs4362a_volumes(chip);
 }
 
-static void xonar_dx_init(struct oxygen *chip)
+static void cs43xx_init(struct oxygen *chip)
 {
        struct xonar_data *data = chip->model_data;
 
-       data->anti_pop_delay = 800;
-       data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE;
-       data->ext_power_reg = OXYGEN_GPI_DATA;
-       data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
-       data->ext_power_bit = GPI_DX_EXT_POWER;
-       data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST;
-       data->cs4362a_fm = CS4362A_FM_SINGLE |
-               CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L;
-
-       oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS,
-                      OXYGEN_2WIRE_LENGTH_8 |
-                      OXYGEN_2WIRE_INTERRUPT_MASK |
-                      OXYGEN_2WIRE_SPEED_FAST);
-
        /* set CPEN (control port mode) and power down */
        cs4398_write(chip, 8, CS4398_CPEN | CS4398_PDN);
        cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN);
@@ -311,6 +304,27 @@ static void xonar_dx_init(struct oxygen *chip)
        /* clear power down */
        cs4398_write(chip, 8, CS4398_CPEN);
        cs4362a_write(chip, 0x01, CS4362A_CPEN);
+}
+
+static void xonar_dx_init(struct oxygen *chip)
+{
+       struct xonar_data *data = chip->model_data;
+
+       data->anti_pop_delay = 800;
+       data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE;
+       data->ext_power_reg = OXYGEN_GPI_DATA;
+       data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
+       data->ext_power_bit = GPI_DX_EXT_POWER;
+       data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST;
+       data->cs4362a_fm = CS4362A_FM_SINGLE |
+               CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L;
+
+       oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS,
+                      OXYGEN_2WIRE_LENGTH_8 |
+                      OXYGEN_2WIRE_INTERRUPT_MASK |
+                      OXYGEN_2WIRE_SPEED_FAST);
+
+       cs43xx_init(chip);
 
        oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL,
                          GPIO_DX_FRONT_PANEL | GPIO_DX_INPUT_ROUTE);