5 #include <linux/ioport.h>
6 #include <linux/kernel.h>
7 #include <linux/math64.h>
8 #include <linux/module.h>
10 #include <linux/platform_device.h>
11 #include <linux/pwm.h>
12 #include <linux/slab.h>
13 #include <linux/types.h>
14 #include <linux/spinlock.h>
15 #include <linux/of_device.h>
16 #include <linux/of_address.h>
17 #include <linux/rockchip/grf.h>
18 #include <linux/rockchip/iomap.h>
21 static int pwm_dbg_level = 0;
22 module_param_named(dbg_level, pwm_dbg_level, int, 0644);
23 #define DBG( args...) \
25 if (pwm_dbg_level) { \
34 #define PWM_REG_CNTR 0x00
35 #define PWM_REG_HRC 0x04
36 #define PWM_REG_LRC 0x08
37 #define PWM_REG_CTRL 0x0c /* PWM Control Register */
39 #define PWM_REG_PERIOD PWM_REG_HRC /* Period Register */
40 #define PWM_REG_DUTY PWM_REG_LRC /* Duty Cycle Register */
42 #define VOP_REG_CNTR 0x0C
43 #define VOP_REG_CTRL 0x00 /* VOP-PWM Control Register */
45 //#define PWM_REG_CTRL 0x0c /* Control Register */
47 #define PWM_DIV_MASK (0xf << 9)
48 #define PWM_CAPTURE (1 << 8)
49 #define PWM_RESET (1 << 7)
50 #define PWM_INTCLR (1 << 6)
51 #define PWM_INTEN (1 << 5)
52 #define PWM_SINGLE (1 << 4)
54 #define PWM_ENABLE (1 << 3)
55 #define PWM_TIMER_EN (1 << 0)
57 #define RK_PWM_DISABLE (0 << 0)
58 #define RK_PWM_ENABLE (1 << 0)
60 #define PWM_SHOT (0 << 1)
61 #define PWM_CONTINUMOUS (1 << 1)
62 #define RK_PWM_CAPTURE (1 << 2)
64 #define PWM_DUTY_POSTIVE (1 << 3)
65 #define PWM_DUTY_NEGATIVE (0 << 3)
67 #define PWM_INACTIVE_POSTIVE (1 << 4)
68 #define PWM_INACTIVE_NEGATIVE (0 << 4)
70 #define PWM_OUTPUT_LEFT (0 << 5)
71 #define PWM_OUTPUT_ENTER (1 << 5)
73 #define PWM_LP_ENABLE (1<<8)
74 #define PWM_LP_DISABLE (0<<8)
76 #define DW_PWM_PRESCALE 9
77 #define RK_PWM_PRESCALE 16
79 #define PWMCR_MIN_PRESCALE 0x00
81 #define PWMCR_MIN_PRESCALE 0x00
82 #define PWMCR_MAX_PRESCALE 0x07
84 #define PWMDCR_MIN_DUTY 0x0001
85 #define PWMDCR_MAX_DUTY 0xFFFF
87 #define PWMPCR_MIN_PERIOD 0x0001
88 #define PWMPCR_MAX_PERIOD 0xFFFF
90 static spinlock_t pwm_lock[4] = {
91 __SPIN_LOCK_UNLOCKED(pwm_lock0),
92 __SPIN_LOCK_UNLOCKED(pwm_lock1),
93 __SPIN_LOCK_UNLOCKED(pwm_lock2),
94 __SPIN_LOCK_UNLOCKED(pwm_lock3),
98 /********************************************
99 * struct rk_pwm_chip - struct representing pwm chip
101 * @base: base address of pwm chip
102 * @clk: pointer to clk structure of pwm chip
103 * @chip: linux pwm chip representation
104 *********************************************/
108 struct pwm_chip chip;
115 int (*config)(struct pwm_chip *chip,
116 struct pwm_device *pwm, int duty_ns, int period_ns);
117 void (*set_enable)(struct pwm_chip *chip, struct pwm_device *pwm,bool enable);
118 void (*pwm_suspend)(struct pwm_chip *chip, struct pwm_device *pwm);
119 void (*pwm_resume)(struct pwm_chip *chip, struct pwm_device *pwm);
123 static inline struct rk_pwm_chip *to_rk_pwm_chip(struct pwm_chip *chip)
125 return container_of(chip, struct rk_pwm_chip, chip);
128 static inline u32 rk_pwm_readl(struct rk_pwm_chip *chip, unsigned int num,
129 unsigned long offset)
131 return readl_relaxed(chip->base + (num << 4) + offset);
134 static inline void rk_pwm_writel(struct rk_pwm_chip *chip,
135 unsigned int num, unsigned long offset,
138 writel_relaxed(val, chip->base + (num << 4) + offset);
141 /* config for rockchip,pwm*/
142 static int rk_pwm_config_v1(struct pwm_chip *chip, struct pwm_device *pwm,
143 int duty_ns, int period_ns)
145 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
146 u64 val, div, clk_rate;
147 unsigned long prescale = PWMCR_MIN_PRESCALE, pv, dc;
154 lock =(&pc->lock);// &pwm_lock[pwm->hwpwm];
156 on = PWM_ENABLE | PWM_TIMER_EN;
158 * Find pv, dc and prescale to suit duty_ns and period_ns. This is done
159 * according to formulas described below:
161 * period_ns = 10^9 * (PRESCALE ) * PV / PWM_CLK_RATE
162 * duty_ns = 10^9 * (PRESCALE + 1) * DC / PWM_CLK_RATE
164 * PV = (PWM_CLK_RATE * period_ns) / (10^9 * (PRESCALE + 1))
165 * DC = (PWM_CLK_RATE * duty_ns) / (10^9 * (PRESCALE + 1))
168 clk_rate = clk_get_rate(pc->clk);
175 val = clk_rate * period_ns;
176 pv = div64_u64(val, div);
177 val = clk_rate * duty_ns;
178 dc = div64_u64(val, div);
180 /* if duty_ns and period_ns are not achievable then return */
181 if (pv < PWMPCR_MIN_PERIOD || dc < PWMDCR_MIN_DUTY)
185 * if pv and dc have crossed their upper limit, then increase
186 * prescale and recalculate pv and dc.
188 if (pv > PWMPCR_MAX_PERIOD || dc > PWMDCR_MAX_DUTY) {
189 if (++prescale > PWMCR_MAX_PRESCALE)
196 /* NOTE: the clock to PWM has to be enabled first before writing to the registers. */
199 ret = clk_enable(pc->clk);
203 spin_lock_irqsave(lock, flags);
205 conf |= (prescale << DW_PWM_PRESCALE);
207 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL,off);
209 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_HRC,dc);//0x1900);// dc);
210 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_LRC, pv);//0x5dc0);//pv);
211 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CNTR,0);
213 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL,on|conf);
215 spin_unlock_irqrestore(lock, flags);
218 static void rk_pwm_set_enable_v1(struct pwm_chip *chip, struct pwm_device *pwm, bool enable)
220 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
223 val = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_CTRL);
229 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL, val);
232 static void rk_pwm_suspend_v1(struct pwm_chip *chip, struct pwm_device *pwm)
234 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
235 pc->pwm_ctrl = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_CTRL);
236 pc->pwm_duty= rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_HRC);//0x1900);// dc);
237 pc->pwm_period = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_LRC );//0x5dc0);//pv);
238 pc->pwm_count= rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_CNTR);
240 static void rk_pwm_resume_v1(struct pwm_chip *chip, struct pwm_device *pwm)
242 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
245 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL,off);
247 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_HRC,pc->pwm_duty);//0x1900);// dc);
248 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_LRC, pc->pwm_period);//0x5dc0);//pv);
249 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CNTR,pc->pwm_count);
251 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL,pc->pwm_ctrl);
253 /* config for rockchip,pwm*/
254 static int rk_pwm_config_v2(struct pwm_chip *chip, struct pwm_device *pwm,
255 int duty_ns, int period_ns)
257 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
258 u64 val, div, clk_rate;
259 unsigned long prescale = PWMCR_MIN_PRESCALE, pv, dc;
266 lock = (&pc->lock);//&pwm_lock[pwm->hwpwm];
268 conf = PWM_OUTPUT_LEFT|PWM_LP_DISABLE|
269 PWM_CONTINUMOUS|PWM_DUTY_POSTIVE|PWM_INACTIVE_NEGATIVE;
271 * Find pv, dc and prescale to suit duty_ns and period_ns. This is done
272 * according to formulas described below:
274 * period_ns = 10^9 * (PRESCALE ) * PV / PWM_CLK_RATE
275 * duty_ns = 10^9 * (PRESCALE + 1) * DC / PWM_CLK_RATE
277 * PV = (PWM_CLK_RATE * period_ns) / (10^9 * (PRESCALE + 1))
278 * DC = (PWM_CLK_RATE * duty_ns) / (10^9 * (PRESCALE + 1))
281 clk_rate = clk_get_rate(pc->clk);
288 val = clk_rate * period_ns;
289 pv = div64_u64(val, div);
290 val = clk_rate * duty_ns;
291 dc = div64_u64(val, div);
293 /* if duty_ns and period_ns are not achievable then return */
294 if (pv < PWMPCR_MIN_PERIOD || dc < PWMDCR_MIN_DUTY)
298 * if pv and dc have crossed their upper limit, then increase
299 * prescale and recalculate pv and dc.
301 if (pv > PWMPCR_MAX_PERIOD || dc > PWMDCR_MAX_DUTY) {
302 if (++prescale > PWMCR_MAX_PRESCALE)
310 * NOTE: the clock to PWM has to be enabled first before writing to the
314 ret = clk_enable(pc->clk);
317 spin_lock_irqsave(lock, flags);
319 conf |= (prescale << RK_PWM_PRESCALE);
321 //rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL,off);
323 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_DUTY,dc);//0x1900);// dc);
324 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_PERIOD,pv);//0x5dc0);//pv);
325 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CNTR,0);
327 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL,on|conf);
328 spin_unlock_irqrestore(lock, flags);
333 static void rk_pwm_set_enable_v2(struct pwm_chip *chip, struct pwm_device *pwm,bool enable)
335 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
338 val = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_CTRL);
340 val |= RK_PWM_ENABLE;
342 val &= ~RK_PWM_ENABLE;
343 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL, val);
344 DBG("%s %d \n", __FUNCTION__, rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_CTRL));
349 static void rk_pwm_suspend_v2(struct pwm_chip *chip, struct pwm_device *pwm)
351 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
352 pc->pwm_ctrl = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_CTRL);
353 pc->pwm_duty = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_DUTY);//0x1900);// dc);
354 pc->pwm_period = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_PERIOD );//0x5dc0);//pv);
355 pc->pwm_count = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_CNTR);
357 static void rk_pwm_resume_v2(struct pwm_chip *chip, struct pwm_device *pwm)
359 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
361 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_DUTY, pc->pwm_duty);//0x1900);// dc);
362 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_PERIOD, pc->pwm_period);//0x5dc0);//pv);
363 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CNTR,pc->pwm_count);
365 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL,pc->pwm_ctrl);
367 //#define grf_readl(offset) readl_relaxed(RK_GRF_VIRT + offset)
368 //#define grf_writel(v, offset) do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0)
369 /* config for rockchip,pwm*/
370 static int rk_pwm_config_v3(struct pwm_chip *chip, struct pwm_device *pwm,
371 int duty_ns, int period_ns)
373 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
374 u64 val, div, clk_rate;
375 unsigned long prescale = PWMCR_MIN_PRESCALE, pv, dc;
382 lock = (&pc->lock);//&pwm_lock[pwm->hwpwm];
384 conf = PWM_OUTPUT_LEFT|PWM_LP_DISABLE|
385 PWM_CONTINUMOUS|PWM_DUTY_POSTIVE|PWM_INACTIVE_NEGATIVE;
387 * Find pv, dc and prescale to suit duty_ns and period_ns. This is done
388 * according to formulas described below:
390 * period_ns = 10^9 * (PRESCALE ) * PV / PWM_CLK_RATE
391 * duty_ns = 10^9 * (PRESCALE + 1) * DC / PWM_CLK_RATE
393 * PV = (PWM_CLK_RATE * period_ns) / (10^9 * (PRESCALE + 1))
394 * DC = (PWM_CLK_RATE * duty_ns) / (10^9 * (PRESCALE + 1))
397 clk_rate = clk_get_rate(pc->clk);
404 val = clk_rate * period_ns;
405 pv = div64_u64(val, div);
406 val = clk_rate * duty_ns;
407 dc = div64_u64(val, div);
409 /* if duty_ns and period_ns are not achievable then return */
410 if (pv < PWMPCR_MIN_PERIOD || dc < PWMDCR_MIN_DUTY)
414 * if pv and dc have crossed their upper limit, then increase
415 * prescale and recalculate pv and dc.
417 if (pv > PWMPCR_MAX_PERIOD || dc > PWMDCR_MAX_DUTY) {
418 if (++prescale > PWMCR_MAX_PRESCALE)
426 * NOTE: the clock to PWM has to be enabled first before writing to the
430 ret = clk_enable(pc->clk);
433 spin_lock_irqsave(lock, flags);
435 conf |= (prescale << RK_PWM_PRESCALE);
438 // rk_pwm_writel(pc, pwm->hwpwm, VOP_REG_CTRL,off);
441 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_DUTY,dc); // 2 0x1900);// dc);
442 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_PERIOD,pv); // 4 0x5dc0);//pv);
443 rk_pwm_writel(pc, pwm->hwpwm, VOP_REG_CNTR,0);
445 rk_pwm_writel(pc, pwm->hwpwm, VOP_REG_CTRL,on|conf);
447 //grf_writel(0x00030002,0x6c);
448 DBG("VOP iomux 0x%x\n", grf_readl(0x6c));
449 DBG("VOP_REG_CTRL0x%x\n", rk_pwm_readl(pc, pwm->hwpwm, VOP_REG_CTRL));
450 DBG("PWM_REG_DUTY0x%x\n", rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_DUTY));
451 DBG("PWM_REG_PERIOD 0x%x\n", rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_PERIOD));
452 DBG("VOP_REG_CNTR 0x%x\n", rk_pwm_readl(pc, pwm->hwpwm, VOP_REG_CNTR));
454 spin_unlock_irqrestore(lock, flags);
458 static void rk_pwm_set_enable_v3(struct pwm_chip *chip, struct pwm_device *pwm,bool enable)
460 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
463 val = rk_pwm_readl(pc, pwm->hwpwm, VOP_REG_CTRL);
465 val |= RK_PWM_ENABLE;
467 val &= ~RK_PWM_ENABLE;
468 rk_pwm_writel(pc, pwm->hwpwm, VOP_REG_CTRL, val);
471 static void rk_pwm_suspend_v3(struct pwm_chip *chip, struct pwm_device *pwm)
473 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
474 pc->pwm_ctrl = rk_pwm_readl(pc, pwm->hwpwm, VOP_REG_CTRL);
475 pc->pwm_duty = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_DUTY);//0x1900);// dc);
476 pc->pwm_period = rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_PERIOD );//0x5dc0);//pv);
477 pc->pwm_count = rk_pwm_readl(pc, pwm->hwpwm, VOP_REG_CNTR);
479 static void rk_pwm_resume_v3(struct pwm_chip *chip, struct pwm_device *pwm)
481 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
483 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_DUTY, pc->pwm_duty);//0x1900);// dc);
484 rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_PERIOD, pc->pwm_period);//0x5dc0);//pv);
485 rk_pwm_writel(pc, pwm->hwpwm, VOP_REG_CNTR,pc->pwm_count);
487 rk_pwm_writel(pc, pwm->hwpwm, VOP_REG_CTRL,pc->pwm_ctrl);
491 static int rk_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
492 int duty_ns, int period_ns)
494 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
497 ret = pc->config(chip, pwm, duty_ns, period_ns);
501 static int rk_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
503 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
506 rc = clk_enable(pc->clk);
510 pc->set_enable(chip, pwm,true);
514 static void rk_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
516 struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
518 pc->set_enable(chip, pwm,false);
519 clk_disable(pc->clk);
522 static const struct pwm_ops rk_pwm_ops = {
523 .config = rk_pwm_config,
524 .enable = rk_pwm_enable,
525 .disable = rk_pwm_disable,
526 .owner = THIS_MODULE,
530 int (*config)(struct pwm_chip *chip, struct pwm_device *pwm, int duty_ns, int period_ns);
531 void (*set_enable)(struct pwm_chip *chip, struct pwm_device *pwm,bool enable);
532 void (*pwm_suspend)(struct pwm_chip *chip, struct pwm_device *pwm);
533 void (*pwm_resume)(struct pwm_chip *chip, struct pwm_device *pwm);
538 static struct rk_pwm_data rk_pwm_data_v1={
539 .config = rk_pwm_config_v1,
540 .set_enable = rk_pwm_set_enable_v1,
541 .pwm_suspend = rk_pwm_suspend_v1,
542 .pwm_resume = rk_pwm_resume_v1,
546 static struct rk_pwm_data rk_pwm_data_v2={
547 .config = rk_pwm_config_v2,
548 .set_enable = rk_pwm_set_enable_v2,
549 .pwm_suspend = rk_pwm_suspend_v2,
550 .pwm_resume = rk_pwm_resume_v2,
554 static struct rk_pwm_data rk_pwm_data_v3={
555 .config = rk_pwm_config_v3,
556 .set_enable = rk_pwm_set_enable_v3,
557 .pwm_suspend = rk_pwm_suspend_v3,
558 .pwm_resume = rk_pwm_resume_v3,
562 static const struct of_device_id rk_pwm_of_match[] = {
563 { .compatible = "rockchip,pwm", .data = &rk_pwm_data_v1,},
564 { .compatible = "rockchip,rk-pwm", .data = &rk_pwm_data_v2,},
565 { .compatible = "rockchip,vop-pwm", .data = &rk_pwm_data_v3,},
569 MODULE_DEVICE_TABLE(of, rk_pwm_of_match);
570 static int rk_pwm_probe(struct platform_device *pdev)
572 const struct of_device_id *of_id =
573 of_match_device(rk_pwm_of_match, &pdev->dev);
574 struct device_node *np = pdev->dev.of_node;
575 const struct rk_pwm_data *data;
576 struct rk_pwm_chip *pc;
580 dev_err(&pdev->dev, "failed to match device\n");
583 pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL);
585 dev_err(&pdev->dev, "failed to allocate memory\n");
589 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
591 dev_err(&pdev->dev, "no memory resources defined\n");
594 pc->base = devm_ioremap_resource(&pdev->dev, r);
595 if (IS_ERR(pc->base))
596 return PTR_ERR(pc->base);
598 pc->base = of_iomap(np, 0);
599 if (IS_ERR(pc->base)){
600 printk("PWM base ERR \n");
601 return PTR_ERR(pc->base);
603 pc->clk = devm_clk_get(&pdev->dev,"pclk_pwm");
605 return PTR_ERR(pc->clk);
607 platform_set_drvdata(pdev, pc);
609 pc->config = data->config;
610 pc->set_enable = data->set_enable;
611 pc->pwm_suspend = data->pwm_suspend;
612 pc->pwm_resume = data->pwm_resume;
613 pc->chip.dev = &pdev->dev;
614 pc->chip.ops = &rk_pwm_ops;
616 pc->chip.npwm = NUM_PWM;
617 pc->lock = __SPIN_LOCK_UNLOCKED(PWM##spinlock_num);
620 ret = clk_prepare(pc->clk);
625 ret = clk_enable(pc->clk);
627 clk_unprepare(pc->clk);
630 /* Following enables PWM chip, channels would still be enabled individually through their control register */
631 DBG("npwm = %d, of_pwm_ncells =%d \n", pc->chip.npwm,pc->chip.of_pwm_n_cells);
632 ret = pwmchip_add(&pc->chip);
634 clk_unprepare(pc->clk);
635 dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret);
638 DBG("%s end \n",__FUNCTION__);
642 //(struct platform_device *, pm_message_t state);
643 static int rk_pwm_suspend(struct platform_device *pdev, pm_message_t state)
645 struct pwm_device *pwm;
646 struct rk_pwm_chip *pc;
647 struct pwm_chip *chip;
649 pc = platform_get_drvdata(pdev);
653 pc->pwm_suspend(chip,pwm);
655 return 0;//pwmchip_remove(&pc->chip);
657 static int rk_pwm_resume(struct platform_device *pdev)
659 struct pwm_device *pwm;
660 struct rk_pwm_chip *pc;
661 struct pwm_chip *chip;
663 pc = platform_get_drvdata(pdev);
667 pc->pwm_resume(chip,pwm);
668 return 0;//pwmchip_remove(&pc->chip);
671 static int rk_pwm_remove(struct platform_device *pdev)
673 return 0;//pwmchip_remove(&pc->chip);
676 static struct platform_driver rk_pwm_driver = {
679 .of_match_table = rk_pwm_of_match,
681 .probe = rk_pwm_probe,
682 .remove = rk_pwm_remove,
685 module_platform_driver(rk_pwm_driver);
687 MODULE_LICENSE("GPL");
688 MODULE_AUTHOR("<xsf@rock-chips.com>");
689 MODULE_ALIAS("platform:rk-pwm");