Lines Matching full:vc5

128 /* VC5 Input mux settings */
146 /* Supported IDT VC5 models. */
158 /* Structure to describe features of a particular VC5 model */
171 struct vc5_driver_data *vc5; member
179 struct vc5_driver_data *vc5; member
230 struct vc5_driver_data *vc5 = in vc5_mux_get_parent() local
236 ret = regmap_read(vc5->regmap, VC5_PRIM_SRC_SHDN, &src); in vc5_mux_get_parent()
248 dev_warn(&vc5->client->dev, in vc5_mux_get_parent()
255 struct vc5_driver_data *vc5 = in vc5_mux_set_parent() local
260 if ((index > 1) || !vc5->clk_mux_ins) in vc5_mux_set_parent()
263 if (vc5->clk_mux_ins == (VC5_MUX_IN_CLKIN | VC5_MUX_IN_XIN)) { in vc5_mux_set_parent()
272 if (vc5->clk_mux_ins == VC5_MUX_IN_XIN) in vc5_mux_set_parent()
274 else if (vc5->clk_mux_ins == VC5_MUX_IN_CLKIN) in vc5_mux_set_parent()
280 return regmap_update_bits(vc5->regmap, VC5_PRIM_SRC_SHDN, mask, src); in vc5_mux_set_parent()
292 struct vc5_driver_data *vc5 = in vc5_dbl_recalc_rate() local
297 ret = regmap_read(vc5->regmap, VC5_PRIM_SRC_SHDN, &premul); in vc5_dbl_recalc_rate()
319 struct vc5_driver_data *vc5 = in vc5_dbl_set_rate() local
328 return regmap_update_bits(vc5->regmap, VC5_PRIM_SRC_SHDN, in vc5_dbl_set_rate()
342 struct vc5_driver_data *vc5 = in vc5_pfd_recalc_rate() local
347 ret = regmap_read(vc5->regmap, VC5_VCO_CTRL_AND_PREDIV, &prediv); in vc5_pfd_recalc_rate()
355 ret = regmap_read(vc5->regmap, VC5_REF_DIVIDER, &div); in vc5_pfd_recalc_rate()
394 struct vc5_driver_data *vc5 = in vc5_pfd_set_rate() local
402 ret = regmap_set_bits(vc5->regmap, VC5_VCO_CTRL_AND_PREDIV, in vc5_pfd_set_rate()
407 return regmap_update_bits(vc5->regmap, VC5_REF_DIVIDER, 0xff, 0x00); in vc5_pfd_set_rate()
418 ret = regmap_update_bits(vc5->regmap, VC5_REF_DIVIDER, 0xff, div); in vc5_pfd_set_rate()
422 return regmap_clear_bits(vc5->regmap, VC5_VCO_CTRL_AND_PREDIV, in vc5_pfd_set_rate()
439 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_pll_recalc_rate() local
443 regmap_bulk_read(vc5->regmap, VC5_FEEDBACK_INT_DIV, fb, 5); in vc5_pll_recalc_rate()
456 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_pll_determine_rate() local
460 req->rate = clamp(req->rate, VC5_PLL_VCO_MIN, vc5->chip_info->vco_max); in vc5_pll_determine_rate()
484 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_pll_set_rate() local
493 return regmap_bulk_write(vc5->regmap, VC5_FEEDBACK_INT_DIV, fb, 5); in vc5_pll_set_rate()
506 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_fod_recalc_rate() local
513 regmap_bulk_read(vc5->regmap, VC5_OUT_DIV_INT(hwdata->num, 0), in vc5_fod_recalc_rate()
515 regmap_bulk_read(vc5->regmap, VC5_OUT_DIV_FRAC(hwdata->num, 0), in vc5_fod_recalc_rate()
568 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_fod_set_rate() local
579 ret = regmap_bulk_write(vc5->regmap, VC5_OUT_DIV_FRAC(hwdata->num, 0), in vc5_fod_set_rate()
590 ret = regmap_clear_bits(vc5->regmap, VC5_GLOBAL_REGISTER, in vc5_fod_set_rate()
595 return regmap_set_bits(vc5->regmap, VC5_GLOBAL_REGISTER, in vc5_fod_set_rate()
608 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_clk_out_prepare() local
623 if (vc5->chip_info->flags & VC5_HAS_BYPASS_SYNC_BIT) { in vc5_clk_out_prepare()
624 ret = regmap_set_bits(vc5->regmap, in vc5_clk_out_prepare()
635 ret = regmap_read(vc5->regmap, VC5_OUT_DIV_CONTROL(hwdata->num), &src); in vc5_clk_out_prepare()
641 ret = regmap_update_bits(vc5->regmap, in vc5_clk_out_prepare()
649 ret = regmap_set_bits(vc5->regmap, VC5_CLK_OUTPUT_CFG(hwdata->num, 1), in vc5_clk_out_prepare()
655 dev_dbg(&vc5->client->dev, "Update output %d mask 0x%0X val 0x%0X\n", in vc5_clk_out_prepare()
659 ret = regmap_update_bits(vc5->regmap, in vc5_clk_out_prepare()
673 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_clk_out_unprepare() local
676 regmap_clear_bits(vc5->regmap, VC5_CLK_OUTPUT_CFG(hwdata->num, 1), in vc5_clk_out_unprepare()
683 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_clk_out_get_parent() local
694 ret = regmap_read(vc5->regmap, VC5_OUT_DIV_CONTROL(hwdata->num), &src); in vc5_clk_out_get_parent()
709 dev_warn(&vc5->client->dev, in vc5_clk_out_get_parent()
717 struct vc5_driver_data *vc5 = hwdata->vc5; in vc5_clk_out_set_parent() local
731 return regmap_update_bits(vc5->regmap, VC5_OUT_DIV_CONTROL(hwdata->num), in vc5_clk_out_set_parent()
746 struct vc5_driver_data *vc5 = data; in vc5_of_clk_get() local
749 if (idx >= vc5->chip_info->clk_out_cnt) in vc5_of_clk_get()
752 return &vc5->clk_out[idx].hw; in vc5_of_clk_get()
857 static int vc5_update_cap_load(struct device_node *node, struct vc5_driver_data *vc5) in vc5_update_cap_load() argument
875 ret = regmap_update_bits(vc5->regmap, VC5_XTAL_X1_LOAD_CAP, ~0x03, in vc5_update_cap_load()
880 return regmap_update_bits(vc5->regmap, VC5_XTAL_X2_LOAD_CAP, ~0x03, in vc5_update_cap_load()
955 struct vc5_driver_data *vc5; in vc5_probe() local
961 vc5 = devm_kzalloc(&client->dev, sizeof(*vc5), GFP_KERNEL); in vc5_probe()
962 if (!vc5) in vc5_probe()
965 i2c_set_clientdata(client, vc5); in vc5_probe()
966 vc5->client = client; in vc5_probe()
967 vc5->chip_info = i2c_get_match_data(client); in vc5_probe()
969 vc5->pin_xin = devm_clk_get(&client->dev, "xin"); in vc5_probe()
970 if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER) in vc5_probe()
973 vc5->pin_clkin = devm_clk_get(&client->dev, "clkin"); in vc5_probe()
974 if (PTR_ERR(vc5->pin_clkin) == -EPROBE_DEFER) in vc5_probe()
977 vc5->regmap = devm_regmap_init_i2c(client, &vc5_regmap_config); in vc5_probe()
978 if (IS_ERR(vc5->regmap)) in vc5_probe()
979 return dev_err_probe(&client->dev, PTR_ERR(vc5->regmap), in vc5_probe()
1003 ret = regmap_update_bits(vc5->regmap, VC5_PRIM_SRC_SHDN, src_mask, in vc5_probe()
1011 if (!IS_ERR(vc5->pin_xin)) { in vc5_probe()
1012 vc5->clk_mux_ins |= VC5_MUX_IN_XIN; in vc5_probe()
1013 parent_names[init.num_parents++] = __clk_get_name(vc5->pin_xin); in vc5_probe()
1014 } else if (vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL) { in vc5_probe()
1015 vc5->pin_xin = clk_register_fixed_rate(&client->dev, in vc5_probe()
1018 if (IS_ERR(vc5->pin_xin)) in vc5_probe()
1019 return PTR_ERR(vc5->pin_xin); in vc5_probe()
1020 vc5->clk_mux_ins |= VC5_MUX_IN_XIN; in vc5_probe()
1021 parent_names[init.num_parents++] = __clk_get_name(vc5->pin_xin); in vc5_probe()
1024 if (!IS_ERR(vc5->pin_clkin)) { in vc5_probe()
1025 vc5->clk_mux_ins |= VC5_MUX_IN_CLKIN; in vc5_probe()
1027 __clk_get_name(vc5->pin_clkin); in vc5_probe()
1035 if (!(vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL)) { in vc5_probe()
1036 ret = vc5_update_cap_load(client->dev.of_node, vc5); in vc5_probe()
1050 vc5->clk_mux.init = &init; in vc5_probe()
1051 ret = devm_clk_hw_register(&client->dev, &vc5->clk_mux); in vc5_probe()
1056 if (vc5->chip_info->flags & VC5_HAS_PFD_FREQ_DBL) { in vc5_probe()
1068 parent_names[0] = clk_hw_get_name(&vc5->clk_mux); in vc5_probe()
1070 vc5->clk_mul.init = &init; in vc5_probe()
1071 ret = devm_clk_hw_register(&client->dev, &vc5->clk_mul); in vc5_probe()
1087 if (vc5->chip_info->flags & VC5_HAS_PFD_FREQ_DBL) in vc5_probe()
1088 parent_names[0] = clk_hw_get_name(&vc5->clk_mul); in vc5_probe()
1090 parent_names[0] = clk_hw_get_name(&vc5->clk_mux); in vc5_probe()
1092 vc5->clk_pfd.init = &init; in vc5_probe()
1093 ret = devm_clk_hw_register(&client->dev, &vc5->clk_pfd); in vc5_probe()
1108 parent_names[0] = clk_hw_get_name(&vc5->clk_pfd); in vc5_probe()
1110 vc5->clk_pll.num = 0; in vc5_probe()
1111 vc5->clk_pll.vc5 = vc5; in vc5_probe()
1112 vc5->clk_pll.hw.init = &init; in vc5_probe()
1113 ret = devm_clk_hw_register(&client->dev, &vc5->clk_pll.hw); in vc5_probe()
1119 for (n = 0; n < vc5->chip_info->clk_fod_cnt; n++) { in vc5_probe()
1120 idx = vc5_map_index_to_output(vc5->chip_info->model, n); in vc5_probe()
1131 parent_names[0] = clk_hw_get_name(&vc5->clk_pll.hw); in vc5_probe()
1133 vc5->clk_fod[n].num = idx; in vc5_probe()
1134 vc5->clk_fod[n].vc5 = vc5; in vc5_probe()
1135 vc5->clk_fod[n].hw.init = &init; in vc5_probe()
1136 ret = devm_clk_hw_register(&client->dev, &vc5->clk_fod[n].hw); in vc5_probe()
1153 parent_names[0] = clk_hw_get_name(&vc5->clk_mux); in vc5_probe()
1155 vc5->clk_out[0].num = idx; in vc5_probe()
1156 vc5->clk_out[0].vc5 = vc5; in vc5_probe()
1157 vc5->clk_out[0].hw.init = &init; in vc5_probe()
1158 ret = devm_clk_hw_register(&client->dev, &vc5->clk_out[0].hw); in vc5_probe()
1164 for (n = 1; n < vc5->chip_info->clk_out_cnt; n++) { in vc5_probe()
1165 idx = vc5_map_index_to_output(vc5->chip_info->model, n - 1); in vc5_probe()
1166 parent_names[0] = clk_hw_get_name(&vc5->clk_fod[idx].hw); in vc5_probe()
1168 parent_names[1] = clk_hw_get_name(&vc5->clk_mux); in vc5_probe()
1171 clk_hw_get_name(&vc5->clk_out[n - 1].hw); in vc5_probe()
1184 vc5->clk_out[n].num = idx; in vc5_probe()
1185 vc5->clk_out[n].vc5 = vc5; in vc5_probe()
1186 vc5->clk_out[n].hw.init = &init; in vc5_probe()
1187 ret = devm_clk_hw_register(&client->dev, &vc5->clk_out[n].hw); in vc5_probe()
1193 ret = vc5_get_output_config(client, &vc5->clk_out[n]); in vc5_probe()
1198 ret = of_clk_add_hw_provider(client->dev.of_node, vc5_of_clk_get, vc5); in vc5_probe()
1212 if (vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL) in vc5_probe()
1213 clk_unregister_fixed_rate(vc5->pin_xin); in vc5_probe()
1219 struct vc5_driver_data *vc5 = i2c_get_clientdata(client); in vc5_remove() local
1223 if (vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL) in vc5_remove()
1224 clk_unregister_fixed_rate(vc5->pin_xin); in vc5_remove()
1229 struct vc5_driver_data *vc5 = dev_get_drvdata(dev); in vc5_suspend() local
1231 regcache_cache_only(vc5->regmap, true); in vc5_suspend()
1232 regcache_mark_dirty(vc5->regmap); in vc5_suspend()
1239 struct vc5_driver_data *vc5 = dev_get_drvdata(dev); in vc5_resume() local
1242 regcache_cache_only(vc5->regmap, false); in vc5_resume()
1243 ret = regcache_sync(vc5->regmap); in vc5_resume()
1343 .name = "vc5",