1.1 --- a/pkg/devices/lib/cpm/src/common.cc Mon Oct 30 17:25:00 2023 +0100
1.2 +++ b/pkg/devices/lib/cpm/src/common.cc Fri Nov 03 18:09:49 2023 +0100
1.3 @@ -405,22 +405,28 @@
1.4 }
1.5 }
1.6
1.7 -#define zero_as_one(X) ((X) ? (X) : 1)
1.8
1.9
1.10 +#define zero_as_one(X) ((X) ? (X) : 1)
1.11
1.12 // Feedback multiplier.
1.13
1.14 uint32_t
1.15 Divider_pll::get_multiplier(Cpm_regs ®s)
1.16 {
1.17 - return zero_as_one(_multiplier.get_field(regs));
1.18 + if (_adjust_by_one)
1.19 + return _multiplier.get_field(regs) + 1;
1.20 + else
1.21 + return zero_as_one(_multiplier.get_field(regs));
1.22 }
1.23
1.24 void
1.25 Divider_pll::set_multiplier(Cpm_regs ®s, uint32_t multiplier)
1.26 {
1.27 - _multiplier.set_field(regs, multiplier);
1.28 + if (_adjust_by_one)
1.29 + _multiplier.set_field(regs, multiplier - 1);
1.30 + else
1.31 + _multiplier.set_field(regs, multiplier);
1.32 }
1.33
1.34 // Input divider.
1.35 @@ -428,13 +434,19 @@
1.36 uint32_t
1.37 Divider_pll::get_input_divider(Cpm_regs ®s)
1.38 {
1.39 - return zero_as_one(_input_divider.get_field(regs));
1.40 + if (_adjust_by_one)
1.41 + return _input_divider.get_field(regs) + 1;
1.42 + else
1.43 + return zero_as_one(_input_divider.get_field(regs));
1.44 }
1.45
1.46 void
1.47 Divider_pll::set_input_divider(Cpm_regs ®s, uint32_t divider)
1.48 {
1.49 - _input_divider.set_field(regs, divider);
1.50 + if (_adjust_by_one)
1.51 + _input_divider.set_field(regs, divider - 1);
1.52 + else
1.53 + _input_divider.set_field(regs, divider);
1.54 }
1.55
1.56 // Output dividers.
1.57 @@ -442,9 +454,20 @@
1.58 uint32_t
1.59 Divider_pll::get_output_divider(Cpm_regs ®s)
1.60 {
1.61 - uint32_t d0 = zero_as_one(_output_divider0.get_field(regs));
1.62 - uint32_t d1 = _output_divider1.is_defined() ?
1.63 - zero_as_one(_output_divider1.get_field(regs)) : 1;
1.64 + uint32_t d0, d1;
1.65 +
1.66 + if (_adjust_by_one)
1.67 + {
1.68 + d0 = _output_divider0.get_field(regs) + 1;
1.69 + d1 = _output_divider1.is_defined() ?
1.70 + _output_divider1.get_field(regs) + 1 : 1;
1.71 + }
1.72 + else
1.73 + {
1.74 + d0 = zero_as_one(_output_divider0.get_field(regs));
1.75 + d1 = _output_divider1.is_defined() ?
1.76 + zero_as_one(_output_divider1.get_field(regs)) : 1;
1.77 + }
1.78
1.79 return d0 * d1;
1.80 }
1.81 @@ -463,7 +486,10 @@
1.82
1.83 if (!_output_divider1.is_defined())
1.84 {
1.85 - _output_divider0.set_field(regs, divider);
1.86 + if (_adjust_by_one)
1.87 + _output_divider0.set_field(regs, divider);
1.88 + else
1.89 + _output_divider0.set_field(regs, divider - 1);
1.90 return;
1.91 }
1.92
1.93 @@ -481,8 +507,16 @@
1.94 d1 = divider / d0;
1.95 }
1.96
1.97 - _output_divider0.set_field(regs, d0);
1.98 - _output_divider1.set_field(regs, d1);
1.99 + if (_adjust_by_one)
1.100 + {
1.101 + _output_divider0.set_field(regs, d0 - 1);
1.102 + _output_divider1.set_field(regs, d1 - 1);
1.103 + }
1.104 + else
1.105 + {
1.106 + _output_divider0.set_field(regs, d0);
1.107 + _output_divider1.set_field(regs, d1);
1.108 + }
1.109 }
1.110
1.111 uint64_t