Lines Matching full:ost

22 /* OST register offsets */
70 struct ingenic_ost *ost; member
99 prescale = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_percpu_timer_recalc_rate()
113 prescale = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_global_timer_recalc_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()
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()
215 struct ingenic_ost *ost = ingenic_ost; in ingenic_ost_global_timer_read_cntl() local
218 count = readl(ost->base + OST_REG_OST2CNTL); in ingenic_ost_global_timer_read_cntl()
235 struct ingenic_ost *ost = to_ingenic_ost(evt); in ingenic_ost_cevt_set_state_shutdown() local
237 writel(OSTECR_OST1ENC, ost->base + OST_REG_OSTECR); in ingenic_ost_cevt_set_state_shutdown()
245 struct ingenic_ost *ost = to_ingenic_ost(evt); in ingenic_ost_cevt_set_next() local
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()
259 struct ingenic_ost *ost = to_ingenic_ost(evt); in ingenic_ost_cevt_cb() local
261 writel(OSTECR_OST1ENC, ost->base + OST_REG_OSTECR); in ingenic_ost_cevt_cb()
269 static int __init ingenic_ost_register_clock(struct ingenic_ost *ost, in ingenic_ost_register_clock() argument
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()
313 struct ingenic_ost *ost) in ingenic_ost_percpu_timer_init() argument
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()
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()
367 struct ingenic_ost *ost) in ingenic_ost_global_timer_init() argument
370 struct clocksource *cs = &ost->cs; in ingenic_ost_global_timer_init()
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()
389 writel(OSTCR_OST2CLR, ost->base + OST_REG_OSTCR); in ingenic_ost_global_timer_init()
391 /* Enable OST channel */ 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()
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, },
425 struct ingenic_ost *ost; in ingenic_ost_probe() local
429 ost = kzalloc(sizeof(*ost), GFP_KERNEL); in ingenic_ost_probe()
430 if (!ost) 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()
435 pr_err("%s: Failed to map OST registers\n", __func__); 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()
443 pr_crit("%s: Cannot get OST clock\n", __func__); in ingenic_ost_probe()
447 ret = clk_prepare_enable(ost->clk); in ingenic_ost_probe()
449 pr_crit("%s: Unable to enable OST clock\n", __func__); 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()
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()
478 ingenic_ost = ost; 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()
492 kfree(ost); in ingenic_ost_probe()
498 struct ingenic_ost *ost; in ingenic_ost_init() local
504 pr_crit("%s: Failed to initialize OST clocks: %d\n", __func__, ret); in ingenic_ost_init()
510 ost = ingenic_ost; in ingenic_ost_init()
511 if (IS_ERR(ost)) in ingenic_ost_init()
512 return PTR_ERR(ost); in ingenic_ost_init()
514 ret = ingenic_ost_global_timer_init(np, ost); in ingenic_ost_init()
520 ret = ingenic_ost_percpu_timer_init(np, ost); in ingenic_ost_init()
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()
535 kfree(ost); in ingenic_ost_init()
539 TIMER_OF_DECLARE(x1000_ost, "ingenic,x1000-ost", ingenic_ost_init);