viortc_class
viortc_class = viortc_class_get_locked(dev);
if (IS_ERR(viortc_class))
return PTR_ERR(viortc_class);
ret = viortc_read_alarm(viortc_class->viortc, viortc_class->vio_clk_id,
struct viortc_class *viortc_class;
viortc_class = viortc_class_get_locked(dev);
if (IS_ERR(viortc_class))
return PTR_ERR(viortc_class);
return viortc_set_alarm(viortc_class->viortc, viortc_class->vio_clk_id,
struct viortc_class *viortc_class;
viortc_class = viortc_class_get_locked(dev);
if (IS_ERR(viortc_class))
return PTR_ERR(viortc_class);
return viortc_set_alarm_enabled(viortc_class->viortc,
viortc_class->vio_clk_id, enabled);
void viortc_class_alarm(struct viortc_class *viortc_class, u16 vio_clk_id)
if (vio_clk_id != viortc_class->vio_clk_id) {
dev_warn_ratelimited(&viortc_class->rtc->dev,
vio_clk_id, viortc_class->vio_clk_id);
rtc_update_irq(viortc_class->rtc, 1, RTC_AF | RTC_IRQF);
void viortc_class_stop(struct viortc_class *viortc_class)
rtc_lock(viortc_class->rtc);
viortc_class->stopped = true;
rtc_unlock(viortc_class->rtc);
int viortc_class_register(struct viortc_class *viortc_class)
return devm_rtc_register_device(viortc_class->rtc);
struct viortc_class *viortc_class_init(struct viortc_dev *viortc,
struct viortc_class *viortc_class;
viortc_class =
devm_kzalloc(parent_dev, sizeof(*viortc_class), GFP_KERNEL);
if (!viortc_class)
viortc_class->viortc = viortc;
viortc_class->rtc = rtc;
viortc_class->vio_clk_id = vio_clk_id;
return viortc_class;
static struct viortc_class *viortc_class_get_locked(struct device *dev)
struct viortc_class *viortc_class;
viortc_class = viortc_class_from_dev(dev);
if (IS_ERR(viortc_class))
return viortc_class;
if (viortc_class->stopped)
return viortc_class;
struct viortc_class *viortc_class;
viortc_class = viortc_class_get_locked(dev);
if (IS_ERR(viortc_class))
return PTR_ERR(viortc_class);
ret = viortc_read(viortc_class->viortc, viortc_class->vio_clk_id, &ns);
struct viortc_class *viortc_class;
return viortc->viortc_class ?: ERR_PTR(-ENODEV);
if (viortc->viortc_class)
viortc_class_stop(viortc->viortc_class);
if (!viortc->viortc_class)
viortc_class_alarm(viortc->viortc_class, clock_id);
struct viortc_class *viortc_class;
struct viortc_class *viortc_class;
if (viortc->viortc_class) {
viortc_class = viortc_class_init(viortc, vio_clk_id, have_alarm, dev);
if (IS_ERR(viortc_class))
return PTR_ERR(viortc_class);
viortc->viortc_class = viortc_class;
return viortc_class_register(viortc_class) ?: 1;
struct viortc_class *viortc_class_from_dev(struct device *dev)
static inline void viortc_class_stop(struct viortc_class *viortc_class)
static inline int viortc_class_register(struct viortc_class *viortc_class)
static inline struct viortc_class *viortc_class_init(struct viortc_dev *viortc,
struct viortc_class;
struct viortc_class *viortc_class_from_dev(struct device *dev);
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,
static inline void viortc_class_alarm(struct viortc_class *viortc_class,