Lines Matching refs:ddata

61 	struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
63 mutex_lock(&ddata->lock);
64 ddata->user_count++;
65 mutex_unlock(&ddata->lock);
72 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
74 mutex_lock(&ddata->lock);
75 ddata->user_count--;
76 mutex_unlock(&ddata->lock);
79 /* Called holding ddata->lock */
80 static void pwm_sifive_update_clock(struct pwm_sifive_ddata *ddata,
94 scale_pow = div64_ul(ddata->approx_period * (u64)rate, NSEC_PER_SEC);
99 writel(val, ddata->regs + PWM_SIFIVE_PWMCFG);
103 ddata->real_period = div64_ul(num, rate);
104 dev_dbg(ddata->chip.dev,
105 "New real_period = %u ns\n", ddata->real_period);
111 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
114 duty = readl(ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm));
118 val = readl(ddata->regs + PWM_SIFIVE_PWMCFG);
122 state->period = ddata->real_period;
124 (u64)duty * ddata->real_period >> PWM_SIFIVE_CMPWIDTH;
130 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
134 ret = clk_enable(ddata->clk);
136 dev_err(ddata->chip.dev, "Enable clk failed\n");
142 clk_disable(ddata->clk);
150 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
161 ret = clk_enable(ddata->clk);
163 dev_err(ddata->chip.dev, "Enable clk failed\n");
185 mutex_lock(&ddata->lock);
186 if (state->period != ddata->approx_period) {
193 if (ddata->user_count != 1 && ddata->approx_period) {
194 mutex_unlock(&ddata->lock);
198 ddata->approx_period = state->period;
199 pwm_sifive_update_clock(ddata, clk_get_rate(ddata->clk));
201 mutex_unlock(&ddata->lock);
203 writel(frac, ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm));
209 clk_disable(ddata->clk);
225 struct pwm_sifive_ddata *ddata =
229 mutex_lock(&ddata->lock);
230 pwm_sifive_update_clock(ddata, ndata->new_rate);
231 mutex_unlock(&ddata->lock);
240 struct pwm_sifive_ddata *ddata;
247 ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
248 if (!ddata)
251 mutex_init(&ddata->lock);
252 chip = &ddata->chip;
261 ddata->regs = devm_ioremap_resource(dev, res);
262 if (IS_ERR(ddata->regs))
263 return PTR_ERR(ddata->regs);
265 ddata->clk = devm_clk_get(dev, NULL);
266 if (IS_ERR(ddata->clk))
267 return dev_err_probe(dev, PTR_ERR(ddata->clk),
270 ret = clk_prepare_enable(ddata->clk);
276 val = readl(ddata->regs + PWM_SIFIVE_PWMCFG);
281 val = readl(ddata->regs + PWM_SIFIVE_PWMCMP(i));
291 ret = clk_enable(ddata->clk);
299 clk_disable(ddata->clk);
304 ddata->notifier.notifier_call = pwm_sifive_clock_notifier;
305 ret = clk_notifier_register(ddata->clk, &ddata->notifier);
317 platform_set_drvdata(pdev, ddata);
323 clk_notifier_unregister(ddata->clk, &ddata->notifier);
326 clk_disable(ddata->clk);
329 clk_unprepare(ddata->clk);
336 struct pwm_sifive_ddata *ddata = platform_get_drvdata(dev);
340 pwmchip_remove(&ddata->chip);
341 clk_notifier_unregister(ddata->clk, &ddata->notifier);
343 for (ch = 0; ch < ddata->chip.npwm; ch++) {
344 pwm = &ddata->chip.pwms[ch];
346 clk_disable(ddata->clk);
349 clk_unprepare(ddata->clk);