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

#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;
}

