Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp762908pxb; Wed, 18 Aug 2021 13:37:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy/dFKqC7you2aP0kTk6kfTkztKOqD+MNFhAkL0ecGwEaQLCALHjHXhtFzaEVKNRN+YdMTW X-Received: by 2002:a92:cf08:: with SMTP id c8mr7626329ilo.246.1629319076510; Wed, 18 Aug 2021 13:37:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629319076; cv=none; d=google.com; s=arc-20160816; b=AlXh0vn6mGGYzgX5/WW+4DhNyivoppYi3mlBBT2GmnwiFecdK8HhJmwxm/acmpNoE8 3rrcUCYvzvwEVDG4sVXM3W1bVL1aUczzQZF7GT9jlJB/tvQvqdeqvVkgqH1lhVJdnHLF 4Ci7VZZ+DOhhKZNBd+p3eg+RXfLKctttjYdHDmXD5Eo2+CEgTmbb/7hVKmC57PCqrmMO GkIzonI9UL6vkrgwoMAlrtz5MIu22JtbKGn87/lLPfvyp/Q8nseL7N7VGDEciGgSqHj2 +WEP4Wli5RIyv5g78sM8DkmeNwnkrohjIpB0KoyrGG6o9aFIYlev89TF5xRtH6PRmAVU 9qVg== 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=2w1vSuT1tH9Ybxo97VpBG8kj77ZOt5fncj54b1Z/4R4=; b=N4M7a7EqXsoVA4x+JnXcuX71SKaL6UdZ4GM0okZk9MYAtIwpDY7OJvMzZ/KJpQPhLX /vprHaGeY5gFC1IpGQSjqaAOIn5u1JnrCnGEIo07g0UKNpxKVNZbseqhwz/nPrMULKJh qD5BEAPC1a7ebUcy3N8o6IWChwa7ydHXPURL9Ko4ilRSc2x8u8mOoL4teHzPUoNaNltT 2H6bJLhJFZBpc78qhafvYN7NfpgvgvA8F+nOoxouae85GRbf7zXwBbsvxLniX/JXdqiP DZD1x3EPPE7NjBoRrR4OCCwcUv9JkMETS40QLWKLRZF2IVXlynQpoYGLZELbNY0NcvyU EVxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=m3jlFtgd; 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 t10si1062113ilu.86.2021.08.18.13.37.44; Wed, 18 Aug 2021 13:37:56 -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=m3jlFtgd; 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 S233868AbhHRUfm (ORCPT + 99 others); Wed, 18 Aug 2021 16:35:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51414 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233847AbhHRUfl (ORCPT ); Wed, 18 Aug 2021 16:35:41 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F3474C061764 for ; Wed, 18 Aug 2021 13:35:05 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id gt38so7598018ejc.13 for ; Wed, 18 Aug 2021 13:35:05 -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=2w1vSuT1tH9Ybxo97VpBG8kj77ZOt5fncj54b1Z/4R4=; b=m3jlFtgdrR9kQKISjmF6YSNHIN6AUjyLp5Qshmuz62x/bGt9ZuZJl+lx7FYD0EWa5n SxM59XGaNKETVufiqmddRoQnYoDkjrmwGbHxm0a3i4tt+v4NKtsgRnhI7FPQBLSJucKM W0NJ+L8my4LfGEc07qEeFAq+rPwTBK7BnQbK0= 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=2w1vSuT1tH9Ybxo97VpBG8kj77ZOt5fncj54b1Z/4R4=; b=FhjlE/njS5MWMgNk9NktW4cR2zDTmzf1r2TWk1gF33bSsabHpB+UlB/I0lSaF2MReX HqHHpZW1y7ojKOepqRqe1YB5+qaaWH4a+bjXCQX/1DX0O8VC8Aecy9e2NR6nkQ4cgyd+ Y3tRAhv1XC82f+rB9elSFvehJWAZCquufHJ4yTNAwK9zEY8ANvd3FHABI3pN4chvfZoh xfEBU6w8BeDcupPf1j+1BmyCDdnWAep4so9l3rMSf8K8SBE1vQj9u0C83tzEjOL3hWZq mFMsC4RkdNQB1h1jj6vQT2pZYMC4z6v7o5UFMovUMomh8lGDHgYDcFomP3pBlWBhZ47O 59FA== X-Gm-Message-State: AOAM531EkPMqE0lYSUdOXKusMu4NCOwm0b37GGbc1oaw1kB2Xi73EYxf 78aCqRNzOmGHvjDDmx2rfNmGD+sB8TnQrQ== X-Received: by 2002:a17:906:d9dc:: with SMTP id qk28mr3519111ejb.491.1629318904574; Wed, 18 Aug 2021 13:35:04 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id f19sm602192edt.44.2021.08.18.13.35.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:35:04 -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 v2] media: uvcvideo: Quirk for hardware with invalid sof Date: Wed, 18 Aug 2021 22:35:02 +0200 Message-Id: <20210818203502.269889-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 (1 KHz). 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 --- v2: Fix typo in frequency 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