2 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
4 * This source file is released under GPL v2 license (no other versions).
5 * See the COPYING file included in the main directory of this source
6 * distribution for the license terms and conditions.
11 * This file contains the definition of the pcm device functions.
20 #include <linux/slab.h>
21 #include <sound/pcm.h>
23 /* Hardware descriptions for playback */
24 static struct snd_pcm_hardware ct_pcm_playback_hw
= {
25 .info
= (SNDRV_PCM_INFO_MMAP
|
26 SNDRV_PCM_INFO_INTERLEAVED
|
27 SNDRV_PCM_INFO_BLOCK_TRANSFER
|
28 SNDRV_PCM_INFO_MMAP_VALID
|
29 SNDRV_PCM_INFO_PAUSE
),
30 .formats
= (SNDRV_PCM_FMTBIT_U8
|
31 SNDRV_PCM_FMTBIT_S16_LE
|
32 SNDRV_PCM_FMTBIT_S24_3LE
|
33 SNDRV_PCM_FMTBIT_S32_LE
|
34 SNDRV_PCM_FMTBIT_FLOAT_LE
),
35 .rates
= (SNDRV_PCM_RATE_CONTINUOUS
|
36 SNDRV_PCM_RATE_8000_192000
),
41 .buffer_bytes_max
= (128*1024),
42 .period_bytes_min
= (64),
43 .period_bytes_max
= (128*1024),
49 static struct snd_pcm_hardware ct_spdif_passthru_playback_hw
= {
50 .info
= (SNDRV_PCM_INFO_MMAP
|
51 SNDRV_PCM_INFO_INTERLEAVED
|
52 SNDRV_PCM_INFO_BLOCK_TRANSFER
|
53 SNDRV_PCM_INFO_MMAP_VALID
|
54 SNDRV_PCM_INFO_PAUSE
),
55 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
56 .rates
= (SNDRV_PCM_RATE_48000
|
57 SNDRV_PCM_RATE_44100
|
58 SNDRV_PCM_RATE_32000
),
63 .buffer_bytes_max
= (128*1024),
64 .period_bytes_min
= (64),
65 .period_bytes_max
= (128*1024),
71 /* Hardware descriptions for capture */
72 static struct snd_pcm_hardware ct_pcm_capture_hw
= {
73 .info
= (SNDRV_PCM_INFO_MMAP
|
74 SNDRV_PCM_INFO_INTERLEAVED
|
75 SNDRV_PCM_INFO_BLOCK_TRANSFER
|
76 SNDRV_PCM_INFO_PAUSE
|
77 SNDRV_PCM_INFO_MMAP_VALID
),
78 .formats
= (SNDRV_PCM_FMTBIT_U8
|
79 SNDRV_PCM_FMTBIT_S16_LE
|
80 SNDRV_PCM_FMTBIT_S24_3LE
|
81 SNDRV_PCM_FMTBIT_S32_LE
|
82 SNDRV_PCM_FMTBIT_FLOAT_LE
),
83 .rates
= (SNDRV_PCM_RATE_CONTINUOUS
|
84 SNDRV_PCM_RATE_8000_96000
),
89 .buffer_bytes_max
= (128*1024),
90 .period_bytes_min
= (384),
91 .period_bytes_max
= (64*1024),
97 static void ct_atc_pcm_interrupt(struct ct_atc_pcm
*atc_pcm
)
99 struct ct_atc_pcm
*apcm
= atc_pcm
;
101 if (!apcm
->substream
)
104 snd_pcm_period_elapsed(apcm
->substream
);
107 static void ct_atc_pcm_free_substream(struct snd_pcm_runtime
*runtime
)
109 struct ct_atc_pcm
*apcm
= runtime
->private_data
;
110 struct ct_atc
*atc
= snd_pcm_substream_chip(apcm
->substream
);
112 atc
->pcm_release_resources(atc
, apcm
);
113 ct_timer_instance_free(apcm
->timer
);
115 runtime
->private_data
= NULL
;
118 /* pcm playback operations */
119 static int ct_pcm_playback_open(struct snd_pcm_substream
*substream
)
121 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
122 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
123 struct ct_atc_pcm
*apcm
;
126 apcm
= kzalloc(sizeof(*apcm
), GFP_KERNEL
);
130 apcm
->substream
= substream
;
131 apcm
->interrupt
= ct_atc_pcm_interrupt
;
132 if (IEC958
== substream
->pcm
->device
) {
133 runtime
->hw
= ct_spdif_passthru_playback_hw
;
134 atc
->spdif_out_passthru(atc
, 1);
136 runtime
->hw
= ct_pcm_playback_hw
;
137 if (FRONT
== substream
->pcm
->device
)
138 runtime
->hw
.channels_max
= 8;
141 err
= snd_pcm_hw_constraint_integer(runtime
,
142 SNDRV_PCM_HW_PARAM_PERIODS
);
147 err
= snd_pcm_hw_constraint_minmax(runtime
,
148 SNDRV_PCM_HW_PARAM_BUFFER_BYTES
,
155 apcm
->timer
= ct_timer_instance_new(atc
->timer
, apcm
);
160 runtime
->private_data
= apcm
;
161 runtime
->private_free
= ct_atc_pcm_free_substream
;
166 static int ct_pcm_playback_close(struct snd_pcm_substream
*substream
)
168 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
170 /* TODO: Notify mixer inactive. */
171 if (IEC958
== substream
->pcm
->device
)
172 atc
->spdif_out_passthru(atc
, 0);
174 /* The ct_atc_pcm object will be freed by runtime->private_free */
179 static int ct_pcm_hw_params(struct snd_pcm_substream
*substream
,
180 struct snd_pcm_hw_params
*hw_params
)
182 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
183 struct ct_atc_pcm
*apcm
= substream
->runtime
->private_data
;
186 err
= snd_pcm_lib_malloc_pages(substream
,
187 params_buffer_bytes(hw_params
));
190 /* clear previous resources */
191 atc
->pcm_release_resources(atc
, apcm
);
195 static int ct_pcm_hw_free(struct snd_pcm_substream
*substream
)
197 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
198 struct ct_atc_pcm
*apcm
= substream
->runtime
->private_data
;
200 /* clear previous resources */
201 atc
->pcm_release_resources(atc
, apcm
);
202 /* Free snd-allocated pages */
203 return snd_pcm_lib_free_pages(substream
);
207 static int ct_pcm_playback_prepare(struct snd_pcm_substream
*substream
)
210 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
211 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
212 struct ct_atc_pcm
*apcm
= runtime
->private_data
;
214 if (IEC958
== substream
->pcm
->device
)
215 err
= atc
->spdif_passthru_playback_prepare(atc
, apcm
);
217 err
= atc
->pcm_playback_prepare(atc
, apcm
);
220 dev_err(atc
->card
->dev
,
221 "Preparing pcm playback failed!!!\n");
229 ct_pcm_playback_trigger(struct snd_pcm_substream
*substream
, int cmd
)
231 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
232 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
233 struct ct_atc_pcm
*apcm
= runtime
->private_data
;
236 case SNDRV_PCM_TRIGGER_START
:
237 case SNDRV_PCM_TRIGGER_RESUME
:
238 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
239 atc
->pcm_playback_start(atc
, apcm
);
241 case SNDRV_PCM_TRIGGER_STOP
:
242 case SNDRV_PCM_TRIGGER_SUSPEND
:
243 case SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
244 atc
->pcm_playback_stop(atc
, apcm
);
253 static snd_pcm_uframes_t
254 ct_pcm_playback_pointer(struct snd_pcm_substream
*substream
)
256 unsigned long position
;
257 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
258 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
259 struct ct_atc_pcm
*apcm
= runtime
->private_data
;
261 /* Read out playback position */
262 position
= atc
->pcm_playback_position(atc
, apcm
);
263 position
= bytes_to_frames(runtime
, position
);
264 if (position
>= runtime
->buffer_size
)
269 /* pcm capture operations */
270 static int ct_pcm_capture_open(struct snd_pcm_substream
*substream
)
272 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
273 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
274 struct ct_atc_pcm
*apcm
;
277 apcm
= kzalloc(sizeof(*apcm
), GFP_KERNEL
);
282 apcm
->substream
= substream
;
283 apcm
->interrupt
= ct_atc_pcm_interrupt
;
284 runtime
->hw
= ct_pcm_capture_hw
;
285 runtime
->hw
.rate_max
= atc
->rsr
* atc
->msr
;
287 err
= snd_pcm_hw_constraint_integer(runtime
,
288 SNDRV_PCM_HW_PARAM_PERIODS
);
293 err
= snd_pcm_hw_constraint_minmax(runtime
,
294 SNDRV_PCM_HW_PARAM_BUFFER_BYTES
,
301 apcm
->timer
= ct_timer_instance_new(atc
->timer
, apcm
);
306 runtime
->private_data
= apcm
;
307 runtime
->private_free
= ct_atc_pcm_free_substream
;
312 static int ct_pcm_capture_close(struct snd_pcm_substream
*substream
)
314 /* The ct_atc_pcm object will be freed by runtime->private_free */
315 /* TODO: Notify mixer inactive. */
319 static int ct_pcm_capture_prepare(struct snd_pcm_substream
*substream
)
322 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
323 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
324 struct ct_atc_pcm
*apcm
= runtime
->private_data
;
326 err
= atc
->pcm_capture_prepare(atc
, apcm
);
328 dev_err(atc
->card
->dev
,
329 "Preparing pcm capture failed!!!\n");
337 ct_pcm_capture_trigger(struct snd_pcm_substream
*substream
, int cmd
)
339 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
340 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
341 struct ct_atc_pcm
*apcm
= runtime
->private_data
;
344 case SNDRV_PCM_TRIGGER_START
:
345 atc
->pcm_capture_start(atc
, apcm
);
347 case SNDRV_PCM_TRIGGER_STOP
:
348 atc
->pcm_capture_stop(atc
, apcm
);
351 atc
->pcm_capture_stop(atc
, apcm
);
358 static snd_pcm_uframes_t
359 ct_pcm_capture_pointer(struct snd_pcm_substream
*substream
)
361 unsigned long position
;
362 struct ct_atc
*atc
= snd_pcm_substream_chip(substream
);
363 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
364 struct ct_atc_pcm
*apcm
= runtime
->private_data
;
366 /* Read out playback position */
367 position
= atc
->pcm_capture_position(atc
, apcm
);
368 position
= bytes_to_frames(runtime
, position
);
369 if (position
>= runtime
->buffer_size
)
374 /* PCM operators for playback */
375 static struct snd_pcm_ops ct_pcm_playback_ops
= {
376 .open
= ct_pcm_playback_open
,
377 .close
= ct_pcm_playback_close
,
378 .ioctl
= snd_pcm_lib_ioctl
,
379 .hw_params
= ct_pcm_hw_params
,
380 .hw_free
= ct_pcm_hw_free
,
381 .prepare
= ct_pcm_playback_prepare
,
382 .trigger
= ct_pcm_playback_trigger
,
383 .pointer
= ct_pcm_playback_pointer
,
384 .page
= snd_pcm_sgbuf_ops_page
,
387 /* PCM operators for capture */
388 static struct snd_pcm_ops ct_pcm_capture_ops
= {
389 .open
= ct_pcm_capture_open
,
390 .close
= ct_pcm_capture_close
,
391 .ioctl
= snd_pcm_lib_ioctl
,
392 .hw_params
= ct_pcm_hw_params
,
393 .hw_free
= ct_pcm_hw_free
,
394 .prepare
= ct_pcm_capture_prepare
,
395 .trigger
= ct_pcm_capture_trigger
,
396 .pointer
= ct_pcm_capture_pointer
,
397 .page
= snd_pcm_sgbuf_ops_page
,
400 static const struct snd_pcm_chmap_elem surround_map
[] = {
402 .map
= { SNDRV_CHMAP_MONO
} },
404 .map
= { SNDRV_CHMAP_RL
, SNDRV_CHMAP_RR
} },
408 static const struct snd_pcm_chmap_elem clfe_map
[] = {
410 .map
= { SNDRV_CHMAP_MONO
} },
412 .map
= { SNDRV_CHMAP_FC
, SNDRV_CHMAP_LFE
} },
416 static const struct snd_pcm_chmap_elem side_map
[] = {
418 .map
= { SNDRV_CHMAP_MONO
} },
420 .map
= { SNDRV_CHMAP_SL
, SNDRV_CHMAP_SR
} },
424 /* Create ALSA pcm device */
425 int ct_alsa_pcm_create(struct ct_atc
*atc
,
426 enum CTALSADEVS device
,
427 const char *device_name
)
430 const struct snd_pcm_chmap_elem
*map
;
433 int playback_count
, capture_count
;
435 playback_count
= (IEC958
== device
) ? 1 : 256;
436 capture_count
= (FRONT
== device
) ? 1 : 0;
437 err
= snd_pcm_new(atc
->card
, "ctxfi", device
,
438 playback_count
, capture_count
, &pcm
);
440 dev_err(atc
->card
->dev
, "snd_pcm_new failed!! Err=%d\n",
445 pcm
->private_data
= atc
;
447 pcm
->dev_subclass
= SNDRV_PCM_SUBCLASS_GENERIC_MIX
;
448 strlcpy(pcm
->name
, device_name
, sizeof(pcm
->name
));
450 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_PLAYBACK
, &ct_pcm_playback_ops
);
454 SNDRV_PCM_STREAM_CAPTURE
, &ct_pcm_capture_ops
);
456 snd_pcm_lib_preallocate_pages_for_all(pcm
, SNDRV_DMA_TYPE_DEV_SG
,
457 snd_dma_pci_data(atc
->pci
), 128*1024, 128*1024);
463 map
= snd_pcm_std_chmaps
;
475 map
= snd_pcm_std_chmaps
;
478 err
= snd_pcm_add_chmap_ctls(pcm
, SNDRV_PCM_STREAM_PLAYBACK
, map
, chs
,
483 #ifdef CONFIG_PM_SLEEP
484 atc
->pcms
[device
] = pcm
;