1 /* 2 * PPS sysfs support 3 * 4 * 5 * Copyright (C) 2007-2009 Rodolfo Giometti <giometti@linux.it> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22 23 #include <linux/device.h> 24 #include <linux/module.h> 25 #include <linux/string.h> 26 #include <linux/pps_kernel.h> 27 28 /* 29 * Attribute functions 30 */ 31 32 static ssize_t pps_show_assert(struct device *dev, 33 struct device_attribute *attr, char *buf) 34 { 35 struct pps_device *pps = dev_get_drvdata(dev); 36 37 if (!(pps->info.mode & PPS_CAPTUREASSERT)) 38 return 0; 39 40 return sprintf(buf, "%lld.%09d#%d\n", 41 (long long) pps->assert_tu.sec, pps->assert_tu.nsec, 42 pps->assert_sequence); 43 } 44 45 static ssize_t pps_show_clear(struct device *dev, 46 struct device_attribute *attr, char *buf) 47 { 48 struct pps_device *pps = dev_get_drvdata(dev); 49 50 if (!(pps->info.mode & PPS_CAPTURECLEAR)) 51 return 0; 52 53 return sprintf(buf, "%lld.%09d#%d\n", 54 (long long) pps->clear_tu.sec, pps->clear_tu.nsec, 55 pps->clear_sequence); 56 } 57 58 static ssize_t pps_show_mode(struct device *dev, 59 struct device_attribute *attr, char *buf) 60 { 61 struct pps_device *pps = dev_get_drvdata(dev); 62 63 return sprintf(buf, "%4x\n", pps->info.mode); 64 } 65 66 static ssize_t pps_show_echo(struct device *dev, 67 struct device_attribute *attr, char *buf) 68 { 69 struct pps_device *pps = dev_get_drvdata(dev); 70 71 return sprintf(buf, "%d\n", !!pps->info.echo); 72 } 73 74 static ssize_t pps_show_name(struct device *dev, 75 struct device_attribute *attr, char *buf) 76 { 77 struct pps_device *pps = dev_get_drvdata(dev); 78 79 return sprintf(buf, "%s\n", pps->info.name); 80 } 81 82 static ssize_t pps_show_path(struct device *dev, 83 struct device_attribute *attr, char *buf) 84 { 85 struct pps_device *pps = dev_get_drvdata(dev); 86 87 return sprintf(buf, "%s\n", pps->info.path); 88 } 89 90 struct device_attribute pps_attrs[] = { 91 __ATTR(assert, S_IRUGO, pps_show_assert, NULL), 92 __ATTR(clear, S_IRUGO, pps_show_clear, NULL), 93 __ATTR(mode, S_IRUGO, pps_show_mode, NULL), 94 __ATTR(echo, S_IRUGO, pps_show_echo, NULL), 95 __ATTR(name, S_IRUGO, pps_show_name, NULL), 96 __ATTR(path, S_IRUGO, pps_show_path, NULL), 97 __ATTR_NULL, 98 }; 99