Lines Matching refs:ddata

62 	struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
64 mutex_lock(&ddata->lock);
65 ddata->user_count++;
66 mutex_unlock(&ddata->lock);
73 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
75 mutex_lock(&ddata->lock);
76 ddata->user_count--;
77 mutex_unlock(&ddata->lock);
80 /* Called holding ddata->lock */
81 static void pwm_sifive_update_clock(struct pwm_sifive_ddata *ddata,
95 scale_pow = div64_ul(ddata->approx_period * (u64)rate, NSEC_PER_SEC);
100 writel(val, ddata->regs + PWM_SIFIVE_PWMCFG);
104 ddata->real_period = div64_ul(num, rate);
105 dev_dbg(ddata->chip.dev,
106 "New real_period = %u ns\n", ddata->real_period);
112 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
115 duty = readl(ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm));
119 val = readl(ddata->regs + PWM_SIFIVE_PWMCFG);
123 state->period = ddata->real_period;
125 (u64)duty * ddata->real_period >> PWM_SIFIVE_CMPWIDTH;
134 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
163 mutex_lock(&ddata->lock);
164 if (state->period != ddata->approx_period) {
171 if (ddata->user_count != 1 && ddata->approx_period) {
172 mutex_unlock(&ddata->lock);
175 ddata->approx_period = state->period;
176 pwm_sifive_update_clock(ddata, clk_get_rate(ddata->clk));
178 mutex_unlock(&ddata->lock);
186 ret = clk_enable(ddata->clk);
188 dev_err(ddata->chip.dev, "Enable clk failed\n");
193 writel(frac, ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm));
196 clk_disable(ddata->clk);
213 struct pwm_sifive_ddata *ddata =
217 mutex_lock(&ddata->lock);
218 pwm_sifive_update_clock(ddata, ndata->new_rate);
219 mutex_unlock(&ddata->lock);
228 struct pwm_sifive_ddata *ddata;
234 ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
235 if (!ddata)
238 mutex_init(&ddata->lock);
239 chip = &ddata->chip;
244 ddata->regs = devm_platform_ioremap_resource(pdev, 0);
245 if (IS_ERR(ddata->regs))
246 return PTR_ERR(ddata->regs);
248 ddata->clk = devm_clk_get_prepared(dev, NULL);
249 if (IS_ERR(ddata->clk))
250 return dev_err_probe(dev, PTR_ERR(ddata->clk),
253 ret = clk_enable(ddata->clk);
259 val = readl(ddata->regs + PWM_SIFIVE_PWMCFG);
264 val = readl(ddata->regs + PWM_SIFIVE_PWMCMP(i));
274 ret = clk_enable(ddata->clk);
282 clk_disable(ddata->clk);
287 ddata->notifier.notifier_call = pwm_sifive_clock_notifier;
288 ret = clk_notifier_register(ddata->clk, &ddata->notifier);
300 platform_set_drvdata(pdev, ddata);
306 clk_notifier_unregister(ddata->clk, &ddata->notifier);
309 clk_disable(ddata->clk);
318 struct pwm_sifive_ddata *ddata = platform_get_drvdata(dev);
322 pwmchip_remove(&ddata->chip);
323 clk_notifier_unregister(ddata->clk, &ddata->notifier);
325 for (ch = 0; ch < ddata->chip.npwm; ch++) {
326 pwm = &ddata->chip.pwms[ch];
328 clk_disable(ddata->clk);