/* ----------------------------------------------------------------------------
 *         SAM Software Package License 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2012, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

/**
  * \file
  *
  * Implementation WM8904 driver.
  *
  */

#ifndef WM8904_H
#define WM8904_H

#include "board.h"

/*----------------------------------------------------------------------------
 *         Definitions
 *----------------------------------------------------------------------------*/
#define WM8904_CSB_STATE            (0x0 << 0)

/** Slave address */
#define WM8904_SLAVE_ADDRESS        0x1a | WM8904_CSB_STATE


/** Reset register*/
#define WM8904_REG_RESET                           0x00

/** Bias control 0 register*/
#define WM8904_REG_BIAS_CTRL0                      0x04

/** VMID control 0 register*/
#define WM8904_REG_VMID_CTRL0                      0x05

/** MIC Bias control 0 register*/
#define WM8904_REG_MICBIAS_CTRL0                   0x06

/** Bias control 1 register*/
#define WM8904_REG_BIAS_CTRL1                      0x07

/** Power management control 0 register*/
#define WM8904_REG_POWER_MANG0                     0x0C
/** Power management control 2 register*/
#define WM8904_REG_POWER_MANG2                     0x0E
/** Power management control 3 register*/
#define WM8904_REG_POWER_MANG3                     0x0F
/** Power management control 6 register*/
#define WM8904_REG_POWER_MANG6                     0x12

/** Clock rate0 register*/
#define WM8904_REG_CLOCK_RATE0                     0x14
/** Clock rate1 register*/
#define WM8904_REG_CLOCK_RATE1                     0x15

/** Clock rate2 register*/
#define WM8904_REG_CLOCK_RATE2                     0x16

/** Audio interface0 register*/
#define WM8904_REG_AUD_INF0                        0x18

/** Audio interface1 register*/
#define WM8904_REG_AUD_INF1                        0x19
/** Audio interface2 register*/
#define WM8904_REG_AUD_INF2                        0x1A
/** Audio interface3 register*/
#define WM8904_REG_AUD_INF3                        0x1B

/** ADC digital 0 register*/
#define WM8904_REG_ADC_DIG0                        0x20
/** ADC digital 1 register*/
#define WM8904_REG_ADC_DIG1                        0x21

/** Analogue left input 0 register*/
#define WM8904_REG_ANALOGUE_LIN0                   0x2C
/** Analogue right input 0 register*/
#define WM8904_REG_ANALOGUE_RIN0                   0x2D

/** Analogue left input 1 register*/
#define WM8904_REG_ANALOGUE_LIN1                   0x2E
/** Analogue right input 1 register*/
#define WM8904_REG_ANALOGUE_RIN1                   0x2F

/** Analogue left output 1 register*/
#define WM8904_REG_ANALOGUE_LOUT1                  0x39
/** Analogue right output 1 register*/
#define WM8904_REG_ANALOGUE_ROUT1                  0x3A

/** Analogue left output 2 register*/
#define WM8904_REG_ANALOGUE_LOUT2                  0x3B
/** Analogue right output 2 register*/
#define WM8904_REG_ANALOGUE_ROUT2                  0x3C

/** Analogue output 12 ZC register*/
#define WM8904_REG_ANALOGUE_OUT12ZC                0x3D

/** DC servo 0 register*/
#define WM8904_REG_DC_SERVO0                       0x43

/** Analogue HP 0 register*/
#define WM8904_REG_ANALOGUE_HP0                    0x5A

/** Charge pump 0 register*/
#define WM8904_REG_CHARGE_PUMP0                    0x62

/** Class W 0 register*/
#define WM8904_REG_CLASS0                          0x68

/** FLL control 1 register*/
#define WM8904_REG_FLL_CRTL1                       0x74
/** FLL control 2 register*/
#define WM8904_REG_FLL_CRTL2                       0x75
/** FLL control 3 register*/
#define WM8904_REG_FLL_CRTL3                       0x76
/** FLL control 4 register*/
#define WM8904_REG_FLL_CRTL4                       0x77
/** FLL control 5 register*/
#define WM8904_REG_FLL_CRTL5                       0x78

/** DUMMY register*/
#define WM8904_REG_END                             0xFF

/*----------------------------------------------------------------------------
 *         Exported functions
 *----------------------------------------------------------------------------*/

extern uint16_t WM8904_Read(Twid *pTwid, uint32_t device, uint32_t regAddr);
extern void WM8904_Write(Twid *pTwid, uint32_t device, uint32_t regAddr, uint16_t data);
extern uint8_t WM8904_Init(Twid *pTwid, uint32_t device, uint32_t PCK);
extern uint8_t WM8904_VolumeSet(Twid *pTwid,  uint32_t device, uint16_t value);
extern void WM8904_IN2R_IN1L(Twid *pTwid, uint32_t device);
#endif // WM8904_H


