Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp756560pxb; Wed, 18 Aug 2021 13:26:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwY6Xu/i2P69ILEHSAt2mPHt8EEbTzdEKgH46r1kqbPyC/eRjaVRS194F0BR6aqOMZ+YiTE X-Received: by 2002:a5e:8e04:: with SMTP id a4mr8544953ion.56.1629318379512; Wed, 18 Aug 2021 13:26:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629318379; cv=none; d=google.com; s=arc-20160816; b=hSyW8r2SZAhttiyLKfWC7pomX6fhcq4psVS2p/VQBjHGwwb4TYIo9CxjjPwmtduSw5 pM/2nIC9ilaGb3Kn4jKNPB6G2upAqpvsiGJ8asWTGQEGWgG3lNuq7Gjgf7o6bIxfjbam DoEsRXclhk3qMTicvHKp5UXzORZIi9CDYImS7VSW/jRmCgqSa8wxQCjM5DJfHLwbgU1g dQ0mBTz2E2fJSSUSvSv84rEBG1eOvajwKVAptrS5s6ePIjrH/sDGKw883PlPJ06t/IOr OvvXvU13L1JUiiCBj+BRusGDhjy8K3o1PwZV1h25gkSjnlP/1PKQ0rgcaS6AKI+Spulz khsw== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=yE1jUBvTlSKiQfOB3L5au2tliUnWZLNpdRP8a1r8bhE=; b=jhJeUO5zYSV7WELbi0OxWHRFyF25/kG/iBWWwdn7pYr4jBe7WcPWdYhiMCefUizm+J /XieG+oTtpPlcwWaayDQxTpYc9bMUtal1I0hOIPmg/mY4Ds6YkcFC55+2Y7CEoE1fXiW Khb/5e/48jHTgVLLYgzWswagUw05CA5tYsY8RI61J8aMxkwyGgguA5GJmvPKtNRK12Nt 6yn5VtKYe70MhCtCs596R/loQnewj3w419njSxUxRhCGsvsoGU5iqxkttseS6jpeE6zU abps5UyH2NOSngzWVMEDKjOwhqLgVFJgauHPfjdi3nKwC65TakAUz905F3E4/TUQ7ECj 7Nww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=UzSiYoVD; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r4si918057ilb.59.2021.08.18.13.26.07; Wed, 18 Aug 2021 13:26:19 -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; dkim=pass header.i=@chromium.org header.s=google header.b=UzSiYoVD; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233719AbhHRUYI (ORCPT + 99 others); Wed, 18 Aug 2021 16:24:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48824 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230440AbhHRUYH (ORCPT ); Wed, 18 Aug 2021 16:24:07 -0400 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3652AC0613CF for ; Wed, 18 Aug 2021 13:23:32 -0700 (PDT) Received: by mail-ed1-x529.google.com with SMTP id n12so5043472edx.8 for ; Wed, 18 Aug 2021 13:23:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=yE1jUBvTlSKiQfOB3L5au2tliUnWZLNpdRP8a1r8bhE=; b=UzSiYoVDYsdDr1U1Z7itOTxq4ovOxzLmTdQ4YCxF5BTfmv1hqXqq0cLfLcZGC7jHRJ 61+VSyqb5ow2iTyKIovbUQCgSB/nQv6OC73tBqsEQZG74sy9Jhd8ivyDpDEef3Kmh+Gg /Y88ZJTuIw0BaH0gBTbSUMWxXJ8kNvBaImkvY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=yE1jUBvTlSKiQfOB3L5au2tliUnWZLNpdRP8a1r8bhE=; b=SkVKH6gDKdvyxIMR72f8PRAHWTglVvlz2J5yQa9qBHV7loMtshLmFaZlgaf5qfi7X5 rJp/QwTrffAh1IOUqdrP0L9CT99cxrtj5goJpsxO5Ko5pAps3te2IgYL4hy3d8hnesdZ K5HmgmMpue1FqZXnyKDjE56P6ukq0N2dMW4CifAEjmHtC8UoVQ2FlcznbULuxbAmayZM o6jAHt7udRvtKuLa3lyn46MEqU11ZVdejq9FNt9M10Y8vPmrjlpoGfFamI2eJ7/Hy48N 41YfFJDeQWD5pFU8yf3nQMjO9LqPEoqN+qNmQfvJ8zXz7AOIvlX3FPghKhDyCtmSvfEL Yebw== X-Gm-Message-State: AOAM531EGGd0wsfCZfZlDhty6w952zOVigZbbTZxmFly8D9rEwwbfQTX /l2ytlZZb0WbuHYVMI82mM2pgQ== X-Received: by 2002:a05:6402:3128:: with SMTP id dd8mr12263271edb.40.1629318210766; Wed, 18 Aug 2021 13:23:30 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id m6sm597920edq.22.2021.08.18.13.23.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:23:30 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Ricardo Ribalda Subject: [PATCH] media: uvcvideo: Quirk for hardware with invalid sof Date: Wed, 18 Aug 2021 22:23:28 +0200 Message-Id: <20210818202328.267644-1-ribalda@chromium.org> X-Mailer: git-send-email 2.33.0.rc2.250.ged5fa647cd-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The hardware timestamping code has the assumption than the device_sof and the host_sof run at the same frequency (2048 Hz). Unfortunately, this is not the case for all the hardware. Add a quirk to support such hardware. Note on how to identify such hardware: When running with "yavta -c /dev/videoX" Look for periodic jumps of the fps. Eg: 30 (6) [-] none 30 614400 B 21.245557 21.395214 34.133 fps ts mono/SoE 31 (7) [-] none 31 614400 B 21.275327 21.427246 33.591 fps ts mono/SoE 32 (0) [-] none 32 614400 B 21.304739 21.459256 34.000 fps ts mono/SoE 33 (1) [-] none 33 614400 B 21.334324 21.495274 33.801 fps ts mono/SoE 34 (2) [-] none 34 614400 B 21.529237 21.527297 5.130 fps ts mono/SoE 35 (3) [-] none 35 614400 B 21.649416 21.559306 8.321 fps ts mono/SoE 36 (4) [-] none 36 614400 B 21.678789 21.595320 34.045 fps ts mono/SoE ... 99 (3) [-] none 99 614400 B 23.542226 23.696352 33.541 fps ts mono/SoE 100 (4) [-] none 100 614400 B 23.571578 23.728404 34.069 fps ts mono/SoE 101 (5) [-] none 101 614400 B 23.601425 23.760420 33.504 fps ts mono/SoE 102 (6) [-] none 102 614400 B 23.798324 23.796428 5.079 fps ts mono/SoE 103 (7) [-] none 103 614400 B 23.916271 23.828450 8.478 fps ts mono/SoE 104 (0) [-] none 104 614400 B 23.945720 23.860479 33.957 fps ts mono/SoE They happen because the delta_sof calculated at uvc_video_clock_host_sof(), wraps periodically, as both clocks drift. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ drivers/media/usb/uvc/uvc_video.c | 11 +++++++++-- drivers/media/usb/uvc/uvcvideo.h | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index 9a791d8ef200..d1e6cba10b15 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2771,6 +2771,15 @@ static const struct usb_device_id uvc_ids[] = { .bInterfaceSubClass = 1, .bInterfaceProtocol = 0, .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_RESTORE_CTRLS_ON_INIT) }, + /* Logitech HD Pro Webcam C922 */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x046d, + .idProduct = 0x085c, + .bInterfaceClass = USB_CLASS_VIDEO, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = 0, + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_INVALID_DEVICE_SOF) }, /* Chicony CNF7129 (Asus EEE 100HE) */ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c index 6d0e474671a2..760ab015cf9c 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -518,13 +518,20 @@ uvc_video_clock_decode(struct uvc_streaming *stream, struct uvc_buffer *buf, /* To limit the amount of data, drop SCRs with an SOF identical to the * previous one. */ - dev_sof = get_unaligned_le16(&data[header_size - 2]); + if (stream->dev->quirks & UVC_QUIRK_INVALID_DEVICE_SOF) + dev_sof = usb_get_current_frame_number(stream->dev->udev); + else + dev_sof = get_unaligned_le16(&data[header_size - 2]); + if (dev_sof == stream->clock.last_sof) return; stream->clock.last_sof = dev_sof; - host_sof = usb_get_current_frame_number(stream->dev->udev); + if (stream->dev->quirks & UVC_QUIRK_INVALID_DEVICE_SOF) + host_sof = dev_sof; + else + host_sof = usb_get_current_frame_number(stream->dev->udev); time = uvc_video_get_time(); /* The UVC specification allows device implementations that can't obtain diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h index cce5e38133cd..89d909661915 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -209,6 +209,8 @@ #define UVC_QUIRK_RESTORE_CTRLS_ON_INIT 0x00000400 #define UVC_QUIRK_FORCE_Y8 0x00000800 #define UVC_QUIRK_FORCE_BPP 0x00001000 +#define UVC_QUIRK_INVALID_DEVICE_SOF 0x00002000 + /* Format flags */ #define UVC_FMT_FLAG_COMPRESSED 0x00000001 -- 2.33.0.rc2.250.ged5fa647cd-goog