Lines Matching +full:reset +full:- +full:bps

1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (C) 2005 Marc Kleine-Budde, Pengutronix
4 * Copyright (C) 2008-2009 Wolfgang Grandegger <[email protected]>
10 #define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */
12 /* Bit-timing calculation derived from:
15 * Copyright 2004-2006 Pavel Pisa - DCE FELK CVUT cz
19 * Calculates proper bit-timing parameters for a specified bit-rate
20 * and sample-point, which can then be used to set the bit-timing
36 tseg2 = tseg + CAN_SYNC_SEG - in can_update_sample_point()
38 1000 - i; in can_update_sample_point()
39 tseg2 = clamp(tseg2, btc->tseg2_min, btc->tseg2_max); in can_update_sample_point()
40 tseg1 = tseg - tseg2; in can_update_sample_point()
41 if (tseg1 > btc->tseg1_max) { in can_update_sample_point()
42 tseg1 = btc->tseg1_max; in can_update_sample_point()
43 tseg2 = tseg - tseg1; in can_update_sample_point()
46 sample_point = 1000 * (tseg + CAN_SYNC_SEG - tseg2) / in can_update_sample_point()
48 sample_point_error = abs(sample_point_nominal - sample_point); in can_update_sample_point()
82 if (bt->sample_point) { in can_calc_bittiming()
83 sample_point_nominal = bt->sample_point; in can_calc_bittiming()
85 if (bt->bitrate > 800 * KILO /* BPS */) in can_calc_bittiming()
87 else if (bt->bitrate > 500 * KILO /* BPS */) in can_calc_bittiming()
94 for (tseg = (btc->tseg1_max + btc->tseg2_max) * 2 + 1; in can_calc_bittiming()
95 tseg >= (btc->tseg1_min + btc->tseg2_min) * 2; tseg--) { in can_calc_bittiming()
99 brp = priv->clock.freq / (tsegall * bt->bitrate) + tseg % 2; in can_calc_bittiming()
102 brp = (brp / btc->brp_inc) * btc->brp_inc; in can_calc_bittiming()
103 if (brp < btc->brp_min || brp > btc->brp_max) in can_calc_bittiming()
106 bitrate = priv->clock.freq / (brp * tsegall); in can_calc_bittiming()
107 bitrate_error = abs(bt->bitrate - bitrate); in can_calc_bittiming()
113 /* reset sample point error if we have a better bitrate */ in can_calc_bittiming()
132 /* Error in one-tenth of a percent */ in can_calc_bittiming()
134 do_div(v64, bt->bitrate); in can_calc_bittiming()
140 return -EINVAL; in can_calc_bittiming()
148 bt->sample_point = can_update_sample_point(btc, sample_point_nominal, in can_calc_bittiming()
153 do_div(v64, priv->clock.freq); in can_calc_bittiming()
154 bt->tq = (u32)v64; in can_calc_bittiming()
155 bt->prop_seg = tseg1 / 2; in can_calc_bittiming()
156 bt->phase_seg1 = tseg1 - bt->prop_seg; in can_calc_bittiming()
157 bt->phase_seg2 = tseg2; in can_calc_bittiming()
165 bt->brp = best_brp; in can_calc_bittiming()
168 bt->bitrate = priv->clock.freq / in can_calc_bittiming()
169 (bt->brp * can_bit_time(bt)); in can_calc_bittiming()
184 /* As specified in ISO 11898-1 section 11.3.3 "Transmitter in can_calc_tdco()
188 if (dbt->brp == 1 || dbt->brp == 2) { in can_calc_tdco()
190 u32 sample_point_in_tc = (CAN_SYNC_SEG + dbt->prop_seg + in can_calc_tdco()
191 dbt->phase_seg1) * dbt->brp; in can_calc_tdco()
193 if (sample_point_in_tc < tdc_const->tdco_min) in can_calc_tdco()
195 tdc->tdco = min(sample_point_in_tc, tdc_const->tdco_max); in can_calc_tdco()