mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-18 00:24:58 +08:00
net: dsa: sja1105: make future_base_time a common helper
Because the PTP_CLK pin starts toggling only at a time higher than the current PTP clock, this helper from the time-aware shaper code comes in handy here as well. We'll use it to transform generic user input for the perout request into valid input for the sja1105 hardware. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
79d5511cc0
commit
4bfa1616d9
@ -21,6 +21,33 @@ static inline s64 sja1105_ticks_to_ns(s64 ticks)
|
||||
return ticks * SJA1105_TICK_NS;
|
||||
}
|
||||
|
||||
/* Calculate the first base_time in the future that satisfies this
|
||||
* relationship:
|
||||
*
|
||||
* future_base_time = base_time + N x cycle_time >= now, or
|
||||
*
|
||||
* now - base_time
|
||||
* N >= ---------------
|
||||
* cycle_time
|
||||
*
|
||||
* Because N is an integer, the ceiling value of the above "a / b" ratio
|
||||
* is in fact precisely the floor value of "(a + b - 1) / b", which is
|
||||
* easier to calculate only having integer division tools.
|
||||
*/
|
||||
static inline s64 future_base_time(s64 base_time, s64 cycle_time, s64 now)
|
||||
{
|
||||
s64 a, b, n;
|
||||
|
||||
if (base_time >= now)
|
||||
return base_time;
|
||||
|
||||
a = now - base_time;
|
||||
b = cycle_time;
|
||||
n = div_s64(a + b - 1, b);
|
||||
|
||||
return base_time + n * cycle_time;
|
||||
}
|
||||
|
||||
struct sja1105_ptp_cmd {
|
||||
u64 ptpstrtsch; /* start schedule */
|
||||
u64 ptpstopsch; /* stop schedule */
|
||||
|
@ -28,33 +28,6 @@ static s64 sja1105_delta_to_ns(s64 delta)
|
||||
return delta * 200;
|
||||
}
|
||||
|
||||
/* Calculate the first base_time in the future that satisfies this
|
||||
* relationship:
|
||||
*
|
||||
* future_base_time = base_time + N x cycle_time >= now, or
|
||||
*
|
||||
* now - base_time
|
||||
* N >= ---------------
|
||||
* cycle_time
|
||||
*
|
||||
* Because N is an integer, the ceiling value of the above "a / b" ratio
|
||||
* is in fact precisely the floor value of "(a + b - 1) / b", which is
|
||||
* easier to calculate only having integer division tools.
|
||||
*/
|
||||
static s64 future_base_time(s64 base_time, s64 cycle_time, s64 now)
|
||||
{
|
||||
s64 a, b, n;
|
||||
|
||||
if (base_time >= now)
|
||||
return base_time;
|
||||
|
||||
a = now - base_time;
|
||||
b = cycle_time;
|
||||
n = div_s64(a + b - 1, b);
|
||||
|
||||
return base_time + n * cycle_time;
|
||||
}
|
||||
|
||||
static int sja1105_tas_set_runtime_params(struct sja1105_private *priv)
|
||||
{
|
||||
struct sja1105_tas_data *tas_data = &priv->tas_data;
|
||||
|
Loading…
Reference in New Issue
Block a user