xref: /linux/drivers/virtio/virtio_rtc_internal.h (revision 8ca154e4910efff1b04e7750e007d75732c68323)
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