
This isn't quite what I was expecting - what I was expecting was more that the I2S driver would set up a function on startup which would be called by the ASoC DMA driver from its trigger function. It does look like a reasonable approach, though.
Yes, I understand what you exactly want. I was intend to register the callback function on I2S startup, but finally I found it is not possible because there are two callback functions for the DMA driver: s3c24xx_snd_txctrl() and s3c24xx_snd_rxctrl(), however, there's only one slot for the callback function. So I choose not to setup the callback functions dynamicly, when the task is playback, the callback funtion is s3c24xx_snd_txctrl() and when the task is record, the funtion is s3c24xx_snd_rxctrl().
However, there's another way to archive what you expect: combine the s3c24xx_snd_txctrl() and s3c24xx_snd_rxctrl() into one function. That would be like:
struct s3c24xx_snd_ctrl_data { int event; //start or stop int direction; //playback or record };
static void s3c24xx_snd_ctrl(struct s3c24xx_snd_ctrl_data* data) { if(data->direction == SNDRV_PCM_STREAM_PLAYBACK) s3c24xx_snd_txctrl(data->event); eles s3c24xx_snd_rxctrl(data->event); }
Then we can register this callback funtion on I2S startup.
The way you've got things at the minute at least all the other S3C ASoC drivers will need to be updated to match the change in the DMA driver.
I have posted the DMA driver patch to linux-arm-kernel yesterday: http://lists.arm.linux.org.uk/lurker/message/20090822.153940.e15e3bd7.en.htm...
Hope there is no problem to merge the patch.
If the dma patch is accepted, I will post a formal patch here for ASoC S3C24XX.