CC: [email protected] CC: [email protected] In-Reply-To: <[email protected]> References: <[email protected]> TO: Jens Renner <[email protected]> TO: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected] CC: [email protected]
Hi Jens, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on clk/clk-next] [also build test WARNING on linus/master v5.16-rc4] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Jens-Renner/clk-si5351-Add-phase-offset-for-clock-output/20211208-234754 base: https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git clk-next :::::: branch date: 3 days ago :::::: commit date: 3 days ago config: riscv-randconfig-c006-20211207 (https://download.01.org/0day-ci/archive/20211211/[email protected]/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 097a1cb1d5ebb3a0ec4bcaed8ba3ff6a8e33c00a) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install riscv cross compiling tool for clang build # apt-get install binutils-riscv64-linux-gnu # https://github.com/0day-ci/linux/commit/2e4aec73925b427049ef0fd8cd48e660eaff48fb git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Jens-Renner/clk-si5351-Add-phase-offset-for-clock-output/20211208-234754 git checkout 2e4aec73925b427049ef0fd8cd48e660eaff48fb # save the config file to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> clang-analyzer warnings: (new ones prefixed by >>) ^ drivers/media/dvb-frontends/stb0899_algo.c:404:5: note: The left operand of '&' is a garbage value STB0899_SETFIELD_VAL(CFRM, cfr[0], MSB(internal->inversion * derot_freq)); ^ drivers/media/dvb-frontends/stb0899_priv.h:61:61: note: expanded from macro 'STB0899_SETFIELD_VAL' #define STB0899_SETFIELD_VAL(bitf, mask, val) (mask = (mask & (~(((1 << STB0899_WIDTH_##bitf) - 1) <<\ ~~~~ ^ Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 13 warnings generated. drivers/media/dvb-frontends/af9013.c:45:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:45:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:108:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:108:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:401:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:401:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:518:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:518:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:832:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:832:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:980:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:980:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:1166:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:1166:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:1185:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:1185:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:1239:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:1239:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:1260:21: warning: Value stored to 'client' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ drivers/media/dvb-frontends/af9013.c:1260:21: note: Value stored to 'client' during its initialization is never read struct i2c_client *client = state->client; ^~~~~~ ~~~~~~~~~~~~~ Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 6 warnings generated. drivers/clk/clk-si5351.c:775:3: warning: Value stored to 'reg' is never read [clang-analyzer-deadcode.DeadStores] reg = si5351_set_bits(hwdata->drvdata, ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/clk/clk-si5351.c:775:3: note: Value stored to 'reg' is never read reg = si5351_set_bits(hwdata->drvdata, ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/clk/clk-si5351.c:875:2: warning: Value stored to 'act_degrees' is >> never read [clang-analyzer-deadcode.DeadStores] act_degrees = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(90 * phoff, rate), ^ drivers/clk/clk-si5351.c:875:2: note: Value stored to 'act_degrees' is never read >> drivers/clk/clk-si5351.c:1304:25: warning: Value stored to 'hwdata' during >> its initialization is never read [clang-analyzer-deadcode.DeadStores] struct si5351_hw_data *hwdata = ^~~~~~ drivers/clk/clk-si5351.c:1304:25: note: Value stored to 'hwdata' during its initialization is never read struct si5351_hw_data *hwdata = ^~~~~~ Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 20 warnings generated. drivers/media/tuners/mxl5005s.c:2668:3: warning: Value stored to 'Fmax' is never read [clang-analyzer-deadcode.DeadStores] Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2668:3: note: Value stored to 'Fmax' is never read Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2669:3: warning: Value stored to 'Fmin' is never read [clang-analyzer-deadcode.DeadStores] Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2669:3: note: Value stored to 'Fmin' is never read Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2677:3: warning: Value stored to 'Fmax' is never read [clang-analyzer-deadcode.DeadStores] Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2677:3: note: Value stored to 'Fmax' is never read Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2678:3: warning: Value stored to 'Fmin' is never read [clang-analyzer-deadcode.DeadStores] Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2678:3: note: Value stored to 'Fmin' is never read Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2686:3: warning: Value stored to 'Fmax' is never read [clang-analyzer-deadcode.DeadStores] Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2686:3: note: Value stored to 'Fmax' is never read Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2687:3: warning: Value stored to 'Fmin' is never read [clang-analyzer-deadcode.DeadStores] Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2687:3: note: Value stored to 'Fmin' is never read Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2695:3: warning: Value stored to 'Fmax' is never read [clang-analyzer-deadcode.DeadStores] Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2695:3: note: Value stored to 'Fmax' is never read Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2696:3: warning: Value stored to 'Fmin' is never read [clang-analyzer-deadcode.DeadStores] Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2696:3: note: Value stored to 'Fmin' is never read Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2704:3: warning: Value stored to 'Fmax' is never read [clang-analyzer-deadcode.DeadStores] Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2704:3: note: Value stored to 'Fmax' is never read Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2705:3: warning: Value stored to 'Fmin' is never read [clang-analyzer-deadcode.DeadStores] Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2705:3: note: Value stored to 'Fmin' is never read Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2713:3: warning: Value stored to 'Fmax' is never read [clang-analyzer-deadcode.DeadStores] Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2713:3: note: Value stored to 'Fmax' is never read Fmax = FmaxBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2714:3: warning: Value stored to 'Fmin' is never read [clang-analyzer-deadcode.DeadStores] Fmin = FminBin ; ^ ~~~~~~~ drivers/media/tuners/mxl5005s.c:2714:3: note: Value stored to 'Fmin' is never read Fmin = FminBin ; vim +/act_degrees +875 drivers/clk/clk-si5351.c 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 754 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 755 static int si5351_msynth_set_rate(struct clk_hw *hw, unsigned long rate, 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 756 unsigned long parent_rate) 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 757 { 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 758 struct si5351_hw_data *hwdata = 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 759 container_of(hw, struct si5351_hw_data, hw); 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 760 u8 reg = si5351_msynth_params_address(hwdata->num); 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 761 int divby4 = 0; 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 762 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 763 /* write multisynth parameters */ 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 764 si5351_write_parameters(hwdata->drvdata, reg, &hwdata->params); 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 765 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 766 if (rate > SI5351_MULTISYNTH_DIVBY4_FREQ) 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 767 divby4 = 1; 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 768 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 769 /* enable/disable integer mode and divby4 on multisynth0-5 */ 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 770 if (hwdata->num < 6) { 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 771 si5351_set_bits(hwdata->drvdata, reg + 2, 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 772 SI5351_OUTPUT_CLK_DIVBY4, 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 773 (divby4) ? SI5351_OUTPUT_CLK_DIVBY4 : 0); 2e4aec73925b42 Jens Renner 2021-12-08 774 /* clear existing phase offset */ 2e4aec73925b42 Jens Renner 2021-12-08 @775 reg = si5351_set_bits(hwdata->drvdata, 2e4aec73925b42 Jens Renner 2021-12-08 776 SI5351_CLK0_PHASE_OFFSET + hwdata->num, 2e4aec73925b42 Jens Renner 2021-12-08 777 SI5351_CLK_PHASE_OFFSET_MASK, 0); 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 778 si5351_set_bits(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num, 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 779 SI5351_CLK_INTEGER_MODE, 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 780 (hwdata->params.p2 == 0) ? SI5351_CLK_INTEGER_MODE : 0); 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 781 } 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 782 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 783 dev_dbg(&hwdata->drvdata->client->dev, 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 784 "%s - %s: p1 = %lu, p2 = %lu, p3 = %lu, divby4 = %d, parent_rate = %lu, rate = %lu\n", 44f22a5d671ad8 Stephen Boyd 2015-08-07 785 __func__, clk_hw_get_name(hw), 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 786 hwdata->params.p1, hwdata->params.p2, hwdata->params.p3, 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 787 divby4, parent_rate, rate); 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 788 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 789 return 0; 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 790 } 9abd5f0555df6c Sebastian Hesselbarth 2013-04-11 791 2e4aec73925b42 Jens Renner 2021-12-08 792 /* 2e4aec73925b42 Jens Renner 2021-12-08 793 * Initial phase offset for MS0..5 can be set in 127 steps of T_vco/4. 2e4aec73925b42 Jens Renner 2021-12-08 794 * With a minimum MS divider a = 6, a theoretical maximum phase shift of 2e4aec73925b42 Jens Renner 2021-12-08 795 * ph_ms,max = 127 * 90 deg. / 6 = 1905 deg. is possible at the MS output. 2e4aec73925b42 Jens Renner 2021-12-08 796 * 2e4aec73925b42 Jens Renner 2021-12-08 797 * For a maximum R divider of 128 though, CLKOUT could request a phase shift 2e4aec73925b42 Jens Renner 2021-12-08 798 * from the MS of up to 128 * 360 deg. = 46080 deg. 2e4aec73925b42 Jens Renner 2021-12-08 799 * 2e4aec73925b42 Jens Renner 2021-12-08 800 * (clk_set_phase() applies a limit of degrees %= 360 which means CLKOUT phase 2e4aec73925b42 Jens Renner 2021-12-08 801 * offsets will be restricted to ph_clk < 180,..,3 deg. for RDIV = 2,..,128 2e4aec73925b42 Jens Renner 2021-12-08 802 * when not calling si5351_msynth_set_phase() directly!) 2e4aec73925b42 Jens Renner 2021-12-08 803 */ 2e4aec73925b42 Jens Renner 2021-12-08 804 static int si5351_msynth_set_phase(struct clk_hw *hw, int degrees) 2e4aec73925b42 Jens Renner 2021-12-08 805 { 2e4aec73925b42 Jens Renner 2021-12-08 806 struct si5351_hw_data *hwdata = 2e4aec73925b42 Jens Renner 2021-12-08 807 container_of(hw, struct si5351_hw_data, hw); 2e4aec73925b42 Jens Renner 2021-12-08 808 struct clk_hw *parent_hw; 2e4aec73925b42 Jens Renner 2021-12-08 809 unsigned long parent_rate, rate; 2e4aec73925b42 Jens Renner 2021-12-08 810 unsigned int phoff, act_degrees, tmp; 2e4aec73925b42 Jens Renner 2021-12-08 811 bool fractmode; 2e4aec73925b42 Jens Renner 2021-12-08 812 2e4aec73925b42 Jens Renner 2021-12-08 813 /* 2e4aec73925b42 Jens Renner 2021-12-08 814 * To leverage the full phase offset range for high ratios of 2e4aec73925b42 Jens Renner 2021-12-08 815 * f_vco/f_clk, set the theoretical limit to ph_ms,max < 1905 deg. 2e4aec73925b42 Jens Renner 2021-12-08 816 * The later calculation could still fail for large phase-divider 2e4aec73925b42 Jens Renner 2021-12-08 817 * products (i.e. ph_ms * a = ph_ms * f_vco/f_ms > ph_vco,max). 2e4aec73925b42 Jens Renner 2021-12-08 818 */ 2e4aec73925b42 Jens Renner 2021-12-08 819 if ((degrees < 0) || (degrees >= 127*90/SI5351_MULTISYNTH_A_MIN) || 2e4aec73925b42 Jens Renner 2021-12-08 820 (hwdata->num > 5)) { 2e4aec73925b42 Jens Renner 2021-12-08 821 dev_err(&hwdata->drvdata->client->dev, 2e4aec73925b42 Jens Renner 2021-12-08 822 "Phase offset of %d degrees is not allowed for %s.\n", 2e4aec73925b42 Jens Renner 2021-12-08 823 degrees, clk_hw_get_name(hw)); 2e4aec73925b42 Jens Renner 2021-12-08 824 return -EINVAL; 2e4aec73925b42 Jens Renner 2021-12-08 825 } 2e4aec73925b42 Jens Renner 2021-12-08 826 2e4aec73925b42 Jens Renner 2021-12-08 827 /* 2e4aec73925b42 Jens Renner 2021-12-08 828 * Requested phase offset refers to multisynth output (ph_ms). 2e4aec73925b42 Jens Renner 2021-12-08 829 * CLKx_PHOFF[6:0] = round(t_off * 4 * f_vco) 2e4aec73925b42 Jens Renner 2021-12-08 830 * Convert phase offset for f_ms to steps of 4 x f_vco: 2e4aec73925b42 Jens Renner 2021-12-08 831 * ph_offs = ph_ms * (a + b/c) / 90 = ph_ms * (f_vco / f_ms) / 90 2e4aec73925b42 Jens Renner 2021-12-08 832 */ 2e4aec73925b42 Jens Renner 2021-12-08 833 parent_hw = clk_hw_get_parent(hw); 2e4aec73925b42 Jens Renner 2021-12-08 834 parent_rate = clk_get_rate(parent_hw->clk); 2e4aec73925b42 Jens Renner 2021-12-08 835 rate = clk_get_rate(hw->clk); 2e4aec73925b42 Jens Renner 2021-12-08 836 2e4aec73925b42 Jens Renner 2021-12-08 837 tmp = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(parent_rate, degrees), rate); 2e4aec73925b42 Jens Renner 2021-12-08 838 phoff = tmp/90; 2e4aec73925b42 Jens Renner 2021-12-08 839 2e4aec73925b42 Jens Renner 2021-12-08 840 if (phoff > 127) { 2e4aec73925b42 Jens Renner 2021-12-08 841 dev_err(&hwdata->drvdata->client->dev, 2e4aec73925b42 Jens Renner 2021-12-08 842 "Phase offset of %d degrees (%d steps) not possible for chosen rates of %s.\n", 2e4aec73925b42 Jens Renner 2021-12-08 843 degrees, phoff, clk_hw_get_name(hw)); 2e4aec73925b42 Jens Renner 2021-12-08 844 return -EINVAL; 2e4aec73925b42 Jens Renner 2021-12-08 845 } 2e4aec73925b42 Jens Renner 2021-12-08 846 2e4aec73925b42 Jens Renner 2021-12-08 847 /* 2e4aec73925b42 Jens Renner 2021-12-08 848 * Fractional mode should be used for phase offsets, but works only 2e4aec73925b42 Jens Renner 2021-12-08 849 * for dividers a + b/c >= 8! (P1 = 128 * a + floor(128*b/c) - 512). 2e4aec73925b42 Jens Renner 2021-12-08 850 * (For RDIVBY4 = 11b, P1 = 0, P2 = 0, P3 = 1.) 2e4aec73925b42 Jens Renner 2021-12-08 851 * Hence, use fract. mode for P2 != 0, or P1 >= 512 with phase offset. 2e4aec73925b42 Jens Renner 2021-12-08 852 */ 2e4aec73925b42 Jens Renner 2021-12-08 853 fractmode = ((hwdata->params.p2 != 0) || 2e4aec73925b42 Jens Renner 2021-12-08 854 ((phoff > 0) && (hwdata->params.p1 >= 512))); 2e4aec73925b42 Jens Renner 2021-12-08 855 2e4aec73925b42 Jens Renner 2021-12-08 856 si5351_set_bits(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num, 2e4aec73925b42 Jens Renner 2021-12-08 857 SI5351_CLK_INTEGER_MODE, 2e4aec73925b42 Jens Renner 2021-12-08 858 (fractmode) ? 0 : SI5351_CLK_INTEGER_MODE); 2e4aec73925b42 Jens Renner 2021-12-08 859 2e4aec73925b42 Jens Renner 2021-12-08 860 /* 2e4aec73925b42 Jens Renner 2021-12-08 861 * For a MS rate f_ms > 112.5 MHz, only dividers a < 8 are possible and 2e4aec73925b42 Jens Renner 2021-12-08 862 * fractional mode cannot be used. Issue a warning and continue. 2e4aec73925b42 Jens Renner 2021-12-08 863 * (Tested & works for f_ms = 128 MHz, a = 7, and ph_vco = 7 * 90 deg.) 2e4aec73925b42 Jens Renner 2021-12-08 864 */ 2e4aec73925b42 Jens Renner 2021-12-08 865 if ((phoff > 0) && !fractmode) { 2e4aec73925b42 Jens Renner 2021-12-08 866 dev_warn(&hwdata->drvdata->client->dev, 2e4aec73925b42 Jens Renner 2021-12-08 867 "Fract. mode cannot be set for divider of %s. Continue with int. mode.\n", 2e4aec73925b42 Jens Renner 2021-12-08 868 clk_hw_get_name(hw)); 2e4aec73925b42 Jens Renner 2021-12-08 869 } 2e4aec73925b42 Jens Renner 2021-12-08 870 2e4aec73925b42 Jens Renner 2021-12-08 871 si5351_set_bits(hwdata->drvdata, 2e4aec73925b42 Jens Renner 2021-12-08 872 SI5351_CLK0_PHASE_OFFSET + hwdata->num, 2e4aec73925b42 Jens Renner 2021-12-08 873 SI5351_CLK_PHASE_OFFSET_MASK, phoff); 2e4aec73925b42 Jens Renner 2021-12-08 874 2e4aec73925b42 Jens Renner 2021-12-08 @875 act_degrees = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(90 * phoff, rate), 2e4aec73925b42 Jens Renner 2021-12-08 876 parent_rate); 2e4aec73925b42 Jens Renner 2021-12-08 877 2e4aec73925b42 Jens Renner 2021-12-08 878 dev_dbg(&hwdata->drvdata->client->dev, 2e4aec73925b42 Jens Renner 2021-12-08 879 "%s - %s: degrees = %d, actual = %d, phoff steps = %u, mode = %c. PLL needs reset!\n", 2e4aec73925b42 Jens Renner 2021-12-08 880 __func__, clk_hw_get_name(hw), 2e4aec73925b42 Jens Renner 2021-12-08 881 degrees, act_degrees, phoff, (fractmode) ? 'f' : 'i'); 2e4aec73925b42 Jens Renner 2021-12-08 882 2e4aec73925b42 Jens Renner 2021-12-08 883 return 0; 2e4aec73925b42 Jens Renner 2021-12-08 884 } 2e4aec73925b42 Jens Renner 2021-12-08 885 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
