| /* |
| * 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; |
| } |
| |