/*
 * board.h
 *
 * (C) Copyright 2016
 * Heiko Schocher, DENX Software Engineering, hs@denx.de.
 *
 * Based on:
 * TI AM335x boards information header
 *
 * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#ifndef _BOARD_H_
#define _BOARD_H_

/* Definition to control the GPIOs (for LEDs and Reset) */
#define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))

static inline int board_is_b_sample(void)
{
#if defined CONFIG_B_SAMPLE
	return 1;
#else
	return 0;
#endif
}

static inline int board_is_c_sample(void)
{
#if defined CONFIG_C_SAMPLE
	return 1;
#else
	return 0;
#endif
}

static inline int board_is_c3_sample(void)
{
#if defined CONFIG_C3_SAMPLE
	return 1;
#else
	return 0;
#endif
}

static inline int board_is_series(void)
{
#if defined CONFIG_SERIES
	return 1;
#else
	return 0;
#endif
}

/*
 * Definitions for pinmuxing header and Board ID strings
 */
#if defined CONFIG_B_SAMPLE
# define BOARD_ID_STR "SHC B-Sample\n"
#elif defined CONFIG_B2_SAMPLE
# define BOARD_ID_STR "SHC B2-Sample\n"
#elif defined CONFIG_C_SAMPLE
# if defined(CONFIG_SHC_NETBOOT)
#  define BOARD_ID_STR "#### NETBOOT ####\nSHC C-Sample\n"
# elif defined(CONFIG_SHC_SDBOOT)
#  define BOARD_ID_STR "#### SDBOOT ####\nSHC C-Sample\n"
# else
#  define BOARD_ID_STR "SHC C-Sample\n"
# endif
#elif defined CONFIG_C2_SAMPLE
# if defined(CONFIG_SHC_ICT)
#  define BOARD_ID_STR "#### ICT ####\nSHC C2-Sample\n"
# elif defined(CONFIG_SHC_NETBOOT)
#  define BOARD_ID_STR "#### NETBOOT ####\nSHC C2-Sample\n"
# elif defined(CONFIG_SHC_SDBOOT)
#  define BOARD_ID_STR "#### SDBOOT ####\nSHC C2-Sample\n"
# else
#  define BOARD_ID_STR "SHC C2-Sample\n"
# endif
#elif defined CONFIG_C3_SAMPLE
# if defined(CONFIG_SHC_ICT)
#  define BOARD_ID_STR "#### ICT ####\nSHC C3-Sample\n"
# elif defined(CONFIG_SHC_NETBOOT)
#  define BOARD_ID_STR "#### NETBOOT ####\nSHC C3-Sample\n"
# elif defined(CONFIG_SHC_SDBOOT)
#  define BOARD_ID_STR "#### SDBOOT ####\nSHC C3-Sample\n"
# else
#  define BOARD_ID_STR "SHC C3-Sample\n"
# endif
#elif defined CONFIG_SERIES
# if defined(CONFIG_SHC_ICT)
#  define BOARD_ID_STR "#### ICT ####\nSHC\n"
# elif defined(CONFIG_SHC_NETBOOT)
#  define BOARD_ID_STR "#### NETBOOT ####\nSHC\n"
# elif defined(CONFIG_SHC_SDBOOT)
#  define BOARD_ID_STR "#### SDBOOT ####\nSHC\n"
# else
#  define BOARD_ID_STR "SHC\n"
# endif
#else
# define BOARD_ID_STR "Unknown device!\n"
#endif

/*
 * Definitions for GPIO pin assignments
 */
#if defined CONFIG_B_SAMPLE

# define LED_PWR_BL_GPIO   GPIO_TO_PIN(1, 17)
# define LED_PWR_RD_GPIO   GPIO_TO_PIN(1, 18)
# define LED_PWR_GN_GPIO   GPIO_TO_PIN(1, 19)
# define LED_CONN_BL_GPIO  GPIO_TO_PIN(0, 26)
# define LED_CONN_RD_GPIO  GPIO_TO_PIN(0, 22)
# define LED_CONN_GN_GPIO  GPIO_TO_PIN(0, 23)
# define RESET_GPIO        GPIO_TO_PIN(1, 29)
# define WIFI_REGEN_GPIO   GPIO_TO_PIN(1, 16)
# define WIFI_RST_GPIO     GPIO_TO_PIN(0, 27)
# define ZIGBEE_RST_GPIO   GPIO_TO_PIN(3, 18)
# define BIDCOS_RST_GPIO   GPIO_TO_PIN(0, 12)
# define ENOC_RST_GPIO     GPIO_TO_PIN(1, 22)

#else

# define LED_PWR_BL_GPIO   GPIO_TO_PIN(0, 22)
# define LED_PWR_RD_GPIO   GPIO_TO_PIN(0, 23)
# define LED_LAN_BL_GPIO   GPIO_TO_PIN(1, 17)
# define LED_LAN_RD_GPIO   GPIO_TO_PIN(0, 26)
# define LED_CLOUD_BL_GPIO GPIO_TO_PIN(1, 18)
# define LED_CLOUD_RD_GPIO GPIO_TO_PIN(2, 2)
# define LED_PWM_GPIO      GPIO_TO_PIN(1, 19)
# define RESET_GPIO        GPIO_TO_PIN(1, 29)
# define WIFI_REGEN_GPIO   GPIO_TO_PIN(1, 16)
# define WIFI_RST_GPIO     GPIO_TO_PIN(0, 27)
# define ZIGBEE_RST_GPIO   GPIO_TO_PIN(3, 18)
# define BIDCOS_RST_GPIO   GPIO_TO_PIN(1, 24)
# define Z_WAVE_RST_GPIO   GPIO_TO_PIN(1, 21)
# define ENOC_RST_GPIO     GPIO_TO_PIN(1, 22)

#endif

#define BACK_BUTTON_GPIO    GPIO_TO_PIN(1, 29)
#define FRONT_BUTTON_GPIO   GPIO_TO_PIN(1, 25)

/* Reset is on GPIO pin 29 of GPIO bank 1 */
#define RESET_MASK	(0x1 << 29)

#define HDR_MAGIC	0x43485342
#define HDR_ETH_ALEN	6
#define HDR_NAME_LEN	8
#define HDR_REV_LEN	8
#define HDR_SER_LEN	16
#define HDR_ROOT_LEN	12
#define HDR_FATC_LEN	12

/*
* SHC parameters held in On-Board I²C EEPROM device.
*
* Header Format
*
*  Name     Size   Contents
*-------------------------------------------------------------
*  Magic     4     0x42 0x53 0x48 0x43  [BSHC]
*
*  Version   2     0x0100 for v1.0
*
*  Lenght    2     The length of the complete structure, not only this header
*
*  Eth-MAC   6     Ethernet MAC Address
*                  SHC Pool: 7C:AC:B2:00:10:01 - TBD
*
*  --- Further values follow, not important for Bootloader ---
*/

struct  shc_eeprom {
	u32  magic;
	u16  version;
	u16  lenght;
	uint8_t mac_addr[HDR_ETH_ALEN];
};

void enable_uart0_pin_mux(void);
void enable_shc_board_pin_mux(void);
void enable_shc_board_pwm_pin_mux(void);

#endif
