Lines Matching +full:reg +full:- +full:names
1 // SPDX-License-Identifier: GPL-2.0
15 #include <linux/clk-provider.h>
127 /* Input dividers (48-bit) */
138 ((output)->data->reg_output_offset[(output)->index])
143 ((output)->data->reg_rdiv_offset[(output)->index])
220 * using only the XTAL input, without pre-divider.
364 /* Read and interpret a 44-bit followed by a 32-bit value in the regmap */
365 static int si5341_decode_44_32(struct regmap *regmap, unsigned int reg, in si5341_decode_44_32() argument
371 err = regmap_bulk_read(regmap, reg, r, 10); in si5341_decode_44_32()
382 static int si5341_encode_44_32(struct regmap *regmap, unsigned int reg, in si5341_encode_44_32() argument
401 return regmap_bulk_write(regmap, reg, r, sizeof(r)); in si5341_encode_44_32()
416 err = si5341_decode_44_32(data->regmap, SI5341_PLL_M_NUM, in si5341_clk_recalc_rate()
425 * Though m_num is 64-bit, only the upper bits are actually used. While in si5341_clk_recalc_rate()
427 * the left. To avoid 96-bit division here, we just shift them back so in si5341_clk_recalc_rate()
440 data->freq_vco = res; in si5341_clk_recalc_rate()
453 err = regmap_read(data->regmap, SI5341_IN_SEL, &val); in si5341_clk_get_selected_input()
477 /* Enable register-based input selection */ in si5341_clk_reparent()
480 err = regmap_update_bits(data->regmap, in si5341_clk_reparent()
487 err = regmap_update_bits(data->regmap, in si5341_clk_reparent()
493 err = regmap_update_bits(data->regmap, SI5341_INX_TO_PFD_EN, in si5341_clk_reparent()
500 err = regmap_update_bits(data->regmap, SI5341_XAXB_CFG, in si5341_clk_reparent()
510 err = regmap_write(data->regmap, SI5341_IN_PDIV(index), 1); in si5341_clk_reparent()
514 err = regmap_write(data->regmap, SI5341_IN_PSET(index), 1); in si5341_clk_reparent()
519 err = regmap_write(data->regmap, SI5341_PX_UPD, BIT(index)); in si5341_clk_reparent()
524 err = regmap_update_bits(data->regmap, SI5341_IN_EN, 0x07, 0); in si5341_clk_reparent()
529 err = regmap_update_bits(data->regmap, SI5341_INX_TO_PFD_EN, in si5341_clk_reparent()
535 err = regmap_update_bits(data->regmap, SI5341_XAXB_CFG, in si5341_clk_reparent()
537 SI5341_XAXB_CFG_PDNB | (data->xaxb_ext_clk ? in si5341_clk_reparent()
568 u8 index = synth->index; in si5341_synth_clk_is_on()
570 err = regmap_read(synth->data->regmap, in si5341_synth_clk_is_on()
578 err = regmap_read(synth->data->regmap, SI5341_SYNTH_N_PDNB, &val); in si5341_synth_clk_is_on()
586 err = regmap_read(synth->data->regmap, SI5341_SYNTH_N_CLK_DIS, &val); in si5341_synth_clk_is_on()
596 u8 index = synth->index; /* In range 0..5 */ in si5341_synth_clk_unprepare()
600 regmap_update_bits(synth->data->regmap, in si5341_synth_clk_unprepare()
603 regmap_update_bits(synth->data->regmap, in si5341_synth_clk_unprepare()
606 regmap_update_bits(synth->data->regmap, in si5341_synth_clk_unprepare()
614 u8 index = synth->index; in si5341_synth_clk_prepare()
618 err = regmap_update_bits(synth->data->regmap, in si5341_synth_clk_prepare()
624 err = regmap_update_bits(synth->data->regmap, in si5341_synth_clk_prepare()
630 return regmap_update_bits(synth->data->regmap, in si5341_synth_clk_prepare()
634 /* Synth clock frequency: Fvco * n_den / n_den, with Fvco in 13500-14256 MHz */
644 err = si5341_decode_44_32(synth->data->regmap, in si5341_synth_clk_recalc_rate()
645 SI5341_SYNTH_N_NUM(synth->index), &n_num, &n_den); in si5341_synth_clk_recalc_rate()
654 * overflow in 64-bit math, we shift n_den 4 bits to the right in si5341_synth_clk_recalc_rate()
656 f = synth->data->freq_vco; in si5341_synth_clk_recalc_rate()
659 /* Now we need to do 64-bit division: f/n_num */ in si5341_synth_clk_recalc_rate()
673 f = synth->data->freq_vco; in si5341_synth_clk_round_rate()
678 f = synth->data->freq_vco; in si5341_synth_clk_round_rate()
690 u8 index = synth->index; in si5341_synth_program()
692 err = si5341_encode_44_32(synth->data->regmap, in si5341_synth_program()
695 err = regmap_update_bits(synth->data->regmap, in si5341_synth_program()
700 return regmap_write(synth->data->regmap, in si5341_synth_program()
715 n_num = synth->data->freq_vco; in si5341_synth_clk_set_rate()
731 dev_dbg(&synth->data->i2c_client->dev, in si5341_synth_clk_set_rate()
733 synth->index, n_num, n_den, in si5341_synth_clk_set_rate()
754 err = regmap_read(output->data->regmap, in si5341_output_clk_is_on()
768 regmap_update_bits(output->data->regmap, in si5341_output_clk_unprepare()
771 regmap_update_bits(output->data->regmap, in si5341_output_clk_unprepare()
782 err = regmap_update_bits(output->data->regmap, in si5341_output_clk_prepare()
788 return regmap_update_bits(output->data->regmap, in si5341_output_clk_prepare()
802 err = regmap_read(output->data->regmap, in si5341_output_clk_recalc_rate()
811 err = regmap_bulk_read(output->data->regmap, in si5341_output_clk_recalc_rate()
816 /* Calculate value as 24-bit integer*/ in si5341_output_clk_recalc_rate()
834 unsigned long rate = req->rate; in si5341_output_clk_determine_rate()
840 r = req->best_parent_rate >> 1; in si5341_output_clk_determine_rate()
848 /* minimum r-divider is 2 */ in si5341_output_clk_determine_rate()
854 req->best_parent_rate = r * rate; in si5341_output_clk_determine_rate()
858 rate = req->best_parent_rate / (r << 1); in si5341_output_clk_determine_rate()
861 req->rate = rate; in si5341_output_clk_determine_rate()
874 return -EINVAL; in si5341_output_clk_set_rate()
882 r_div = BIT(24) - 1; in si5341_output_clk_set_rate()
884 --r_div; in si5341_output_clk_set_rate()
887 err = regmap_update_bits(output->data->regmap, in si5341_output_clk_set_rate()
898 return regmap_bulk_write(output->data->regmap, in si5341_output_clk_set_rate()
904 return regmap_update_bits(output->data->regmap, in si5341_output_reparent()
912 if (index >= output->data->num_synth) in si5341_output_set_parent()
913 return -EINVAL; in si5341_output_set_parent()
923 regmap_read(output->data->regmap, SI5341_OUT_MUX_SEL(output), &val); in si5341_output_get_parent()
940 * The chip can be bought in a pre-programmed version, or one can program the
950 /* Read the PLL divider value, it must have a non-zero value */ in si5341_is_programmed_already()
951 err = regmap_bulk_read(data->regmap, SI5341_PLL_M_DEN, in si5341_is_programmed_already()
963 unsigned int idx = clkspec->args[1]; in of_clk_si5341_get()
964 unsigned int group = clkspec->args[0]; in of_clk_si5341_get()
968 if (idx >= data->num_outputs) { in of_clk_si5341_get()
969 dev_err(&data->i2c_client->dev, in of_clk_si5341_get()
971 return ERR_PTR(-EINVAL); in of_clk_si5341_get()
973 return &data->clk[idx].hw; in of_clk_si5341_get()
975 if (idx >= data->num_synth) { in of_clk_si5341_get()
976 dev_err(&data->i2c_client->dev, in of_clk_si5341_get()
978 return ERR_PTR(-EINVAL); in of_clk_si5341_get()
980 return &data->synth[idx].hw; in of_clk_si5341_get()
983 dev_err(&data->i2c_client->dev, in of_clk_si5341_get()
985 return ERR_PTR(-EINVAL); in of_clk_si5341_get()
987 return &data->hw; in of_clk_si5341_get()
989 dev_err(&data->i2c_client->dev, "invalid group %u\n", group); in of_clk_si5341_get()
990 return ERR_PTR(-EINVAL); in of_clk_si5341_get()
997 u8 reg[4]; in si5341_probe_chip_id() local
1000 err = regmap_bulk_read(data->regmap, SI5341_PN_BASE, reg, in si5341_probe_chip_id()
1001 ARRAY_SIZE(reg)); in si5341_probe_chip_id()
1003 dev_err(&data->i2c_client->dev, "Failed to read chip ID\n"); in si5341_probe_chip_id()
1007 model = get_unaligned_le16(reg); in si5341_probe_chip_id()
1009 dev_info(&data->i2c_client->dev, "Chip: %x Grade: %u Rev: %u\n", in si5341_probe_chip_id()
1010 model, reg[2], reg[3]); in si5341_probe_chip_id()
1014 data->num_outputs = SI5340_MAX_NUM_OUTPUTS; in si5341_probe_chip_id()
1015 data->num_synth = SI5340_NUM_SYNTH; in si5341_probe_chip_id()
1016 data->reg_output_offset = si5340_reg_output_offset; in si5341_probe_chip_id()
1017 data->reg_rdiv_offset = si5340_reg_rdiv_offset; in si5341_probe_chip_id()
1020 data->num_outputs = SI5341_MAX_NUM_OUTPUTS; in si5341_probe_chip_id()
1021 data->num_synth = SI5341_NUM_SYNTH; in si5341_probe_chip_id()
1022 data->reg_output_offset = si5341_reg_output_offset; in si5341_probe_chip_id()
1023 data->reg_rdiv_offset = si5341_reg_rdiv_offset; in si5341_probe_chip_id()
1026 data->num_outputs = SI5342_MAX_NUM_OUTPUTS; in si5341_probe_chip_id()
1027 data->num_synth = SI5342_NUM_SYNTH; in si5341_probe_chip_id()
1028 data->reg_output_offset = si5340_reg_output_offset; in si5341_probe_chip_id()
1029 data->reg_rdiv_offset = si5340_reg_rdiv_offset; in si5341_probe_chip_id()
1032 data->num_outputs = SI5344_MAX_NUM_OUTPUTS; in si5341_probe_chip_id()
1033 data->num_synth = SI5344_NUM_SYNTH; in si5341_probe_chip_id()
1034 data->reg_output_offset = si5340_reg_output_offset; in si5341_probe_chip_id()
1035 data->reg_rdiv_offset = si5340_reg_rdiv_offset; in si5341_probe_chip_id()
1038 data->num_outputs = SI5345_MAX_NUM_OUTPUTS; in si5341_probe_chip_id()
1039 data->num_synth = SI5345_NUM_SYNTH; in si5341_probe_chip_id()
1040 data->reg_output_offset = si5341_reg_output_offset; in si5341_probe_chip_id()
1041 data->reg_rdiv_offset = si5341_reg_rdiv_offset; in si5341_probe_chip_id()
1044 dev_err(&data->i2c_client->dev, "Model '%x' not supported\n", in si5341_probe_chip_id()
1046 return -EINVAL; in si5341_probe_chip_id()
1049 data->chip_id = model; in si5341_probe_chip_id()
1061 err = regmap_bulk_read(data->regmap, SI5341_PLL_M_NUM, r, 10); in si5341_read_settings()
1065 err = regmap_bulk_read(data->regmap, in si5341_read_settings()
1070 err = regmap_bulk_read(data->regmap, in si5341_read_settings()
1075 for (i = 0; i < data->num_synth; ++i) { in si5341_read_settings()
1076 err = regmap_bulk_read(data->regmap, in si5341_read_settings()
1082 for (i = 0; i < data->num_outputs; ++i) { in si5341_read_settings()
1083 err = regmap_bulk_read(data->regmap, in si5341_read_settings()
1084 data->reg_output_offset[i], r, 4); in si5341_read_settings()
1088 err = regmap_bulk_read(data->regmap, in si5341_read_settings()
1089 data->reg_rdiv_offset[i], r, 3); in si5341_read_settings()
1104 res = regmap_write(data->regmap, in si5341_write_multiple()
1107 dev_err(&data->i2c_client->dev, in si5341_write_multiple()
1136 res = regmap_read(data->regmap, SI5341_DEVICE_REV, &revision); in si5341_send_preamble()
1141 res = regmap_write(data->regmap, 0xB24, revision < 2 ? 0xD8 : 0xC0); in si5341_send_preamble()
1146 if (data->chip_id > 0x5341) in si5341_send_preamble()
1161 /* Perform a soft reset and write post-amble */
1167 res = regmap_write(data->regmap, SI5341_IO_VDD_SEL, in si5341_finalize_defaults()
1168 data->iovdd_33 ? 1 : 0); in si5341_finalize_defaults()
1172 res = regmap_read(data->regmap, SI5341_DEVICE_REV, &revision); in si5341_finalize_defaults()
1176 dev_dbg(&data->i2c_client->dev, "%s rev=%u\n", __func__, revision); in si5341_finalize_defaults()
1178 res = regmap_write(data->regmap, SI5341_SOFT_RST, 0x01); in si5341_finalize_defaults()
1182 /* The si5342..si5345 have an additional post-amble */ in si5341_finalize_defaults()
1183 if (data->chip_id > 0x5341) { in si5341_finalize_defaults()
1184 res = regmap_write(data->regmap, 0x540, 0x0); in si5341_finalize_defaults()
1190 res = regmap_write(data->regmap, 0xB24, revision < 2 ? 0xDB : 0xC3); in si5341_finalize_defaults()
1193 res = regmap_write(data->regmap, 0x0B25, 0x02); in si5341_finalize_defaults()
1254 dev_err(&client->dev, "timeout waiting for DEVICE_READY\n"); in si5341_wait_device_ready()
1255 return -EIO; in si5341_wait_device_ready()
1272 struct device_node *np = data->i2c_client->dev.of_node; in si5341_dt_parse_dt()
1280 if (of_property_read_u32(child, "reg", &num)) { in si5341_dt_parse_dt()
1281 dev_err(&data->i2c_client->dev, "missing reg property of %s\n", in si5341_dt_parse_dt()
1282 child->name); in si5341_dt_parse_dt()
1287 dev_err(&data->i2c_client->dev, "invalid clkout %d\n", num); in si5341_dt_parse_dt()
1297 case 2: /* low-power differential */ in si5341_dt_parse_dt()
1306 dev_err(&data->i2c_client->dev, in si5341_dt_parse_dt()
1317 if (!of_property_read_u32(child, "silabs,common-mode", &val)) { in si5341_dt_parse_dt()
1319 dev_err(&data->i2c_client->dev, in si5341_dt_parse_dt()
1320 "invalid silabs,common-mode %u\n", in si5341_dt_parse_dt()
1330 dev_err(&data->i2c_client->dev, in si5341_dt_parse_dt()
1339 if (of_property_read_bool(child, "silabs,disable-high")) in si5341_dt_parse_dt()
1343 of_property_read_bool(child, "silabs,synth-master"); in si5341_dt_parse_dt()
1346 of_property_read_bool(child, "always-on"); in si5341_dt_parse_dt()
1349 if (data->clk[num].vddo_reg) { in si5341_dt_parse_dt()
1350 int vdd = regulator_get_voltage(data->clk[num].vddo_reg); in si5341_dt_parse_dt()
1363 dev_err(&data->i2c_client->dev, in si5341_dt_parse_dt()
1365 vdd, child->name); in si5341_dt_parse_dt()
1370 dev_warn(&data->i2c_client->dev, in si5341_dt_parse_dt()
1372 child->name); in si5341_dt_parse_dt()
1381 return -EINVAL; in si5341_dt_parse_dt()
1385 * If not pre-configured, calculate and set the PLL configuration manually.
1386 * For low-jitter performance, the PLL should be set such that the synthesizers
1390 * may be sub-optimal.
1394 struct device_node *np = data->i2c_client->dev.of_node; in si5341_initialize_pll()
1399 if (of_property_read_u32(np, "silabs,pll-m-num", &m_num)) { in si5341_initialize_pll()
1400 dev_err(&data->i2c_client->dev, in si5341_initialize_pll()
1401 "PLL configuration requires silabs,pll-m-num\n"); in si5341_initialize_pll()
1403 if (of_property_read_u32(np, "silabs,pll-m-den", &m_den)) { in si5341_initialize_pll()
1404 dev_err(&data->i2c_client->dev, in si5341_initialize_pll()
1405 "PLL configuration requires silabs,pll-m-den\n"); in si5341_initialize_pll()
1409 dev_err(&data->i2c_client->dev, in si5341_initialize_pll()
1415 m_den = clk_get_rate(data->input_clk[sel]) / 10; in si5341_initialize_pll()
1419 return si5341_encode_44_32(data->regmap, in si5341_initialize_pll()
1434 if (!data->input_clk[res]) { in si5341_clk_select_active_input()
1435 dev_dbg(&data->i2c_client->dev, in si5341_clk_select_active_input()
1437 res = -ENODEV; in si5341_clk_select_active_input()
1439 if (data->input_clk[i]) { in si5341_clk_select_active_input()
1445 dev_err(&data->i2c_client->dev, in si5341_clk_select_active_input()
1456 err = clk_prepare_enable(data->input_clk[res]); in si5341_clk_select_active_input()
1469 int res = regmap_read(data->regmap, SI5341_STATUS, &status); in input_present_show()
1484 int res = regmap_read(data->regmap, SI5341_STATUS_STICKY, &status); in input_present_sticky_show()
1499 int res = regmap_read(data->regmap, SI5341_STATUS, &status); in pll_locked_show()
1514 int res = regmap_read(data->regmap, SI5341_STATUS_STICKY, &status); in pll_locked_sticky_show()
1531 return -EINVAL; in clear_sticky_store()
1533 int res = regmap_write(data->regmap, SI5341_STATUS_STICKY, 0); in clear_sticky_store()
1564 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); in si5341_probe()
1566 return -ENOMEM; in si5341_probe()
1568 data->i2c_client = client; in si5341_probe()
1576 input = devm_clk_get(&client->dev, si5341_input_clock_names[i]); in si5341_probe()
1578 if (PTR_ERR(input) == -EPROBE_DEFER) in si5341_probe()
1579 return -EPROBE_DEFER; in si5341_probe()
1580 data->input_clk_name[i] = si5341_input_clock_names[i]; in si5341_probe()
1582 data->input_clk[i] = input; in si5341_probe()
1583 data->input_clk_name[i] = __clk_get_name(input); in si5341_probe()
1591 data->clk[i].vddo_reg = devm_regulator_get_optional( in si5341_probe()
1592 &client->dev, reg_name); in si5341_probe()
1593 if (IS_ERR(data->clk[i].vddo_reg)) { in si5341_probe()
1594 err = PTR_ERR(data->clk[i].vddo_reg); in si5341_probe()
1595 data->clk[i].vddo_reg = NULL; in si5341_probe()
1596 if (err == -ENODEV) in si5341_probe()
1600 err = regulator_enable(data->clk[i].vddo_reg); in si5341_probe()
1602 dev_err(&client->dev, in si5341_probe()
1605 data->clk[i].vddo_reg = NULL; in si5341_probe()
1615 if (of_property_read_string(client->dev.of_node, "clock-output-names", in si5341_probe()
1617 init.name = client->dev.of_node->name; in si5341_probe()
1620 data->regmap = devm_regmap_init_i2c(client, &si5341_regmap_config); in si5341_probe()
1621 if (IS_ERR(data->regmap)) { in si5341_probe()
1622 err = PTR_ERR(data->regmap); in si5341_probe()
1632 if (of_property_read_bool(client->dev.of_node, "silabs,reprogram")) { in si5341_probe()
1641 data->xaxb_ext_clk = of_property_read_bool(client->dev.of_node, in si5341_probe()
1642 "silabs,xaxb-ext-clk"); in si5341_probe()
1643 data->iovdd_33 = of_property_read_bool(client->dev.of_node, in si5341_probe()
1644 "silabs,iovdd-33"); in si5341_probe()
1661 regcache_cache_only(data->regmap, true); in si5341_probe()
1683 init.parent_names = data->input_clk_name; in si5341_probe()
1687 data->hw.init = &init; in si5341_probe()
1689 err = devm_clk_hw_register(&client->dev, &data->hw); in si5341_probe()
1691 dev_err(&client->dev, "clock registration failed\n"); in si5341_probe()
1698 for (i = 0; i < data->num_synth; ++i) { in si5341_probe()
1699 synth_clock_names[i] = devm_kasprintf(&client->dev, GFP_KERNEL, in si5341_probe()
1700 "%s.N%u", client->dev.of_node->name, i); in si5341_probe()
1702 err = -ENOMEM; in si5341_probe()
1706 data->synth[i].index = i; in si5341_probe()
1707 data->synth[i].data = data; in si5341_probe()
1708 data->synth[i].hw.init = &init; in si5341_probe()
1709 err = devm_clk_hw_register(&client->dev, &data->synth[i].hw); in si5341_probe()
1711 dev_err(&client->dev, in si5341_probe()
1717 init.num_parents = data->num_synth; in si5341_probe()
1720 for (i = 0; i < data->num_outputs; ++i) { in si5341_probe()
1722 client->dev.of_node->name, i); in si5341_probe()
1724 err = -ENOMEM; in si5341_probe()
1728 data->clk[i].index = i; in si5341_probe()
1729 data->clk[i].data = data; in si5341_probe()
1730 data->clk[i].hw.init = &init; in si5341_probe()
1732 regmap_write(data->regmap, in si5341_probe()
1733 SI5341_OUT_FORMAT(&data->clk[i]), in si5341_probe()
1735 regmap_write(data->regmap, in si5341_probe()
1736 SI5341_OUT_CM(&data->clk[i]), in si5341_probe()
1738 regmap_update_bits(data->regmap, in si5341_probe()
1739 SI5341_OUT_MUX_SEL(&data->clk[i]), in si5341_probe()
1743 err = devm_clk_hw_register(&client->dev, &data->clk[i].hw); in si5341_probe()
1746 dev_err(&client->dev, in si5341_probe()
1751 clk_prepare(data->clk[i].hw.clk); in si5341_probe()
1754 err = devm_of_clk_add_hw_provider(&client->dev, of_clk_si5341_get, in si5341_probe()
1757 dev_err(&client->dev, "unable to add clk provider\n"); in si5341_probe()
1763 regcache_cache_only(data->regmap, false); in si5341_probe()
1764 err = regcache_sync(data->regmap); in si5341_probe()
1774 err = regmap_read_poll_timeout(data->regmap, SI5341_STATUS, status, in si5341_probe()
1778 dev_err(&client->dev, "Error waiting for input clock or PLL lock\n"); in si5341_probe()
1783 err = regmap_write(data->regmap, SI5341_STATUS_STICKY, 0); in si5341_probe()
1785 dev_err(&client->dev, "unable to clear sticky status\n"); in si5341_probe()
1789 err = sysfs_create_files(&client->dev.kobj, si5341_attributes); in si5341_probe()
1791 dev_err(&client->dev, "unable to create sysfs files\n"); in si5341_probe()
1794 /* Free the names, clk framework makes copies */ in si5341_probe()
1795 for (i = 0; i < data->num_synth; ++i) in si5341_probe()
1796 devm_kfree(&client->dev, (void *)synth_clock_names[i]); in si5341_probe()
1801 if (data->clk[i].vddo_reg) in si5341_probe()
1802 regulator_disable(data->clk[i].vddo_reg); in si5341_probe()
1813 sysfs_remove_files(&client->dev.kobj, si5341_attributes); in si5341_remove()
1816 if (data->clk[i].vddo_reg) in si5341_remove()
1817 regulator_disable(data->clk[i].vddo_reg); in si5341_remove()