Lines Matching +full:fail +full:- +full:fast
46 __raw_writel(val, p->base + offset); in pwm_writel()
51 return __raw_readl(p->base + offset); in pwm_readl()
56 return p->base + 0x200 + index * 0x20; in pwmc_regs()
63 struct device *dev = &pwm->pdev->dev; in pwm_dumpregs()
71 "pwm ch%d - mr %08x, dty %u, prd %u, cnt %u\n", in pwm_dumpregs()
72 ch->index, in pwm_dumpregs()
81 * pwm_channel_alloc - allocate an unused PWM channel
86 * matching board-specific setup code. Returns zero or negative errno.
94 if (!pwm || !(pwm->mask & 1 << index)) in pwm_channel_alloc()
95 return -ENODEV; in pwm_channel_alloc()
98 return -EINVAL; in pwm_channel_alloc()
101 spin_lock_irqsave(&pwm->lock, flags); in pwm_channel_alloc()
102 if (pwm->channel[index]) in pwm_channel_alloc()
103 status = -EBUSY; in pwm_channel_alloc()
105 clk_enable(pwm->clk); in pwm_channel_alloc()
107 ch->regs = pwmc_regs(pwm, index); in pwm_channel_alloc()
108 ch->index = index; in pwm_channel_alloc()
110 /* REVISIT: ap7000 seems to go 2x as fast as we expect!! */ in pwm_channel_alloc()
111 ch->mck = clk_get_rate(pwm->clk); in pwm_channel_alloc()
113 pwm->channel[index] = ch; in pwm_channel_alloc()
114 pwm->handler[index] = NULL; in pwm_channel_alloc()
120 spin_unlock_irqrestore(&pwm->lock, flags); in pwm_channel_alloc()
130 return -ENODEV; in pwmcheck()
132 return -EINVAL; in pwmcheck()
133 index = ch->index; in pwmcheck()
134 if (index < 0 || index >= PWM_NCHAN || pwm->channel[index] != ch) in pwmcheck()
135 return -EINVAL; in pwmcheck()
141 * pwm_channel_free - release a previously allocated channel
145 * and made available for re-use. Returns zero, or negative errno.
152 spin_lock_irqsave(&pwm->lock, flags); in pwm_channel_free()
155 pwm->channel[t] = NULL; in pwm_channel_free()
156 pwm->handler[t] = NULL; in pwm_channel_free()
162 clk_disable(pwm->clk); in pwm_channel_free()
165 spin_unlock_irqrestore(&pwm->lock, flags); in pwm_channel_free()
177 spin_lock_irqsave(&pwm->lock, flags); in __pwm_channel_onoff()
184 spin_unlock_irqrestore(&pwm->lock, flags); in __pwm_channel_onoff()
191 * pwm_clk_alloc - allocate and configure CLKA or CLKB
205 int ret = -EBUSY; in pwm_clk_alloc()
208 return -EINVAL; in pwm_clk_alloc()
210 spin_lock_irqsave(&pwm->lock, flags); in pwm_clk_alloc()
221 spin_unlock_irqrestore(&pwm->lock, flags); in pwm_clk_alloc()
227 * pwm_clk_free - deconfigure and release CLKA or CLKB
236 spin_lock_irqsave(&pwm->lock, flags); in pwm_clk_free()
242 spin_unlock_irqrestore(&pwm->lock, flags); in pwm_clk_free()
247 * pwm_channel_handler - manage channel's IRQ handler
251 * If the handler is non-null, the handler will be called after every
261 spin_lock_irqsave(&pwm->lock, flags); in pwm_channel_handler()
264 pwm->handler[t] = handler; in pwm_channel_handler()
268 spin_unlock_irqrestore(&pwm->lock, flags); in pwm_channel_handler()
281 spin_lock(&p->lock); in pwm_irq()
290 index = ffs(irqstat) - 1; in pwm_irq()
292 ch = pwm->channel[index]; in pwm_irq()
293 handler = pwm->handler[index]; in pwm_irq()
295 spin_unlock(&p->lock); in pwm_irq()
297 spin_lock(&p->lock); in pwm_irq()
302 spin_unlock(&p->lock); in pwm_irq()
310 u32 *mp = pdev->dev.platform_data; in pwm_probe()
312 int status = -EIO; in pwm_probe()
315 return -EBUSY; in pwm_probe()
317 return -ENODEV; in pwm_probe()
318 if (*mp & ~((1<<PWM_NCHAN)-1)) { in pwm_probe()
319 dev_warn(&pdev->dev, "mask 0x%x ... more than %d channels\n", in pwm_probe()
321 return -EINVAL; in pwm_probe()
326 return -ENOMEM; in pwm_probe()
328 spin_lock_init(&p->lock); in pwm_probe()
329 p->pdev = pdev; in pwm_probe()
330 p->mask = *mp; in pwm_probe()
331 p->irq = irq; in pwm_probe()
332 p->base = ioremap(r->start, resource_size(r)); in pwm_probe()
333 if (!p->base) in pwm_probe()
334 goto fail; in pwm_probe()
335 p->clk = clk_get(&pdev->dev, "pwm_clk"); in pwm_probe()
336 if (IS_ERR(p->clk)) { in pwm_probe()
337 status = PTR_ERR(p->clk); in pwm_probe()
338 p->clk = NULL; in pwm_probe()
339 goto fail; in pwm_probe()
342 status = request_irq(irq, pwm_irq, 0, pdev->name, p); in pwm_probe()
344 goto fail; in pwm_probe()
351 fail: in pwm_probe()
352 if (p->clk) in pwm_probe()
353 clk_put(p->clk); in pwm_probe()
354 if (p->base) in pwm_probe()
355 iounmap(p->base); in pwm_probe()
366 return -EINVAL; in pwm_remove()
368 clk_enable(pwm->clk); in pwm_remove()
369 pwm_writel(pwm, PWM_DIS, (1 << PWM_NCHAN) - 1); in pwm_remove()
370 pwm_writel(pwm, PWM_IDR, (1 << PWM_NCHAN) - 1); in pwm_remove()
371 clk_disable(pwm->clk); in pwm_remove()
375 free_irq(p->irq, p); in pwm_remove()
376 clk_put(p->clk); in pwm_remove()
377 iounmap(p->base); in pwm_remove()