/* Copyright (c) 2009-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 QDSP5AUDRECCMDI_H
#define QDSP5AUDRECCMDI_H

/*
 * AUDRECTASK COMMANDS
 * ARM uses 2 queues to communicate with the AUDRECTASK
 * 1.uPAudRec[i]CmdQueue, where i=0,1,2
 * Location :MEMC
 * Buffer Size : 5
 * No of Buffers in a queue : 2
 * 2.uPAudRec[i]BitstreamQueue, where i=0,1,2
 * Location : MEMC
 * Buffer Size : 5
 * No of buffers in a queue : 3
 */

/*
 * Commands on uPAudRec[i]CmdQueue, where i=0,1,2
 */

/*
 * Command to configure memory for enabled encoder
 */

#define AUDREC_CMD_MEM_CFG_CMD 0x0000
#define AUDREC_CMD_ARECMEM_CFG_LEN	\
	sizeof(struct audrec_cmd_arecmem_cfg)

struct audrec_cmd_arecmem_cfg {
	unsigned short cmd_id;
	unsigned short audrec_up_pkt_intm_count;
	unsigned short audrec_ext_pkt_start_addr_msw;
	unsigned short audrec_ext_pkt_start_addr_lsw;
	unsigned short audrec_ext_pkt_buf_number;
} __attribute__((packed));

/*
 * Command to configure pcm input memory
 */

#define AUDREC_CMD_PCM_CFG_ARM_TO_ENC 0x0001
#define AUDREC_CMD_PCM_CFG_ARM_TO_ENC_LEN	\
	sizeof(struct audrec_cmd_pcm_cfg_arm_to_enc)

struct audrec_cmd_pcm_cfg_arm_to_enc {
	unsigned short cmd_id;
	unsigned short config_update_flag;
	unsigned short enable_flag;
	unsigned short sampling_freq;
	unsigned short channels;
	unsigned short frequency_of_intimation;
	unsigned short max_number_of_buffers;
} __attribute__((packed));

#define AUDREC_PCM_CONFIG_UPDATE_FLAG_ENABLE -1
#define AUDREC_PCM_CONFIG_UPDATE_FLAG_DISABLE 0

#define AUDREC_ENABLE_FLAG_VALUE -1
#define AUDREC_DISABLE_FLAG_VALUE 0

/*
 * Command to intimate available pcm buffer
 */

#define AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC 0x0002
#define AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC_LEN \
  sizeof(struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc)

struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc {
	unsigned short cmd_id;
	unsigned short num_buffers;
	unsigned short buffer_write_cnt_msw;
	unsigned short buffer_write_cnt_lsw;
	unsigned short buf_address_length[8];/*this array holds address
						and length details of
						two buffers*/
} __attribute__((packed));

/*
 * Command to flush
 */

#define AUDREC_CMD_FLUSH 0x0003
#define AUDREC_CMD_FLUSH_LEN	\
	sizeof(struct audrec_cmd_flush)

struct audrec_cmd_flush {
	unsigned short cmd_id;
} __attribute__((packed));

/*
 * Commands on uPAudRec[i]BitstreamQueue, where i=0,1,2
 */

/*
 * Command to indicate current packet read count
 */

#define UP_AUDREC_PACKET_EXT_PTR 0x0000
#define UP_AUDREC_PACKET_EXT_PTR_LEN	\
	sizeof(up_audrec_packet_ext_ptr)

struct up_audrec_packet_ext_ptr {
	unsigned short cmd_id;
	unsigned short audrec_up_curr_read_count_lsw;
	unsigned short audrec_up_curr_read_count_msw;
} __attribute__((packed));

#endif /* QDSP5AUDRECCMDI_H */
