Lines Matching refs:tcu
42 struct ingenic_tcu *tcu = ingenic_tcu; in ingenic_tcu_timer_read() local
45 regmap_read(tcu->map, TCU_REG_TCNTc(tcu->cs_channel), &count); in ingenic_tcu_timer_read()
62 struct ingenic_tcu *tcu = to_ingenic_tcu(evt); in ingenic_tcu_cevt_set_state_shutdown() local
64 regmap_write(tcu->map, TCU_REG_TECR, BIT(tcu->timer_channel)); in ingenic_tcu_cevt_set_state_shutdown()
72 struct ingenic_tcu *tcu = to_ingenic_tcu(evt); in ingenic_tcu_cevt_set_next() local
77 regmap_write(tcu->map, TCU_REG_TDFRc(tcu->timer_channel), next); in ingenic_tcu_cevt_set_next()
78 regmap_write(tcu->map, TCU_REG_TCNTc(tcu->timer_channel), 0); in ingenic_tcu_cevt_set_next()
79 regmap_write(tcu->map, TCU_REG_TESR, BIT(tcu->timer_channel)); in ingenic_tcu_cevt_set_next()
87 struct ingenic_tcu *tcu = to_ingenic_tcu(evt); in ingenic_tcu_cevt_cb() local
89 regmap_write(tcu->map, TCU_REG_TECR, BIT(tcu->timer_channel)); in ingenic_tcu_cevt_cb()
109 struct ingenic_tcu *tcu) in ingenic_tcu_timer_init() argument
111 unsigned int timer_virq, channel = tcu->timer_channel; in ingenic_tcu_timer_init()
116 tcu->timer_clk = ingenic_tcu_get_clock(np, channel); in ingenic_tcu_timer_init()
117 if (IS_ERR(tcu->timer_clk)) in ingenic_tcu_timer_init()
118 return PTR_ERR(tcu->timer_clk); in ingenic_tcu_timer_init()
120 err = clk_prepare_enable(tcu->timer_clk); in ingenic_tcu_timer_init()
124 rate = clk_get_rate(tcu->timer_clk); in ingenic_tcu_timer_init()
142 snprintf(tcu->name, sizeof(tcu->name), "TCU"); in ingenic_tcu_timer_init()
145 tcu->name, &tcu->cevt); in ingenic_tcu_timer_init()
149 tcu->cevt.cpumask = cpumask_of(smp_processor_id()); in ingenic_tcu_timer_init()
150 tcu->cevt.features = CLOCK_EVT_FEAT_ONESHOT; in ingenic_tcu_timer_init()
151 tcu->cevt.name = tcu->name; in ingenic_tcu_timer_init()
152 tcu->cevt.rating = 200; in ingenic_tcu_timer_init()
153 tcu->cevt.set_state_shutdown = ingenic_tcu_cevt_set_state_shutdown; in ingenic_tcu_timer_init()
154 tcu->cevt.set_next_event = ingenic_tcu_cevt_set_next; in ingenic_tcu_timer_init()
156 clockevents_config_and_register(&tcu->cevt, rate, 10, 0xffff); in ingenic_tcu_timer_init()
163 clk_disable_unprepare(tcu->timer_clk); in ingenic_tcu_timer_init()
165 clk_put(tcu->timer_clk); in ingenic_tcu_timer_init()
170 struct ingenic_tcu *tcu) in ingenic_tcu_clocksource_init() argument
172 unsigned int channel = tcu->cs_channel; in ingenic_tcu_clocksource_init()
173 struct clocksource *cs = &tcu->cs; in ingenic_tcu_clocksource_init()
177 tcu->cs_clk = ingenic_tcu_get_clock(np, channel); in ingenic_tcu_clocksource_init()
178 if (IS_ERR(tcu->cs_clk)) in ingenic_tcu_clocksource_init()
179 return PTR_ERR(tcu->cs_clk); in ingenic_tcu_clocksource_init()
181 err = clk_prepare_enable(tcu->cs_clk); in ingenic_tcu_clocksource_init()
185 rate = clk_get_rate(tcu->cs_clk); in ingenic_tcu_clocksource_init()
192 regmap_update_bits(tcu->map, TCU_REG_TCSRc(channel), in ingenic_tcu_clocksource_init()
196 regmap_write(tcu->map, TCU_REG_TDFRc(channel), 0xffff); in ingenic_tcu_clocksource_init()
197 regmap_write(tcu->map, TCU_REG_TCNTc(channel), 0); in ingenic_tcu_clocksource_init()
200 regmap_write(tcu->map, TCU_REG_TESR, BIT(channel)); in ingenic_tcu_clocksource_init()
215 clk_disable_unprepare(tcu->cs_clk); in ingenic_tcu_clocksource_init()
217 clk_put(tcu->cs_clk); in ingenic_tcu_clocksource_init()
240 struct ingenic_tcu *tcu; in ingenic_tcu_init() local
251 tcu = kzalloc(sizeof(*tcu), GFP_KERNEL); in ingenic_tcu_init()
252 if (!tcu) in ingenic_tcu_init()
256 tcu->pwm_channels_mask = GENMASK(soc_info->num_channels - 1, 2); in ingenic_tcu_init()
258 (u32 *)&tcu->pwm_channels_mask); in ingenic_tcu_init()
261 if (hweight8(tcu->pwm_channels_mask) > soc_info->num_channels - 2) { in ingenic_tcu_init()
263 tcu->pwm_channels_mask); in ingenic_tcu_init()
268 tcu->map = map; in ingenic_tcu_init()
269 ingenic_tcu = tcu; in ingenic_tcu_init()
271 tcu->timer_channel = find_first_zero_bit(&tcu->pwm_channels_mask, in ingenic_tcu_init()
273 tcu->cs_channel = find_next_zero_bit(&tcu->pwm_channels_mask, in ingenic_tcu_init()
275 tcu->timer_channel + 1); in ingenic_tcu_init()
277 ret = ingenic_tcu_clocksource_init(np, tcu); in ingenic_tcu_init()
283 ret = ingenic_tcu_timer_init(np, tcu); in ingenic_tcu_init()
288 rate = clk_get_rate(tcu->cs_clk); in ingenic_tcu_init()
294 clocksource_unregister(&tcu->cs); in ingenic_tcu_init()
295 clk_disable_unprepare(tcu->cs_clk); in ingenic_tcu_init()
296 clk_put(tcu->cs_clk); in ingenic_tcu_init()
298 kfree(tcu); in ingenic_tcu_init()
316 struct ingenic_tcu *tcu = dev_get_drvdata(dev); in ingenic_tcu_suspend() local
318 clk_disable(tcu->cs_clk); in ingenic_tcu_suspend()
319 clk_disable(tcu->timer_clk); in ingenic_tcu_suspend()
325 struct ingenic_tcu *tcu = dev_get_drvdata(dev); in ingenic_tcu_resume() local
328 ret = clk_enable(tcu->timer_clk); in ingenic_tcu_resume()
332 ret = clk_enable(tcu->cs_clk); in ingenic_tcu_resume()
334 clk_disable(tcu->timer_clk); in ingenic_tcu_resume()