Received: by 2002:a4f:b056:0:0:0:0:0 with SMTP id m22csp1385562ivi; Fri, 2 Oct 2020 08:54:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz3sXBqFmbh3h5l47+P9+4MqDAqqNfq9LPblOLzb3ouekCaOfhY+Ku4Cohzy4f4RANwyUcv X-Received: by 2002:a17:906:37c6:: with SMTP id o6mr3074642ejc.404.1601654076700; Fri, 02 Oct 2020 08:54:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601654076; cv=none; d=google.com; s=arc-20160816; b=nX4UgIaNinvwvRb7lxlx4L08pq7TIU8YLYK7vCVq/hZrVhNforMT9/p1rvpbR0ATJn s8QVpHjVZN3ujSkYdG9CMsEWtZX3qKBkCdUf6iux2G0SZvBKrVkhtfgIYHJhm5eGSrL6 rQxPdsnw9DykGICY78pmDkFrG1btzuFlWjsCachFaCOJjRZmySnZWOI7eH8t27opIs2c iBDC1pzOcU+GNbsWs9wDYXruxi/WEEzrTjAY0Y4gafCPSlrSMglaIi4Lmt/UBmG/L4i/ DESwcIgLUOxscgfHbVnLWHcPi8ihKCuI+fsA5A/WbYxvDXVv+RNDi42MDAwquKoOFa3z Dbqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=66AI9eqiIEAnj1528Die9k8CfJVp+9xgfej4VwLuUaw=; b=IDCNiGHnUaBX1f4yi4NexeuD0xXYuTlkeYfezajqj5iKVAA2VhmjH9jQiVkgM1p9Y5 r+e9OhJyifhZiAfX+XHWw9/TAxxt5Z4Ht4Rc6UVd47vw/fCB64+cyzoT2bpxjOBUZ+Y1 S49PTC1ELeti76kd6LSKn0cn2xS08t16wj6a0HR/v6BGJTuKuxGdoC9SwUYKrcC8HAFn Br6tVOoh9N7XZ6ygfd7sNbjBaTI2bDg50a1vt3INcSpq26UqjwWqyW74mdIdL/08biT3 ZB0CYLalk0+ATalMhN2MkezvLiedMAhKeQQqYYH4c5ezuuvdPnIU/BDWKNN+Ki7oBCW2 2onQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f1si1254410ejh.0.2020.10.02.08.54.13; Fri, 02 Oct 2020 08:54:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387938AbgJBPvu (ORCPT + 99 others); Fri, 2 Oct 2020 11:51:50 -0400 Received: from smtp13.smtpout.orange.fr ([80.12.242.135]:38223 "EHLO smtp.smtpout.orange.fr" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2387692AbgJBPvt (ORCPT ); Fri, 2 Oct 2020 11:51:49 -0400 Received: from tomoyo.flets-east.jp ([153.230.197.127]) by mwinf5d76 with ME id b3re230092lQRaH033rizY; Fri, 02 Oct 2020 17:51:47 +0200 X-ME-Helo: tomoyo.flets-east.jp X-ME-Auth: bWFpbGhvbC52aW5jZW50QHdhbmFkb28uZnI= X-ME-Date: Fri, 02 Oct 2020 17:51:47 +0200 X-ME-IP: 153.230.197.127 From: Vincent Mailhol To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-can@vger.kernel.org, Wolfgang Grandegger , Marc Kleine-Budde , "David S . Miller" , Jakub Kicinski Cc: Vincent Mailhol , Oliver Neukum , Greg Kroah-Hartman , Masahiro Yamada , Arunachalam Santhanam , linux-usb@vger.kernel.org (open list:USB ACM DRIVER) Subject: [PATCH v3 5/7] can: dev: add a helper function to calculate the duration of one bit Date: Sat, 3 Oct 2020 00:41:49 +0900 Message-Id: <20201002154219.4887-6-mailhol.vincent@wanadoo.fr> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201002154219.4887-1-mailhol.vincent@wanadoo.fr> References: <20200926175810.278529-1-mailhol.vincent@wanadoo.fr> <20201002154219.4887-1-mailhol.vincent@wanadoo.fr> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rename macro CAN_CALC_SYNC_SEG to CAN_SYNC_SEG and make it available through include/linux/can/dev.h Add an helper function can_bit_time() which returns the duration (in time quanta) of one CAN bit. Rationale for this patch: the sync segment and the bit time are two concepts which are defined in the CAN ISO standard. Device drivers for CAN might need those. Please refer to ISO 11898-1:2015, section 11.3.1.1 "Bit time" for additional information. Signed-off-by: Vincent Mailhol --- Changes in v3: None Changes in v2: None --- drivers/net/can/dev.c | 13 ++++++------- include/linux/can/dev.h | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 8c3e11820e03..6070b4ab3bd8 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c @@ -60,7 +60,6 @@ EXPORT_SYMBOL_GPL(can_len2dlc); #ifdef CONFIG_CAN_CALC_BITTIMING #define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */ -#define CAN_CALC_SYNC_SEG 1 /* Bit-timing calculation derived from: * @@ -86,8 +85,8 @@ can_update_sample_point(const struct can_bittiming_const *btc, int i; for (i = 0; i <= 1; i++) { - tseg2 = tseg + CAN_CALC_SYNC_SEG - - (sample_point_nominal * (tseg + CAN_CALC_SYNC_SEG)) / + tseg2 = tseg + CAN_SYNC_SEG - + (sample_point_nominal * (tseg + CAN_SYNC_SEG)) / 1000 - i; tseg2 = clamp(tseg2, btc->tseg2_min, btc->tseg2_max); tseg1 = tseg - tseg2; @@ -96,8 +95,8 @@ can_update_sample_point(const struct can_bittiming_const *btc, tseg2 = tseg - tseg1; } - sample_point = 1000 * (tseg + CAN_CALC_SYNC_SEG - tseg2) / - (tseg + CAN_CALC_SYNC_SEG); + sample_point = 1000 * (tseg + CAN_SYNC_SEG - tseg2) / + (tseg + CAN_SYNC_SEG); sample_point_error = abs(sample_point_nominal - sample_point); if (sample_point <= sample_point_nominal && @@ -145,7 +144,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, /* tseg even = round down, odd = round up */ for (tseg = (btc->tseg1_max + btc->tseg2_max) * 2 + 1; tseg >= (btc->tseg1_min + btc->tseg2_min) * 2; tseg--) { - tsegall = CAN_CALC_SYNC_SEG + tseg / 2; + tsegall = CAN_SYNC_SEG + tseg / 2; /* Compute all possible tseg choices (tseg=tseg1+tseg2) */ brp = priv->clock.freq / (tsegall * bt->bitrate) + tseg % 2; @@ -223,7 +222,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, /* real bitrate */ bt->bitrate = priv->clock.freq / - (bt->brp * (CAN_CALC_SYNC_SEG + tseg1 + tseg2)); + (bt->brp * (CAN_SYNC_SEG + tseg1 + tseg2)); return 0; } diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 791c452d98e1..77c3ea49b8fb 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -82,6 +82,21 @@ struct can_priv { #endif }; +#define CAN_SYNC_SEG 1 + +/* + * can_bit_time() - Duration of one bit + * + * Please refer to ISO 11898-1:2015, section 11.3.1.1 "Bit time" for + * additional information. + * + * Return: the number of time quanta in one bit. + */ +static inline int can_bit_time(struct can_bittiming *bt) +{ + return CAN_SYNC_SEG + bt->prop_seg + bt->phase_seg1 + bt->phase_seg2; +} + /* * get_can_dlc(value) - helper macro to cast a given data length code (dlc) * to u8 and ensure the dlc value to be max. 8 bytes. -- 2.26.2