| Vinod Koul | e60061a | 2011-12-23 10:36:38 +0530 | [diff] [blame] | 1 | /* | 
|  | 2 | *  compress_driver.h - compress offload driver definations | 
|  | 3 | * | 
|  | 4 | *  Copyright (C) 2011 Intel Corporation | 
|  | 5 | *  Authors:	Vinod Koul <vinod.koul@linux.intel.com> | 
|  | 6 | *		Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> | 
|  | 7 | *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 8 | * | 
|  | 9 | *  This program is free software; you can redistribute it and/or modify | 
|  | 10 | *  it under the terms of the GNU General Public License as published by | 
|  | 11 | *  the Free Software Foundation; version 2 of the License. | 
|  | 12 | * | 
|  | 13 | *  This program is distributed in the hope that it will be useful, but | 
|  | 14 | *  WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 15 | *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | 16 | *  General Public License for more details. | 
|  | 17 | * | 
|  | 18 | *  You should have received a copy of the GNU General Public License along | 
|  | 19 | *  with this program; if not, write to the Free Software Foundation, Inc., | 
|  | 20 | *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | 
|  | 21 | * | 
|  | 22 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 23 | * | 
|  | 24 | */ | 
|  | 25 | #ifndef __COMPRESS_DRIVER_H | 
|  | 26 | #define __COMPRESS_DRIVER_H | 
|  | 27 |  | 
|  | 28 | #include <linux/types.h> | 
|  | 29 | #include <linux/sched.h> | 
|  | 30 | #include <sound/compress_offload.h> | 
|  | 31 | #include <sound/asound.h> | 
|  | 32 | #include <sound/pcm.h> | 
|  | 33 |  | 
|  | 34 | struct snd_compr_ops; | 
|  | 35 |  | 
|  | 36 | /** | 
|  | 37 | * struct snd_compr_runtime: runtime stream description | 
|  | 38 | * @state: stream state | 
|  | 39 | * @ops: pointer to DSP callbacks | 
|  | 40 | * @buffer: pointer to kernel buffer, valid only when not in mmap mode or | 
|  | 41 | *	DSP doesn't implement copy | 
|  | 42 | * @buffer_size: size of the above buffer | 
|  | 43 | * @fragment_size: size of buffer fragment in bytes | 
|  | 44 | * @fragments: number of such fragments | 
|  | 45 | * @hw_pointer: offset of last location in buffer where DSP copied data | 
|  | 46 | * @app_pointer: offset of last location in buffer where app wrote data | 
|  | 47 | * @total_bytes_available: cumulative number of bytes made available in | 
|  | 48 | *	the ring buffer | 
|  | 49 | * @total_bytes_transferred: cumulative bytes transferred by offload DSP | 
|  | 50 | * @sleep: poll sleep | 
|  | 51 | */ | 
|  | 52 | struct snd_compr_runtime { | 
|  | 53 | snd_pcm_state_t state; | 
|  | 54 | struct snd_compr_ops *ops; | 
|  | 55 | void *buffer; | 
|  | 56 | u64 buffer_size; | 
|  | 57 | u32 fragment_size; | 
|  | 58 | u32 fragments; | 
|  | 59 | u64 hw_pointer; | 
|  | 60 | u64 app_pointer; | 
|  | 61 | u64 total_bytes_available; | 
|  | 62 | u64 total_bytes_transferred; | 
|  | 63 | wait_queue_head_t sleep; | 
|  | 64 | }; | 
|  | 65 |  | 
|  | 66 | /** | 
|  | 67 | * struct snd_compr_stream: compressed stream | 
|  | 68 | * @name: device name | 
|  | 69 | * @ops: pointer to DSP callbacks | 
|  | 70 | * @runtime: pointer to runtime structure | 
|  | 71 | * @device: device pointer | 
|  | 72 | * @direction: stream direction, playback/recording | 
|  | 73 | * @private_data: pointer to DSP private data | 
|  | 74 | */ | 
|  | 75 | struct snd_compr_stream { | 
|  | 76 | const char *name; | 
|  | 77 | struct snd_compr_ops *ops; | 
|  | 78 | struct snd_compr_runtime *runtime; | 
|  | 79 | struct snd_compr *device; | 
|  | 80 | enum snd_compr_direction direction; | 
|  | 81 | void *private_data; | 
|  | 82 | }; | 
|  | 83 |  | 
|  | 84 | /** | 
|  | 85 | * struct snd_compr_ops: compressed path DSP operations | 
|  | 86 | * @open: Open the compressed stream | 
|  | 87 | * This callback is mandatory and shall keep dsp ready to receive the stream | 
|  | 88 | * parameter | 
|  | 89 | * @free: Close the compressed stream, mandatory | 
|  | 90 | * @set_params: Sets the compressed stream parameters, mandatory | 
|  | 91 | * This can be called in during stream creation only to set codec params | 
|  | 92 | * and the stream properties | 
|  | 93 | * @get_params: retrieve the codec parameters, mandatory | 
|  | 94 | * @trigger: Trigger operations like start, pause, resume, drain, stop. | 
|  | 95 | * This callback is mandatory | 
|  | 96 | * @pointer: Retrieve current h/w pointer information. Mandatory | 
|  | 97 | * @copy: Copy the compressed data to/from userspace, Optional | 
|  | 98 | * Can't be implemented if DSP supports mmap | 
|  | 99 | * @mmap: DSP mmap method to mmap DSP memory | 
|  | 100 | * @ack: Ack for DSP when data is written to audio buffer, Optional | 
|  | 101 | * Not valid if copy is implemented | 
|  | 102 | * @get_caps: Retrieve DSP capabilities, mandatory | 
|  | 103 | * @get_codec_caps: Retrieve capabilities for a specific codec, mandatory | 
|  | 104 | */ | 
|  | 105 | struct snd_compr_ops { | 
|  | 106 | int (*open)(struct snd_compr_stream *stream); | 
|  | 107 | int (*free)(struct snd_compr_stream *stream); | 
|  | 108 | int (*set_params)(struct snd_compr_stream *stream, | 
|  | 109 | struct snd_compr_params *params); | 
|  | 110 | int (*get_params)(struct snd_compr_stream *stream, | 
|  | 111 | struct snd_codec *params); | 
|  | 112 | int (*trigger)(struct snd_compr_stream *stream, int cmd); | 
|  | 113 | int (*pointer)(struct snd_compr_stream *stream, | 
|  | 114 | struct snd_compr_tstamp *tstamp); | 
|  | 115 | int (*copy)(struct snd_compr_stream *stream, const char __user *buf, | 
|  | 116 | size_t count); | 
|  | 117 | int (*mmap)(struct snd_compr_stream *stream, | 
|  | 118 | struct vm_area_struct *vma); | 
|  | 119 | int (*ack)(struct snd_compr_stream *stream, size_t bytes); | 
|  | 120 | int (*get_caps) (struct snd_compr_stream *stream, | 
|  | 121 | struct snd_compr_caps *caps); | 
|  | 122 | int (*get_codec_caps) (struct snd_compr_stream *stream, | 
|  | 123 | struct snd_compr_codec_caps *codec); | 
|  | 124 | }; | 
|  | 125 |  | 
|  | 126 | /** | 
|  | 127 | * struct snd_compr: Compressed device | 
|  | 128 | * @name: DSP device name | 
|  | 129 | * @dev: Device pointer | 
|  | 130 | * @ops: pointer to DSP callbacks | 
|  | 131 | * @private_data: pointer to DSP pvt data | 
|  | 132 | * @card: sound card pointer | 
|  | 133 | * @direction: Playback or capture direction | 
|  | 134 | * @lock: device lock | 
|  | 135 | * @device: device id | 
|  | 136 | */ | 
|  | 137 | struct snd_compr { | 
|  | 138 | const char *name; | 
|  | 139 | struct device *dev; | 
|  | 140 | struct snd_compr_ops *ops; | 
|  | 141 | void *private_data; | 
|  | 142 | struct snd_card *card; | 
|  | 143 | unsigned int direction; | 
|  | 144 | struct mutex lock; | 
|  | 145 | int device; | 
|  | 146 | }; | 
|  | 147 |  | 
|  | 148 | /* compress device register APIs */ | 
|  | 149 | int snd_compress_register(struct snd_compr *device); | 
|  | 150 | int snd_compress_deregister(struct snd_compr *device); | 
|  | 151 | int snd_compress_new(struct snd_card *card, int device, | 
|  | 152 | int type, struct snd_compr *compr); | 
|  | 153 |  | 
|  | 154 | /* dsp driver callback apis | 
|  | 155 | * For playback: driver should call snd_compress_fragment_elapsed() to let the | 
|  | 156 | * framework know that a fragment has been consumed from the ring buffer | 
|  | 157 | * | 
|  | 158 | * For recording: we want to know when a frame is available or when | 
|  | 159 | * at least one frame is available so snd_compress_frame_elapsed() | 
|  | 160 | * callback should be called when a encodeded frame is available | 
|  | 161 | */ | 
|  | 162 | static inline void snd_compr_fragment_elapsed(struct snd_compr_stream *stream) | 
|  | 163 | { | 
|  | 164 | wake_up(&stream->runtime->sleep); | 
|  | 165 | } | 
|  | 166 |  | 
|  | 167 | #endif |