• Home
  • Raw
  • Download

Lines Matching full:tcu

3  * JZ47xx SoCs TCU clocks driver
10 #include <linux/mfd/ingenic-tcu.h>
16 #include <dt-bindings/clock/ingenic,tcu.h>
22 #define pr_fmt(fmt) "ingenic-tcu-clk: " fmt
45 struct ingenic_tcu *tcu; member
68 struct ingenic_tcu *tcu = tcu_clk->tcu; in ingenic_tcu_enable() local
70 regmap_write(tcu->map, TCU_REG_TSCR, BIT(info->gate_bit)); in ingenic_tcu_enable()
79 struct ingenic_tcu *tcu = tcu_clk->tcu; in ingenic_tcu_disable() local
81 regmap_write(tcu->map, TCU_REG_TSSR, BIT(info->gate_bit)); in ingenic_tcu_disable()
90 regmap_read(tcu_clk->tcu->map, TCU_REG_TSR, &value); in ingenic_tcu_is_enabled()
99 struct ingenic_tcu *tcu = tcu_clk->tcu; in ingenic_tcu_enable_regs() local
107 regmap_write(tcu->map, TCU_REG_TSCR, BIT(info->gate_bit)); in ingenic_tcu_enable_regs()
116 struct ingenic_tcu *tcu = tcu_clk->tcu; in ingenic_tcu_disable_regs() local
118 regmap_write(tcu->map, TCU_REG_TSSR, BIT(info->gate_bit)); in ingenic_tcu_disable_regs()
128 ret = regmap_read(tcu_clk->tcu->map, info->tcsr_reg, &val); in ingenic_tcu_get_parent()
143 ret = regmap_update_bits(tcu_clk->tcu->map, info->tcsr_reg, in ingenic_tcu_set_parent()
161 ret = regmap_read(tcu_clk->tcu->map, info->tcsr_reg, &prescale); in ingenic_tcu_recalc_rate()
205 ret = regmap_update_bits(tcu_clk->tcu->map, info->tcsr_reg, in ingenic_tcu_set_rate()
264 static int __init ingenic_tcu_register_clock(struct ingenic_tcu *tcu, in ingenic_tcu_register_clock() argument
279 tcu_clk->tcu = tcu; in ingenic_tcu_register_clock()
283 regmap_update_bits(tcu->map, info->tcsr_reg, 0xffff, BIT(parent)); in ingenic_tcu_register_clock()
317 .has_ost = false, /* X1000 has OST, but it not belong TCU */
322 { .compatible = "ingenic,jz4740-tcu", .data = &jz4740_soc_info, },
323 { .compatible = "ingenic,jz4725b-tcu", .data = &jz4725b_soc_info, },
324 { .compatible = "ingenic,jz4770-tcu", .data = &jz4770_soc_info, },
325 { .compatible = "ingenic,x1000-tcu", .data = &x1000_soc_info, },
332 struct ingenic_tcu *tcu; in ingenic_tcu_probe() local
341 tcu = kzalloc(sizeof(*tcu), GFP_KERNEL); in ingenic_tcu_probe()
342 if (!tcu) in ingenic_tcu_probe()
345 tcu->map = map; in ingenic_tcu_probe()
346 tcu->soc_info = id->data; in ingenic_tcu_probe()
348 if (tcu->soc_info->has_tcu_clk) { in ingenic_tcu_probe()
349 tcu->clk = of_clk_get_by_name(np, "tcu"); in ingenic_tcu_probe()
350 if (IS_ERR(tcu->clk)) { in ingenic_tcu_probe()
351 ret = PTR_ERR(tcu->clk); in ingenic_tcu_probe()
352 pr_crit("Cannot get TCU clock\n"); in ingenic_tcu_probe()
356 ret = clk_prepare_enable(tcu->clk); in ingenic_tcu_probe()
358 pr_crit("Unable to enable TCU clock\n"); in ingenic_tcu_probe()
363 tcu->clocks = kzalloc(struct_size(tcu->clocks, hws, TCU_CLK_COUNT), in ingenic_tcu_probe()
365 if (!tcu->clocks) { in ingenic_tcu_probe()
370 tcu->clocks->num = TCU_CLK_COUNT; in ingenic_tcu_probe()
372 for (i = 0; i < tcu->soc_info->num_channels; i++) { in ingenic_tcu_probe()
373 ret = ingenic_tcu_register_clock(tcu, i, TCU_PARENT_EXT, in ingenic_tcu_probe()
375 tcu->clocks); in ingenic_tcu_probe()
383 * We set EXT as the default parent clock for all the TCU clocks in ingenic_tcu_probe()
389 ret = ingenic_tcu_register_clock(tcu, TCU_CLK_WDT, TCU_PARENT_RTC, in ingenic_tcu_probe()
391 tcu->clocks); in ingenic_tcu_probe()
397 if (tcu->soc_info->has_ost) { in ingenic_tcu_probe()
398 ret = ingenic_tcu_register_clock(tcu, TCU_CLK_OST, in ingenic_tcu_probe()
401 tcu->clocks); in ingenic_tcu_probe()
408 ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, tcu->clocks); in ingenic_tcu_probe()
414 ingenic_tcu = tcu; in ingenic_tcu_probe()
419 if (tcu->soc_info->has_ost) in ingenic_tcu_probe()
420 clk_hw_unregister(tcu->clocks->hws[i + 1]); in ingenic_tcu_probe()
422 clk_hw_unregister(tcu->clocks->hws[i]); in ingenic_tcu_probe()
424 for (i = 0; i < tcu->clocks->num; i++) in ingenic_tcu_probe()
425 if (tcu->clocks->hws[i]) in ingenic_tcu_probe()
426 clk_hw_unregister(tcu->clocks->hws[i]); in ingenic_tcu_probe()
427 kfree(tcu->clocks); in ingenic_tcu_probe()
429 if (tcu->soc_info->has_tcu_clk) in ingenic_tcu_probe()
430 clk_disable_unprepare(tcu->clk); in ingenic_tcu_probe()
432 if (tcu->soc_info->has_tcu_clk) in ingenic_tcu_probe()
433 clk_put(tcu->clk); in ingenic_tcu_probe()
435 kfree(tcu); in ingenic_tcu_probe()
441 struct ingenic_tcu *tcu = ingenic_tcu; in tcu_pm_suspend() local
443 if (tcu->clk) in tcu_pm_suspend()
444 clk_disable(tcu->clk); in tcu_pm_suspend()
451 struct ingenic_tcu *tcu = ingenic_tcu; in tcu_pm_resume() local
453 if (tcu->clk) in tcu_pm_resume()
454 clk_enable(tcu->clk); in tcu_pm_resume()
467 pr_crit("Failed to initialize TCU clocks: %d\n", ret); in ingenic_tcu_init()
473 CLK_OF_DECLARE_DRIVER(jz4740_cgu, "ingenic,jz4740-tcu", ingenic_tcu_init);
474 CLK_OF_DECLARE_DRIVER(jz4725b_cgu, "ingenic,jz4725b-tcu", ingenic_tcu_init);
475 CLK_OF_DECLARE_DRIVER(jz4770_cgu, "ingenic,jz4770-tcu", ingenic_tcu_init);
476 CLK_OF_DECLARE_DRIVER(x1000_cgu, "ingenic,x1000-tcu", ingenic_tcu_init);