1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * virtio_rtc internal interfaces
4 *
5 * Copyright (C) 2022-2023 OpenSynergy GmbH
6 * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
7 */
8
9 #ifndef _VIRTIO_RTC_INTERNAL_H_
10 #define _VIRTIO_RTC_INTERNAL_H_
11
12 #include <linux/device.h>
13 #include <linux/err.h>
14 #include <linux/ptp_clock_kernel.h>
15 #include <linux/types.h>
16
17 /* driver core IFs */
18
19 struct viortc_dev;
20
21 int viortc_read(struct viortc_dev *viortc, u16 vio_clk_id, u64 *reading);
22 int viortc_read_cross(struct viortc_dev *viortc, u16 vio_clk_id, u8 hw_counter,
23 u64 *reading, u64 *cycles);
24 int viortc_cross_cap(struct viortc_dev *viortc, u16 vio_clk_id, u8 hw_counter,
25 bool *supported);
26 int viortc_read_alarm(struct viortc_dev *viortc, u16 vio_clk_id,
27 u64 *alarm_time, bool *enabled);
28 int viortc_set_alarm(struct viortc_dev *viortc, u16 vio_clk_id, u64 alarm_time,
29 bool alarm_enable);
30 int viortc_set_alarm_enabled(struct viortc_dev *viortc, u16 vio_clk_id,
31 bool alarm_enable);
32
33 struct viortc_class;
34
35 struct viortc_class *viortc_class_from_dev(struct device *dev);
36
37 /* PTP IFs */
38
39 struct viortc_ptp_clock;
40
41 #if IS_ENABLED(CONFIG_VIRTIO_RTC_PTP)
42
43 struct viortc_ptp_clock *viortc_ptp_register(struct viortc_dev *viortc,
44 struct device *parent_dev,
45 u16 vio_clk_id,
46 const char *ptp_clock_name);
47 int viortc_ptp_unregister(struct viortc_ptp_clock *vio_ptp,
48 struct device *parent_dev);
49
50 #else
51
52 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)53 viortc_ptp_register(struct viortc_dev *viortc, struct device *parent_dev,
54 u16 vio_clk_id, const char *ptp_clock_name)
55 {
56 return NULL;
57 }
58
viortc_ptp_unregister(struct viortc_ptp_clock * vio_ptp,struct device * parent_dev)59 static inline int viortc_ptp_unregister(struct viortc_ptp_clock *vio_ptp,
60 struct device *parent_dev)
61 {
62 return -ENODEV;
63 }
64
65 #endif
66
67 /* HW counter IFs */
68
69 /**
70 * viortc_hw_xtstamp_params() - get HW-specific xtstamp params
71 * @hw_counter: virtio_rtc HW counter type
72 * @cs_id: clocksource id corresponding to hw_counter
73 *
74 * Gets the HW-specific xtstamp params. Returns an error if the driver cannot
75 * support xtstamp.
76 *
77 * Context: Process context.
78 * Return: Zero on success, negative error code otherwise.
79 */
80 int viortc_hw_xtstamp_params(u8 *hw_counter, enum clocksource_ids *cs_id);
81
82 /* RTC class IFs */
83
84 #if IS_ENABLED(CONFIG_VIRTIO_RTC_CLASS)
85
86 void viortc_class_alarm(struct viortc_class *viortc_class, u16 vio_clk_id);
87
88 void viortc_class_stop(struct viortc_class *viortc_class);
89
90 int viortc_class_register(struct viortc_class *viortc_class);
91
92 struct viortc_class *viortc_class_init(struct viortc_dev *viortc,
93 u16 vio_clk_id, bool have_alarm,
94 struct device *parent_dev);
95
96 #else /* CONFIG_VIRTIO_RTC_CLASS */
97
viortc_class_alarm(struct viortc_class * viortc_class,u16 vio_clk_id)98 static inline void viortc_class_alarm(struct viortc_class *viortc_class,
99 u16 vio_clk_id)
100 {
101 }
102
viortc_class_stop(struct viortc_class * viortc_class)103 static inline void viortc_class_stop(struct viortc_class *viortc_class)
104 {
105 }
106
viortc_class_register(struct viortc_class * viortc_class)107 static inline int viortc_class_register(struct viortc_class *viortc_class)
108 {
109 return -ENODEV;
110 }
111
viortc_class_init(struct viortc_dev * viortc,u16 vio_clk_id,bool have_alarm,struct device * parent_dev)112 static inline struct viortc_class *viortc_class_init(struct viortc_dev *viortc,
113 u16 vio_clk_id,
114 bool have_alarm,
115 struct device *parent_dev)
116 {
117 return ERR_PTR(-ENODEV);
118 }
119
120 #endif /* CONFIG_VIRTIO_RTC_CLASS */
121
122 #endif /* _VIRTIO_RTC_INTERNAL_H_ */
123