• Home
  • Raw
  • Download

Lines Matching +full:- +full:pwm

2  * drivers/pwm/pwm-pxa.c
4 * simple driver for PWM (Pulse Width Modulator) controller
10 * 2008-02-13 initial version
21 #include <linux/pwm.h>
29 /* PWM has_secondary_pwm? */
30 { "pxa25x-pwm", 0 },
31 { "pxa27x-pwm", HAS_SECONDARY_PWM },
32 { "pxa168-pwm", 0 },
33 { "pxa910-pwm", 0 },
38 /* PWM registers and bits definitions */
63 static int pxa_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, in pxa_pwm_config() argument
72 offset = pwm->hwpwm ? 0x10 : 0; in pxa_pwm_config()
74 c = clk_get_rate(pc->clk); in pxa_pwm_config()
81 prescale = (period_cycles - 1) / 1024; in pxa_pwm_config()
82 pv = period_cycles / (prescale + 1) - 1; in pxa_pwm_config()
85 return -EINVAL; in pxa_pwm_config()
92 /* NOTE: the clock to PWM has to be enabled first in pxa_pwm_config()
95 rc = clk_prepare_enable(pc->clk); in pxa_pwm_config()
99 writel(prescale, pc->mmio_base + offset + PWMCR); in pxa_pwm_config()
100 writel(dc, pc->mmio_base + offset + PWMDCR); in pxa_pwm_config()
101 writel(pv, pc->mmio_base + offset + PWMPCR); in pxa_pwm_config()
103 clk_disable_unprepare(pc->clk); in pxa_pwm_config()
107 static int pxa_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) in pxa_pwm_enable() argument
111 return clk_prepare_enable(pc->clk); in pxa_pwm_enable()
114 static void pxa_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) in pxa_pwm_disable() argument
118 clk_disable_unprepare(pc->clk); in pxa_pwm_disable()
130 * Device tree users must create one device instance for each PWM channel.
132 * code that this is a single channel pxa25x-pwm. Currently all devices are
136 { .compatible = "marvell,pxa250-pwm", .data = &pwm_id_table[0]},
137 { .compatible = "marvell,pxa270-pwm", .data = &pwm_id_table[0]},
138 { .compatible = "marvell,pxa168-pwm", .data = &pwm_id_table[0]},
139 { .compatible = "marvell,pxa910-pwm", .data = &pwm_id_table[0]},
151 return id ? id->data : NULL; in pxa_pwm_get_id_dt()
157 struct pwm_device *pwm; in pxa_pwm_of_xlate() local
159 pwm = pwm_request_from_chip(pc, 0, NULL); in pxa_pwm_of_xlate()
160 if (IS_ERR(pwm)) in pxa_pwm_of_xlate()
161 return pwm; in pxa_pwm_of_xlate()
163 pwm->args.period = args->args[0]; in pxa_pwm_of_xlate()
165 return pwm; in pxa_pwm_of_xlate()
171 struct pxa_pwm_chip *pwm; in pwm_probe() local
176 id = pxa_pwm_get_id_dt(&pdev->dev); in pwm_probe()
179 return -EINVAL; in pwm_probe()
181 pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL); in pwm_probe()
182 if (pwm == NULL) in pwm_probe()
183 return -ENOMEM; in pwm_probe()
185 pwm->clk = devm_clk_get(&pdev->dev, NULL); in pwm_probe()
186 if (IS_ERR(pwm->clk)) in pwm_probe()
187 return PTR_ERR(pwm->clk); in pwm_probe()
189 pwm->chip.dev = &pdev->dev; in pwm_probe()
190 pwm->chip.ops = &pxa_pwm_ops; in pwm_probe()
191 pwm->chip.base = -1; in pwm_probe()
192 pwm->chip.npwm = (id->driver_data & HAS_SECONDARY_PWM) ? 2 : 1; in pwm_probe()
195 pwm->chip.of_xlate = pxa_pwm_of_xlate; in pwm_probe()
196 pwm->chip.of_pwm_n_cells = 1; in pwm_probe()
200 pwm->mmio_base = devm_ioremap_resource(&pdev->dev, r); in pwm_probe()
201 if (IS_ERR(pwm->mmio_base)) in pwm_probe()
202 return PTR_ERR(pwm->mmio_base); in pwm_probe()
204 ret = pwmchip_add(&pwm->chip); in pwm_probe()
206 dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret); in pwm_probe()
210 platform_set_drvdata(pdev, pwm); in pwm_probe()
220 return -ENODEV; in pwm_remove()
222 return pwmchip_remove(&chip->chip); in pwm_remove()
227 .name = "pxa25x-pwm",