// SPDX-License-Identifier: GPL-2.0-or-later /* * PPS generators sysfs support * * Copyright (C) 2024 Rodolfo Giometti */ #include #include #include #include /* * Attribute functions */ static ssize_t system_show(struct device *dev, struct device_attribute *attr, char *buf) { struct pps_gen_device *pps_gen = dev_get_drvdata(dev); return sysfs_emit(buf, "%d\n", pps_gen->info.use_system_clock); } static DEVICE_ATTR_RO(system); static ssize_t time_show(struct device *dev, struct device_attribute *attr, char *buf) { struct pps_gen_device *pps_gen = dev_get_drvdata(dev); struct timespec64 time; int ret; ret = pps_gen->info.get_time(pps_gen, &time); if (ret) return ret; return sysfs_emit(buf, "%llu %09lu\n", time.tv_sec, time.tv_nsec); } static DEVICE_ATTR_RO(time); static ssize_t enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct pps_gen_device *pps_gen = dev_get_drvdata(dev); bool status; int ret; ret = kstrtobool(buf, &status); if (ret) return ret; ret = pps_gen->info.enable(pps_gen, status); if (ret) return ret; pps_gen->enabled = status; return count; } static DEVICE_ATTR_WO(enable); static struct attribute *pps_gen_attrs[] = { &dev_attr_enable.attr, &dev_attr_time.attr, &dev_attr_system.attr, NULL, }; static const struct attribute_group pps_gen_group = { .attrs = pps_gen_attrs, }; const struct attribute_group *pps_gen_groups[] = { &pps_gen_group, NULL, };