Lines Matching +full:num +full:- +full:cs
1 // SPDX-License-Identifier: GPL-2.0
9 #include <linux/clk-provider.h>
20 #include <dt-bindings/clock/ingenic,sysost.h>
79 struct clocksource cs; member
96 const struct ingenic_ost_clk_info *info = ost_clk->info; in ingenic_ost_percpu_timer_recalc_rate()
99 prescale = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_percpu_timer_recalc_rate()
110 const struct ingenic_ost_clk_info *info = ost_clk->info; in ingenic_ost_global_timer_recalc_rate()
113 prescale = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_global_timer_recalc_rate()
149 const struct ingenic_ost_clk_info *info = ost_clk->info; in ingenic_ost_percpu_timer_set_rate()
153 val = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_percpu_timer_set_rate()
155 writel(val, ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_percpu_timer_set_rate()
164 const struct ingenic_ost_clk_info *info = ost_clk->info; in ingenic_ost_global_timer_set_rate()
168 val = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_global_timer_set_rate()
170 writel(val, ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_global_timer_set_rate()
218 count = readl(ost->base + OST_REG_OST2CNTL); in ingenic_ost_global_timer_read_cntl()
223 static u64 notrace ingenic_ost_clocksource_read(struct clocksource *cs) in ingenic_ost_clocksource_read() argument
237 writel(OSTECR_OST1ENC, ost->base + OST_REG_OSTECR); in ingenic_ost_cevt_set_state_shutdown()
247 writel((u32)~OSTFR_FFLAG, ost->base + OST_REG_OSTFR); in ingenic_ost_cevt_set_next()
248 writel(next, ost->base + OST_REG_OST1DFR); in ingenic_ost_cevt_set_next()
249 writel(OSTCR_OST1CLR, ost->base + OST_REG_OSTCR); in ingenic_ost_cevt_set_next()
250 writel(OSTESR_OST1ENS, ost->base + OST_REG_OSTESR); in ingenic_ost_cevt_set_next()
251 writel((u32)~OSTMR_FMASK, ost->base + OST_REG_OSTMR); in ingenic_ost_cevt_set_next()
261 writel(OSTECR_OST1ENC, ost->base + OST_REG_OSTECR); in ingenic_ost_cevt_cb()
263 if (evt->event_handler) in ingenic_ost_cevt_cb()
264 evt->event_handler(evt); in ingenic_ost_cevt_cb()
278 return -ENOMEM; in ingenic_ost_register_clock()
280 ost_clk->hw.init = &info->init_data; in ingenic_ost_register_clock()
281 ost_clk->idx = idx; in ingenic_ost_register_clock()
282 ost_clk->info = info; in ingenic_ost_register_clock()
283 ost_clk->ost = ost; in ingenic_ost_register_clock()
286 val = readl(ost->base + info->ostccr_reg); in ingenic_ost_register_clock()
288 writel(val, ost->base + info->ostccr_reg); in ingenic_ost_register_clock()
290 err = clk_hw_register(NULL, &ost_clk->hw); in ingenic_ost_register_clock()
296 clocks->hws[idx] = &ost_clk->hw; in ingenic_ost_register_clock()
319 ost->percpu_timer_clk = ingenic_ost_get_clock(np, channel); in ingenic_ost_percpu_timer_init()
320 if (IS_ERR(ost->percpu_timer_clk)) in ingenic_ost_percpu_timer_init()
321 return PTR_ERR(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
323 err = clk_prepare_enable(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
327 rate = clk_get_rate(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
329 err = -EINVAL; in ingenic_ost_percpu_timer_init()
335 err = -EINVAL; in ingenic_ost_percpu_timer_init()
339 snprintf(ost->name, sizeof(ost->name), "OST percpu timer"); in ingenic_ost_percpu_timer_init()
342 ost->name, &ost->cevt); in ingenic_ost_percpu_timer_init()
346 ost->cevt.cpumask = cpumask_of(smp_processor_id()); in ingenic_ost_percpu_timer_init()
347 ost->cevt.features = CLOCK_EVT_FEAT_ONESHOT; in ingenic_ost_percpu_timer_init()
348 ost->cevt.name = ost->name; in ingenic_ost_percpu_timer_init()
349 ost->cevt.rating = 400; in ingenic_ost_percpu_timer_init()
350 ost->cevt.set_state_shutdown = ingenic_ost_cevt_set_state_shutdown; in ingenic_ost_percpu_timer_init()
351 ost->cevt.set_next_event = ingenic_ost_cevt_set_next; in ingenic_ost_percpu_timer_init()
353 clockevents_config_and_register(&ost->cevt, rate, 4, 0xffffffff); in ingenic_ost_percpu_timer_init()
360 clk_disable_unprepare(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
362 clk_put(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
370 struct clocksource *cs = &ost->cs; in ingenic_ost_global_timer_init() local
374 ost->global_timer_clk = ingenic_ost_get_clock(np, channel); in ingenic_ost_global_timer_init()
375 if (IS_ERR(ost->global_timer_clk)) in ingenic_ost_global_timer_init()
376 return PTR_ERR(ost->global_timer_clk); in ingenic_ost_global_timer_init()
378 err = clk_prepare_enable(ost->global_timer_clk); in ingenic_ost_global_timer_init()
382 rate = clk_get_rate(ost->global_timer_clk); in ingenic_ost_global_timer_init()
384 err = -EINVAL; in ingenic_ost_global_timer_init()
389 writel(OSTCR_OST2CLR, ost->base + OST_REG_OSTCR); in ingenic_ost_global_timer_init()
392 writel(OSTESR_OST2ENS, ost->base + OST_REG_OSTESR); in ingenic_ost_global_timer_init()
394 cs->name = "ingenic-ost"; in ingenic_ost_global_timer_init()
395 cs->rating = 400; in ingenic_ost_global_timer_init()
396 cs->flags = CLOCK_SOURCE_IS_CONTINUOUS; in ingenic_ost_global_timer_init()
397 cs->mask = CLOCKSOURCE_MASK(32); in ingenic_ost_global_timer_init()
398 cs->read = ingenic_ost_clocksource_read; in ingenic_ost_global_timer_init()
400 err = clocksource_register_hz(cs, rate); in ingenic_ost_global_timer_init()
407 clk_disable_unprepare(ost->global_timer_clk); in ingenic_ost_global_timer_init()
409 clk_put(ost->global_timer_clk); in ingenic_ost_global_timer_init()
418 { .compatible = "ingenic,x1000-ost", .data = &x1000_soc_info, },
431 return -ENOMEM; in ingenic_ost_probe()
433 ost->base = of_io_request_and_map(np, 0, of_node_full_name(np)); in ingenic_ost_probe()
434 if (IS_ERR(ost->base)) { in ingenic_ost_probe()
436 ret = PTR_ERR(ost->base); in ingenic_ost_probe()
440 ost->clk = of_clk_get_by_name(np, "ost"); in ingenic_ost_probe()
441 if (IS_ERR(ost->clk)) { in ingenic_ost_probe()
442 ret = PTR_ERR(ost->clk); in ingenic_ost_probe()
447 ret = clk_prepare_enable(ost->clk); in ingenic_ost_probe()
453 ost->soc_info = id->data; in ingenic_ost_probe()
455 ost->clocks = kzalloc(struct_size(ost->clocks, hws, ost->soc_info->num_channels), in ingenic_ost_probe()
457 if (!ost->clocks) { in ingenic_ost_probe()
458 ret = -ENOMEM; in ingenic_ost_probe()
462 ost->clocks->num = ost->soc_info->num_channels; in ingenic_ost_probe()
464 for (i = 0; i < ost->clocks->num; i++) { in ingenic_ost_probe()
465 ret = ingenic_ost_register_clock(ost, i, &ingenic_ost_clk_info[i], ost->clocks); in ingenic_ost_probe()
472 ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, ost->clocks); in ingenic_ost_probe()
483 for (i = 0; i < ost->clocks->num; i++) in ingenic_ost_probe()
484 if (ost->clocks->hws[i]) in ingenic_ost_probe()
485 clk_hw_unregister(ost->clocks->hws[i]); in ingenic_ost_probe()
486 kfree(ost->clocks); in ingenic_ost_probe()
488 clk_disable_unprepare(ost->clk); in ingenic_ost_probe()
490 clk_put(ost->clk); in ingenic_ost_probe()
525 rate = clk_get_rate(ost->global_timer_clk); in ingenic_ost_init()
531 clocksource_unregister(&ost->cs); in ingenic_ost_init()
532 clk_disable_unprepare(ost->global_timer_clk); in ingenic_ost_init()
533 clk_put(ost->global_timer_clk); in ingenic_ost_init()
539 TIMER_OF_DECLARE(x1000_ost, "ingenic,x1000-ost", ingenic_ost_init);