/*
 *  This file is part of FH8620 BSP for RT-Thread distribution.
 *
 *	Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd. 
 *	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 as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  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.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 *	Visit http://www.fullhan.com to get contact with Fullhan.
 *
 * Change Logs:
 * Date           Author       Notes
 */
 
#ifndef ACW_H_
#define ACW_H_
#include <rtthread.h>
#include <rtdevice.h>
#ifdef RT_USING_DFS
#include <dfs_fs.h>
#endif
#include <rthw.h>
#define ACW_CAP_DMA_CHAN 2
#define ACW_PLY_DMA_CHAN 3
typedef unsigned long long dma_addr_t;
struct scatterlist {
#ifdef CONFIG_DEBUG_SG
	unsigned long	sg_magic;
#endif
	unsigned long	page_link;
	unsigned int	offset;
	unsigned int	length;
	dma_addr_t	dma_address;
#ifdef CONFIG_NEED_SG_DMA_LENGTH
	unsigned int	dma_length;
#endif
};
#define readl(a)          (*(volatile rt_uint32_t   *)(a))
#define rkqueue_struct		rt_workqueue
#define work_struct				rt_work
#define INIT_WORK(work,func)	rt_work_init(work,func,RT_NULL);
#define queue_work				rt_workqueue_dowork


//timer
#define timer_list				rt_timer
#define wait_queue_head_t				struct rt_event
#define init_waitqueue_head(event_t) 		rt_event_init(event_t, "audio_event", RT_IPC_FLAG_FIFO)
typedef enum{
	AC_SR_8K   = 8000,
	AC_SR_16K  = 16000,
	AC_SR_32K  = 32000,
	AC_SR_441K = 44100,
	AC_SR_48K  = 48000,
} FH_AC_SAMPLE_RATE_E;

typedef enum{
	AC_BW_8  = 8,
	AC_BW_16 = 16,
	AC_BW_24 = 24,
} FH_AC_BIT_WIDTH_E;

enum io_select{
	mic_in = 0,
	line_in = 1,
	speaker_out = 2,
	line_out = 3,
};

struct fh_audio_cfg_arg{
	enum io_select io_type;
	int volume;
	int rate;
	int frame_bit;
	int channels;
	int buffer_size;
	int period_size;
};
typedef struct{
	unsigned int len;
	unsigned char *data;
}FH_AC_FRAME_S;

typedef enum{
	FH_AC_MIC_IN = 0,
	FH_AC_LINE_IN = 1,
	FH_AC_SPK_OUT = 2,
	FH_AC_LINE_OUT = 3
}FH_AC_IO_TYPE_E;


typedef struct {
	FH_AC_IO_TYPE_E io_type;
	FH_AC_SAMPLE_RATE_E sample_rate;
	FH_AC_BIT_WIDTH_E bit_width;
	unsigned int channels;
	unsigned int period_size;
	unsigned int volume;
} FH_AC_CONFIG;

struct device_dma_parameters {
	/*
	 * a low level driver may set these to teach IOMMU code about
	 * sg limitations.
	 */
	unsigned int max_segment_size;
	unsigned long segment_boundary_mask;
};

struct list_head {
    struct list_head *next;
    struct list_head *prev;
};
struct dma_coherent_mem {
	void		*virt_base;
	dma_addr_t	device_base;
	int		size;
	int		flags;
	unsigned long	*bitmap;
};
struct device_acw{
	unsigned long long		*dma_mask;	/* dma mask (if dma'able device) */
	unsigned long long		coherent_dma_mask;/* Like dma_mask, but for
					     alloc_coherent mappings as
					     not all hardware supports
					     64 bit addresses for consistent
					     allocations such descriptors. */
	struct device_dma_parameters *dma_parms;

	struct list_head	dma_pools;

	struct dma_coherent_mem	*dma_mem;
};
#define false 0
#define true  1



#define	AC_INIT_CAPTURE_MEM    	    0x10
#define	AC_INIT_PLAYBACK_MEM        0x11


#define AC_SET_VOL                  0x12
#define AC_SET_INPUT_MODE           0x13
#define AC_SET_OUTPUT_MODE          0x14


#define AC_AI_EN                    0x15
#define AC_AO_EN                    0x16
#define AC_AI_DISABLE               0x17
#define AC_AO_DISABLE       		0x18
#define AC_AI_PAUSE               	0x19
#define AC_AI_RESUME          		0x1a
#define AC_AO_PAUSE              	0x1b
#define AC_AO_RESUME          		0x1c
#define AC_MIC_BOOST          		0x1d

#define POLLIN		0x001		/* There is data to read.  */
#define POLLPRI		0x002		/* There is urgent data to read.  */
#define POLLOUT		0x004		/* Writing now will not block.  */


/* These values are defined in XPG4.2.  */
# define POLLRDNORM	0x040		/* Normal data may be read.  */
# define POLLRDBAND	0x080		/* Priority data may be read.  */
# define POLLWRNORM	0x100		/* Writing now will not block.  */
# define POLLWRBAND	0x200		/* Priority data may be written.  */



/* These are extensions for Linux.  */
# define POLLMSG	0x400
# define POLLREMOVE	0x1000
# define POLLRDHUP	0x2000


/* Event types always implicitly polled for.  These bits need not be set in
   `events', but they will appear in `revents' to indicate the status of
   the file descriptor.  */
#define POLLERR		0x008		/* Error condition.  */
#define POLLHUP		0x010		/* Hung up.  */
#define POLLNVAL	0x020		/* Invalid polling request.  */

#define	EPERM		 1	/* Operation not permitted */
#define	ENOENT		 2	/* No such file or directory */
#define	ESRCH		 3	/* No such process */
#define	EINTR		 4	/* Interrupted system call */
#define	EIO		 5	/* I/O error */
#define	ENXIO		 6	/* No such device or address */
#define	E2BIG		 7	/* Argument list too long */
#define	ENOEXEC		 8	/* Exec format error */
#define	EBADF		 9	/* Bad file number */
#define	ECHILD		10	/* No child processes */
#define	EAGAIN		11	/* Try again */
#define	ENOMEM		12	/* Out of memory */
#define	EACCES		13	/* Permission denied */
#define	EFAULT		14	/* Bad address */
#define	ENOTBLK		15	/* Block device required */
#define	EBUSY		16	/* Device or resource busy */
#define	EEXIST		17	/* File exists */
#define	EXDEV		18	/* Cross-device link */
#define	ENODEV		19	/* No such device */
#define	ENOTDIR		20	/* Not a directory */
#define	EISDIR		21	/* Is a directory */
#define	EINVAL		22	/* Invalid argument */
#define	ENFILE		23	/* File table overflow */
#define	EMFILE		24	/* Too many open files */
#define	ENOTTY		25	/* Not a typewriter */
#define	ETXTBSY		26	/* Text file busy */
#define	EFBIG		27	/* File too large */
#define	ENOSPC		28	/* No space left on device */
#define	ESPIPE		29	/* Illegal seek */
#define	EROFS		30	/* Read-only file system */
#define	EMLINK		31	/* Too many links */
#define	EPIPE		32	/* Broken pipe */
#define	EDOM		33	/* Math argument out of domain of func */
#define	ERANGE		34	/* Math result not representable */
extern void  fh_audio_init(void);
extern void fh_acw_test();
#endif