/*
 * 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 <memmap.h>
#include <global.h>
#include "io.h"
#include "pwm_driver.h"
#include "galois_speed.h"

#define PWM_CHANNEL     2

struct duty_volt {
    int duty;
    int volt;
};

static struct duty_volt dv_table[] =
{
    {25, 1025},
    {50, 1000},
    {63, 975},
    {80, 950},
    {-1, -1},
};


int pwm(int volt)
{
    int pwm_freq;
    struct duty_volt *p;
    PWM_SETTINGS pwm_setting ;

    pwm_setting.En = 1;
    pwm_setting.PreScale = 1 ;
    pwm_setting.Polarity = 0 ;
    p = dv_table;
    while(p->duty != -1) {
        if(p->volt == volt)
            break;
        p++;
    }
    if(p->duty == -1)
        return -1;
    pwm_freq = GaloisGetFrequency(SOC_FREQ_CFG);
    pwm_setting.Duty = pwm_freq*p->duty/100;
    pwm_setting.Tcnt= pwm_freq;

    pwm_write_settings(PWM_CHANNEL, &pwm_setting) ;
    pwm_on_off(PWM_CHANNEL, &pwm_setting, 1) ;

    return 0;
}
