370 lines
8.6 KiB
C
370 lines
8.6 KiB
C
/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef __MSM_AUDIO_MVS_H
|
|
#define __MSM_AUDIO_MVS_H
|
|
#include <linux/msm_audio.h>
|
|
#include <linux/wakelock.h>
|
|
#include <linux/pm_qos.h>
|
|
#include <mach/msm_rpcrouter.h>
|
|
#include <mach/debug_mm.h>
|
|
#include <linux/slab.h>
|
|
|
|
|
|
#define AUDIO_GET_MVS_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \
|
|
(AUDIO_MAX_COMMON_IOCTL_NUM + 0), unsigned)
|
|
#define AUDIO_SET_MVS_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \
|
|
(AUDIO_MAX_COMMON_IOCTL_NUM + 1), unsigned)
|
|
#define AUDIO_SET_SCR_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \
|
|
(AUDIO_MAX_COMMON_IOCTL_NUM + 2), unsigned)
|
|
#define AUDIO_SET_DTX_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \
|
|
(AUDIO_MAX_COMMON_IOCTL_NUM + 3), unsigned)
|
|
/* MVS modes */
|
|
#define MVS_MODE_LINEAR_PCM 9
|
|
|
|
#define MVS_PROG 0x30000014
|
|
#define MVS_VERS 0x00030001
|
|
|
|
#define MVS_CLIENT_ID_VOIP 0x00000003 /* MVS_CLIENT_VOIP */
|
|
|
|
#define MVS_ACQUIRE_PROC 4
|
|
#define MVS_ENABLE_PROC 5
|
|
#define MVS_RELEASE_PROC 6
|
|
#define MVS_SET_PCM_MODE_PROC 9
|
|
|
|
#define MVS_EVENT_CB_TYPE_PROC 1
|
|
#define MVS_PACKET_UL_FN_TYPE_PROC 2
|
|
#define MVS_PACKET_DL_FN_TYPE_PROC 3
|
|
|
|
#define MVS_CB_FUNC_ID 0xAAAABBBB
|
|
#define MVS_UL_CB_FUNC_ID 0xBBBBCCCC
|
|
#define MVS_DL_CB_FUNC_ID 0xCCCCDDDD
|
|
|
|
/* MVS frame modes */
|
|
|
|
#define MVS_FRAME_MODE_PCM_UL 13
|
|
#define MVS_FRAME_MODE_PCM_DL 14
|
|
|
|
/* MVS context */
|
|
#define MVS_PKT_CONTEXT_ISR 0x00000001
|
|
|
|
/* Max voc packet size */
|
|
#define MVS_MAX_VOC_PKT_SIZE 320
|
|
|
|
#define VOIP_MAX_Q_LEN 20
|
|
#define MVS_MAX_Q_LEN 8
|
|
#define RPC_TYPE_REQUEST 0
|
|
#define RPC_TYPE_REPLY 1
|
|
|
|
#define RPC_STATUS_FAILURE 0
|
|
#define RPC_STATUS_SUCCESS 1
|
|
#define RPC_STATUS_REJECT 1
|
|
|
|
|
|
#define RPC_COMMON_HDR_SZ (sizeof(uint32_t) * 2)
|
|
#define RPC_REQUEST_HDR_SZ (sizeof(struct rpc_request_hdr))
|
|
#define RPC_REPLY_HDR_SZ (sizeof(uint32_t) * 3)
|
|
|
|
|
|
enum audio_mvs_state_type { AUDIO_MVS_CLOSED, AUDIO_MVS_OPENED,
|
|
AUDIO_MVS_PREPARING, AUDIO_MVS_ACQUIRE, AUDIO_MVS_ENABLED,
|
|
AUDIO_MVS_CLOSING
|
|
};
|
|
|
|
enum audio_mvs_event_type { AUDIO_MVS_COMMAND, AUDIO_MVS_MODE,
|
|
AUDIO_MVS_NOTIFY
|
|
};
|
|
|
|
enum audio_mvs_cmd_status_type { AUDIO_MVS_CMD_FAILURE, AUDIO_MVS_CMD_BUSY,
|
|
AUDIO_MVS_CMD_SUCCESS
|
|
};
|
|
|
|
enum audio_mvs_mode_status_type { AUDIO_MVS_MODE_NOT_AVAIL,
|
|
AUDIO_MVS_MODE_INIT, AUDIO_MVS_MODE_READY
|
|
};
|
|
|
|
enum audio_mvs_pkt_status_type { AUDIO_MVS_PKT_NORMAL, AUDIO_MVS_PKT_FAST,
|
|
AUDIO_MVS_PKT_SLOW
|
|
};
|
|
|
|
struct rpc_audio_mvs_acquire_args {
|
|
uint32_t client_id;
|
|
uint32_t cb_func_id;
|
|
};
|
|
|
|
struct audio_mvs_acquire_msg {
|
|
struct rpc_request_hdr rpc_hdr;
|
|
struct rpc_audio_mvs_acquire_args acquire_args;
|
|
};
|
|
|
|
struct rpc_audio_mvs_enable_args {
|
|
uint32_t client_id;
|
|
uint32_t mode;
|
|
uint32_t ul_cb_func_id;
|
|
uint32_t dl_cb_func_id;
|
|
uint32_t context;
|
|
};
|
|
|
|
struct audio_mvs_enable_msg {
|
|
struct rpc_request_hdr rpc_hdr;
|
|
struct rpc_audio_mvs_enable_args enable_args;
|
|
};
|
|
|
|
struct audio_mvs_release_msg {
|
|
struct rpc_request_hdr rpc_hdr;
|
|
uint32_t client_id;
|
|
};
|
|
|
|
struct audio_mvs_set_pcm_mode_msg {
|
|
struct rpc_request_hdr rpc_hdr;
|
|
uint32_t pcm_mode;
|
|
};
|
|
|
|
struct audio_mvs_set_pcmwb_mode_msg {
|
|
struct rpc_request_hdr rpc_hdr;
|
|
uint32_t pcmwb_mode;
|
|
};
|
|
|
|
struct audio_mvs_buffer {
|
|
uint8_t *voc_pkt;
|
|
uint32_t len;
|
|
};
|
|
|
|
union audio_mvs_event_data {
|
|
struct mvs_ev_command_type {
|
|
uint32_t event;
|
|
uint32_t client_id;
|
|
uint32_t cmd_status;
|
|
} mvs_ev_command_type;
|
|
|
|
struct mvs_ev_mode_type {
|
|
uint32_t event;
|
|
uint32_t client_id;
|
|
uint32_t mode_status;
|
|
uint32_t mode;
|
|
} mvs_ev_mode_type;
|
|
|
|
struct mvs_ev_notify_type {
|
|
uint32_t event;
|
|
uint32_t client_id;
|
|
uint32_t buf_dir;
|
|
uint32_t max_frames;
|
|
} mvs_ev_notify_type;
|
|
};
|
|
|
|
struct audio_mvs_cb_func_args {
|
|
uint32_t cb_func_id;
|
|
uint32_t valid_ptr;
|
|
uint32_t event;
|
|
union audio_mvs_event_data event_data;
|
|
};
|
|
|
|
struct audio_mvs_frame_info_hdr {
|
|
uint32_t frame_mode;
|
|
uint32_t mvs_mode;
|
|
uint32_t buf_free_cnt;
|
|
};
|
|
|
|
struct audio_mvs_ul_cb_func_args {
|
|
uint32_t cb_func_id;
|
|
uint32_t pkt_len;
|
|
uint32_t voc_pkt[MVS_MAX_VOC_PKT_SIZE / 4];
|
|
|
|
uint32_t valid_ptr;
|
|
|
|
uint32_t frame_mode;
|
|
uint32_t frame_mode_ignore;
|
|
|
|
struct audio_mvs_frame_info_hdr frame_info_hdr;
|
|
|
|
uint32_t pcm_frame;
|
|
uint32_t pcm_mode;
|
|
|
|
uint32_t pkt_len_ignore;
|
|
};
|
|
|
|
struct audio_mvs_ul_reply {
|
|
struct rpc_reply_hdr reply_hdr;
|
|
uint32_t valid_pkt_status_ptr;
|
|
uint32_t pkt_status;
|
|
};
|
|
|
|
struct audio_mvs_dl_cb_func_args {
|
|
uint32_t cb_func_id;
|
|
uint32_t valid_ptr;
|
|
|
|
uint32_t frame_mode;
|
|
uint32_t frame_mode_ignore;
|
|
|
|
struct audio_mvs_frame_info_hdr frame_info_hdr;
|
|
|
|
uint32_t pcm_frame;
|
|
uint32_t pcm_mode;
|
|
|
|
};
|
|
|
|
struct audio_mvs_dl_reply {
|
|
struct rpc_reply_hdr reply_hdr;
|
|
uint32_t voc_pkt[MVS_MAX_VOC_PKT_SIZE / 4];
|
|
uint32_t valid_frame_info_ptr;
|
|
|
|
uint32_t frame_mode;
|
|
uint32_t frame_mode_again;
|
|
|
|
struct audio_mvs_frame_info_hdr frame_info_hdr;
|
|
|
|
uint32_t pcm_frame;
|
|
uint32_t pcm_mode;
|
|
|
|
uint32_t valid_pkt_status_ptr;
|
|
uint32_t pkt_status;
|
|
};
|
|
|
|
struct audio_mvs_info_type {
|
|
enum audio_mvs_state_type state;
|
|
uint32_t frame_mode;
|
|
uint32_t mvs_mode;
|
|
uint32_t buf_free_cnt;
|
|
uint32_t pcm_frame;
|
|
uint32_t pcm_mode;
|
|
uint32_t out_sample_rate;
|
|
uint32_t out_channel_mode;
|
|
uint32_t out_weight;
|
|
uint32_t out_buffer_size;
|
|
int dl_play;
|
|
struct msm_rpc_endpoint *rpc_endpt;
|
|
uint32_t rpc_prog;
|
|
uint32_t rpc_ver;
|
|
uint32_t rpc_status;
|
|
|
|
unsigned int pcm_size;
|
|
unsigned int pcm_count;
|
|
unsigned int pcm_playback_irq_pos; /* IRQ position */
|
|
unsigned int pcm_playback_buf_pos; /* position in buffer */
|
|
|
|
unsigned int pcm_capture_size;
|
|
unsigned int pcm_capture_count;
|
|
unsigned int pcm_capture_irq_pos; /* IRQ position */
|
|
unsigned int pcm_capture_buf_pos; /* position in buffer */
|
|
|
|
uint32_t samp_rate;
|
|
uint32_t channel_mode;
|
|
|
|
uint8_t *mem_chunk;
|
|
struct snd_pcm_substream *playback_substream;
|
|
struct snd_pcm_substream *capture_substream;
|
|
|
|
struct audio_mvs_buffer in[MVS_MAX_Q_LEN];
|
|
uint32_t in_read;
|
|
uint32_t in_write;
|
|
|
|
struct audio_mvs_buffer out[MVS_MAX_Q_LEN];
|
|
uint32_t out_read;
|
|
uint32_t out_write;
|
|
|
|
struct task_struct *task;
|
|
|
|
wait_queue_head_t wait;
|
|
wait_queue_head_t prepare_wait;
|
|
wait_queue_head_t out_wait;
|
|
wait_queue_head_t in_wait;
|
|
|
|
|
|
struct mutex lock;
|
|
struct mutex prepare_lock;
|
|
struct mutex in_lock;
|
|
struct mutex out_lock;
|
|
|
|
struct wake_lock suspend_lock;
|
|
struct pm_qos_request pm_qos_req;
|
|
struct timer_list timer;
|
|
unsigned long expiry;
|
|
int ack_dl_count;
|
|
int ack_ul_count;
|
|
int prepare_ack;
|
|
int playback_start;
|
|
int capture_start;
|
|
unsigned long expiry_delta;
|
|
int mvs_enable;
|
|
int playback_enable;
|
|
int capture_enable;
|
|
int instance;
|
|
|
|
};
|
|
|
|
struct audio_voip_info_type {
|
|
enum audio_mvs_state_type state;
|
|
enum audio_mvs_state_type playback_state;
|
|
enum audio_mvs_state_type capture_state;
|
|
|
|
unsigned int pcm_playback_size;
|
|
unsigned int pcm_count;
|
|
unsigned int pcm_playback_irq_pos; /* IRQ position */
|
|
unsigned int pcm_playback_buf_pos; /* position in buffer */
|
|
|
|
unsigned int pcm_capture_size;
|
|
unsigned int pcm_capture_count;
|
|
unsigned int pcm_capture_irq_pos; /* IRQ position */
|
|
unsigned int pcm_capture_buf_pos; /* position in buffer */
|
|
|
|
struct snd_pcm_substream *playback_substream;
|
|
struct snd_pcm_substream *capture_substream;
|
|
|
|
struct audio_mvs_buffer in[VOIP_MAX_Q_LEN];
|
|
uint32_t in_read;
|
|
uint32_t in_write;
|
|
|
|
struct audio_mvs_buffer out[VOIP_MAX_Q_LEN];
|
|
uint32_t out_read;
|
|
uint32_t out_write;
|
|
|
|
wait_queue_head_t out_wait;
|
|
wait_queue_head_t in_wait;
|
|
|
|
struct mutex lock;
|
|
struct mutex prepare_lock;
|
|
|
|
struct wake_lock suspend_lock;
|
|
struct pm_qos_request pm_qos_req;
|
|
int playback_start;
|
|
int capture_start;
|
|
int instance;
|
|
};
|
|
|
|
enum msm_audio_pcm_frame_type {
|
|
MVS_AMR_SPEECH_GOOD, /* Good speech frame */
|
|
MVS_AMR_SPEECH_DEGRADED, /* Speech degraded */
|
|
MVS_AMR_ONSET, /* onset */
|
|
MVS_AMR_SPEECH_BAD, /* Corrupt speech frame (bad CRC) */
|
|
MVS_AMR_SID_FIRST, /* First silence descriptor */
|
|
MVS_AMR_SID_UPDATE, /* Comfort noise frame */
|
|
MVS_AMR_SID_BAD, /* Corrupt SID frame (bad CRC) */
|
|
MVS_AMR_NO_DATA, /* Nothing to transmit */
|
|
MVS_AMR_SPEECH_LOST, /* downlink speech lost */
|
|
};
|
|
|
|
enum msm_audio_dtx_mode_type { MVS_DTX_OFF, MVS_DTX_ON
|
|
};
|
|
|
|
struct msm_audio_mvs_config {
|
|
uint32_t mvs_mode;
|
|
uint32_t bit_rate;
|
|
};
|
|
|
|
extern struct snd_soc_dai_driver msm_mvs_dais[2];
|
|
extern struct snd_soc_codec_device soc_codec_dev_msm_mvs;
|
|
extern struct snd_soc_platform_driver msm_mvs_soc_platform;
|
|
extern struct snd_soc_platform_driver msm_voip_soc_platform;
|
|
#endif /* __MSM_AUDIO_MVS_H */
|