Lines Matching full:ost

23 /* OST register offsets */
69 struct ingenic_ost *ost; member
98 prescale = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_percpu_timer_recalc_rate()
112 prescale = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_global_timer_recalc_rate()
157 val = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_percpu_timer_set_rate()
160 writel(val, ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_percpu_timer_set_rate()
173 val = readl(ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_global_timer_set_rate()
176 writel(val, ost_clk->ost->base + info->ostccr_reg); in ingenic_ost_global_timer_set_rate()
221 struct ingenic_ost *ost = ingenic_ost; in ingenic_ost_global_timer_read_cntl() local
224 count = readl(ost->base + OST_REG_OST2CNTL); in ingenic_ost_global_timer_read_cntl()
241 struct ingenic_ost *ost = to_ingenic_ost(evt); in ingenic_ost_cevt_set_state_shutdown() local
243 writel(OSTECR_OST1ENC, ost->base + OST_REG_OSTECR); in ingenic_ost_cevt_set_state_shutdown()
251 struct ingenic_ost *ost = to_ingenic_ost(evt); in ingenic_ost_cevt_set_next() local
253 writel((u32)~OSTFR_FFLAG, ost->base + OST_REG_OSTFR); in ingenic_ost_cevt_set_next()
254 writel(next, ost->base + OST_REG_OST1DFR); in ingenic_ost_cevt_set_next()
255 writel(OSTCR_OST1CLR, ost->base + OST_REG_OSTCR); in ingenic_ost_cevt_set_next()
256 writel(OSTESR_OST1ENS, ost->base + OST_REG_OSTESR); in ingenic_ost_cevt_set_next()
257 writel((u32)~OSTMR_FMASK, ost->base + OST_REG_OSTMR); in ingenic_ost_cevt_set_next()
265 struct ingenic_ost *ost = to_ingenic_ost(evt); in ingenic_ost_cevt_cb() local
267 writel(OSTECR_OST1ENC, ost->base + OST_REG_OSTECR); in ingenic_ost_cevt_cb()
275 static int __init ingenic_ost_register_clock(struct ingenic_ost *ost, in ingenic_ost_register_clock() argument
289 ost_clk->ost = ost; in ingenic_ost_register_clock()
292 val = readl(ost->base + info->ostccr_reg); in ingenic_ost_register_clock()
294 writel(val, ost->base + info->ostccr_reg); in ingenic_ost_register_clock()
319 struct ingenic_ost *ost) in ingenic_ost_percpu_timer_init() argument
325 ost->percpu_timer_clk = ingenic_ost_get_clock(np, channel); in ingenic_ost_percpu_timer_init()
326 if (IS_ERR(ost->percpu_timer_clk)) in ingenic_ost_percpu_timer_init()
327 return PTR_ERR(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
329 err = clk_prepare_enable(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
333 rate = clk_get_rate(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
345 snprintf(ost->name, sizeof(ost->name), "OST percpu timer"); in ingenic_ost_percpu_timer_init()
348 ost->name, &ost->cevt); in ingenic_ost_percpu_timer_init()
352 ost->cevt.cpumask = cpumask_of(smp_processor_id()); in ingenic_ost_percpu_timer_init()
353 ost->cevt.features = CLOCK_EVT_FEAT_ONESHOT; in ingenic_ost_percpu_timer_init()
354 ost->cevt.name = ost->name; in ingenic_ost_percpu_timer_init()
355 ost->cevt.rating = 400; in ingenic_ost_percpu_timer_init()
356 ost->cevt.set_state_shutdown = ingenic_ost_cevt_set_state_shutdown; in ingenic_ost_percpu_timer_init()
357 ost->cevt.set_next_event = ingenic_ost_cevt_set_next; in ingenic_ost_percpu_timer_init()
359 clockevents_config_and_register(&ost->cevt, rate, 4, 0xffffffff); in ingenic_ost_percpu_timer_init()
366 clk_disable_unprepare(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
368 clk_put(ost->percpu_timer_clk); in ingenic_ost_percpu_timer_init()
373 struct ingenic_ost *ost) in ingenic_ost_global_timer_init() argument
376 struct clocksource *cs = &ost->cs; in ingenic_ost_global_timer_init()
380 ost->global_timer_clk = ingenic_ost_get_clock(np, channel); in ingenic_ost_global_timer_init()
381 if (IS_ERR(ost->global_timer_clk)) in ingenic_ost_global_timer_init()
382 return PTR_ERR(ost->global_timer_clk); in ingenic_ost_global_timer_init()
384 err = clk_prepare_enable(ost->global_timer_clk); in ingenic_ost_global_timer_init()
388 rate = clk_get_rate(ost->global_timer_clk); in ingenic_ost_global_timer_init()
395 writel(OSTCR_OST2CLR, ost->base + OST_REG_OSTCR); in ingenic_ost_global_timer_init()
397 /* Enable OST channel */ in ingenic_ost_global_timer_init()
398 writel(OSTESR_OST2ENS, ost->base + OST_REG_OSTESR); in ingenic_ost_global_timer_init()
400 cs->name = "ingenic-ost"; in ingenic_ost_global_timer_init()
413 clk_disable_unprepare(ost->global_timer_clk); in ingenic_ost_global_timer_init()
415 clk_put(ost->global_timer_clk); in ingenic_ost_global_timer_init()
424 { .compatible = "ingenic,x1000-ost", .data = &x1000_soc_info },
431 struct ingenic_ost *ost; in ingenic_ost_probe() local
435 ost = kzalloc(sizeof(*ost), GFP_KERNEL); in ingenic_ost_probe()
436 if (!ost) in ingenic_ost_probe()
439 ost->base = of_io_request_and_map(np, 0, of_node_full_name(np)); in ingenic_ost_probe()
440 if (IS_ERR(ost->base)) { in ingenic_ost_probe()
441 pr_err("%s: Failed to map OST registers\n", __func__); in ingenic_ost_probe()
442 ret = PTR_ERR(ost->base); in ingenic_ost_probe()
446 ost->clk = of_clk_get_by_name(np, "ost"); in ingenic_ost_probe()
447 if (IS_ERR(ost->clk)) { in ingenic_ost_probe()
448 ret = PTR_ERR(ost->clk); in ingenic_ost_probe()
449 pr_crit("%s: Cannot get OST clock\n", __func__); in ingenic_ost_probe()
453 ret = clk_prepare_enable(ost->clk); in ingenic_ost_probe()
455 pr_crit("%s: Unable to enable OST clock\n", __func__); in ingenic_ost_probe()
459 ost->soc_info = id->data; in ingenic_ost_probe()
461 ost->clocks = kzalloc(struct_size(ost->clocks, hws, ost->soc_info->num_channels), in ingenic_ost_probe()
463 if (!ost->clocks) { in ingenic_ost_probe()
468 ost->clocks->num = ost->soc_info->num_channels; in ingenic_ost_probe()
470 for (i = 0; i < ost->clocks->num; i++) { in ingenic_ost_probe()
471 ret = ingenic_ost_register_clock(ost, i, &x1000_ost_clk_info[i], ost->clocks); in ingenic_ost_probe()
478 ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, ost->clocks); in ingenic_ost_probe()
484 ingenic_ost = ost; in ingenic_ost_probe()
489 for (i = 0; i < ost->clocks->num; i++) in ingenic_ost_probe()
490 if (ost->clocks->hws[i]) in ingenic_ost_probe()
491 clk_hw_unregister(ost->clocks->hws[i]); in ingenic_ost_probe()
492 kfree(ost->clocks); in ingenic_ost_probe()
494 clk_disable_unprepare(ost->clk); in ingenic_ost_probe()
496 clk_put(ost->clk); in ingenic_ost_probe()
498 kfree(ost); in ingenic_ost_probe()
504 struct ingenic_ost *ost; in ingenic_ost_init() local
510 pr_crit("%s: Failed to initialize OST clocks: %d\n", __func__, ret); in ingenic_ost_init()
516 ost = ingenic_ost; in ingenic_ost_init()
517 if (IS_ERR(ost)) in ingenic_ost_init()
518 return PTR_ERR(ost); in ingenic_ost_init()
520 ret = ingenic_ost_global_timer_init(np, ost); in ingenic_ost_init()
526 ret = ingenic_ost_percpu_timer_init(np, ost); in ingenic_ost_init()
531 rate = clk_get_rate(ost->global_timer_clk); in ingenic_ost_init()
537 clocksource_unregister(&ost->cs); in ingenic_ost_init()
538 clk_disable_unprepare(ost->global_timer_clk); in ingenic_ost_init()
539 clk_put(ost->global_timer_clk); in ingenic_ost_init()
541 kfree(ost); in ingenic_ost_init()
545 TIMER_OF_DECLARE(x1000_ost, "ingenic,x1000-ost", ingenic_ost_init);