| Duy Truong | e833aca | 2013-02-12 13:35:08 -0800 | [diff] [blame] | 1 | /* Copyright (c) 2010, The Linux Foundation. All rights reserved. | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2 | * | 
|  | 3 | * This program is free software; you can redistribute it and/or modify | 
|  | 4 | * it under the terms of the GNU General Public License version 2 and | 
|  | 5 | * only version 2 as published by the Free Software Foundation. | 
|  | 6 | * | 
|  | 7 | * This program is distributed in the hope that it will be useful, | 
|  | 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 10 | * GNU General Public License for more details. | 
|  | 11 | * | 
|  | 12 | */ | 
|  | 13 | #ifndef __PMIC8058_PWM_H__ | 
|  | 14 | #define __PMIC8058_PWM_H__ | 
|  | 15 |  | 
|  | 16 | /* The MAX value is computation limit. Hardware limit is 393 seconds. */ | 
|  | 17 | #define	PM_PWM_PERIOD_MAX		(274 * USEC_PER_SEC) | 
|  | 18 | /* The MIN value is hardware limit. */ | 
|  | 19 | #define	PM_PWM_PERIOD_MIN		7 /* micro seconds */ | 
|  | 20 |  | 
|  | 21 | struct pm8058_pwm_pdata { | 
|  | 22 | int 	(*config)(struct pwm_device *pwm, int ch, int on); | 
|  | 23 | int 	(*enable)(struct pwm_device *pwm, int ch, int on); | 
|  | 24 | }; | 
|  | 25 |  | 
|  | 26 | #define	PM_PWM_LUT_SIZE			64 | 
|  | 27 | #define	PM_PWM_LUT_DUTY_TIME_MAX	512	/* ms */ | 
|  | 28 | #define	PM_PWM_LUT_PAUSE_MAX		(7000 * PM_PWM_LUT_DUTY_TIME_MAX) | 
|  | 29 |  | 
|  | 30 | /* Flags for Look Up Table */ | 
|  | 31 | #define	PM_PWM_LUT_LOOP		0x01 | 
|  | 32 | #define	PM_PWM_LUT_RAMP_UP	0x02 | 
|  | 33 | #define	PM_PWM_LUT_REVERSE	0x04 | 
|  | 34 | #define	PM_PWM_LUT_PAUSE_HI_EN	0x10 | 
|  | 35 | #define	PM_PWM_LUT_PAUSE_LO_EN	0x20 | 
|  | 36 |  | 
|  | 37 | #define	PM_PWM_LUT_NO_TABLE	0x100 | 
|  | 38 |  | 
|  | 39 | /* PWM LED ID */ | 
|  | 40 | #define	PM_PWM_LED_0		0 | 
|  | 41 | #define	PM_PWM_LED_1		1 | 
|  | 42 | #define	PM_PWM_LED_2		2 | 
|  | 43 | #define	PM_PWM_LED_KPD		3 | 
|  | 44 | #define	PM_PWM_LED_FLASH	4 | 
|  | 45 | #define	PM_PWM_LED_FLASH1	5 | 
|  | 46 |  | 
|  | 47 | /* PWM LED configuration mode */ | 
|  | 48 | #define	PM_PWM_CONF_NONE	0x0 | 
|  | 49 | #define	PM_PWM_CONF_PWM1	0x1 | 
|  | 50 | #define	PM_PWM_CONF_PWM2	0x2 | 
|  | 51 | #define	PM_PWM_CONF_PWM3	0x3 | 
|  | 52 | #define	PM_PWM_CONF_DTEST1	0x4 | 
|  | 53 | #define	PM_PWM_CONF_DTEST2	0x5 | 
|  | 54 | #define	PM_PWM_CONF_DTEST3	0x6 | 
|  | 55 | #define	PM_PWM_CONF_DTEST4	0x7 | 
|  | 56 |  | 
| Willie Ruan | d3337ed | 2011-07-04 23:16:22 -0700 | [diff] [blame] | 57 | /** | 
|  | 58 | * PWM frequency/period control | 
|  | 59 | * | 
|  | 60 | * PWM Frequency = ClockFrequency / (N * T) | 
|  | 61 | *   or | 
|  | 62 | * PWM Period = Clock Period * (N * T) | 
|  | 63 | *   where | 
|  | 64 | * N = 2^9 or 2^6 for 9-bit or 6-bit PWM size | 
|  | 65 | * T = Pre-divide * 2^m, m = 0..7 (exponent) | 
|  | 66 | * | 
|  | 67 | */ | 
|  | 68 |  | 
|  | 69 | enum pm_pwm_size { | 
|  | 70 | PM_PWM_SIZE_6BIT =	6, | 
|  | 71 | PM_PWM_SIZE_9BIT =	9, | 
|  | 72 | }; | 
|  | 73 |  | 
|  | 74 | enum pm_pwm_clk { | 
|  | 75 | PM_PWM_CLK_1KHZ, | 
|  | 76 | PM_PWM_CLK_32KHZ, | 
|  | 77 | PM_PWM_CLK_19P2MHZ, | 
|  | 78 | }; | 
|  | 79 |  | 
|  | 80 | enum pm_pwm_pre_div { | 
|  | 81 | PM_PWM_PDIV_2, | 
|  | 82 | PM_PWM_PDIV_3, | 
|  | 83 | PM_PWM_PDIV_5, | 
|  | 84 | PM_PWM_PDIV_6, | 
|  | 85 | }; | 
|  | 86 |  | 
| Willie Ruan | 368db79 | 2011-07-05 08:09:58 -0700 | [diff] [blame] | 87 | /** | 
|  | 88 | * struct pm8058_pwm_period - PWM period structure | 
|  | 89 | * @pwm_size: enum pm_pwm_size | 
|  | 90 | * @clk: enum pm_pwm_clk | 
|  | 91 | * @pre_div: enum pm_pwm_pre_div | 
|  | 92 | * @pre_div_exp: exponent of 2 as part of pre-divider: 0..7 | 
|  | 93 | */ | 
| Willie Ruan | d3337ed | 2011-07-04 23:16:22 -0700 | [diff] [blame] | 94 | struct pm8058_pwm_period { | 
|  | 95 | enum pm_pwm_size	pwm_size; | 
|  | 96 | enum pm_pwm_clk		clk; | 
|  | 97 | enum pm_pwm_pre_div	pre_div; | 
| Willie Ruan | 368db79 | 2011-07-05 08:09:58 -0700 | [diff] [blame] | 98 | int			pre_div_exp; | 
| Willie Ruan | d3337ed | 2011-07-04 23:16:22 -0700 | [diff] [blame] | 99 | }; | 
|  | 100 |  | 
| Willie Ruan | 368db79 | 2011-07-05 08:09:58 -0700 | [diff] [blame] | 101 | /** | 
|  | 102 | * pm8058_pwm_config_period - change PWM period | 
|  | 103 | * | 
|  | 104 | * @pwm: the PWM device | 
|  | 105 | * @pwm_p: period in struct pm8058_pwm_period | 
|  | 106 | */ | 
|  | 107 | int pm8058_pwm_config_period(struct pwm_device *pwm, | 
|  | 108 | struct pm8058_pwm_period *pwm_p); | 
|  | 109 |  | 
|  | 110 | /** | 
|  | 111 | * pm8058_pwm_config_duty_cycle - change PWM duty cycle | 
|  | 112 | * | 
|  | 113 | * @pwm: the PWM device | 
|  | 114 | * @pwm_value: the duty cycle in raw PWM value (< 2^pwm_size) | 
|  | 115 | */ | 
|  | 116 | int pm8058_pwm_config_duty_cycle(struct pwm_device *pwm, int pwm_value); | 
|  | 117 |  | 
|  | 118 | /** | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 119 | * pm8058_pwm_lut_config - change a PWM device configuration to use LUT | 
|  | 120 | * | 
|  | 121 | * @pwm: the PWM device | 
|  | 122 | * @period_us: period in micro second | 
|  | 123 | * @duty_pct: arrary of duty cycles in percent, like 20, 50. | 
|  | 124 | * @duty_time_ms: time for each duty cycle in millisecond | 
|  | 125 | * @start_idx: start index in lookup table from 0 to MAX-1 | 
|  | 126 | * @idx_len: number of index | 
|  | 127 | * @pause_lo: pause time in millisecond at low index | 
|  | 128 | * @pause_hi: pause time in millisecond at high index | 
|  | 129 | * @flags: control flags | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 130 | */ | 
|  | 131 | int pm8058_pwm_lut_config(struct pwm_device *pwm, int period_us, | 
|  | 132 | int duty_pct[], int duty_time_ms, int start_idx, | 
|  | 133 | int len, int pause_lo, int pause_hi, int flags); | 
|  | 134 |  | 
| Willie Ruan | 368db79 | 2011-07-05 08:09:58 -0700 | [diff] [blame] | 135 | /** | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 136 | * pm8058_pwm_lut_enable - control a PWM device to start/stop LUT ramp | 
|  | 137 | * | 
|  | 138 | * @pwm: the PWM device | 
|  | 139 | * @start: to start (1), or stop (0) | 
|  | 140 | */ | 
|  | 141 | int pm8058_pwm_lut_enable(struct pwm_device *pwm, int start); | 
|  | 142 |  | 
|  | 143 | int pm8058_pwm_set_dtest(struct pwm_device *pwm, int enable); | 
|  | 144 |  | 
|  | 145 | int pm8058_pwm_config_led(struct pwm_device *pwm, int id, | 
|  | 146 | int mode, int max_current); | 
|  | 147 |  | 
|  | 148 | #endif /* __PMIC8058_PWM_H__ */ |