Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
19struct viortc_dev;
20
21int viortc_read(struct viortc_dev *viortc, u16 vio_clk_id, u64 *reading);
22int viortc_read_cross(struct viortc_dev *viortc, u16 vio_clk_id, u8 hw_counter,
23 u64 *reading, u64 *cycles);
24int viortc_cross_cap(struct viortc_dev *viortc, u16 vio_clk_id, u8 hw_counter,
25 bool *supported);
26int viortc_read_alarm(struct viortc_dev *viortc, u16 vio_clk_id,
27 u64 *alarm_time, bool *enabled);
28int viortc_set_alarm(struct viortc_dev *viortc, u16 vio_clk_id, u64 alarm_time,
29 bool alarm_enable);
30int viortc_set_alarm_enabled(struct viortc_dev *viortc, u16 vio_clk_id,
31 bool alarm_enable);
32
33struct viortc_class;
34
35struct viortc_class *viortc_class_from_dev(struct device *dev);
36
37/* PTP IFs */
38
39struct viortc_ptp_clock;
40
41#if IS_ENABLED(CONFIG_VIRTIO_RTC_PTP)
42
43struct 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);
47int viortc_ptp_unregister(struct viortc_ptp_clock *vio_ptp,
48 struct device *parent_dev);
49
50#else
51
52static inline struct viortc_ptp_clock *
53viortc_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
59static 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 */
80int 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
86void viortc_class_alarm(struct viortc_class *viortc_class, u16 vio_clk_id);
87
88void viortc_class_stop(struct viortc_class *viortc_class);
89
90int viortc_class_register(struct viortc_class *viortc_class);
91
92struct 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
98static inline void viortc_class_alarm(struct viortc_class *viortc_class,
99 u16 vio_clk_id)
100{
101}
102
103static inline void viortc_class_stop(struct viortc_class *viortc_class)
104{
105}
106
107static inline int viortc_class_register(struct viortc_class *viortc_class)
108{
109 return -ENODEV;
110}
111
112static 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_ */