Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 76ffe1e3 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Takashi Iwai
Browse files

sound: oxygen: allow custom MCLK rates



Add a callback that allows model drivers to modify the default I2S MCLK
rate.

Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent a361e247
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ static const struct oxygen_model model_hifier = {
	.init = hifier_init,
	.cleanup = hifier_cleanup,
	.resume = hifier_resume,
	.get_i2s_mclk = oxygen_default_i2s_mclk,
	.set_dac_params = set_ak4396_params,
	.set_adc_params = set_cs5340_params,
	.update_dac_volume = update_ak4396_volume,
+1 −0
Original line number Diff line number Diff line
@@ -361,6 +361,7 @@ static const struct oxygen_model model_generic = {
	.init = generic_init,
	.cleanup = generic_cleanup,
	.resume = generic_resume,
	.get_i2s_mclk = oxygen_default_i2s_mclk,
	.set_dac_params = set_ak4396_params,
	.set_adc_params = set_wm8785_params,
	.update_dac_volume = update_ak4396_volume,
+4 −0
Original line number Diff line number Diff line
@@ -78,6 +78,8 @@ struct oxygen_model {
	void (*resume)(struct oxygen *chip);
	void (*pcm_hardware_filter)(unsigned int channel,
				    struct snd_pcm_hardware *hardware);
	unsigned int (*get_i2s_mclk)(struct oxygen *chip, unsigned int channel,
				     struct snd_pcm_hw_params *hw_params);
	void (*set_dac_params)(struct oxygen *chip,
			       struct snd_pcm_hw_params *params);
	void (*set_adc_params)(struct oxygen *chip,
@@ -163,6 +165,8 @@ void oxygen_update_spdif_source(struct oxygen *chip);
/* oxygen_pcm.c */

int oxygen_pcm_init(struct oxygen *chip);
unsigned int oxygen_default_i2s_mclk(struct oxygen *chip, unsigned int channel,
				     struct snd_pcm_hw_params *hw_params);

/* oxygen_io.c */

+9 −4
Original line number Diff line number Diff line
@@ -271,13 +271,16 @@ static unsigned int oxygen_rate(struct snd_pcm_hw_params *hw_params)
	}
}

static unsigned int oxygen_i2s_mclk(struct snd_pcm_hw_params *hw_params)
unsigned int oxygen_default_i2s_mclk(struct oxygen *chip,
				     unsigned int channel,
				     struct snd_pcm_hw_params *hw_params)
{
	if (params_rate(hw_params) <= 96000)
		return OXYGEN_I2S_MCLK_256;
	else
		return OXYGEN_I2S_MCLK_128;
}
EXPORT_SYMBOL(oxygen_default_i2s_mclk);

static unsigned int oxygen_i2s_bits(struct snd_pcm_hw_params *hw_params)
{
@@ -354,7 +357,7 @@ static int oxygen_rec_a_hw_params(struct snd_pcm_substream *substream,
			     OXYGEN_REC_FORMAT_A_MASK);
	oxygen_write16_masked(chip, OXYGEN_I2S_A_FORMAT,
			      oxygen_rate(hw_params) |
			      oxygen_i2s_mclk(hw_params) |
			      chip->model.get_i2s_mclk(chip, PCM_A, hw_params) |
			      chip->model.adc_i2s_format |
			      oxygen_i2s_bits(hw_params),
			      OXYGEN_I2S_RATE_MASK |
@@ -390,7 +393,8 @@ static int oxygen_rec_b_hw_params(struct snd_pcm_substream *substream,
	if (!is_ac97)
		oxygen_write16_masked(chip, OXYGEN_I2S_B_FORMAT,
				      oxygen_rate(hw_params) |
				      oxygen_i2s_mclk(hw_params) |
				      chip->model.get_i2s_mclk(chip, PCM_B,
							       hw_params) |
				      chip->model.adc_i2s_format |
				      oxygen_i2s_bits(hw_params),
				      OXYGEN_I2S_RATE_MASK |
@@ -472,7 +476,8 @@ static int oxygen_multich_hw_params(struct snd_pcm_substream *substream,
	oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT,
			      oxygen_rate(hw_params) |
			      chip->model.dac_i2s_format |
			      oxygen_i2s_mclk(hw_params) |
			      chip->model.get_i2s_mclk(chip, PCM_MULTICH,
						       hw_params) |
			      oxygen_i2s_bits(hw_params),
			      OXYGEN_I2S_RATE_MASK |
			      OXYGEN_I2S_FORMAT_MASK |
+1 −0
Original line number Diff line number Diff line
@@ -321,6 +321,7 @@ static const struct oxygen_model model_xonar_d1 = {
	.cleanup = xonar_d1_cleanup,
	.suspend = xonar_d1_suspend,
	.resume = xonar_d1_resume,
	.get_i2s_mclk = oxygen_default_i2s_mclk,
	.set_dac_params = set_cs43xx_params,
	.set_adc_params = xonar_set_cs53x1_params,
	.update_dac_volume = update_cs43xx_volume,
Loading