/*
 *  Copyright (c) 2013 Qualcomm Atheros, Inc.
 *
 *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/**
 * @brief Audio sampling rate and sample size supported 
 */

typedef enum _audio_type {
    SAMP_RATE_48k_SAMP_SIZE_16=0,    
    SAMP_RATE_48k_SAMP_SIZE_24,
    SAMP_MAX_RATE_NUM_ELEMENTS,    
} audio_type_t;

/* Keep this in sync with ATH_SUPPORT_AOW_TXSCHED 
   This sync requirement is temporary, since the AoW
   Tx scheduling feature will become permanent once it
   matures. */
#define WLAN_AOW_TXSCHED_ENABLED  1

/*
 * =====================================================================================
 *        Struct :  i2s_rx_dev
 *  Description  :  Holds I2S related function pointers
 * =====================================================================================
 */
typedef struct i2s_rx_dev {
    int (*open)(void);
    int (*close)(void);
    int (*dma_start)(int);
    int (*dma_resume)(int);
    int (*dma_pause)(void);
    int (*get_tx_sample_count)(void);
    int (*get_rx_sample_count)(void);
    int (*clk)(void);
    int (*write)(int len, const char* data);
    int (*read)(int len, const char* data);
    int (*fifo_reset)(void);
    int (*set_dsize)(u_int16_t size);
    int (*is_desc_busy)(struct file *filp);
    int (*get_used_desc_count)(void);

}i2s_rx_dev_t;


/*
 * =====================================================================================
 *       Struct:  aow_tx_dev
 *  Description:  Encapsulates the AoW Transmit node
 * =====================================================================================
 */
typedef struct aow_tx_dev {
    void (*set_audioparams)(audio_type_t audiotype);
    int (*send_data)(char *data, int len, int channel, unsigned long long tsf);
#ifdef WLAN_AOW_TXSCHED_ENABLED
    int (*dispatch_data)(void);
#endif
    unsigned int (*send_ctrl)(unsigned char *data, unsigned int len, unsigned long long tsf);
    void (*get_tsf)(unsigned long long* tsf);
}aow_tx_dev_t;    


/*
 * =====================================================================================
 *       Struct:  aow_rx_dev
 *  Description:  Encapsulates the AoW Receive node
 * =====================================================================================
 */
typedef struct aow_rx_dev {
    /* TODO: Add a function to set audio parameters, if required */
    int (*recv_data)(char *data, int len);
    int (*recv_ctrl)(char* data, int len);
    int (*set_frame_size)(unsigned int size);
    /* set_alt_setting is temporary */
    int (*set_alt_setting)(unsigned int altsetting);
    i2s_rx_dev_t i2s_ctrl;
}aow_rx_dev_t;    


/*
 * =====================================================================================
 *       Struct:  aow_dev
 *  Description:  Encapsulates the conceptual AoW device made of tx and rx
 * =====================================================================================
 */

typedef struct aow_dev {
    aow_tx_dev_t tx;
    aow_rx_dev_t rx;
}aow_dev_t;   

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  aow_register_wlan_calls_to_i2s
 *  Description:  Part of I2S API, Wlan will use this api to register it's function to
 *                I2S device
 *                WLAN device will register function to be used for informing it about
 *                audio parameters
 *                WLAN device will register transmit data function
 *                WLAN device will register dispatch data function
 *                WLAN device will register transmit ctrl function
 *                WLAN device will register get tsf function
 *
 * =====================================================================================
 */

int aow_register_wlan_calls_to_i2s(void* set_audioparams,
                                   void* tx_data,
#ifdef WLAN_AOW_TXSCHED_ENABLED
                                   void* dispatch_data,
#endif                            
                                   void* tx_ctrl,
                                   void* get_tsf);


/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  aow_register_wlan_calls_to_usb
 *  Description:  Part of USB API, Wlan will use this api to register it's function to
 *                USB device
 *                WLAN device will register function to be used for informing it about
 *                audio parameters
 *                WLAN device will register transmit data function
 *                WLAN device will register dispatch data function
 *                WLAN device will register transmit ctrl function              
 *                WLAN device will register get tsf function
 *
 * =====================================================================================
 */
int aow_register_wlan_calls_to_usb(void* set_audioparams,
                                   void* tx_data,
#ifdef WLAN_AOW_TXSCHED_ENABLED
                                   void* dispatch_data,
#endif                            
                                   void* tx_ctrl,
                                   void* get_tsf);


/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  aow_register_i2s_calls_to_wlan
 *  Description:  Part of I2S API, Wlan will use this api to register I2S functions to
 *                WLAN device
 *
 *                I2S device will register the following APIs 
 *                - open
 *                - close
 *                - start
 *                - resume
 *                - get_sample_count
 *                - pause
 *                - clk
 *                - write
 *                - read
 *                - fifo_reset
 * =====================================================================================
 */

int aow_register_i2s_calls_to_wlan(aow_dev_t* dev);


/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  aow_register_usb_calls_to_wlan
 *  Description:  Part of USB API, wlan will use this api to register USB functions to
 *                WLAN device
 *              
 *                TBD
 *
 * =====================================================================================
 */
int aow_register_usb_calls_to_wlan(void* recv_data,
                                   void* recv_ctrl,
                                   void* set_frame_size,
                                   void* set_alt_setting);

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  wlan_aow_register_calls_to_usb
 *  Description:  Part of WLAN API. Register WLAN calls to USB
 * =====================================================================================
 */

int wlan_aow_register_calls_to_usb(aow_dev_t* dev);
