[alsa-devel] ASOC snd_soc_dai_ops for clock mux control
Gellner, Christoph (ADITG/SW1)
cgellner at de.adit-jv.com
Wed Apr 3 18:22:00 CEST 2013
I'm working on the driver of an audio CPU DAI IP providing
- Internal clocks which can be used for master clock generation by TX as well as RX section
- One oversampling clock available to RX section
- One oversampling clock available to TX section.
Kernel version is 3.5.7
I want to add support to the CPU DAI driver to
- Specify the rate of the input clocks
- Select which of the clock inputs shall be used by RX and which shall be used by TX section
I'm currently wondering how to map this to existing snd_soc_dai_ops functions.
Currently I see only set_sysclk, set_pll, set_clkdiv for clock control.
I plan to use set_sysclk to specify the rate as well as the direction of each clock.
What is currently missing for me is a way to specify the clock to be used by RX or TX section.
I can't really add this in set_sysclk. In case I switch to clock X when set_sysclk is called with clock ID of X, I need a way to distinguish if RX or TX section or both need to switch to this clock.
But I can't really double the internal clock X in virtual clocks X_TX, X_RX (one time for TX and one time for RX section) as the internal clock X has only one rate for both sections and this would not represent the hardware correctly.
Do you have any recommendation how to implement ?
What do you think about adding a new function pointer to snd_soc_dai_ops ?
int (*set_clkmux)(struct snd_soc_dai *dai, int mux_id, int source_id);
I think this would be the cleanest solution as it models the features of the hardware (the clock multiplexers for RX or TX sections)
It might be possible to use set_pll or set_clkdiv to realize.
I could use set_pll and ignore the freq_in and freq_out
I could use set_clkdiv and interpret div (divider integer value) as a source_id
But this is not a 100% clean solution in my opinion.
More information about the Alsa-devel