blob: cdddd98cf569311f49a59edfb5c5afc32d99b2ac [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
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 * Qualcomm PM8XXX Pulse Width Modulation (PWM) driver
14 *
15 * The HW module is also called LPG (Light Pulse Generator).
16 */
17
18#define pr_fmt(fmt) "%s: " fmt, __func__
19
20#include <linux/module.h>
21#include <linux/platform_device.h>
22#include <linux/slab.h>
23#include <linux/err.h>
24#include <linux/debugfs.h>
25#include <linux/mfd/pm8xxx/core.h>
26#include <linux/mfd/pm8xxx/pwm.h>
27
28#define PM8XXX_LPG_BANKS 8
29#define PM8XXX_PWM_CHANNELS PM8XXX_LPG_BANKS
30
31#define PM8XXX_LPG_CTL_REGS 7
32
33/* PM8XXX PWM */
34#define SSBI_REG_ADDR_LPG_CTL_BASE 0x13C
35#define SSBI_REG_ADDR_LPG_CTL(n) (SSBI_REG_ADDR_LPG_CTL_BASE + (n))
36#define SSBI_REG_ADDR_LPG_BANK_SEL 0x143
37#define SSBI_REG_ADDR_LPG_BANK_EN 0x144
38#define SSBI_REG_ADDR_LPG_LUT_CFG0 0x145
39#define SSBI_REG_ADDR_LPG_LUT_CFG1 0x146
40
41/* Control 0 */
42#define PM8XXX_PWM_1KHZ_COUNT_MASK 0xF0
43#define PM8XXX_PWM_1KHZ_COUNT_SHIFT 4
44
45#define PM8XXX_PWM_1KHZ_COUNT_MAX 15
46
47#define PM8XXX_PWM_OUTPUT_EN 0x08
48#define PM8XXX_PWM_PWM_EN 0x04
49#define PM8XXX_PWM_RAMP_GEN_EN 0x02
50#define PM8XXX_PWM_RAMP_START 0x01
51
52#define PM8XXX_PWM_PWM_START (PM8XXX_PWM_OUTPUT_EN \
53 | PM8XXX_PWM_PWM_EN)
54#define PM8XXX_PWM_RAMP_GEN_START (PM8XXX_PWM_RAMP_GEN_EN \
55 | PM8XXX_PWM_RAMP_START)
56
57/* Control 1 */
58#define PM8XXX_PWM_REVERSE_EN 0x80
59#define PM8XXX_PWM_BYPASS_LUT 0x40
60#define PM8XXX_PWM_HIGH_INDEX_MASK 0x3F
61
62/* Control 2 */
63#define PM8XXX_PWM_LOOP_EN 0x80
64#define PM8XXX_PWM_RAMP_UP 0x40
65#define PM8XXX_PWM_LOW_INDEX_MASK 0x3F
66
67/* Control 3 */
68#define PM8XXX_PWM_VALUE_BIT7_0 0xFF
69#define PM8XXX_PWM_VALUE_BIT5_0 0x3F
70
71/* Control 4 */
72#define PM8XXX_PWM_VALUE_BIT8 0x80
73
74#define PM8XXX_PWM_CLK_SEL_MASK 0x60
75#define PM8XXX_PWM_CLK_SEL_SHIFT 5
76
77#define PM8XXX_PWM_CLK_SEL_NO 0
78#define PM8XXX_PWM_CLK_SEL_1KHZ 1
79#define PM8XXX_PWM_CLK_SEL_32KHZ 2
80#define PM8XXX_PWM_CLK_SEL_19P2MHZ 3
81
82#define PM8XXX_PWM_PREDIVIDE_MASK 0x18
83#define PM8XXX_PWM_PREDIVIDE_SHIFT 3
84
85#define PM8XXX_PWM_PREDIVIDE_2 0
86#define PM8XXX_PWM_PREDIVIDE_3 1
87#define PM8XXX_PWM_PREDIVIDE_5 2
88#define PM8XXX_PWM_PREDIVIDE_6 3
89
90#define PM8XXX_PWM_M_MASK 0x07
91#define PM8XXX_PWM_M_MIN 0
92#define PM8XXX_PWM_M_MAX 7
93
94/* Control 5 */
95#define PM8XXX_PWM_PAUSE_COUNT_HI_MASK 0xFC
96#define PM8XXX_PWM_PAUSE_COUNT_HI_SHIFT 2
97
98#define PM8XXX_PWM_PAUSE_ENABLE_HIGH 0x02
99#define PM8XXX_PWM_SIZE_9_BIT 0x01
100
101/* Control 6 */
102#define PM8XXX_PWM_PAUSE_COUNT_LO_MASK 0xFC
103#define PM8XXX_PWM_PAUSE_COUNT_LO_SHIFT 2
104
105#define PM8XXX_PWM_PAUSE_ENABLE_LOW 0x02
106#define PM8XXX_PWM_RESERVED 0x01
107
108#define PM8XXX_PWM_PAUSE_COUNT_MAX 56 /* < 2^6 = 64 */
109
110/* LUT_CFG1 */
111#define PM8XXX_PWM_LUT_READ 0x40
112
113/*
114 * PWM Frequency = Clock Frequency / (N * T)
115 * or
116 * PWM Period = Clock Period * (N * T)
117 * where
118 * N = 2^9 or 2^6 for 9-bit or 6-bit PWM size
119 * T = Pre-divide * 2^m, where m = 0..7 (exponent)
120 *
121 * This is the formula to figure out m for the best pre-divide and clock:
122 * (PWM Period / N) / 2^m = (Pre-divide * Clock Period)
123 */
124#define NUM_CLOCKS 3
125
126#define NSEC_1000HZ (NSEC_PER_SEC / 1000)
127#define NSEC_32768HZ (NSEC_PER_SEC / 32768)
128#define NSEC_19P2MHZ (NSEC_PER_SEC / 19200000)
129
130#define CLK_PERIOD_MIN NSEC_19P2MHZ
131#define CLK_PERIOD_MAX NSEC_1000HZ
132
133#define NUM_PRE_DIVIDE 3 /* No default support for pre-divide = 6 */
134
135#define PRE_DIVIDE_0 2
136#define PRE_DIVIDE_1 3
137#define PRE_DIVIDE_2 5
138
139#define PRE_DIVIDE_MIN PRE_DIVIDE_0
140#define PRE_DIVIDE_MAX PRE_DIVIDE_2
141
142static unsigned int pt_t[NUM_PRE_DIVIDE][NUM_CLOCKS] = {
143 { PRE_DIVIDE_0 * NSEC_1000HZ,
144 PRE_DIVIDE_0 * NSEC_32768HZ,
145 PRE_DIVIDE_0 * NSEC_19P2MHZ,
146 },
147 { PRE_DIVIDE_1 * NSEC_1000HZ,
148 PRE_DIVIDE_1 * NSEC_32768HZ,
149 PRE_DIVIDE_1 * NSEC_19P2MHZ,
150 },
151 { PRE_DIVIDE_2 * NSEC_1000HZ,
152 PRE_DIVIDE_2 * NSEC_32768HZ,
153 PRE_DIVIDE_2 * NSEC_19P2MHZ,
154 },
155};
156
157#define MIN_MPT ((PRE_DIVIDE_MIN * CLK_PERIOD_MIN) << PM8XXX_PWM_M_MIN)
158#define MAX_MPT ((PRE_DIVIDE_MAX * CLK_PERIOD_MAX) << PM8XXX_PWM_M_MAX)
159
160/* Private data */
161struct pm8xxx_pwm_chip;
162
163struct pwm_device {
164 int pwm_id; /* = bank/channel id */
165 int in_use;
166 const char *label;
167 int pwm_period;
168 int pwm_duty;
169 u8 pwm_ctl[PM8XXX_LPG_CTL_REGS];
170 int irq;
171 struct pm8xxx_pwm_chip *chip;
172};
173
174struct pm8xxx_pwm_chip {
175 struct pwm_device pwm_dev[PM8XXX_PWM_CHANNELS];
176 u8 bank_mask;
177 struct mutex pwm_mutex;
178 struct device *dev;
179};
180
181static struct pm8xxx_pwm_chip *pwm_chip;
182
183struct pm8xxx_pwm_config {
184 int pwm_size; /* round up to 6 or 9 for 6/9-bit PWM SIZE */
185 int clk;
186 int pre_div;
187 int pre_div_exp;
188 int pwm_value;
189 int bypass_lut;
190
191 /* LUT parameters when bypass_lut is 0 */
192 int lut_duty_ms;
193 int lut_lo_index;
194 int lut_hi_index;
195 int lut_pause_hi;
196 int lut_pause_lo;
197 int flags;
198};
199
200static const u16 duty_msec[PM8XXX_PWM_1KHZ_COUNT_MAX + 1] = {
201 0, 1, 2, 3, 4, 6, 8, 16, 18, 24, 32, 36, 64, 128, 256, 512
202};
203
204static const u16 pause_count[PM8XXX_PWM_PAUSE_COUNT_MAX + 1] = {
205 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
206 23, 28, 31, 42, 47, 56, 63, 83, 94, 111, 125, 167, 188, 222, 250, 333,
207 375, 500, 667, 750, 800, 900, 1000, 1100,
208 1200, 1300, 1400, 1500, 1600, 1800, 2000, 2500,
209 3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500,
210 7000
211};
212
213/* Internal functions */
214static int pm8xxx_pwm_bank_enable(struct pwm_device *pwm, int enable)
215{
216 int rc;
217 u8 reg;
218 struct pm8xxx_pwm_chip *chip;
219
220 chip = pwm->chip;
221
222 if (enable)
223 reg = chip->bank_mask | (1 << pwm->pwm_id);
224 else
225 reg = chip->bank_mask & ~(1 << pwm->pwm_id);
226
227 rc = pm8xxx_writeb(chip->dev->parent, SSBI_REG_ADDR_LPG_BANK_EN, reg);
228 if (rc) {
229 pr_err("pm8xxx_write(): rc=%d (Enable LPG Bank)\n", rc);
230 return rc;
231 }
232 chip->bank_mask = reg;
233
234 return 0;
235}
236
237static int pm8xxx_pwm_bank_sel(struct pwm_device *pwm)
238{
239 int rc;
240
241 rc = pm8xxx_writeb(pwm->chip->dev->parent, SSBI_REG_ADDR_LPG_BANK_SEL,
242 pwm->pwm_id);
243 if (rc)
244 pr_err("pm8xxx_write(): rc=%d (Select PWM Bank)\n", rc);
245 return rc;
246}
247
248static int pm8xxx_pwm_start(struct pwm_device *pwm, int start, int ramp_start)
249{
250 int rc;
251 u8 reg;
252
253 if (start) {
254 reg = pwm->pwm_ctl[0] | PM8XXX_PWM_PWM_START;
255 if (ramp_start)
256 reg |= PM8XXX_PWM_RAMP_GEN_START;
257 else
258 reg &= ~PM8XXX_PWM_RAMP_GEN_START;
259 } else {
260 reg = pwm->pwm_ctl[0] & ~PM8XXX_PWM_PWM_START;
261 reg &= ~PM8XXX_PWM_RAMP_GEN_START;
262 }
263
264 rc = pm8xxx_writeb(pwm->chip->dev->parent, SSBI_REG_ADDR_LPG_CTL(0),
265 reg);
266 if (rc)
267 pr_err("pm8xxx_write(): rc=%d (Enable PWM Ctl 0)\n", rc);
268 else
269 pwm->pwm_ctl[0] = reg;
270 return rc;
271}
272
273static void pm8xxx_pwm_calc_period(unsigned int period_us,
274 struct pm8xxx_pwm_config *pwm_conf)
275{
276 int n, m, clk, div;
277 int best_m, best_div, best_clk;
278 int last_err, cur_err, better_err, better_m;
279 unsigned int tmp_p, last_p, min_err, period_n;
280
281 /* PWM Period / N */
282 if (period_us < (40 * USEC_PER_SEC)) { /* ~6-bit max */
283 period_n = (period_us * NSEC_PER_USEC) >> 6;
284 n = 6;
285 } else if (period_us < (274 * USEC_PER_SEC)) { /* overflow threshold */
286 period_n = (period_us >> 6) * NSEC_PER_USEC;
287 if (period_n >= MAX_MPT) {
288 n = 9;
289 period_n >>= 3;
290 } else {
291 n = 6;
292 }
293 } else {
294 period_n = (period_us >> 9) * NSEC_PER_USEC;
295 n = 9;
296 }
297
298 min_err = MAX_MPT;
299 best_m = 0;
300 best_clk = 0;
301 best_div = 0;
302 for (clk = 0; clk < NUM_CLOCKS; clk++) {
303 for (div = 0; div < NUM_PRE_DIVIDE; div++) {
304 tmp_p = period_n;
305 last_p = tmp_p;
306 for (m = 0; m <= PM8XXX_PWM_M_MAX; m++) {
307 if (tmp_p <= pt_t[div][clk]) {
308 /* Found local best */
309 if (!m) {
310 better_err = pt_t[div][clk] -
311 tmp_p;
312 better_m = m;
313 } else {
314 last_err = last_p -
315 pt_t[div][clk];
316 cur_err = pt_t[div][clk] -
317 tmp_p;
318
319 if (cur_err < last_err) {
320 better_err = cur_err;
321 better_m = m;
322 } else {
323 better_err = last_err;
324 better_m = m - 1;
325 }
326 }
327
328 if (better_err < min_err) {
329 min_err = better_err;
330 best_m = better_m;
331 best_clk = clk;
332 best_div = div;
333 }
334 break;
335 } else {
336 last_p = tmp_p;
337 tmp_p >>= 1;
338 }
339 }
340 }
341 }
342
343 pwm_conf->pwm_size = n;
344 pwm_conf->clk = best_clk;
345 pwm_conf->pre_div = best_div;
346 pwm_conf->pre_div_exp = best_m;
347}
348
349static int pm8xxx_pwm_configure(struct pwm_device *pwm,
350 struct pm8xxx_pwm_config *pwm_conf)
351{
352 int i, rc, len;
353 u8 reg, ramp_enabled = 0;
354
355 reg = (pwm_conf->pwm_size > 6) ? PM8XXX_PWM_SIZE_9_BIT : 0;
356 pwm->pwm_ctl[5] = reg;
357
358 reg = ((pwm_conf->clk + 1) << PM8XXX_PWM_CLK_SEL_SHIFT)
359 & PM8XXX_PWM_CLK_SEL_MASK;
360 reg |= (pwm_conf->pre_div << PM8XXX_PWM_PREDIVIDE_SHIFT)
361 & PM8XXX_PWM_PREDIVIDE_MASK;
362 reg |= pwm_conf->pre_div_exp & PM8XXX_PWM_M_MASK;
363 pwm->pwm_ctl[4] = reg;
364
365 if (pwm_conf->bypass_lut) {
366 pwm->pwm_ctl[0] &= PM8XXX_PWM_PWM_START; /* keep enabled */
367 pwm->pwm_ctl[1] = PM8XXX_PWM_BYPASS_LUT;
368 pwm->pwm_ctl[2] = 0;
369
370 if (pwm_conf->pwm_size > 6) {
371 pwm->pwm_ctl[3] = pwm_conf->pwm_value
372 & PM8XXX_PWM_VALUE_BIT7_0;
373 pwm->pwm_ctl[4] |= (pwm_conf->pwm_value >> 1)
374 & PM8XXX_PWM_VALUE_BIT8;
375 } else {
376 pwm->pwm_ctl[3] = pwm_conf->pwm_value
377 & PM8XXX_PWM_VALUE_BIT5_0;
378 }
379
380 len = 6;
381 } else {
382 int pause_cnt, j;
383
384 /* Linear search for duty time */
385 for (i = 0; i < PM8XXX_PWM_1KHZ_COUNT_MAX; i++) {
386 if (duty_msec[i] >= pwm_conf->lut_duty_ms)
387 break;
388 }
389
390 ramp_enabled = pwm->pwm_ctl[0] & PM8XXX_PWM_RAMP_GEN_START;
391 pwm->pwm_ctl[0] &= PM8XXX_PWM_PWM_START; /* keep enabled */
392 pwm->pwm_ctl[0] |= (i << PM8XXX_PWM_1KHZ_COUNT_SHIFT) &
393 PM8XXX_PWM_1KHZ_COUNT_MASK;
394 pwm->pwm_ctl[1] = pwm_conf->lut_hi_index &
395 PM8XXX_PWM_HIGH_INDEX_MASK;
396 pwm->pwm_ctl[2] = pwm_conf->lut_lo_index &
397 PM8XXX_PWM_LOW_INDEX_MASK;
398
399 if (pwm_conf->flags & PM_PWM_LUT_REVERSE)
400 pwm->pwm_ctl[1] |= PM8XXX_PWM_REVERSE_EN;
401 if (pwm_conf->flags & PM_PWM_LUT_RAMP_UP)
402 pwm->pwm_ctl[2] |= PM8XXX_PWM_RAMP_UP;
403 if (pwm_conf->flags & PM_PWM_LUT_LOOP)
404 pwm->pwm_ctl[2] |= PM8XXX_PWM_LOOP_EN;
405
406 /* Pause time */
407 if (pwm_conf->flags & PM_PWM_LUT_PAUSE_HI_EN) {
408 /* Linear search for pause time */
409 pause_cnt = (pwm_conf->lut_pause_hi + duty_msec[i] / 2)
410 / duty_msec[i];
411 for (j = 0; j < PM8XXX_PWM_PAUSE_COUNT_MAX; j++) {
412 if (pause_count[j] >= pause_cnt)
413 break;
414 }
415 pwm->pwm_ctl[5] |= (j <<
416 PM8XXX_PWM_PAUSE_COUNT_HI_SHIFT) &
417 PM8XXX_PWM_PAUSE_COUNT_HI_MASK;
418 pwm->pwm_ctl[5] |= PM8XXX_PWM_PAUSE_ENABLE_HIGH;
419 }
420
421 if (pwm_conf->flags & PM_PWM_LUT_PAUSE_LO_EN) {
422 /* Linear search for pause time */
423 pause_cnt = (pwm_conf->lut_pause_lo + duty_msec[i] / 2)
424 / duty_msec[i];
425 for (j = 0; j < PM8XXX_PWM_PAUSE_COUNT_MAX; j++) {
426 if (pause_count[j] >= pause_cnt)
427 break;
428 }
429 pwm->pwm_ctl[6] = (j <<
430 PM8XXX_PWM_PAUSE_COUNT_LO_SHIFT) &
431 PM8XXX_PWM_PAUSE_COUNT_LO_MASK;
432 pwm->pwm_ctl[6] |= PM8XXX_PWM_PAUSE_ENABLE_LOW;
433 } else {
434 pwm->pwm_ctl[6] = 0;
435 }
436
437 len = 7;
438 }
439
440 pm8xxx_pwm_bank_sel(pwm);
441
442 for (i = 0; i < len; i++) {
443 rc = pm8xxx_writeb(pwm->chip->dev->parent,
444 SSBI_REG_ADDR_LPG_CTL(i),
445 pwm->pwm_ctl[i]);
446 if (rc) {
447 pr_err("pm8xxx_write(): rc=%d (PWM Ctl[%d])\n", rc, i);
448 break;
449 }
450 }
451
452 if (ramp_enabled) {
453 pwm->pwm_ctl[0] |= ramp_enabled;
454 pm8xxx_writeb(pwm->chip->dev->parent,
455 SSBI_REG_ADDR_LPG_CTL(0),
456 pwm->pwm_ctl[0]);
457 }
458
459 return rc;
460}
461
462/* APIs */
463/**
464 * pwm_request - request a PWM device
465 * @pwm_id: PWM id or channel
466 * @label: the label to identify the user
467 */
468struct pwm_device *pwm_request(int pwm_id, const char *label)
469{
470 struct pwm_device *pwm;
471
472 if (pwm_id > PM8XXX_PWM_CHANNELS || pwm_id < 0) {
473 pr_err("Invalid pwm_id: %d with %s\n",
474 pwm_id, label ? label : ".");
475 return ERR_PTR(-EINVAL);
476 }
477 if (pwm_chip == NULL) {
478 pr_err("No pwm_chip\n");
479 return ERR_PTR(-ENODEV);
480 }
481
482 mutex_lock(&pwm_chip->pwm_mutex);
483 pwm = &pwm_chip->pwm_dev[pwm_id];
484 if (!pwm->in_use) {
485 pwm->in_use = 1;
486 pwm->label = label;
487 } else {
488 pwm = ERR_PTR(-EBUSY);
489 }
490 mutex_unlock(&pwm_chip->pwm_mutex);
491
492 return pwm;
493}
494EXPORT_SYMBOL_GPL(pwm_request);
495
496/**
497 * pwm_free - free a PWM device
498 * @pwm: the PWM device
499 */
500void pwm_free(struct pwm_device *pwm)
501{
502 if (pwm == NULL || IS_ERR(pwm) || pwm->chip == NULL) {
503 pr_err("Invalid pwm handle\n");
504 return;
505 }
506
507 mutex_lock(&pwm->chip->pwm_mutex);
508 if (pwm->in_use) {
509 pm8xxx_pwm_bank_sel(pwm);
510 pm8xxx_pwm_start(pwm, 0, 0);
511
512 pwm->in_use = 0;
513 pwm->label = NULL;
514 }
515 pm8xxx_pwm_bank_enable(pwm, 0);
516 mutex_unlock(&pwm->chip->pwm_mutex);
517}
518EXPORT_SYMBOL_GPL(pwm_free);
519
520/**
521 * pwm_config - change a PWM device configuration
522 * @pwm: the PWM device
523 * @period_us: period in microseconds
524 * @duty_us: duty cycle in microseconds
525 */
526int pwm_config(struct pwm_device *pwm, int duty_us, int period_us)
527{
528 struct pm8xxx_pwm_config pwm_conf;
529 unsigned int max_pwm_value, tmp;
530 int rc;
531
532 if (pwm == NULL || IS_ERR(pwm) ||
533 duty_us > period_us ||
534 (unsigned)period_us > PM8XXX_PWM_PERIOD_MAX ||
535 (unsigned)period_us < PM8XXX_PWM_PERIOD_MIN) {
536 pr_err("Invalid pwm handle or parameters\n");
537 return -EINVAL;
538 }
539 if (pwm->chip == NULL) {
540 pr_err("No pwm_chip\n");
541 return -ENODEV;
542 }
543
544 mutex_lock(&pwm->chip->pwm_mutex);
545
546 if (!pwm->in_use) {
547 pr_err("pwm_id: %d: stale handle?\n", pwm->pwm_id);
548 rc = -EINVAL;
549 goto out_unlock;
550 }
551
552 pm8xxx_pwm_calc_period(period_us, &pwm_conf);
553
554 /* Figure out pwm_value with overflow handling */
555 if ((unsigned)period_us > (1 << pwm_conf.pwm_size)) {
556 tmp = period_us;
557 tmp >>= pwm_conf.pwm_size;
558 pwm_conf.pwm_value = (unsigned)duty_us / tmp;
559 } else {
560 tmp = duty_us;
561 tmp <<= pwm_conf.pwm_size;
562 pwm_conf.pwm_value = tmp / (unsigned)period_us;
563 }
564 max_pwm_value = (1 << pwm_conf.pwm_size) - 1;
565 if (pwm_conf.pwm_value > max_pwm_value)
566 pwm_conf.pwm_value = max_pwm_value;
567
568 pwm_conf.bypass_lut = 1;
569
570 rc = pm8xxx_pwm_configure(pwm, &pwm_conf);
571
572out_unlock:
573 mutex_unlock(&pwm->chip->pwm_mutex);
574 return rc;
575}
576EXPORT_SYMBOL_GPL(pwm_config);
577
578/**
579 * pwm_enable - start a PWM output toggling
580 * @pwm: the PWM device
581 */
582int pwm_enable(struct pwm_device *pwm)
583{
584 int rc;
585
586 if (pwm == NULL || IS_ERR(pwm)) {
587 pr_err("Invalid pwm handle\n");
588 return -EINVAL;
589 }
590 if (pwm->chip == NULL) {
591 pr_err("No pwm_chip\n");
592 return -ENODEV;
593 }
594
595 mutex_lock(&pwm->chip->pwm_mutex);
596 if (!pwm->in_use) {
597 pr_err("pwm_id: %d: stale handle?\n", pwm->pwm_id);
598 rc = -EINVAL;
599 } else {
600 rc = pm8xxx_pwm_bank_enable(pwm, 1);
601
602 pm8xxx_pwm_bank_sel(pwm);
603 pm8xxx_pwm_start(pwm, 1, 0);
604 }
605 mutex_unlock(&pwm->chip->pwm_mutex);
606 return rc;
607}
608EXPORT_SYMBOL_GPL(pwm_enable);
609
610/**
611 * pwm_disable - stop a PWM output toggling
612 * @pwm: the PWM device
613 */
614void pwm_disable(struct pwm_device *pwm)
615{
616 if (pwm == NULL || IS_ERR(pwm) || pwm->chip == NULL) {
617 pr_err("Invalid pwm handle or no pwm_chip\n");
618 return;
619 }
620
621 mutex_lock(&pwm->chip->pwm_mutex);
622 if (pwm->in_use) {
623 pm8xxx_pwm_bank_sel(pwm);
624 pm8xxx_pwm_start(pwm, 0, 0);
625
626 pm8xxx_pwm_bank_enable(pwm, 0);
627 }
628 mutex_unlock(&pwm->chip->pwm_mutex);
629}
630EXPORT_SYMBOL_GPL(pwm_disable);
631
632/**
633 * pm8xxx_pwm_lut_config - change a PWM device configuration to use LUT
634 * @pwm: the PWM device
635 * @period_us: period in microseconds
636 * @duty_pct: arrary of duty cycles in percent, like 20, 50.
637 * @duty_time_ms: time for each duty cycle in milliseconds
638 * @start_idx: start index in lookup table from 0 to MAX-1
639 * @idx_len: number of index
640 * @pause_lo: pause time in milliseconds at low index
641 * @pause_hi: pause time in milliseconds at high index
642 * @flags: control flags
643 */
644int pm8xxx_pwm_lut_config(struct pwm_device *pwm, int period_us,
645 int duty_pct[], int duty_time_ms, int start_idx,
646 int idx_len, int pause_lo, int pause_hi, int flags)
647{
648 struct pm8xxx_pwm_config pwm_conf;
649 unsigned int pwm_value, max_pwm_value;
650 u8 cfg0, cfg1;
651 int i, len;
652 int rc;
653
654 if (pwm == NULL || IS_ERR(pwm) || !idx_len) {
655 pr_err("Invalid pwm handle or idx_len=0\n");
656 return -EINVAL;
657 }
658 if (duty_pct == NULL && !(flags & PM_PWM_LUT_NO_TABLE)) {
659 pr_err("Invalid duty_pct with flag\n");
660 return -EINVAL;
661 }
662 if (pwm->chip == NULL) {
663 pr_err("No pwm_chip\n");
664 return -ENODEV;
665 }
666 if (idx_len >= PM_PWM_LUT_SIZE && start_idx) {
667 pr_err("Wrong LUT size or index\n");
668 return -EINVAL;
669 }
670 if ((start_idx + idx_len) > PM_PWM_LUT_SIZE) {
671 pr_err("Exceed LUT limit\n");
672 return -EINVAL;
673 }
674 if ((unsigned)period_us > PM8XXX_PWM_PERIOD_MAX ||
675 (unsigned)period_us < PM8XXX_PWM_PERIOD_MIN) {
676 pr_err("Period out of range\n");
677 return -EINVAL;
678 }
679
680 mutex_lock(&pwm->chip->pwm_mutex);
681
682 if (!pwm->in_use) {
683 pr_err("pwm_id: %d: stale handle?\n", pwm->pwm_id);
684 rc = -EINVAL;
685 goto out_unlock;
686 }
687
688 pm8xxx_pwm_calc_period(period_us, &pwm_conf);
689
690 len = (idx_len > PM_PWM_LUT_SIZE) ? PM_PWM_LUT_SIZE : idx_len;
691
692 if (flags & PM_PWM_LUT_NO_TABLE)
693 goto after_table_write;
694
695 max_pwm_value = (1 << pwm_conf.pwm_size) - 1;
696 for (i = 0; i < len; i++) {
697 pwm_value = (duty_pct[i] << pwm_conf.pwm_size) / 100;
698 /* Avoid overflow */
699 if (pwm_value > max_pwm_value)
700 pwm_value = max_pwm_value;
701 cfg0 = pwm_value & 0xff;
702 cfg1 = (pwm_value >> 1) & 0x80;
703 cfg1 |= start_idx + i;
704
705 pm8xxx_writeb(pwm->chip->dev->parent,
706 SSBI_REG_ADDR_LPG_LUT_CFG0, cfg0);
707 pm8xxx_writeb(pwm->chip->dev->parent,
708 SSBI_REG_ADDR_LPG_LUT_CFG1, cfg1);
709 }
710
711after_table_write:
712 pwm_conf.lut_duty_ms = duty_time_ms;
713 pwm_conf.lut_lo_index = start_idx;
714 pwm_conf.lut_hi_index = start_idx + len - 1;
715 pwm_conf.lut_pause_lo = pause_lo;
716 pwm_conf.lut_pause_hi = pause_hi;
717 pwm_conf.flags = flags;
718 pwm_conf.bypass_lut = 0;
719
720 rc = pm8xxx_pwm_configure(pwm, &pwm_conf);
721
722out_unlock:
723 mutex_unlock(&pwm->chip->pwm_mutex);
724 return rc;
725}
726EXPORT_SYMBOL_GPL(pm8xxx_pwm_lut_config);
727
728/**
729 * pm8xxx_pwm_lut_enable - control a PWM device to start/stop LUT ramp
730 * @pwm: the PWM device
731 * @start: to start (1), or stop (0)
732 */
733int pm8xxx_pwm_lut_enable(struct pwm_device *pwm, int start)
734{
735 if (pwm == NULL || IS_ERR(pwm)) {
736 pr_err("Invalid pwm handle\n");
737 return -EINVAL;
738 }
739 if (pwm->chip == NULL) {
740 pr_err("No pwm_chip\n");
741 return -ENODEV;
742 }
743
744 mutex_lock(&pwm->chip->pwm_mutex);
745 if (start) {
746 pm8xxx_pwm_bank_enable(pwm, 1);
747
748 pm8xxx_pwm_bank_sel(pwm);
749 pm8xxx_pwm_start(pwm, 1, 1);
750 } else {
751 pm8xxx_pwm_bank_sel(pwm);
752 pm8xxx_pwm_start(pwm, 0, 0);
753
754 pm8xxx_pwm_bank_enable(pwm, 0);
755 }
756 mutex_unlock(&pwm->chip->pwm_mutex);
757 return 0;
758}
759EXPORT_SYMBOL_GPL(pm8xxx_pwm_lut_enable);
760
761#if defined(CONFIG_DEBUG_FS)
762
763struct pm8xxx_pwm_dbg_device;
764
765struct pm8xxx_pwm_user {
766 int pwm_id;
767 struct pwm_device *pwm;
768 int period;
769 int duty_cycle;
770 int enable;
771 struct pm8xxx_pwm_dbg_device *dbgdev;
772};
773
774struct pm8xxx_pwm_dbg_device {
775 struct mutex dbg_mutex;
776 struct device *dev;
777 struct dentry *dent;
778
779 struct pm8xxx_pwm_user user[PM8XXX_PWM_CHANNELS];
780};
781
782static struct pm8xxx_pwm_dbg_device *pmic_dbg_device;
783
784static int dbg_pwm_check_period(int period)
785{
786 if (period < PM8XXX_PWM_PERIOD_MIN || period > PM8XXX_PWM_PERIOD_MAX) {
787 pr_err("period is invalid: %d\n", period);
788 return -EINVAL;
789 }
790 return 0;
791}
792
793static int dbg_pwm_check_duty_cycle(int duty_cycle, const char *func_name)
794{
795 if (duty_cycle <= 0 || duty_cycle > 100) {
796 pr_err("%s: duty_cycle is invalid: %d\n",
797 func_name, duty_cycle);
798 return -EINVAL;
799 }
800 return 0;
801}
802
803static void dbg_pwm_check_handle(struct pm8xxx_pwm_user *puser)
804{
805 struct pwm_device *tmp;
806
807 if (puser->pwm == NULL) {
808 tmp = pwm_request(puser->pwm_id, "pwm-dbg");
809 if (PTR_ERR(puser->pwm)) {
810 pr_err("pwm_request: err=%ld\n", PTR_ERR(puser->pwm));
811 puser->pwm = NULL;
812 }
813 }
814}
815
816static int dbg_pwm_enable_set(void *data, u64 val)
817{
818 struct pm8xxx_pwm_user *puser = data;
819 struct pm8xxx_pwm_dbg_device *dbgdev = puser->dbgdev;
820 int rc;
821
822 mutex_lock(&dbgdev->dbg_mutex);
823 rc = dbg_pwm_check_duty_cycle(puser->duty_cycle, __func__);
824 if (!rc) {
825 puser->enable = val;
826 dbg_pwm_check_handle(puser);
827 if (puser->pwm) {
828 if (puser->enable)
829 pwm_enable(puser->pwm);
830 else
831 pwm_disable(puser->pwm);
832 }
833 }
834 mutex_unlock(&dbgdev->dbg_mutex);
835 return 0;
836}
837
838static int dbg_pwm_enable_get(void *data, u64 *val)
839{
840 struct pm8xxx_pwm_user *puser = data;
841 struct pm8xxx_pwm_dbg_device *dbgdev = puser->dbgdev;
842
843 mutex_lock(&dbgdev->dbg_mutex);
844 *val = puser->enable;
845 mutex_unlock(&dbgdev->dbg_mutex);
846 return 0;
847}
848
849DEFINE_SIMPLE_ATTRIBUTE(dbg_pwm_enable_fops,
850 dbg_pwm_enable_get, dbg_pwm_enable_set,
851 "%lld\n");
852
853static int dbg_pwm_duty_cycle_set(void *data, u64 val)
854{
855 struct pm8xxx_pwm_user *puser = data;
856 struct pm8xxx_pwm_dbg_device *dbgdev = puser->dbgdev;
857 int rc;
858
859 mutex_lock(&dbgdev->dbg_mutex);
860 rc = dbg_pwm_check_duty_cycle(val, __func__);
861 if (!rc) {
862 puser->duty_cycle = val;
863 dbg_pwm_check_handle(puser);
864 if (puser->pwm) {
865 int duty_us;
866
867 duty_us = puser->duty_cycle * puser->period;
868 pwm_config(puser->pwm,
869 puser->duty_cycle, puser->period);
870 }
871 }
872 mutex_unlock(&dbgdev->dbg_mutex);
873 return 0;
874}
875
876static int dbg_pwm_duty_cycle_get(void *data, u64 *val)
877{
878 struct pm8xxx_pwm_user *puser = data;
879 struct pm8xxx_pwm_dbg_device *dbgdev = puser->dbgdev;
880
881 mutex_lock(&dbgdev->dbg_mutex);
882 *val = puser->duty_cycle;
883 mutex_unlock(&dbgdev->dbg_mutex);
884 return 0;
885}
886
887DEFINE_SIMPLE_ATTRIBUTE(dbg_pwm_duty_cycle_fops,
888 dbg_pwm_duty_cycle_get, dbg_pwm_duty_cycle_set,
889 "%lld\n");
890
891static int dbg_pwm_period_set(void *data, u64 val)
892{
893 struct pm8xxx_pwm_user *puser = data;
894 struct pm8xxx_pwm_dbg_device *dbgdev = puser->dbgdev;
895 int rc;
896
897 mutex_lock(&dbgdev->dbg_mutex);
898 rc = dbg_pwm_check_period(val);
899 if (!rc)
900 puser->period = val;
901 mutex_unlock(&dbgdev->dbg_mutex);
902 return 0;
903}
904
905static int dbg_pwm_period_get(void *data, u64 *val)
906{
907 struct pm8xxx_pwm_user *puser = data;
908 struct pm8xxx_pwm_dbg_device *dbgdev = puser->dbgdev;
909
910 mutex_lock(&dbgdev->dbg_mutex);
911 *val = puser->period;
912 mutex_unlock(&dbgdev->dbg_mutex);
913 return 0;
914}
915
916DEFINE_SIMPLE_ATTRIBUTE(dbg_pwm_period_fops,
917 dbg_pwm_period_get, dbg_pwm_period_set, "%lld\n");
918
919static int __devinit pm8xxx_pwm_dbg_probe(struct device *dev)
920{
921 struct pm8xxx_pwm_dbg_device *dbgdev;
922 struct dentry *dent;
923 struct dentry *temp;
924 struct pm8xxx_pwm_user *puser;
925 int i;
926
927 if (dev == NULL) {
928 pr_err("no parent data passed in.\n");
929 return -EINVAL;
930 }
931
932 dbgdev = kzalloc(sizeof *dbgdev, GFP_KERNEL);
933 if (dbgdev == NULL) {
934 pr_err("kzalloc() failed.\n");
935 return -ENOMEM;
936 }
937
938 mutex_init(&dbgdev->dbg_mutex);
939
940 dbgdev->dev = dev;
941
942 dent = debugfs_create_dir("pm8xxx-pwm-dbg", NULL);
943 if (dent == NULL || IS_ERR(dent)) {
944 pr_err("ERR debugfs_create_dir: dent=%p\n", dent);
945 return -ENOMEM;
946 }
947
948 dbgdev->dent = dent;
949
950 for (i = 0; i < PM8XXX_PWM_CHANNELS; i++) {
951 char pwm_ch[] = "0";
952
953 pwm_ch[0] = '0' + i;
954 dent = debugfs_create_dir(pwm_ch, dbgdev->dent);
955 if (dent == NULL || IS_ERR(dent)) {
956 pr_err("ERR: pwm=%d: dir: dent=%p\n", i, dent);
957 goto debug_error;
958 }
959
960 puser = &dbgdev->user[i];
961 puser->dbgdev = dbgdev;
962 puser->pwm_id = i;
963 temp = debugfs_create_file("period", S_IRUGO | S_IWUSR,
964 dent, puser, &dbg_pwm_period_fops);
965 if (temp == NULL || IS_ERR(temp)) {
966 pr_err("ERR: pwm=%d: period: dent=%p\n", i, dent);
967 goto debug_error;
968 }
969
970 temp = debugfs_create_file("duty-cycle", S_IRUGO | S_IWUSR,
971 dent, puser, &dbg_pwm_duty_cycle_fops);
972 if (temp == NULL || IS_ERR(temp)) {
973 pr_err("ERR: pwm=%d: duty-cycle: dent=%p\n", i, dent);
974 goto debug_error;
975 }
976
977 temp = debugfs_create_file("enable", S_IRUGO | S_IWUSR,
978 dent, puser, &dbg_pwm_enable_fops);
979 if (temp == NULL || IS_ERR(temp)) {
980 pr_err("ERR: pwm=%d: enable: dent=%p\n", i, dent);
981 goto debug_error;
982 }
983 }
984
985 pmic_dbg_device = dbgdev;
986
987 return 0;
988
989debug_error:
990 debugfs_remove_recursive(dbgdev->dent);
991 return -ENOMEM;
992}
993
994static int __devexit pm8xxx_pwm_dbg_remove(void)
995{
996 if (pmic_dbg_device) {
997 debugfs_remove_recursive(pmic_dbg_device->dent);
998 kfree(pmic_dbg_device);
999 }
1000 return 0;
1001}
1002
1003#else
1004
1005static int __devinit pm8xxx_pwm_dbg_probe(struct device *dev)
1006{
1007 return 0;
1008}
1009
1010static int __devexit pm8xxx_pwm_dbg_remove(void)
1011{
1012 return 0;
1013}
1014
1015#endif
1016
1017static int __devinit pm8xxx_pwm_probe(struct platform_device *pdev)
1018{
1019 struct pm8xxx_pwm_chip *chip;
1020 int i;
1021
1022 chip = kzalloc(sizeof *chip, GFP_KERNEL);
1023 if (chip == NULL) {
1024 pr_err("kzalloc() failed.\n");
1025 return -ENOMEM;
1026 }
1027
1028 for (i = 0; i < PM8XXX_PWM_CHANNELS; i++) {
1029 chip->pwm_dev[i].pwm_id = i;
1030 chip->pwm_dev[i].chip = chip;
1031 }
1032
1033 mutex_init(&chip->pwm_mutex);
1034
1035 chip->dev = &pdev->dev;
1036 pwm_chip = chip;
1037 platform_set_drvdata(pdev, chip);
1038
1039 if (pm8xxx_pwm_dbg_probe(&pdev->dev) < 0)
1040 pr_err("could not set up debugfs\n");
1041
1042 pr_notice("OK\n");
1043 return 0;
1044}
1045
1046static int __devexit pm8xxx_pwm_remove(struct platform_device *pdev)
1047{
1048 struct pm8xxx_pwm_chip *chip = dev_get_drvdata(pdev->dev.parent);
1049
1050 pm8xxx_pwm_dbg_remove();
1051 mutex_destroy(&chip->pwm_mutex);
1052 platform_set_drvdata(pdev, NULL);
1053 kfree(chip);
1054 return 0;
1055}
1056
1057static struct platform_driver pm8xxx_pwm_driver = {
1058 .probe = pm8xxx_pwm_probe,
1059 .remove = __devexit_p(pm8xxx_pwm_remove),
1060 .driver = {
1061 .name = PM8XXX_PWM_DEV_NAME,
1062 .owner = THIS_MODULE,
1063 },
1064};
1065
1066static int __init pm8xxx_pwm_init(void)
1067{
1068 return platform_driver_register(&pm8xxx_pwm_driver);
1069}
1070
1071static void __exit pm8xxx_pwm_exit(void)
1072{
1073 platform_driver_unregister(&pm8xxx_pwm_driver);
1074}
1075
1076subsys_initcall(pm8xxx_pwm_init);
1077module_exit(pm8xxx_pwm_exit);
1078
1079MODULE_LICENSE("GPL v2");
1080MODULE_DESCRIPTION("PM8XXX PWM driver");
1081MODULE_VERSION("1.0");
1082MODULE_ALIAS("platform:" PM8XXX_PWM_DEV_NAME);