Hi!
With the patch, it is OK?
Yes.
#include <sys/ioctl.h> #include <unistd.h> #include <fcntl.h> #include <sys/soundcard.h>
int main(void) { int fd; int format; int channels;
if ((fd = open("/dev/dsp", O_WRONLY, 0)) == -1) { perror("open"); return 1; } format = AFMT_S16_LE; if (ioctl(fd, SNDCTL_DSP_SETFMT, &format) == -1) { perror("SNDCTL_DSP_SETFMT"); return 1; } channels = 2; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1) { perror("SNDCTL_DSP_CHANNELS"); return 1; } return 0; }
Output: SNDCTL_DSP_CHANNELS: Device or resource busy
This return from codec or from atmel_ssc_dai?
This -EBUSY definitely comes from atmel_ssc_set_dai_sysclk, when my card-driver tries to set ATMEL_SSC_CMR_DIV. With the patch, it works. (the codec is spdif-transmitter, since the i2c interface of the actual tfa9879 codec is not directly reachable from the linux cpu, but that has nothing to do with this issue).
I try to reproduce it (using the code your pasted directly) on atmel sama5d3xek with wm8904 code, don't meet this error.
I also go through the OSS code, I still don't find this is related with atmel_ssc_set_dai_sysclk.
So, am I missing something or something else?
The sama5d3xek/wm9804 combo, as implemented in the kernel, has the ssc dai in slave mode, and therefore don't need to fiddle with any ssc dai dividers (atmel_9804.c :atmel_asoc_wm9804_hw_params() only sets things in the wm9804 codec dai driver and leaves the ssc dai to itself).
Instead, try the above code on your code with the ssc dai in master mode that you pointed at previously.
https://github.com/Android4SAM/linux-at91/commit/33db8ebd3e75632c482dda27134...
If that happens to not hit -EBUSY (which it might not, since the wm9804 codec will only allow stereo, so the SNDCTL_DSP_CHANNELS ioctl might not need to make any change for any ssc divider) add code to also set a non-default sample rate, e.g.:
speed = 22050; if (ioctl(fd, SNDCTL_DSP_SPEED, &speed) == -1) { perror("SNDCTL_DSP_SPEED"); return 1; }
Cheers, Peter