/*
 * Copyright (C) 2018 Synaptics Incorporated. 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 as
 * published by the Free Software Foundation.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

#include "Galois_memmap.h"
#include "global.h"
#include "pinmux.h"
#include "gpio.h"
#include "io.h"
#include "SysMgr.h"
#include "apbRegBase.h"

#include "board_config.h"

#include "util.h"
#include "lgpl_printf.h"

#define	RA_SET_BITS_GENERIC(ra_base, ra_name, ra_class, bf_name, val) \
	io32_set_bits(ra_base + RA_##ra_name, val, LSb32##ra_class##_##bf_name, b##ra_class##_##bf_name)

#define	RA_SET_BITS_SIMPLE(ra_base, ra_name, bf_name, val) RA_SET_BITS_GENERIC(ra_base, ra_name, ra_name, bf_name, val)

#define	SOC_SET_PINMUX(ra_name, bf_name, val) RA_SET_BITS_GENERIC(MEMMAP_CHIP_CTRL_REG_BASE, ra_name, Gbl_pinMuxCntlBus, bf_name, val)
#define	SM_SET_PINMUX(ra_name, bf_name, val) RA_SET_BITS_GENERIC(SOC_SM_SYS_CTRL_REG_BASE, ra_name, smSysCtl_smPinMuxCntlBus, bf_name, val)

void pin_init(void)
{
	GPIO_PortSetInOut(5, 1); //TOUCH_IRQ_L Input, active low
	GPIO_PortSetInOut(11, 1); //MIC_MUTE_STATUS Input, active high
	GPIO_PortWrite(17, 0); //AMP_EN Output, active high, default=inactive low
	GPIO_PortSetInOut(41, 1); //PP1350_DDR_FB_33 HiZ, default=HiZ
	GPIO_PortWrite(63, 0); //WLAN_EN Output, active high, default=inactive low

	// reset the peripherals for 20ms, no i2c commands allowed during the reset pulse
	// Set PER_RST_L output low
	GPIO_PortWrite(4, 0);
	// Wait 20ms
	berlin_delay_us(20000);
	// Set PER_RST_L output high
	GPIO_PortWrite(4, 1);

	// enable WLAN and amplifier
	// Set WLAN_EN output high
	GPIO_PortWrite(63, 1);

	// Enable SDIO internal pull up
	RA_SET_BITS_SIMPLE(MEMMAP_CHIP_CTRL_REG_BASE, Gbl_SD0_DAT0Cntl, PUEN, 1);
	RA_SET_BITS_SIMPLE(MEMMAP_CHIP_CTRL_REG_BASE, Gbl_SD0_DAT1Cntl, PUEN, 1);
	RA_SET_BITS_SIMPLE(MEMMAP_CHIP_CTRL_REG_BASE, Gbl_SD0_CLKCntl, PUEN, 1);
	RA_SET_BITS_SIMPLE(MEMMAP_CHIP_CTRL_REG_BASE, Gbl_SD0_DAT2Cntl, PUEN, 1);
	RA_SET_BITS_SIMPLE(MEMMAP_CHIP_CTRL_REG_BASE, Gbl_SD0_DAT3Cntl, PUEN, 1);
	RA_SET_BITS_SIMPLE(MEMMAP_CHIP_CTRL_REG_BASE, Gbl_SD0_CMDCntl, PUEN, 1);
	RA_SET_BITS_SIMPLE(MEMMAP_CHIP_CTRL_REG_BASE, Gbl_SD0_CDnCntl, PUEN, 1);
	RA_SET_BITS_SIMPLE(MEMMAP_CHIP_CTRL_REG_BASE, Gbl_SD0_WPCntl, PUEN, 1);

	// end of low level initialisation
}

