162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * PPS sysfs support 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2007-2009 Rodolfo Giometti <giometti@linux.it> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/device.h> 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/string.h> 1262306a36Sopenharmony_ci#include <linux/pps_kernel.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * Attribute functions 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic ssize_t assert_show(struct device *dev, struct device_attribute *attr, 1962306a36Sopenharmony_ci char *buf) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci struct pps_device *pps = dev_get_drvdata(dev); 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci if (!(pps->info.mode & PPS_CAPTUREASSERT)) 2462306a36Sopenharmony_ci return 0; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci return sprintf(buf, "%lld.%09d#%d\n", 2762306a36Sopenharmony_ci (long long) pps->assert_tu.sec, pps->assert_tu.nsec, 2862306a36Sopenharmony_ci pps->assert_sequence); 2962306a36Sopenharmony_ci} 3062306a36Sopenharmony_cistatic DEVICE_ATTR_RO(assert); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic ssize_t clear_show(struct device *dev, struct device_attribute *attr, 3362306a36Sopenharmony_ci char *buf) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci struct pps_device *pps = dev_get_drvdata(dev); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci if (!(pps->info.mode & PPS_CAPTURECLEAR)) 3862306a36Sopenharmony_ci return 0; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci return sprintf(buf, "%lld.%09d#%d\n", 4162306a36Sopenharmony_ci (long long) pps->clear_tu.sec, pps->clear_tu.nsec, 4262306a36Sopenharmony_ci pps->clear_sequence); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_cistatic DEVICE_ATTR_RO(clear); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic ssize_t mode_show(struct device *dev, struct device_attribute *attr, 4762306a36Sopenharmony_ci char *buf) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci struct pps_device *pps = dev_get_drvdata(dev); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci return sprintf(buf, "%4x\n", pps->info.mode); 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_cistatic DEVICE_ATTR_RO(mode); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic ssize_t echo_show(struct device *dev, struct device_attribute *attr, 5662306a36Sopenharmony_ci char *buf) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci struct pps_device *pps = dev_get_drvdata(dev); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci return sprintf(buf, "%d\n", !!pps->info.echo); 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_cistatic DEVICE_ATTR_RO(echo); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic ssize_t name_show(struct device *dev, struct device_attribute *attr, 6562306a36Sopenharmony_ci char *buf) 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci struct pps_device *pps = dev_get_drvdata(dev); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci return sprintf(buf, "%s\n", pps->info.name); 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_cistatic DEVICE_ATTR_RO(name); 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistatic ssize_t path_show(struct device *dev, struct device_attribute *attr, 7462306a36Sopenharmony_ci char *buf) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci struct pps_device *pps = dev_get_drvdata(dev); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci return sprintf(buf, "%s\n", pps->info.path); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_cistatic DEVICE_ATTR_RO(path); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistatic struct attribute *pps_attrs[] = { 8362306a36Sopenharmony_ci &dev_attr_assert.attr, 8462306a36Sopenharmony_ci &dev_attr_clear.attr, 8562306a36Sopenharmony_ci &dev_attr_mode.attr, 8662306a36Sopenharmony_ci &dev_attr_echo.attr, 8762306a36Sopenharmony_ci &dev_attr_name.attr, 8862306a36Sopenharmony_ci &dev_attr_path.attr, 8962306a36Sopenharmony_ci NULL, 9062306a36Sopenharmony_ci}; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic const struct attribute_group pps_group = { 9362306a36Sopenharmony_ci .attrs = pps_attrs, 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ciconst struct attribute_group *pps_groups[] = { 9762306a36Sopenharmony_ci &pps_group, 9862306a36Sopenharmony_ci NULL, 9962306a36Sopenharmony_ci}; 100