10623c759SPeter Hilber /* SPDX-License-Identifier: GPL-2.0-or-later */
20623c759SPeter Hilber /*
30623c759SPeter Hilber * virtio_rtc internal interfaces
40623c759SPeter Hilber *
50623c759SPeter Hilber * Copyright (C) 2022-2023 OpenSynergy GmbH
60623c759SPeter Hilber * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
70623c759SPeter Hilber */
80623c759SPeter Hilber
90623c759SPeter Hilber #ifndef _VIRTIO_RTC_INTERNAL_H_
100623c759SPeter Hilber #define _VIRTIO_RTC_INTERNAL_H_
110623c759SPeter Hilber
12*9d4f22fdSPeter Hilber #include <linux/device.h>
13*9d4f22fdSPeter Hilber #include <linux/err.h>
149a17125aSPeter Hilber #include <linux/ptp_clock_kernel.h>
150623c759SPeter Hilber #include <linux/types.h>
160623c759SPeter Hilber
170623c759SPeter Hilber /* driver core IFs */
180623c759SPeter Hilber
190623c759SPeter Hilber struct viortc_dev;
200623c759SPeter Hilber
210623c759SPeter Hilber int viortc_read(struct viortc_dev *viortc, u16 vio_clk_id, u64 *reading);
220623c759SPeter Hilber int viortc_read_cross(struct viortc_dev *viortc, u16 vio_clk_id, u8 hw_counter,
230623c759SPeter Hilber u64 *reading, u64 *cycles);
240623c759SPeter Hilber int viortc_cross_cap(struct viortc_dev *viortc, u16 vio_clk_id, u8 hw_counter,
250623c759SPeter Hilber bool *supported);
26*9d4f22fdSPeter Hilber int viortc_read_alarm(struct viortc_dev *viortc, u16 vio_clk_id,
27*9d4f22fdSPeter Hilber u64 *alarm_time, bool *enabled);
28*9d4f22fdSPeter Hilber int viortc_set_alarm(struct viortc_dev *viortc, u16 vio_clk_id, u64 alarm_time,
29*9d4f22fdSPeter Hilber bool alarm_enable);
30*9d4f22fdSPeter Hilber int viortc_set_alarm_enabled(struct viortc_dev *viortc, u16 vio_clk_id,
31*9d4f22fdSPeter Hilber bool alarm_enable);
32*9d4f22fdSPeter Hilber
33*9d4f22fdSPeter Hilber struct viortc_class;
34*9d4f22fdSPeter Hilber
35*9d4f22fdSPeter Hilber struct viortc_class *viortc_class_from_dev(struct device *dev);
360623c759SPeter Hilber
379a17125aSPeter Hilber /* PTP IFs */
389a17125aSPeter Hilber
399a17125aSPeter Hilber struct viortc_ptp_clock;
409a17125aSPeter Hilber
419a17125aSPeter Hilber #if IS_ENABLED(CONFIG_VIRTIO_RTC_PTP)
429a17125aSPeter Hilber
439a17125aSPeter Hilber struct viortc_ptp_clock *viortc_ptp_register(struct viortc_dev *viortc,
449a17125aSPeter Hilber struct device *parent_dev,
459a17125aSPeter Hilber u16 vio_clk_id,
469a17125aSPeter Hilber const char *ptp_clock_name);
479a17125aSPeter Hilber int viortc_ptp_unregister(struct viortc_ptp_clock *vio_ptp,
489a17125aSPeter Hilber struct device *parent_dev);
499a17125aSPeter Hilber
509a17125aSPeter Hilber #else
519a17125aSPeter Hilber
529a17125aSPeter Hilber static inline struct viortc_ptp_clock *
viortc_ptp_register(struct viortc_dev * viortc,struct device * parent_dev,u16 vio_clk_id,const char * ptp_clock_name)539a17125aSPeter Hilber viortc_ptp_register(struct viortc_dev *viortc, struct device *parent_dev,
549a17125aSPeter Hilber u16 vio_clk_id, const char *ptp_clock_name)
559a17125aSPeter Hilber {
569a17125aSPeter Hilber return NULL;
579a17125aSPeter Hilber }
589a17125aSPeter Hilber
viortc_ptp_unregister(struct viortc_ptp_clock * vio_ptp,struct device * parent_dev)599a17125aSPeter Hilber static inline int viortc_ptp_unregister(struct viortc_ptp_clock *vio_ptp,
609a17125aSPeter Hilber struct device *parent_dev)
619a17125aSPeter Hilber {
629a17125aSPeter Hilber return -ENODEV;
639a17125aSPeter Hilber }
649a17125aSPeter Hilber
659a17125aSPeter Hilber #endif
669a17125aSPeter Hilber
679a17125aSPeter Hilber /* HW counter IFs */
689a17125aSPeter Hilber
699a17125aSPeter Hilber /**
709a17125aSPeter Hilber * viortc_hw_xtstamp_params() - get HW-specific xtstamp params
719a17125aSPeter Hilber * @hw_counter: virtio_rtc HW counter type
729a17125aSPeter Hilber * @cs_id: clocksource id corresponding to hw_counter
739a17125aSPeter Hilber *
749a17125aSPeter Hilber * Gets the HW-specific xtstamp params. Returns an error if the driver cannot
759a17125aSPeter Hilber * support xtstamp.
769a17125aSPeter Hilber *
779a17125aSPeter Hilber * Context: Process context.
789a17125aSPeter Hilber * Return: Zero on success, negative error code otherwise.
799a17125aSPeter Hilber */
809a17125aSPeter Hilber int viortc_hw_xtstamp_params(u8 *hw_counter, enum clocksource_ids *cs_id);
819a17125aSPeter Hilber
82*9d4f22fdSPeter Hilber /* RTC class IFs */
83*9d4f22fdSPeter Hilber
84*9d4f22fdSPeter Hilber #if IS_ENABLED(CONFIG_VIRTIO_RTC_CLASS)
85*9d4f22fdSPeter Hilber
86*9d4f22fdSPeter Hilber void viortc_class_alarm(struct viortc_class *viortc_class, u16 vio_clk_id);
87*9d4f22fdSPeter Hilber
88*9d4f22fdSPeter Hilber void viortc_class_stop(struct viortc_class *viortc_class);
89*9d4f22fdSPeter Hilber
90*9d4f22fdSPeter Hilber int viortc_class_register(struct viortc_class *viortc_class);
91*9d4f22fdSPeter Hilber
92*9d4f22fdSPeter Hilber struct viortc_class *viortc_class_init(struct viortc_dev *viortc,
93*9d4f22fdSPeter Hilber u16 vio_clk_id, bool have_alarm,
94*9d4f22fdSPeter Hilber struct device *parent_dev);
95*9d4f22fdSPeter Hilber
96*9d4f22fdSPeter Hilber #else /* CONFIG_VIRTIO_RTC_CLASS */
97*9d4f22fdSPeter Hilber
viortc_class_alarm(struct viortc_class * viortc_class,u16 vio_clk_id)98*9d4f22fdSPeter Hilber static inline void viortc_class_alarm(struct viortc_class *viortc_class,
99*9d4f22fdSPeter Hilber u16 vio_clk_id)
100*9d4f22fdSPeter Hilber {
101*9d4f22fdSPeter Hilber }
102*9d4f22fdSPeter Hilber
viortc_class_stop(struct viortc_class * viortc_class)103*9d4f22fdSPeter Hilber static inline void viortc_class_stop(struct viortc_class *viortc_class)
104*9d4f22fdSPeter Hilber {
105*9d4f22fdSPeter Hilber }
106*9d4f22fdSPeter Hilber
viortc_class_register(struct viortc_class * viortc_class)107*9d4f22fdSPeter Hilber static inline int viortc_class_register(struct viortc_class *viortc_class)
108*9d4f22fdSPeter Hilber {
109*9d4f22fdSPeter Hilber return -ENODEV;
110*9d4f22fdSPeter Hilber }
111*9d4f22fdSPeter Hilber
viortc_class_init(struct viortc_dev * viortc,u16 vio_clk_id,bool have_alarm,struct device * parent_dev)112*9d4f22fdSPeter Hilber static inline struct viortc_class *viortc_class_init(struct viortc_dev *viortc,
113*9d4f22fdSPeter Hilber u16 vio_clk_id,
114*9d4f22fdSPeter Hilber bool have_alarm,
115*9d4f22fdSPeter Hilber struct device *parent_dev)
116*9d4f22fdSPeter Hilber {
117*9d4f22fdSPeter Hilber return ERR_PTR(-ENODEV);
118*9d4f22fdSPeter Hilber }
119*9d4f22fdSPeter Hilber
120*9d4f22fdSPeter Hilber #endif /* CONFIG_VIRTIO_RTC_CLASS */
121*9d4f22fdSPeter Hilber
1220623c759SPeter Hilber #endif /* _VIRTIO_RTC_INTERNAL_H_ */
123