Lines Matching +full:clkout +full:- +full:disable
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * clk-si5351.c: Skyworks / Silicon Labs Si5351A/B/C I2C Clock Generator
6 * Rabeeh Khoury <rabeeh@solid-run.com>
10 * https://www.skyworksinc.com/-/media/Skyworks/SL/documents/public/data-sheets/Si5351-B.pdf
12 * https://www.skyworksinc.com/-/media/Skyworks/SL/documents/public/application-notes/AN619.pdf
18 #include <linux/clk-provider.h>
31 #include "clk-si5351.h"
63 struct si5351_hw_data *clkout; member
88 ret = regmap_read(drvdata->regmap, reg, &val); in si5351_reg_read()
90 dev_err(&drvdata->client->dev, in si5351_reg_read()
101 return regmap_bulk_read(drvdata->regmap, reg, buf, count); in si5351_bulk_read()
107 return regmap_write(drvdata->regmap, reg, val); in si5351_reg_write()
113 return regmap_raw_write(drvdata->regmap, reg, buf, count); in si5351_bulk_write()
119 return regmap_update_bits(drvdata->regmap, reg, mask, val); in si5351_set_bits()
125 return SI5351_CLK6_PARAMETERS + (num - 6); in si5351_msynth_params_address()
138 params->p1 = buf[0]; in si5351_read_parameters()
139 params->p2 = 0; in si5351_read_parameters()
140 params->p3 = 1; in si5351_read_parameters()
144 params->p1 = ((buf[2] & 0x03) << 16) | (buf[3] << 8) | buf[4]; in si5351_read_parameters()
145 params->p2 = ((buf[5] & 0x0f) << 16) | (buf[6] << 8) | buf[7]; in si5351_read_parameters()
146 params->p3 = ((buf[5] & 0xf0) << 12) | (buf[0] << 8) | buf[1]; in si5351_read_parameters()
148 params->valid = 1; in si5351_read_parameters()
159 buf[0] = params->p1 & 0xff; in si5351_write_parameters()
163 buf[0] = ((params->p3 & 0x0ff00) >> 8) & 0xff; in si5351_write_parameters()
164 buf[1] = params->p3 & 0xff; in si5351_write_parameters()
167 buf[2] |= ((params->p1 & 0x30000) >> 16) & 0x03; in si5351_write_parameters()
168 buf[3] = ((params->p1 & 0x0ff00) >> 8) & 0xff; in si5351_write_parameters()
169 buf[4] = params->p1 & 0xff; in si5351_write_parameters()
170 buf[5] = ((params->p3 & 0xf0000) >> 12) | in si5351_write_parameters()
171 ((params->p2 & 0xf0000) >> 16); in si5351_write_parameters()
172 buf[6] = ((params->p2 & 0x0ff00) >> 8) & 0xff; in si5351_write_parameters()
173 buf[7] = params->p2 & 0xff; in si5351_write_parameters()
200 /* read-only */ in si5351_regmap_is_writeable()
290 dev_dbg(&drvdata->client->dev, "%s - clkin div = %d, rate = %lu\n", in si5351_clkin_recalc_rate()
311 dev_warn(&hwdata->drvdata->client->dev, "VXCO currently unsupported\n"); in si5351_vxco_prepare()
351 * (1) MSNx_P1[17:0] = 128 * a + floor(128 * b/c) - 512
352 * (2) MSNx_P2[19:0] = 128 * b - c * floor(128 * b/c) = (128*b) mod c
358 * MSNx_P1 = 128 * a + (128 * b/MSNx_P2)/c - 512
374 return -EINVAL; in _si5351_pll_reparent()
376 if (drvdata->variant != SI5351_VARIANT_C && in _si5351_pll_reparent()
378 return -EINVAL; in _si5351_pll_reparent()
389 u8 mask = (hwdata->num == 0) ? SI5351_PLLA_SOURCE : SI5351_PLLB_SOURCE; in si5351_pll_get_parent()
392 val = si5351_reg_read(hwdata->drvdata, SI5351_PLL_INPUT_SOURCE); in si5351_pll_get_parent()
402 if (hwdata->drvdata->variant != SI5351_VARIANT_C && in si5351_pll_set_parent()
404 return -EPERM; in si5351_pll_set_parent()
407 return -EINVAL; in si5351_pll_set_parent()
409 return _si5351_pll_reparent(hwdata->drvdata, hwdata->num, in si5351_pll_set_parent()
419 u8 reg = (hwdata->num == 0) ? SI5351_PLLA_PARAMETERS : in si5351_pll_recalc_rate()
423 if (!hwdata->params.valid) in si5351_pll_recalc_rate()
424 si5351_read_parameters(hwdata->drvdata, reg, &hwdata->params); in si5351_pll_recalc_rate()
426 if (hwdata->params.p3 == 0) in si5351_pll_recalc_rate()
430 rate = hwdata->params.p1 * hwdata->params.p3; in si5351_pll_recalc_rate()
431 rate += 512 * hwdata->params.p3; in si5351_pll_recalc_rate()
432 rate += hwdata->params.p2; in si5351_pll_recalc_rate()
434 do_div(rate, 128 * hwdata->params.p3); in si5351_pll_recalc_rate()
436 dev_dbg(&hwdata->drvdata->client->dev, in si5351_pll_recalc_rate()
437 "%s - %s: p1 = %lu, p2 = %lu, p3 = %lu, parent_rate = %lu, rate = %lu\n", in si5351_pll_recalc_rate()
439 hwdata->params.p1, hwdata->params.p2, hwdata->params.p3, in si5351_pll_recalc_rate()
450 unsigned long rate = req->rate; in si5351_pll_determine_rate()
460 a = rate / req->best_parent_rate; in si5351_pll_determine_rate()
463 rate = req->best_parent_rate * SI5351_PLL_A_MIN; in si5351_pll_determine_rate()
465 rate = req->best_parent_rate * SI5351_PLL_A_MAX; in si5351_pll_determine_rate()
469 lltmp = rate % (req->best_parent_rate); in si5351_pll_determine_rate()
471 do_div(lltmp, req->best_parent_rate); in si5351_pll_determine_rate()
481 hwdata->params.p3 = c; in si5351_pll_determine_rate()
482 hwdata->params.p2 = (128 * b) % c; in si5351_pll_determine_rate()
483 hwdata->params.p1 = 128 * a; in si5351_pll_determine_rate()
484 hwdata->params.p1 += (128 * b / c); in si5351_pll_determine_rate()
485 hwdata->params.p1 -= 512; in si5351_pll_determine_rate()
488 lltmp = req->best_parent_rate; in si5351_pll_determine_rate()
493 rate += req->best_parent_rate * a; in si5351_pll_determine_rate()
495 dev_dbg(&hwdata->drvdata->client->dev, in si5351_pll_determine_rate()
496 "%s - %s: a = %lu, b = %lu, c = %lu, parent_rate = %lu, rate = %lu\n", in si5351_pll_determine_rate()
498 req->best_parent_rate, rate); in si5351_pll_determine_rate()
500 req->rate = rate; in si5351_pll_determine_rate()
509 u8 reg = (hwdata->num == 0) ? SI5351_PLLA_PARAMETERS : in si5351_pll_set_rate()
513 si5351_write_parameters(hwdata->drvdata, reg, &hwdata->params); in si5351_pll_set_rate()
516 si5351_set_bits(hwdata->drvdata, SI5351_CLK6_CTRL + hwdata->num, in si5351_pll_set_rate()
518 (hwdata->params.p2 == 0) ? SI5351_CLK_INTEGER_MODE : 0); in si5351_pll_set_rate()
521 si5351_reg_write(hwdata->drvdata, SI5351_PLL_RESET, in si5351_pll_set_rate()
522 hwdata->num == 0 ? SI5351_PLL_RESET_A : in si5351_pll_set_rate()
525 dev_dbg(&hwdata->drvdata->client->dev, in si5351_pll_set_rate()
526 "%s - %s: p1 = %lu, p2 = %lu, p3 = %lu, parent_rate = %lu, rate = %lu\n", in si5351_pll_set_rate()
528 hwdata->params.p1, hwdata->params.p2, hwdata->params.p3, in si5351_pll_set_rate()
554 * MSx_P1[17:0] = 128 * a + floor(128 * b/c) - 512
555 * MSx_P2[19:0] = 128 * b - c * floor(128 * b/c) = (128*b) mod c
572 return -EINVAL; in _si5351_msynth_reparent()
586 val = si5351_reg_read(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num); in si5351_msynth_get_parent()
596 return _si5351_msynth_reparent(hwdata->drvdata, hwdata->num, in si5351_msynth_set_parent()
606 u8 reg = si5351_msynth_params_address(hwdata->num); in si5351_msynth_recalc_rate()
610 if (!hwdata->params.valid) in si5351_msynth_recalc_rate()
611 si5351_read_parameters(hwdata->drvdata, reg, &hwdata->params); in si5351_msynth_recalc_rate()
614 * multisync0-5: fOUT = (128 * P3 * fIN) / (P1*P3 + P2 + 512*P3) in si5351_msynth_recalc_rate()
615 * multisync6-7: fOUT = fIN / P1 in si5351_msynth_recalc_rate()
618 if (hwdata->num > 5) { in si5351_msynth_recalc_rate()
619 m = hwdata->params.p1; in si5351_msynth_recalc_rate()
620 } else if (hwdata->params.p3 == 0) { in si5351_msynth_recalc_rate()
622 } else if ((si5351_reg_read(hwdata->drvdata, reg + 2) & in si5351_msynth_recalc_rate()
626 rate *= 128 * hwdata->params.p3; in si5351_msynth_recalc_rate()
627 m = hwdata->params.p1 * hwdata->params.p3; in si5351_msynth_recalc_rate()
628 m += hwdata->params.p2; in si5351_msynth_recalc_rate()
629 m += 512 * hwdata->params.p3; in si5351_msynth_recalc_rate()
636 dev_dbg(&hwdata->drvdata->client->dev, in si5351_msynth_recalc_rate()
637 "%s - %s: p1 = %lu, p2 = %lu, p3 = %lu, m = %lu, parent_rate = %lu, rate = %lu\n", in si5351_msynth_recalc_rate()
639 hwdata->params.p1, hwdata->params.p2, hwdata->params.p3, in si5351_msynth_recalc_rate()
650 unsigned long rate = req->rate; in si5351_msynth_determine_rate()
655 /* multisync6-7 can only handle freqencies < 150MHz */ in si5351_msynth_determine_rate()
656 if (hwdata->num >= 6 && rate > SI5351_MULTISYNTH67_MAX_FREQ) in si5351_msynth_determine_rate()
685 req->best_parent_rate = a * rate; in si5351_msynth_determine_rate()
686 } else if (hwdata->num >= 6) { in si5351_msynth_determine_rate()
688 a = DIV_ROUND_CLOSEST(req->best_parent_rate, rate); in si5351_msynth_determine_rate()
699 /* disable divby4 */ in si5351_msynth_determine_rate()
706 a = req->best_parent_rate / rate; in si5351_msynth_determine_rate()
714 lltmp = req->best_parent_rate % rate; in si5351_msynth_determine_rate()
728 lltmp = req->best_parent_rate; in si5351_msynth_determine_rate()
735 hwdata->params.p3 = 1; in si5351_msynth_determine_rate()
736 hwdata->params.p2 = 0; in si5351_msynth_determine_rate()
737 hwdata->params.p1 = 0; in si5351_msynth_determine_rate()
738 } else if (hwdata->num >= 6) { in si5351_msynth_determine_rate()
739 hwdata->params.p3 = 0; in si5351_msynth_determine_rate()
740 hwdata->params.p2 = 0; in si5351_msynth_determine_rate()
741 hwdata->params.p1 = a; in si5351_msynth_determine_rate()
743 hwdata->params.p3 = c; in si5351_msynth_determine_rate()
744 hwdata->params.p2 = (128 * b) % c; in si5351_msynth_determine_rate()
745 hwdata->params.p1 = 128 * a; in si5351_msynth_determine_rate()
746 hwdata->params.p1 += (128 * b / c); in si5351_msynth_determine_rate()
747 hwdata->params.p1 -= 512; in si5351_msynth_determine_rate()
750 dev_dbg(&hwdata->drvdata->client->dev, in si5351_msynth_determine_rate()
751 "%s - %s: a = %lu, b = %lu, c = %lu, divby4 = %d, parent_rate = %lu, rate = %lu\n", in si5351_msynth_determine_rate()
753 req->best_parent_rate, rate); in si5351_msynth_determine_rate()
755 req->rate = rate; in si5351_msynth_determine_rate()
765 u8 reg = si5351_msynth_params_address(hwdata->num); in si5351_msynth_set_rate()
769 si5351_write_parameters(hwdata->drvdata, reg, &hwdata->params); in si5351_msynth_set_rate()
774 /* enable/disable integer mode and divby4 on multisynth0-5 */ in si5351_msynth_set_rate()
775 if (hwdata->num < 6) { in si5351_msynth_set_rate()
776 si5351_set_bits(hwdata->drvdata, reg + 2, in si5351_msynth_set_rate()
779 si5351_set_bits(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num, in si5351_msynth_set_rate()
781 (hwdata->params.p2 == 0) ? SI5351_CLK_INTEGER_MODE : 0); in si5351_msynth_set_rate()
784 dev_dbg(&hwdata->drvdata->client->dev, in si5351_msynth_set_rate()
785 "%s - %s: p1 = %lu, p2 = %lu, p3 = %lu, divby4 = %d, parent_rate = %lu, rate = %lu\n", in si5351_msynth_set_rate()
787 hwdata->params.p1, hwdata->params.p2, hwdata->params.p3, in si5351_msynth_set_rate()
802 * Si5351 clkout divider
810 return -EINVAL; in _si5351_clkout_reparent()
827 if (drvdata->variant != SI5351_VARIANT_C) in _si5351_clkout_reparent()
828 return -EINVAL; in _si5351_clkout_reparent()
848 return -EINVAL; in _si5351_clkout_set_drive_strength()
878 u8 shift = (num < 4) ? (2 * num) : (2 * (num-4)); in _si5351_clkout_set_disable_state()
883 return -EINVAL; in _si5351_clkout_set_disable_state()
923 err = regmap_read_poll_timeout(drvdata->regmap, SI5351_PLL_RESET, v, in _si5351_clkout_reset_pll()
926 dev_err(&drvdata->client->dev, "Reset bit didn't clear\n"); in _si5351_clkout_reset_pll()
928 dev_dbg(&drvdata->client->dev, "%s - %s: pll = %d\n", in _si5351_clkout_reset_pll()
929 __func__, clk_hw_get_name(&drvdata->clkout[num].hw), in _si5351_clkout_reset_pll()
938 hwdata->drvdata->client->dev.platform_data; in si5351_clkout_prepare()
940 si5351_set_bits(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num, in si5351_clkout_prepare()
944 * Do a pll soft reset on the parent pll -- needed to get a in si5351_clkout_prepare()
947 if (pdata->clkout[hwdata->num].pll_reset) in si5351_clkout_prepare()
948 _si5351_clkout_reset_pll(hwdata->drvdata, hwdata->num); in si5351_clkout_prepare()
950 si5351_set_bits(hwdata->drvdata, SI5351_OUTPUT_ENABLE_CTRL, in si5351_clkout_prepare()
951 (1 << hwdata->num), 0); in si5351_clkout_prepare()
960 si5351_set_bits(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num, in si5351_clkout_unprepare()
962 si5351_set_bits(hwdata->drvdata, SI5351_OUTPUT_ENABLE_CTRL, in si5351_clkout_unprepare()
963 (1 << hwdata->num), (1 << hwdata->num)); in si5351_clkout_unprepare()
973 val = si5351_reg_read(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num); in si5351_clkout_get_parent()
1013 return _si5351_clkout_reparent(hwdata->drvdata, hwdata->num, parent); in si5351_clkout_set_parent()
1024 if (hwdata->num <= 5) in si5351_clkout_recalc_rate()
1025 reg = si5351_msynth_params_address(hwdata->num) + 2; in si5351_clkout_recalc_rate()
1029 rdiv = si5351_reg_read(hwdata->drvdata, reg); in si5351_clkout_recalc_rate()
1030 if (hwdata->num == 6) { in si5351_clkout_recalc_rate()
1045 unsigned long rate = req->rate; in si5351_clkout_determine_rate()
1049 if (hwdata->num >= 6 && rate > SI5351_CLKOUT67_MAX_FREQ) in si5351_clkout_determine_rate()
1052 /* clkout freqency is 8kHz - 160MHz */ in si5351_clkout_determine_rate()
1067 req->best_parent_rate = rate; in si5351_clkout_determine_rate()
1073 new_rate = req->best_parent_rate; in si5351_clkout_determine_rate()
1074 err = abs(new_rate - rate); in si5351_clkout_determine_rate()
1077 new_err = abs(new_rate - rate); in si5351_clkout_determine_rate()
1084 rate = req->best_parent_rate >> rdiv; in si5351_clkout_determine_rate()
1086 dev_dbg(&hwdata->drvdata->client->dev, in si5351_clkout_determine_rate()
1087 "%s - %s: rdiv = %u, parent_rate = %lu, rate = %lu\n", in si5351_clkout_determine_rate()
1089 req->best_parent_rate, rate); in si5351_clkout_determine_rate()
1091 req->rate = rate; in si5351_clkout_determine_rate()
1106 err = abs(new_rate - rate); in si5351_clkout_set_rate()
1109 new_err = abs(new_rate - rate); in si5351_clkout_set_rate()
1117 switch (hwdata->num) { in si5351_clkout_set_rate()
1119 si5351_set_bits(hwdata->drvdata, SI5351_CLK6_7_OUTPUT_DIVIDER, in si5351_clkout_set_rate()
1123 si5351_set_bits(hwdata->drvdata, SI5351_CLK6_7_OUTPUT_DIVIDER, in si5351_clkout_set_rate()
1128 si5351_set_bits(hwdata->drvdata, in si5351_clkout_set_rate()
1129 si5351_msynth_params_address(hwdata->num) + 2, in si5351_clkout_set_rate()
1134 /* powerup clkout */ in si5351_clkout_set_rate()
1135 si5351_set_bits(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num, in si5351_clkout_set_rate()
1138 dev_dbg(&hwdata->drvdata->client->dev, in si5351_clkout_set_rate()
1139 "%s - %s: rdiv = %u, parent_rate = %lu, rate = %lu\n", in si5351_clkout_set_rate()
1162 { .compatible = "silabs,si5351a-msop",
1173 struct device_node *child, *np = client->dev.of_node; in si5351_dt_parse()
1183 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); in si5351_dt_parse()
1185 return -ENOMEM; in si5351_dt_parse()
1188 * property silabs,pll-source : <num src>, [<..>] in si5351_dt_parse()
1191 of_property_for_each_u32(np, "silabs,pll-source", prop, p, num) { in si5351_dt_parse()
1193 dev_err(&client->dev, in si5351_dt_parse()
1194 "invalid pll %d on pll-source prop\n", num); in si5351_dt_parse()
1195 return -EINVAL; in si5351_dt_parse()
1200 dev_err(&client->dev, in si5351_dt_parse()
1201 "missing pll-source for pll %d\n", num); in si5351_dt_parse()
1202 return -EINVAL; in si5351_dt_parse()
1207 pdata->pll_src[num] = SI5351_PLL_SRC_XTAL; in si5351_dt_parse()
1211 dev_err(&client->dev, in si5351_dt_parse()
1214 return -EINVAL; in si5351_dt_parse()
1216 pdata->pll_src[num] = SI5351_PLL_SRC_CLKIN; in si5351_dt_parse()
1219 dev_err(&client->dev, in si5351_dt_parse()
1221 return -EINVAL; in si5351_dt_parse()
1225 /* per clkout properties */ in si5351_dt_parse()
1228 dev_err(&client->dev, "missing reg property of %pOFn\n", in si5351_dt_parse()
1235 dev_err(&client->dev, "invalid clkout %d\n", num); in si5351_dt_parse()
1239 if (!of_property_read_u32(child, "silabs,multisynth-source", in si5351_dt_parse()
1243 pdata->clkout[num].multisynth_src = in si5351_dt_parse()
1247 pdata->clkout[num].multisynth_src = in si5351_dt_parse()
1251 dev_err(&client->dev, in si5351_dt_parse()
1258 if (!of_property_read_u32(child, "silabs,clock-source", &val)) { in si5351_dt_parse()
1261 pdata->clkout[num].clkout_src = in si5351_dt_parse()
1265 pdata->clkout[num].clkout_src = in si5351_dt_parse()
1269 pdata->clkout[num].clkout_src = in si5351_dt_parse()
1274 dev_err(&client->dev, in si5351_dt_parse()
1275 "invalid parent %d for clkout %d\n", in si5351_dt_parse()
1279 pdata->clkout[num].clkout_src = in si5351_dt_parse()
1283 dev_err(&client->dev, in si5351_dt_parse()
1284 "invalid parent %d for clkout %d\n", in si5351_dt_parse()
1290 if (!of_property_read_u32(child, "silabs,drive-strength", in si5351_dt_parse()
1297 pdata->clkout[num].drive = val; in si5351_dt_parse()
1300 dev_err(&client->dev, in si5351_dt_parse()
1301 "invalid drive strength %d for clkout %d\n", in si5351_dt_parse()
1307 if (!of_property_read_u32(child, "silabs,disable-state", in si5351_dt_parse()
1311 pdata->clkout[num].disable_state = in si5351_dt_parse()
1315 pdata->clkout[num].disable_state = in si5351_dt_parse()
1319 pdata->clkout[num].disable_state = in si5351_dt_parse()
1323 pdata->clkout[num].disable_state = in si5351_dt_parse()
1327 dev_err(&client->dev, in si5351_dt_parse()
1328 "invalid disable state %d for clkout %d\n", in si5351_dt_parse()
1334 if (!of_property_read_u32(child, "clock-frequency", &val)) in si5351_dt_parse()
1335 pdata->clkout[num].rate = val; in si5351_dt_parse()
1337 pdata->clkout[num].pll_master = in si5351_dt_parse()
1338 of_property_read_bool(child, "silabs,pll-master"); in si5351_dt_parse()
1340 pdata->clkout[num].pll_reset = in si5351_dt_parse()
1341 of_property_read_bool(child, "silabs,pll-reset"); in si5351_dt_parse()
1343 client->dev.platform_data = pdata; in si5351_dt_parse()
1348 return -EINVAL; in si5351_dt_parse()
1355 unsigned int idx = clkspec->args[0]; in si53351_of_clk_get()
1357 if (idx >= drvdata->num_clkout) { in si53351_of_clk_get()
1359 return ERR_PTR(-EINVAL); in si53351_of_clk_get()
1362 return &drvdata->clkout[idx].hw; in si53351_of_clk_get()
1379 { "si5351a-msop", SI5351_VARIANT_A3 },
1389 enum si5351_variant variant = (enum si5351_variant)id->driver_data; in si5351_i2c_probe()
1401 pdata = client->dev.platform_data; in si5351_i2c_probe()
1403 return -EINVAL; in si5351_i2c_probe()
1405 drvdata = devm_kzalloc(&client->dev, sizeof(*drvdata), GFP_KERNEL); in si5351_i2c_probe()
1407 return -ENOMEM; in si5351_i2c_probe()
1410 drvdata->client = client; in si5351_i2c_probe()
1411 drvdata->variant = variant; in si5351_i2c_probe()
1412 drvdata->pxtal = devm_clk_get(&client->dev, "xtal"); in si5351_i2c_probe()
1413 drvdata->pclkin = devm_clk_get(&client->dev, "clkin"); in si5351_i2c_probe()
1415 if (PTR_ERR(drvdata->pxtal) == -EPROBE_DEFER || in si5351_i2c_probe()
1416 PTR_ERR(drvdata->pclkin) == -EPROBE_DEFER) in si5351_i2c_probe()
1417 return -EPROBE_DEFER; in si5351_i2c_probe()
1423 if (IS_ERR(drvdata->pxtal) && in si5351_i2c_probe()
1424 (drvdata->variant != SI5351_VARIANT_C || IS_ERR(drvdata->pclkin))) { in si5351_i2c_probe()
1425 dev_err(&client->dev, "missing parent clock\n"); in si5351_i2c_probe()
1426 return -EINVAL; in si5351_i2c_probe()
1429 drvdata->regmap = devm_regmap_init_i2c(client, &si5351_regmap_config); in si5351_i2c_probe()
1430 if (IS_ERR(drvdata->regmap)) { in si5351_i2c_probe()
1431 dev_err(&client->dev, "failed to allocate register map\n"); in si5351_i2c_probe()
1432 return PTR_ERR(drvdata->regmap); in si5351_i2c_probe()
1435 /* Disable interrupts */ in si5351_i2c_probe()
1438 if (drvdata->variant != SI5351_VARIANT_C) in si5351_i2c_probe()
1444 ret = _si5351_pll_reparent(drvdata, n, pdata->pll_src[n]); in si5351_i2c_probe()
1446 dev_err(&client->dev, in si5351_i2c_probe()
1448 n, pdata->pll_src[n]); in si5351_i2c_probe()
1455 pdata->clkout[n].multisynth_src); in si5351_i2c_probe()
1457 dev_err(&client->dev, in si5351_i2c_probe()
1459 n, pdata->clkout[n].multisynth_src); in si5351_i2c_probe()
1464 pdata->clkout[n].clkout_src); in si5351_i2c_probe()
1466 dev_err(&client->dev, in si5351_i2c_probe()
1467 "failed to reparent clkout %d to %d\n", in si5351_i2c_probe()
1468 n, pdata->clkout[n].clkout_src); in si5351_i2c_probe()
1473 pdata->clkout[n].drive); in si5351_i2c_probe()
1475 dev_err(&client->dev, in si5351_i2c_probe()
1476 "failed set drive strength of clkout%d to %d\n", in si5351_i2c_probe()
1477 n, pdata->clkout[n].drive); in si5351_i2c_probe()
1482 pdata->clkout[n].disable_state); in si5351_i2c_probe()
1484 dev_err(&client->dev, in si5351_i2c_probe()
1485 "failed set disable state of clkout%d to %d\n", in si5351_i2c_probe()
1486 n, pdata->clkout[n].disable_state); in si5351_i2c_probe()
1496 if (!IS_ERR(drvdata->pxtal)) { in si5351_i2c_probe()
1497 drvdata->pxtal_name = __clk_get_name(drvdata->pxtal); in si5351_i2c_probe()
1498 init.parent_names = &drvdata->pxtal_name; in si5351_i2c_probe()
1501 drvdata->xtal.init = &init; in si5351_i2c_probe()
1502 ret = devm_clk_hw_register(&client->dev, &drvdata->xtal); in si5351_i2c_probe()
1504 dev_err(&client->dev, "unable to register %s\n", init.name); in si5351_i2c_probe()
1509 if (drvdata->variant == SI5351_VARIANT_C) { in si5351_i2c_probe()
1513 if (!IS_ERR(drvdata->pclkin)) { in si5351_i2c_probe()
1514 drvdata->pclkin_name = __clk_get_name(drvdata->pclkin); in si5351_i2c_probe()
1515 init.parent_names = &drvdata->pclkin_name; in si5351_i2c_probe()
1518 drvdata->clkin.init = &init; in si5351_i2c_probe()
1519 ret = devm_clk_hw_register(&client->dev, &drvdata->clkin); in si5351_i2c_probe()
1521 dev_err(&client->dev, "unable to register %s\n", in si5351_i2c_probe()
1528 num_parents = (drvdata->variant == SI5351_VARIANT_C) ? 2 : 1; in si5351_i2c_probe()
1533 drvdata->pll[0].num = 0; in si5351_i2c_probe()
1534 drvdata->pll[0].drvdata = drvdata; in si5351_i2c_probe()
1535 drvdata->pll[0].hw.init = &init; in si5351_i2c_probe()
1542 ret = devm_clk_hw_register(&client->dev, &drvdata->pll[0].hw); in si5351_i2c_probe()
1544 dev_err(&client->dev, "unable to register %s\n", init.name); in si5351_i2c_probe()
1549 drvdata->pll[1].num = 1; in si5351_i2c_probe()
1550 drvdata->pll[1].drvdata = drvdata; in si5351_i2c_probe()
1551 drvdata->pll[1].hw.init = &init; in si5351_i2c_probe()
1553 if (drvdata->variant == SI5351_VARIANT_B) { in si5351_i2c_probe()
1566 ret = devm_clk_hw_register(&client->dev, &drvdata->pll[1].hw); in si5351_i2c_probe()
1568 dev_err(&client->dev, "unable to register %s\n", init.name); in si5351_i2c_probe()
1573 num_clocks = (drvdata->variant == SI5351_VARIANT_A3) ? 3 : 8; in si5351_i2c_probe()
1575 if (drvdata->variant == SI5351_VARIANT_B) in si5351_i2c_probe()
1580 drvdata->msynth = devm_kcalloc(&client->dev, num_clocks, in si5351_i2c_probe()
1581 sizeof(*drvdata->msynth), GFP_KERNEL); in si5351_i2c_probe()
1582 drvdata->clkout = devm_kcalloc(&client->dev, num_clocks, in si5351_i2c_probe()
1583 sizeof(*drvdata->clkout), GFP_KERNEL); in si5351_i2c_probe()
1584 drvdata->num_clkout = num_clocks; in si5351_i2c_probe()
1586 if (WARN_ON(!drvdata->msynth || !drvdata->clkout)) { in si5351_i2c_probe()
1587 ret = -ENOMEM; in si5351_i2c_probe()
1592 drvdata->msynth[n].num = n; in si5351_i2c_probe()
1593 drvdata->msynth[n].drvdata = drvdata; in si5351_i2c_probe()
1594 drvdata->msynth[n].hw.init = &init; in si5351_i2c_probe()
1599 if (pdata->clkout[n].pll_master) in si5351_i2c_probe()
1603 ret = devm_clk_hw_register(&client->dev, in si5351_i2c_probe()
1604 &drvdata->msynth[n].hw); in si5351_i2c_probe()
1606 dev_err(&client->dev, "unable to register %s\n", in si5351_i2c_probe()
1612 num_parents = (drvdata->variant == SI5351_VARIANT_C) ? 4 : 3; in si5351_i2c_probe()
1620 drvdata->clkout[n].num = n; in si5351_i2c_probe()
1621 drvdata->clkout[n].drvdata = drvdata; in si5351_i2c_probe()
1622 drvdata->clkout[n].hw.init = &init; in si5351_i2c_probe()
1627 if (pdata->clkout[n].clkout_src == SI5351_CLKOUT_SRC_MSYNTH_N) in si5351_i2c_probe()
1631 ret = devm_clk_hw_register(&client->dev, in si5351_i2c_probe()
1632 &drvdata->clkout[n].hw); in si5351_i2c_probe()
1634 dev_err(&client->dev, "unable to register %s\n", in si5351_i2c_probe()
1639 /* set initial clkout rate */ in si5351_i2c_probe()
1640 if (pdata->clkout[n].rate != 0) { in si5351_i2c_probe()
1642 ret = clk_set_rate(drvdata->clkout[n].hw.clk, in si5351_i2c_probe()
1643 pdata->clkout[n].rate); in si5351_i2c_probe()
1645 dev_err(&client->dev, "Cannot set rate : %d\n", in si5351_i2c_probe()
1651 ret = devm_of_clk_add_hw_provider(&client->dev, si53351_of_clk_get, in si5351_i2c_probe()
1654 dev_err(&client->dev, "unable to add clk provider\n"); in si5351_i2c_probe()