1*74ba9207SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2eae9d2baSRodolfo Giometti /*
3eae9d2baSRodolfo Giometti * PPS sysfs support
4eae9d2baSRodolfo Giometti *
5eae9d2baSRodolfo Giometti * Copyright (C) 2007-2009 Rodolfo Giometti <giometti@linux.it>
6eae9d2baSRodolfo Giometti */
7eae9d2baSRodolfo Giometti
8eae9d2baSRodolfo Giometti
9eae9d2baSRodolfo Giometti #include <linux/device.h>
10eae9d2baSRodolfo Giometti #include <linux/module.h>
11eae9d2baSRodolfo Giometti #include <linux/string.h>
12eae9d2baSRodolfo Giometti #include <linux/pps_kernel.h>
13eae9d2baSRodolfo Giometti
14eae9d2baSRodolfo Giometti /*
15eae9d2baSRodolfo Giometti * Attribute functions
16eae9d2baSRodolfo Giometti */
17eae9d2baSRodolfo Giometti
assert_show(struct device * dev,struct device_attribute * attr,char * buf)18bd0eae4eSGreg Kroah-Hartman static ssize_t assert_show(struct device *dev, struct device_attribute *attr,
19bd0eae4eSGreg Kroah-Hartman char *buf)
20eae9d2baSRodolfo Giometti {
21eae9d2baSRodolfo Giometti struct pps_device *pps = dev_get_drvdata(dev);
22eae9d2baSRodolfo Giometti
23eae9d2baSRodolfo Giometti if (!(pps->info.mode & PPS_CAPTUREASSERT))
24eae9d2baSRodolfo Giometti return 0;
25eae9d2baSRodolfo Giometti
26eae9d2baSRodolfo Giometti return sprintf(buf, "%lld.%09d#%d\n",
27eae9d2baSRodolfo Giometti (long long) pps->assert_tu.sec, pps->assert_tu.nsec,
28eae9d2baSRodolfo Giometti pps->assert_sequence);
29eae9d2baSRodolfo Giometti }
30bd0eae4eSGreg Kroah-Hartman static DEVICE_ATTR_RO(assert);
31eae9d2baSRodolfo Giometti
clear_show(struct device * dev,struct device_attribute * attr,char * buf)32bd0eae4eSGreg Kroah-Hartman static ssize_t clear_show(struct device *dev, struct device_attribute *attr,
33bd0eae4eSGreg Kroah-Hartman char *buf)
34eae9d2baSRodolfo Giometti {
35eae9d2baSRodolfo Giometti struct pps_device *pps = dev_get_drvdata(dev);
36eae9d2baSRodolfo Giometti
37eae9d2baSRodolfo Giometti if (!(pps->info.mode & PPS_CAPTURECLEAR))
38eae9d2baSRodolfo Giometti return 0;
39eae9d2baSRodolfo Giometti
40eae9d2baSRodolfo Giometti return sprintf(buf, "%lld.%09d#%d\n",
41eae9d2baSRodolfo Giometti (long long) pps->clear_tu.sec, pps->clear_tu.nsec,
42eae9d2baSRodolfo Giometti pps->clear_sequence);
43eae9d2baSRodolfo Giometti }
44bd0eae4eSGreg Kroah-Hartman static DEVICE_ATTR_RO(clear);
45eae9d2baSRodolfo Giometti
mode_show(struct device * dev,struct device_attribute * attr,char * buf)46bd0eae4eSGreg Kroah-Hartman static ssize_t mode_show(struct device *dev, struct device_attribute *attr,
47bd0eae4eSGreg Kroah-Hartman char *buf)
48eae9d2baSRodolfo Giometti {
49eae9d2baSRodolfo Giometti struct pps_device *pps = dev_get_drvdata(dev);
50eae9d2baSRodolfo Giometti
51eae9d2baSRodolfo Giometti return sprintf(buf, "%4x\n", pps->info.mode);
52eae9d2baSRodolfo Giometti }
53bd0eae4eSGreg Kroah-Hartman static DEVICE_ATTR_RO(mode);
54eae9d2baSRodolfo Giometti
echo_show(struct device * dev,struct device_attribute * attr,char * buf)55bd0eae4eSGreg Kroah-Hartman static ssize_t echo_show(struct device *dev, struct device_attribute *attr,
56bd0eae4eSGreg Kroah-Hartman char *buf)
57eae9d2baSRodolfo Giometti {
58eae9d2baSRodolfo Giometti struct pps_device *pps = dev_get_drvdata(dev);
59eae9d2baSRodolfo Giometti
60eae9d2baSRodolfo Giometti return sprintf(buf, "%d\n", !!pps->info.echo);
61eae9d2baSRodolfo Giometti }
62bd0eae4eSGreg Kroah-Hartman static DEVICE_ATTR_RO(echo);
63eae9d2baSRodolfo Giometti
name_show(struct device * dev,struct device_attribute * attr,char * buf)64bd0eae4eSGreg Kroah-Hartman static ssize_t name_show(struct device *dev, struct device_attribute *attr,
65bd0eae4eSGreg Kroah-Hartman char *buf)
66eae9d2baSRodolfo Giometti {
67eae9d2baSRodolfo Giometti struct pps_device *pps = dev_get_drvdata(dev);
68eae9d2baSRodolfo Giometti
69eae9d2baSRodolfo Giometti return sprintf(buf, "%s\n", pps->info.name);
70eae9d2baSRodolfo Giometti }
71bd0eae4eSGreg Kroah-Hartman static DEVICE_ATTR_RO(name);
72eae9d2baSRodolfo Giometti
path_show(struct device * dev,struct device_attribute * attr,char * buf)73bd0eae4eSGreg Kroah-Hartman static ssize_t path_show(struct device *dev, struct device_attribute *attr,
74bd0eae4eSGreg Kroah-Hartman char *buf)
75eae9d2baSRodolfo Giometti {
76eae9d2baSRodolfo Giometti struct pps_device *pps = dev_get_drvdata(dev);
77eae9d2baSRodolfo Giometti
78eae9d2baSRodolfo Giometti return sprintf(buf, "%s\n", pps->info.path);
79eae9d2baSRodolfo Giometti }
80bd0eae4eSGreg Kroah-Hartman static DEVICE_ATTR_RO(path);
81eae9d2baSRodolfo Giometti
82bd0eae4eSGreg Kroah-Hartman static struct attribute *pps_attrs[] = {
83bd0eae4eSGreg Kroah-Hartman &dev_attr_assert.attr,
84bd0eae4eSGreg Kroah-Hartman &dev_attr_clear.attr,
85bd0eae4eSGreg Kroah-Hartman &dev_attr_mode.attr,
86bd0eae4eSGreg Kroah-Hartman &dev_attr_echo.attr,
87bd0eae4eSGreg Kroah-Hartman &dev_attr_name.attr,
88bd0eae4eSGreg Kroah-Hartman &dev_attr_path.attr,
89bd0eae4eSGreg Kroah-Hartman NULL,
90bd0eae4eSGreg Kroah-Hartman };
91bd0eae4eSGreg Kroah-Hartman
92bd0eae4eSGreg Kroah-Hartman static const struct attribute_group pps_group = {
93bd0eae4eSGreg Kroah-Hartman .attrs = pps_attrs,
94bd0eae4eSGreg Kroah-Hartman };
95bd0eae4eSGreg Kroah-Hartman
96bd0eae4eSGreg Kroah-Hartman const struct attribute_group *pps_groups[] = {
97bd0eae4eSGreg Kroah-Hartman &pps_group,
98bd0eae4eSGreg Kroah-Hartman NULL,
99eae9d2baSRodolfo Giometti };
100