/********************************************************************************
 * Marvell GPL License Option
 *
 * If you received this File from Marvell, you may opt to use, redistribute and/or
 * modify this File in accordance with the terms and conditions of the General
 * Public License Version 2, June 1991 (the "GPL License"), a copy of which is
 * available along with the File in the license.txt file or by writing to the Free
 * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
 * on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
 *
 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
 * DISCLAIMED.  The GPL License provides additional details about this warranty
 * disclaimer.
 ******************************************************************************/

#include <memmap.h>
#include <global.h>
#include <io.h>
#include "lgpl_printf.h"

#define OPT_ADDR    (0xF7CC0000 + 0x06A0)
#define BIND_INFO2_0  0x0130
#define BIND_INFO2_1  0x0134
#define BIND_INFO1_0  0x0138
#define BIND_INFO1_1  0x013C

#if defined(PWM)
extern int pwm(int volt);
#elif defined(ONEWIRE)
extern int GpioOneWireVoltCtrl(int vout);
#endif

struct leakage_table {
    int info;
    int volt;
};

static struct leakage_table l_table [] =
{
    {1724, 950},
    {1488, 975},
    {1264, 1000},
    {0,    1025},
    {-1, -1},
};

unsigned int get_leakage_info()
{
    return (readl(OPT_ADDR + BIND_INFO1_1)>>8) & 0xFF;
}

static int IS_A0()
{
    return (readl(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_ProductId_ext) == 0xA0) &&
            (!(readl(0xF7CC0000 + 0x06A0 + 0x0134) & 0x40000000));
}

static int IS_A1()
{
    return (readl(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_ProductId_ext) == 0xA0) &&
            (readl(0xF7CC0000 + 0x06A0 + 0x0134) & 0x40000000);
}

void pv_comp()
{
    int leakage_info;
    struct leakage_table *p;

    leakage_info = 16*get_leakage_info();

    lgpl_printf("leakage info %d.\n", leakage_info);
    p = l_table;
    while(p->info != -1) {
        if(p->info <= leakage_info)
            break;
        p++;
    }
    if(p->info == -1) {
        lgpl_printf("leakage info is not found in leakage table.\n");
		return;
    }

	if (IS_A0() || IS_A1())
		p->volt = 960;

    lgpl_printf("set voltage to %d.\n", p->volt);

#if defined(PWM)
	if(pwm(p->volt))
		lgpl_printf("pv compensation failed.\n");
#elif defined(ONEWIRE)
	GpioOneWireVoltCtrl(p->volt);
#else
#error "PV compensation mothod is not supportted."
#endif
}
