/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * virtio_rtc internal interfaces * * Copyright (C) 2022-2023 OpenSynergy GmbH * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _VIRTIO_RTC_INTERNAL_H_ #define _VIRTIO_RTC_INTERNAL_H_ #include #include #include #include /* driver core IFs */ struct viortc_dev; int viortc_read(struct viortc_dev *viortc, u16 vio_clk_id, u64 *reading); int viortc_read_cross(struct viortc_dev *viortc, u16 vio_clk_id, u8 hw_counter, u64 *reading, u64 *cycles); int viortc_cross_cap(struct viortc_dev *viortc, u16 vio_clk_id, u8 hw_counter, bool *supported); int viortc_read_alarm(struct viortc_dev *viortc, u16 vio_clk_id, u64 *alarm_time, bool *enabled); int viortc_set_alarm(struct viortc_dev *viortc, u16 vio_clk_id, u64 alarm_time, bool alarm_enable); int viortc_set_alarm_enabled(struct viortc_dev *viortc, u16 vio_clk_id, bool alarm_enable); struct viortc_class; struct viortc_class *viortc_class_from_dev(struct device *dev); /* PTP IFs */ struct viortc_ptp_clock; #if IS_ENABLED(CONFIG_VIRTIO_RTC_PTP) struct viortc_ptp_clock *viortc_ptp_register(struct viortc_dev *viortc, struct device *parent_dev, u16 vio_clk_id, const char *ptp_clock_name); int viortc_ptp_unregister(struct viortc_ptp_clock *vio_ptp, struct device *parent_dev); #else 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) { return NULL; } static inline int viortc_ptp_unregister(struct viortc_ptp_clock *vio_ptp, struct device *parent_dev) { return -ENODEV; } #endif /* HW counter IFs */ /** * viortc_hw_xtstamp_params() - get HW-specific xtstamp params * @hw_counter: virtio_rtc HW counter type * @cs_id: clocksource id corresponding to hw_counter * * Gets the HW-specific xtstamp params. Returns an error if the driver cannot * support xtstamp. * * Context: Process context. * Return: Zero on success, negative error code otherwise. */ int viortc_hw_xtstamp_params(u8 *hw_counter, enum clocksource_ids *cs_id); /* RTC class IFs */ #if IS_ENABLED(CONFIG_VIRTIO_RTC_CLASS) void viortc_class_alarm(struct viortc_class *viortc_class, u16 vio_clk_id); void viortc_class_stop(struct viortc_class *viortc_class); int viortc_class_register(struct viortc_class *viortc_class); struct viortc_class *viortc_class_init(struct viortc_dev *viortc, u16 vio_clk_id, bool have_alarm, struct device *parent_dev); #else /* CONFIG_VIRTIO_RTC_CLASS */ static inline void viortc_class_alarm(struct viortc_class *viortc_class, u16 vio_clk_id) { } static inline void viortc_class_stop(struct viortc_class *viortc_class) { } static inline int viortc_class_register(struct viortc_class *viortc_class) { return -ENODEV; } static inline struct viortc_class *viortc_class_init(struct viortc_dev *viortc, u16 vio_clk_id, bool have_alarm, struct device *parent_dev) { return ERR_PTR(-ENODEV); } #endif /* CONFIG_VIRTIO_RTC_CLASS */ #endif /* _VIRTIO_RTC_INTERNAL_H_ */