Lines Matching refs:ddata
61 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip); in pwm_sifive_request() local
63 mutex_lock(&ddata->lock); in pwm_sifive_request()
64 ddata->user_count++; in pwm_sifive_request()
65 mutex_unlock(&ddata->lock); in pwm_sifive_request()
72 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip); in pwm_sifive_free() local
74 mutex_lock(&ddata->lock); in pwm_sifive_free()
75 ddata->user_count--; in pwm_sifive_free()
76 mutex_unlock(&ddata->lock); in pwm_sifive_free()
80 static void pwm_sifive_update_clock(struct pwm_sifive_ddata *ddata, in pwm_sifive_update_clock() argument
94 scale_pow = div64_ul(ddata->approx_period * (u64)rate, NSEC_PER_SEC); in pwm_sifive_update_clock()
99 writel(val, ddata->regs + PWM_SIFIVE_PWMCFG); in pwm_sifive_update_clock()
103 ddata->real_period = div64_ul(num, rate); in pwm_sifive_update_clock()
104 dev_dbg(ddata->chip.dev, in pwm_sifive_update_clock()
105 "New real_period = %u ns\n", ddata->real_period); in pwm_sifive_update_clock()
111 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip); in pwm_sifive_get_state() local
114 duty = readl(ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm)); in pwm_sifive_get_state()
118 val = readl(ddata->regs + PWM_SIFIVE_PWMCFG); in pwm_sifive_get_state()
122 state->period = ddata->real_period; in pwm_sifive_get_state()
124 (u64)duty * ddata->real_period >> PWM_SIFIVE_CMPWIDTH; in pwm_sifive_get_state()
133 struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip); in pwm_sifive_apply() local
162 mutex_lock(&ddata->lock); in pwm_sifive_apply()
163 if (state->period != ddata->approx_period) { in pwm_sifive_apply()
170 if (ddata->user_count != 1 && ddata->approx_period) { in pwm_sifive_apply()
171 mutex_unlock(&ddata->lock); in pwm_sifive_apply()
174 ddata->approx_period = state->period; in pwm_sifive_apply()
175 pwm_sifive_update_clock(ddata, clk_get_rate(ddata->clk)); in pwm_sifive_apply()
177 mutex_unlock(&ddata->lock); in pwm_sifive_apply()
185 ret = clk_enable(ddata->clk); in pwm_sifive_apply()
187 dev_err(ddata->chip.dev, "Enable clk failed\n"); in pwm_sifive_apply()
192 writel(frac, ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm)); in pwm_sifive_apply()
195 clk_disable(ddata->clk); in pwm_sifive_apply()
212 struct pwm_sifive_ddata *ddata = in pwm_sifive_clock_notifier() local
216 mutex_lock(&ddata->lock); in pwm_sifive_clock_notifier()
217 pwm_sifive_update_clock(ddata, ndata->new_rate); in pwm_sifive_clock_notifier()
218 mutex_unlock(&ddata->lock); in pwm_sifive_clock_notifier()
227 struct pwm_sifive_ddata *ddata; in pwm_sifive_probe() local
233 ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); in pwm_sifive_probe()
234 if (!ddata) in pwm_sifive_probe()
237 mutex_init(&ddata->lock); in pwm_sifive_probe()
238 chip = &ddata->chip; in pwm_sifive_probe()
243 ddata->regs = devm_platform_ioremap_resource(pdev, 0); in pwm_sifive_probe()
244 if (IS_ERR(ddata->regs)) in pwm_sifive_probe()
245 return PTR_ERR(ddata->regs); in pwm_sifive_probe()
247 ddata->clk = devm_clk_get(dev, NULL); in pwm_sifive_probe()
248 if (IS_ERR(ddata->clk)) in pwm_sifive_probe()
249 return dev_err_probe(dev, PTR_ERR(ddata->clk), in pwm_sifive_probe()
252 ret = clk_prepare_enable(ddata->clk); in pwm_sifive_probe()
258 val = readl(ddata->regs + PWM_SIFIVE_PWMCFG); in pwm_sifive_probe()
263 val = readl(ddata->regs + PWM_SIFIVE_PWMCMP(i)); in pwm_sifive_probe()
273 ret = clk_enable(ddata->clk); in pwm_sifive_probe()
281 clk_disable(ddata->clk); in pwm_sifive_probe()
286 ddata->notifier.notifier_call = pwm_sifive_clock_notifier; in pwm_sifive_probe()
287 ret = clk_notifier_register(ddata->clk, &ddata->notifier); in pwm_sifive_probe()
299 platform_set_drvdata(pdev, ddata); in pwm_sifive_probe()
305 clk_notifier_unregister(ddata->clk, &ddata->notifier); in pwm_sifive_probe()
308 clk_disable(ddata->clk); in pwm_sifive_probe()
311 clk_unprepare(ddata->clk); in pwm_sifive_probe()
318 struct pwm_sifive_ddata *ddata = platform_get_drvdata(dev); in pwm_sifive_remove() local
322 pwmchip_remove(&ddata->chip); in pwm_sifive_remove()
323 clk_notifier_unregister(ddata->clk, &ddata->notifier); in pwm_sifive_remove()
325 for (ch = 0; ch < ddata->chip.npwm; ch++) { in pwm_sifive_remove()
326 pwm = &ddata->chip.pwms[ch]; in pwm_sifive_remove()
328 clk_disable(ddata->clk); in pwm_sifive_remove()
331 clk_unprepare(ddata->clk); in pwm_sifive_remove()