xref: /linux/drivers/pps/generators/sysfs.c (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
186b525beSRodolfo Giometti // SPDX-License-Identifier: GPL-2.0-or-later
286b525beSRodolfo Giometti /*
386b525beSRodolfo Giometti  * PPS generators sysfs support
486b525beSRodolfo Giometti  *
586b525beSRodolfo Giometti  * Copyright (C) 2024 Rodolfo Giometti <giometti@enneenne.com>
686b525beSRodolfo Giometti  */
786b525beSRodolfo Giometti 
886b525beSRodolfo Giometti #include <linux/device.h>
986b525beSRodolfo Giometti #include <linux/module.h>
1086b525beSRodolfo Giometti #include <linux/string.h>
1186b525beSRodolfo Giometti #include <linux/pps_gen_kernel.h>
1286b525beSRodolfo Giometti 
1386b525beSRodolfo Giometti /*
1486b525beSRodolfo Giometti  * Attribute functions
1586b525beSRodolfo Giometti  */
1686b525beSRodolfo Giometti 
1786b525beSRodolfo Giometti static ssize_t system_show(struct device *dev, struct device_attribute *attr,
1886b525beSRodolfo Giometti 				char *buf)
1986b525beSRodolfo Giometti {
2086b525beSRodolfo Giometti 	struct pps_gen_device *pps_gen = dev_get_drvdata(dev);
2186b525beSRodolfo Giometti 
22*ac9c5170SSubramanian Mohan 	return sysfs_emit(buf, "%d\n", pps_gen->info->use_system_clock);
2386b525beSRodolfo Giometti }
2486b525beSRodolfo Giometti static DEVICE_ATTR_RO(system);
2586b525beSRodolfo Giometti 
2686b525beSRodolfo Giometti static ssize_t time_show(struct device *dev, struct device_attribute *attr,
2786b525beSRodolfo Giometti 				char *buf)
2886b525beSRodolfo Giometti {
2986b525beSRodolfo Giometti 	struct pps_gen_device *pps_gen = dev_get_drvdata(dev);
3086b525beSRodolfo Giometti 	struct timespec64 time;
3186b525beSRodolfo Giometti 	int ret;
3286b525beSRodolfo Giometti 
33*ac9c5170SSubramanian Mohan 	ret = pps_gen->info->get_time(pps_gen, &time);
3486b525beSRodolfo Giometti 	if (ret)
3586b525beSRodolfo Giometti 		return ret;
3686b525beSRodolfo Giometti 
3786b525beSRodolfo Giometti 	return sysfs_emit(buf, "%llu %09lu\n", time.tv_sec, time.tv_nsec);
3886b525beSRodolfo Giometti }
3986b525beSRodolfo Giometti static DEVICE_ATTR_RO(time);
4086b525beSRodolfo Giometti 
4186b525beSRodolfo Giometti static ssize_t enable_store(struct device *dev, struct device_attribute *attr,
4286b525beSRodolfo Giometti 				const char *buf, size_t count)
4386b525beSRodolfo Giometti {
4486b525beSRodolfo Giometti 	struct pps_gen_device *pps_gen = dev_get_drvdata(dev);
4586b525beSRodolfo Giometti 	bool status;
4686b525beSRodolfo Giometti 	int ret;
4786b525beSRodolfo Giometti 
4886b525beSRodolfo Giometti 	ret = kstrtobool(buf, &status);
4986b525beSRodolfo Giometti 	if (ret)
5086b525beSRodolfo Giometti 		return ret;
5186b525beSRodolfo Giometti 
52*ac9c5170SSubramanian Mohan 	ret = pps_gen->info->enable(pps_gen, status);
5386b525beSRodolfo Giometti 	if (ret)
5486b525beSRodolfo Giometti 		return ret;
5586b525beSRodolfo Giometti 	pps_gen->enabled = status;
5686b525beSRodolfo Giometti 
5786b525beSRodolfo Giometti 	return count;
5886b525beSRodolfo Giometti }
5986b525beSRodolfo Giometti static DEVICE_ATTR_WO(enable);
6086b525beSRodolfo Giometti 
6186b525beSRodolfo Giometti static struct attribute *pps_gen_attrs[] = {
6286b525beSRodolfo Giometti 	&dev_attr_enable.attr,
6386b525beSRodolfo Giometti 	&dev_attr_time.attr,
6486b525beSRodolfo Giometti 	&dev_attr_system.attr,
6586b525beSRodolfo Giometti 	NULL,
6686b525beSRodolfo Giometti };
6786b525beSRodolfo Giometti 
6886b525beSRodolfo Giometti static const struct attribute_group pps_gen_group = {
6986b525beSRodolfo Giometti 	.attrs = pps_gen_attrs,
7086b525beSRodolfo Giometti };
7186b525beSRodolfo Giometti 
7286b525beSRodolfo Giometti const struct attribute_group *pps_gen_groups[] = {
7386b525beSRodolfo Giometti 	&pps_gen_group,
7486b525beSRodolfo Giometti 	NULL,
7586b525beSRodolfo Giometti };
76