From patchwork Mon Nov 27 13:19:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 119707 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp261555qgn; Mon, 27 Nov 2017 05:23:33 -0800 (PST) X-Google-Smtp-Source: AGs4zMZJVEiGpF/tv8WeLHmEtCsxSeW1bubgKqBtd1fw+8NNHjxkj46AJB8lnU3NqGBY3xBSikUj X-Received: by 10.98.213.71 with SMTP id d68mr34976340pfg.171.1511789013853; Mon, 27 Nov 2017 05:23:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511789013; cv=none; d=google.com; s=arc-20160816; b=XPDbeWuZDtpCdH6cGBE5fK2vzq2fC7nQbe+WMlqHItSsaltWS8a7ORTolBwuigWANm uesWJlofCVW2BZExecqAs0N307jxCm2MARk7yGrinvFkzarFanRB2GaWJxKLrI8hWoYx qC0A0JWR6V9PNjhDaeXFwbSXofpHSheoTz0M5guZvojJ+QtBQDMfvrecpyYWz3aWLmnh E36VAIZzHmW1f9bp6lZvN7H+Aw5wdw++tr7dzQ+OGn1swjo/zuKxjvwZskjbrU2yHGI/ mppYGs2LV8Z+6mNxrsK6WrjZTnGTKPb13GKEOqqnskUiDse+Alv4VD42GxPkqz1qem0q fOFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=l5gpWwgLhMqEwZ8SSMG9p+TP2cH+jLcEi7fiaueUsBU=; b=LNbp7xwSCgbgXQpy/vdKjwqJwgJLpg3IeUKV29ijq9vu+N2NZ6Ky0F+Qa6O/++ylLS aa8E0CnPZV5gfnfmSO5NWvMg8+x+CnnEF47ZmtsvZIWmMLy66jP2CnCtew6ociTRx8p3 5+mdis+ppTBansD4iZISvBbe0GKpVy9CdJN95RTgAUrM9xc07K83juXWar5ePKGIqrA2 lyL5z5EtVRNIBnrlAq8nd0SyTzrY5nyNy5vXN0554HR3JUGfHf7nhinQ/zzu7ijZuUQ5 qnoYl2bd+B2ZJTsFRs+0mBEtnA1vmoXaPNl2xGe99NPJGLro2aKWvD3PWqG7w6qUDqge Vogg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f15si23102028pga.543.2017.11.27.05.23.33; Mon, 27 Nov 2017 05:23:33 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752551AbdK0NXc (ORCPT + 28 others); Mon, 27 Nov 2017 08:23:32 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:59183 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751838AbdK0NXa (ORCPT ); Mon, 27 Nov 2017 08:23:30 -0500 Received: from wuerfel.lan ([109.193.157.232]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.145]) with ESMTPA (Nemesis) id 0LheU5-1exKyM22iH-00mw6q; Mon, 27 Nov 2017 14:23:19 +0100 From: Arnd Bergmann To: Hans Verkuil , Mauro Carvalho Chehab Cc: y2038@lists.linaro.org, Arnd Bergmann , Javier Martinez Canillas , Vincent ABRIOU , Ingo Molnar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/8] [media] vivid: use ktime_t for timestamp calculation Date: Mon, 27 Nov 2017 14:19:58 +0100 Message-Id: <20171127132027.1734806-6-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20171127132027.1734806-1-arnd@arndb.de> References: <20171127132027.1734806-1-arnd@arndb.de> X-Provags-ID: V03:K0:GHlXyGTjdicJWWDTNEZbl32dMyoaroPzvS+ZxYj2b/0aAGX58dM XvqnRWi4wKuYStqo38Aydu9P1MIlC5it33+t7ql1qUreWYYon4BJpBUz7X/bCWWeeeOMICt +KOITwMurcwIIdgKX21ccP9MTPtumAvbQJDmKDpSZompoMlEDWGNnNePnOEBg5AL+qwWSLW AOqgTvQH9dFcTsHttEj9A== X-UI-Out-Filterresults: notjunk:1; V01:K0:PLIH6uVECzU=:XW2pEimbeyw2mdo/EsQ8Ml QK0gh5G3TPLh5Yq3jzqkXlPE+TZkMTY+Bg1ypgvcZviZsjvqdviOLl+XcFS9XpSOMDLOpRWL1 XeLJVbCqfPyqnq+s7xS/e4qs2i3O7BmL1e0i8ie/9zs9q7TnZa+JDnZSE2Vwag1leqzAqzePZ JR1SN0+y11liSdtPPXO2IPcONmBV5sqbe3WQvZSrPXpR5vsEREHR1l+ZphAIy/0wkiYAfDY1b w44fIeCgNxgl/4iSp4f42ZNVGVG927B+JCA2ZjRREyRrVDtNg9FqtaocPMBlqAvGoLfaY2Tb5 roB4zMCexF+saXVE1/jhtIwC9XhxpouU3np0gSrcy+iVWOnG9en0X5xZ0CdWqh96Bqc4+3G+k urS2zIEcynDDNFBl+nITJdE6xBdvwgAmHf0uy8yirDcpHvw38lKI1g+tBV3WKZHqx7PcRicaU FNPjE8UXeRKT0EcrIaYGFV0gFzjv9drILR7XysHL3jqGwe8TLe4EHe+P03l38fjfFqs1Oy91j DDqogBqcPypDN8Xiu82kF1Tg2xcATZKHD3LgsBsY06hQ8v7HUXNp4HlrKpz9KgYHCaOm0DkpW U9W6WKIqTinLKKDL/E3ypr40DsXw1sFxC6ITbWwGkSpHKOi7CROxr4Lb7cLf40eUU4gqXD4G9 VAGIkefYnOxQ1c0J9gVcqBegx41eurmwCprsBl1MS/NaLXi/NlE7UTpkL/VKNi178aLpAckBn 4Rpf+ta9kHfiUE1j3wcaeF12oAjrxV4gPgB0qg== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org timespec is generally deprecated because of the y2038 overflow. In vivid, the usage is fine, since we are dealing with monotonic timestamps, but we can also simplify the code by going to ktime_t. Using ktime_divns() should be roughly as efficient as the old code, since the constant 64-bit division gets turned into a multiplication on modern platforms, and we save multiple 32-bit divisions that can be expensive e.g. on ARMv7. Signed-off-by: Arnd Bergmann --- I hope I understood the VIVID_RDS_GEN_BLOCKS calculation right, please review carefully. --- drivers/media/platform/vivid/vivid-core.c | 2 +- drivers/media/platform/vivid/vivid-core.h | 2 +- drivers/media/platform/vivid/vivid-radio-rx.c | 11 +++++------ drivers/media/platform/vivid/vivid-radio-tx.c | 8 +++----- drivers/media/platform/vivid/vivid-rds-gen.h | 1 + 5 files changed, 11 insertions(+), 13 deletions(-) -- 2.9.0 Tested-by: Hans Verkuil diff --git a/drivers/media/platform/vivid/vivid-core.c b/drivers/media/platform/vivid/vivid-core.c index 5f316a5e38db..a091cfd93164 100644 --- a/drivers/media/platform/vivid/vivid-core.c +++ b/drivers/media/platform/vivid/vivid-core.c @@ -995,7 +995,7 @@ static int vivid_create_instance(struct platform_device *pdev, int inst) dev->edid_max_blocks = dev->edid_blocks = 2; memcpy(dev->edid, vivid_hdmi_edid, sizeof(vivid_hdmi_edid)); - ktime_get_ts(&dev->radio_rds_init_ts); + dev->radio_rds_init_time = ktime_get(); /* create all controls */ ret = vivid_create_controls(dev, ccs_cap == -1, ccs_out == -1, no_error_inj, diff --git a/drivers/media/platform/vivid/vivid-core.h b/drivers/media/platform/vivid/vivid-core.h index 5cdf95bdc4d1..d8bff4dcefb7 100644 --- a/drivers/media/platform/vivid/vivid-core.h +++ b/drivers/media/platform/vivid/vivid-core.h @@ -510,7 +510,7 @@ struct vivid_dev { /* Shared between radio receiver and transmitter */ bool radio_rds_loop; - struct timespec radio_rds_init_ts; + ktime_t radio_rds_init_time; /* CEC */ struct cec_adapter *cec_rx_adap; diff --git a/drivers/media/platform/vivid/vivid-radio-rx.c b/drivers/media/platform/vivid/vivid-radio-rx.c index 47c36c26096b..1b96cbd7f2ea 100644 --- a/drivers/media/platform/vivid/vivid-radio-rx.c +++ b/drivers/media/platform/vivid/vivid-radio-rx.c @@ -38,9 +38,9 @@ ssize_t vivid_radio_rx_read(struct file *file, char __user *buf, size_t size, loff_t *offset) { struct vivid_dev *dev = video_drvdata(file); - struct timespec ts; struct v4l2_rds_data *data = dev->rds_gen.data; bool use_alternates; + ktime_t timestamp; unsigned blk; int perc; int i; @@ -64,17 +64,16 @@ ssize_t vivid_radio_rx_read(struct file *file, char __user *buf, } retry: - ktime_get_ts(&ts); - use_alternates = ts.tv_sec % 10 >= 5; + timestamp = ktime_sub(ktime_get(), dev->radio_rds_init_time); + blk = ktime_divns(timestamp, VIVID_RDS_NSEC_PER_BLK); + use_alternates = blk % VIVID_RDS_GEN_BLOCKS; + if (dev->radio_rx_rds_last_block == 0 || dev->radio_rx_rds_use_alternates != use_alternates) { dev->radio_rx_rds_use_alternates = use_alternates; /* Re-init the RDS generator */ vivid_radio_rds_init(dev); } - ts = timespec_sub(ts, dev->radio_rds_init_ts); - blk = ts.tv_sec * 100 + ts.tv_nsec / 10000000; - blk = (blk * VIVID_RDS_GEN_BLOCKS) / 500; if (blk >= dev->radio_rx_rds_last_block + VIVID_RDS_GEN_BLOCKS) dev->radio_rx_rds_last_block = blk - VIVID_RDS_GEN_BLOCKS + 1; diff --git a/drivers/media/platform/vivid/vivid-radio-tx.c b/drivers/media/platform/vivid/vivid-radio-tx.c index 0e8025b7b4dd..897b56195ca7 100644 --- a/drivers/media/platform/vivid/vivid-radio-tx.c +++ b/drivers/media/platform/vivid/vivid-radio-tx.c @@ -37,7 +37,7 @@ ssize_t vivid_radio_tx_write(struct file *file, const char __user *buf, { struct vivid_dev *dev = video_drvdata(file); struct v4l2_rds_data *data = dev->rds_gen.data; - struct timespec ts; + ktime_t timestamp; unsigned blk; int i; @@ -58,10 +58,8 @@ ssize_t vivid_radio_tx_write(struct file *file, const char __user *buf, dev->radio_tx_rds_owner = file->private_data; retry: - ktime_get_ts(&ts); - ts = timespec_sub(ts, dev->radio_rds_init_ts); - blk = ts.tv_sec * 100 + ts.tv_nsec / 10000000; - blk = (blk * VIVID_RDS_GEN_BLOCKS) / 500; + timestamp = ktime_sub(ktime_get(), dev->radio_rds_init_time); + blk = ktime_divns(timestamp, VIVID_RDS_NSEC_PER_BLK); if (blk - VIVID_RDS_GEN_BLOCKS >= dev->radio_tx_rds_last_block) dev->radio_tx_rds_last_block = blk - VIVID_RDS_GEN_BLOCKS + 1; diff --git a/drivers/media/platform/vivid/vivid-rds-gen.h b/drivers/media/platform/vivid/vivid-rds-gen.h index eff4bf552ed3..e55e3b22b7ca 100644 --- a/drivers/media/platform/vivid/vivid-rds-gen.h +++ b/drivers/media/platform/vivid/vivid-rds-gen.h @@ -29,6 +29,7 @@ #define VIVID_RDS_GEN_GROUPS 57 #define VIVID_RDS_GEN_BLKS_PER_GRP 4 #define VIVID_RDS_GEN_BLOCKS (VIVID_RDS_GEN_BLKS_PER_GRP * VIVID_RDS_GEN_GROUPS) +#define VIVID_RDS_NSEC_PER_BLK (u32)(5ull * NSEC_PER_SEC / VIVID_RDS_GEN_BLOCKS) struct vivid_rds_gen { struct v4l2_rds_data data[VIVID_RDS_GEN_BLOCKS];