From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D8E3136A374 for ; Sat, 27 Jun 2026 20:54:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782593679; cv=none; b=qMVRdnO89n6yzZNXPD693PF5OAYeDqYEfxlo5ee6UFRHbM+I0zTHE61HUAcIe8GKjJAy3EeXf6EgtP7AIKejOt2LRghvQCdWdJV2t1cW35VBr1Iaiv5GRlKdE3uh37YV6lJiOXfnLKduMgTVbwGKB+5iMlscVgw8sriUSDohLZU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782593679; c=relaxed/simple; bh=ZseYeSoJfhjoSVSDpH/sGJrA0X09LMvLtDOBMfxhEcA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=agGay4tTPcYC1NegjilS1PYcQh+wsxp/FF0Oy2hA1KRJ2nd0BuPV3Be/BHwmKbYVgehNVgkpy21EtXffmCsdiaDcodKIrLUg6Wc9omvlSMB5p3SrunhyPGZETp+BjI0HiMIZR88xJDrbk7ZVxfT7NTpu5h778bz1DSlLTbitS10= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=quiJS+q7; arc=none smtp.client-ip=74.125.82.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="quiJS+q7" Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-30df5854e1eso272508eec.0 for ; Sat, 27 Jun 2026 13:54:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782593677; x=1783198477; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JG2YaMAKEEzbNNNQyXrv7KrhFaFj2DNZAtO6lZbdbLI=; b=quiJS+q7YbHTZ7rNjlLfWd1jdcJvrJxz3E9RxokOHK+Yoo03WP9m2qY6IPmRP0k/i3 QFj8EIbhkaA6fEvolNsqJAv2oa3PUrLcYdEW49bWMua4aiZWneSOV1k7jcqCQtpUxwkC cW9Tmeq2QK4R6VQeTF/JwBixV/CUxNXKqCGtDxCocJ3ZPWJGvfyTsDnoMzxeL5bTNcBi lfrMQb69WAxbrL5td5611/s+kBcbXjA32dd0ARstERO1exrJSEMjrcUmptgyXozUkLk0 bVyEI2ZNgZgO59R8B5x/sAU36oeRG9m+2KqSQsz9SWttmWQQEAYIrE7yA80iPht+rzbC CLRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782593677; x=1783198477; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=JG2YaMAKEEzbNNNQyXrv7KrhFaFj2DNZAtO6lZbdbLI=; b=Gv9aS+5ZHTtvkUOWpOEg5K6EPucjPO0SFkTmZ6bIgkq9oKg+PodhDmne7Y4A6x0nT6 cblzEV7+MFdzAM0OTI7c1bKR3G5cp/L71tjaKqcxs8vgfW6bl1/8jcUAtAnXoraaMyLB 8mU5/I+ZwJyjpOYuCZfNQcanwPiqpMpH5IuV7Rzi06QbJoCg5Ig+8ImuvlVrTjXf4W6r 52exvTNIPuuTm67mQav288/swPKpZuzmOMfaMP/zb3wRMHtrdESR5tMJMMQcdKZmP/yL vMlihSImdjoDjkEiU5VkClWtgtnjOxHhjEaiR5vaqhDI9tuQxJLJBN436Ns5lbQeTgUE vKeA== X-Forwarded-Encrypted: i=1; AHgh+RonIUrAgdv+N4q/YGymUYBeI+kY+sbsYVdCPduJKoti6/jYhN0ZGLg3YZCVDb+7Zx7WILV8GDpjdhibKRQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyVUOMAhG56a0KNjBgQSzn+QsKgsC6FxLPU0s/XqFdd6XS29eHG yYcatnchfmj/8dZn3n5QmNPB7VQX3qYQjIJPE+5IbfBznNbtWTYC245D X-Gm-Gg: AfdE7clexM3ZvA8kBj3Lq8/OKLybd1i6mYTH4uYFYTmw//oyv/5mOnFwhu2cQiy5EY1 WqruN4k7gYHtA/u6l0MhUzYV0s418+wd+eq8WSaS2mMGjOz0G+cEu0Z29NNkM9It32/X4rX3+dt /nQHLD83Pg+c36Uvdl7kxLR8oWBTM4EXdxWTnGWF7KoHFhew+twOhhjcNjWZC6+gjjVqt5kFaG4 30hgM/5ugocgVY8eU51IhkzINElO2hvBV2vziAtpZ9XrLYqeZW2saEXAeervj+j61X5hD7TQbQF 3Ncn/q8/GhfPDMrm6O/Q5cragaAqgjYUabcUSCJ8FjISHLDwlc9YMohzRd1bugEwjNj6iz3+XIS ybcw13BVKcHc2VVBPv8fkINUr4zBJ6yYFfeO8XADjJB0yZlucxZoG7QOMBZ9PUZ9KKyzxY9f7nR k= X-Received: by 2002:a05:7300:fb87:b0:30c:ab96:7302 with SMTP id 5a478bee46e88-30cab9676ecmr4656954eec.18.1782593676814; Sat, 27 Jun 2026 13:54:36 -0700 (PDT) Received: from gerik-arch.lan ([2603:8000:d300:219e::c6c]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30c7c52c591sm41400336eec.7.2026.06.27.13.54.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 27 Jun 2026 13:54:36 -0700 (PDT) From: Gerik Kubiak To: giometti@enneenne.com Cc: richardcochran@gmail.com, linux-kernel@vger.kernel.org, Gerik Kubiak Subject: [RFC PATCH 3/3] pps: Timestamp pps events per PPS_SETCLOCK clock Date: Sat, 27 Jun 2026 13:50:28 -0700 Message-ID: <20260627205028.105252-4-gerikkub@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260627205028.105252-1-gerikkub@gmail.com> References: <20260627205028.105252-1-gerikkub@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Implements the PPS_SETCLOCK ioctl to allow userspace to set the clock used to timestamp PPS event. Userspace passes the clock in a pps_kclock_source structure through the PPS_SETCLOCK ioctl. The PPS subsystem will store this clock and future pps events will be timestamped with this clock. The clock source is initialiaized to REALTIME to keep the existing PPS behavior if this ioctl is not used. Signed-off-by: Gerik Kubiak --- drivers/pps/kapi.c | 27 ++++++++++++++++++++------- drivers/pps/pps.c | 22 ++++++++++++++++++++++ include/linux/pps_kernel.h | 1 + 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c index 1bf0335a1b41..c1af445d3e57 100644 --- a/drivers/pps/kapi.c +++ b/drivers/pps/kapi.c @@ -94,6 +94,7 @@ struct pps_device *pps_register_source(struct pps_source_info *info, */ pps->params.api_version = PPS_API_VERS; pps->params.mode = default_params; + pps->clock_source.clock_id = CLOCK_REALTIME; pps->info = *info; /* check for default echo function */ @@ -158,14 +159,26 @@ void pps_event(struct pps_device *pps, struct pps_event_time *ts, int event, { unsigned long flags; int captured = 0; - struct pps_ktime ts_real = { .sec = 0, .nsec = 0, .flags = 0 }; + struct pps_ktime ts_ev = { .sec = 0, .nsec = 0, .flags = 0 }; /* check event type */ BUG_ON((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0); - dev_dbg(&pps->dev, "PPS event at %ptSp\n", &ts->ts_real); + switch (pps->clock_source.clock_id) { + case CLOCK_REALTIME: + timespec_to_pps_ktime(&ts_ev, ts->ts_real); + break; + case CLOCK_MONOTONIC_RAW: + timespec_to_pps_ktime(&ts_ev, ts->ts_raw); + break; + case CLOCK_BOOTTIME: + timespec_to_pps_ktime(&ts_ev, ts->ts_boot); + break; + default: + WARN_ON_ONCE(true); + } - timespec_to_pps_ktime(&ts_real, ts->ts_real); + dev_dbg(&pps->dev, "PPS event at %ptSp\n", &ts_ev); spin_lock_irqsave(&pps->lock, flags); @@ -178,11 +191,11 @@ void pps_event(struct pps_device *pps, struct pps_event_time *ts, int event, if (event & pps->params.mode & PPS_CAPTUREASSERT) { /* We have to add an offset? */ if (pps->params.mode & PPS_OFFSETASSERT) - pps_add_offset(&ts_real, + pps_add_offset(&ts_ev, &pps->params.assert_off_tu); /* Save the time stamp */ - pps->assert_tu = ts_real; + pps->assert_tu = ts_ev; pps->assert_sequence++; dev_dbg(&pps->dev, "capture assert seq #%u\n", pps->assert_sequence); @@ -192,11 +205,11 @@ void pps_event(struct pps_device *pps, struct pps_event_time *ts, int event, if (event & pps->params.mode & PPS_CAPTURECLEAR) { /* We have to add an offset? */ if (pps->params.mode & PPS_OFFSETCLEAR) - pps_add_offset(&ts_real, + pps_add_offset(&ts_ev, &pps->params.clear_off_tu); /* Save the time stamp */ - pps->clear_tu = ts_real; + pps->clear_tu = ts_ev; pps->clear_sequence++; dev_dbg(&pps->dev, "capture clear seq #%u\n", pps->clear_sequence); diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index de1122bb69ea..2349aebeb65e 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c @@ -246,6 +246,28 @@ static long pps_cdev_ioctl(struct file *file, break; } + case PPS_SETCLOCK: { + struct pps_kclock_source source_args; + + dev_dbg(&pps->dev, "PPS_SETCLOCK\n"); + + if (copy_from_user(&source_args, uarg, + sizeof(struct pps_kclock_source))) + return -EFAULT; + + switch (source_args.clock_id) { + case CLOCK_REALTIME: + case CLOCK_MONOTONIC_RAW: + case CLOCK_BOOTTIME: + break; + default: + return -EINVAL; + } + + pps->clock_source = source_args; + + break; + } default: return -ENOTTY; } diff --git a/include/linux/pps_kernel.h b/include/linux/pps_kernel.h index b13cac7fa6b5..2c8367de12e3 100644 --- a/include/linux/pps_kernel.h +++ b/include/linux/pps_kernel.h @@ -43,6 +43,7 @@ struct pps_device { struct pps_source_info info; /* PSS source info */ struct pps_kparams params; /* PPS current params */ + struct pps_kclock_source clock_source; /* Capture clock id */ __u32 assert_sequence; /* PPS assert event seq # */ __u32 clear_sequence; /* PPS clear event seq # */ -- 2.54.0