/*
 * 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.
 */

#define _PWM_DRIVER_C_

#include "pwm_driver.h"
#include "galois_io.h"
#include "memmap.h"
#include <pwm.h>

#define PWM_RegRead(a, pv)	GA_REG_WORD32_READ(base_addr+(a), pv) /*(*(volatile int *)(base_addr+(a)))*/
#define PWM_RegWrite(a, v)	GA_REG_WORD32_WRITE(base_addr+(a), v) /**(volatile int *)(base_addr+(a)) = (v)*/

static const int pwm_reg_offset[4] = {0, 0x10, 0x20, 0x30};

int pwm_on_off(int index, PWM_SETTINGS * pwm_settings, int on_off) {
	int base_addr = MEMMAP_PWM_REG_BASE + pwm_reg_offset[index];

	if(index < 0 || index > 3) {
		return -1;
	}

	on_off = on_off ? 1 : 0;
	PWM_RegWrite(0, on_off);

	//printf("<pwm_on_off> %d -- %d\n", index, on_off);

	pwm_settings->En = on_off;
	return 0;
}

int pwm_read_settings(int index, PWM_SETTINGS * pwm_settings) {
	int base_addr = MEMMAP_PWM_REG_BASE + pwm_reg_offset[index];
	UINT32 t[4];

	if(index < 0 || index > 3) {
		return -1;
	}

	PWM_RegRead(4, &t[1]);
	PWM_RegRead(8, &t[2]);
	PWM_RegRead(12, &t[3]);

	pwm_settings->PreScale = t[1] & 7;
	pwm_settings->Polarity = (t[1] >> 3) & 1;
	pwm_settings->Duty = t[2] & 0xffff;
	pwm_settings->Tcnt = t[3] & 0xffff;

	return 0;
} 

int pwm_write_settings(int index, PWM_SETTINGS * pwm_settings) {
	int base_addr = MEMMAP_PWM_REG_BASE + pwm_reg_offset[index];
	UINT32 t[4];

	if(index < 0 || index > 3) {
		return -1;
	}

	t[1] = (pwm_settings->PreScale & 7) | ((pwm_settings->Polarity & 1) << 3);
	t[2] = pwm_settings->Duty & 0xffff;
	t[3] = pwm_settings->Tcnt & 0xffff;

	PWM_RegWrite(4, t[1]);
	PWM_RegWrite(8, t[2]);
	PWM_RegWrite(12, t[3]);

	return 0;
}

