cregit-Linux how code gets into the kernel

Release 4.7 drivers/rtc/rtc-sysfs.c

Directory: drivers/rtc
/*
 * RTC subsystem, sysfs interface
 *
 * Copyright (C) 2005 Tower Technologies
 * Author: Alessandro Zummo <a.zummo@towertech.it>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

#include <linux/module.h>
#include <linux/rtc.h>

#include "rtc-core.h"


/* device attributes */

/*
 * NOTE:  RTC times displayed in sysfs use the RTC's timezone.  That's
 * ideally UTC.  However, PCs that also boot to MS-Windows normally use
 * the local time and change to match daylight savings time.  That affects
 * attributes including date, time, since_epoch, and wakealarm.
 */


static ssize_t name_show(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%s\n", to_rtc_device(dev)->name); }

Contributors

PersonTokensPropCommitsCommitProp
alessandro zummoalessandro zummo2880.00%133.33%
david brownelldavid brownell617.14%133.33%
greg kroah-hartmangreg kroah-hartman12.86%133.33%
Total35100.00%3100.00%

static DEVICE_ATTR_RO(name);
static ssize_t date_show(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t retval; struct rtc_time tm; retval = rtc_read_time(to_rtc_device(dev), &tm); if (retval == 0) { retval = sprintf(buf, "%04d-%02d-%02d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); } return retval; }

Contributors

PersonTokensPropCommitsCommitProp
alessandro zummoalessandro zummo6686.84%125.00%
david brownelldavid brownell911.84%250.00%
greg kroah-hartmangreg kroah-hartman11.32%125.00%
Total76100.00%4100.00%

static DEVICE_ATTR_RO(date);
static ssize_t time_show(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t retval; struct rtc_time tm; retval = rtc_read_time(to_rtc_device(dev), &tm); if (retval == 0) { retval = sprintf(buf, "%02d:%02d:%02d\n", tm.tm_hour, tm.tm_min, tm.tm_sec); } return retval; }

Contributors

PersonTokensPropCommitsCommitProp
alessandro zummoalessandro zummo6286.11%125.00%
david brownelldavid brownell912.50%250.00%
greg kroah-hartmangreg kroah-hartman11.39%125.00%
Total72100.00%4100.00%

static DEVICE_ATTR_RO(time);
static ssize_t since_epoch_show(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t retval; struct rtc_time tm; retval = rtc_read_time(to_rtc_device(dev), &tm); if (retval == 0) { unsigned long time; rtc_tm_to_time(&tm, &time); retval = sprintf(buf, "%lu\n", time); } return retval; }

Contributors

PersonTokensPropCommitsCommitProp
alessandro zummoalessandro zummo6586.67%125.00%
david brownelldavid brownell912.00%250.00%
greg kroah-hartmangreg kroah-hartman11.33%125.00%
Total75100.00%4100.00%

static DEVICE_ATTR_RO(since_epoch);
static ssize_t max_user_freq_show(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%d\n", to_rtc_device(dev)->max_user_freq); }

Contributors

PersonTokensPropCommitsCommitProp
bryan kadzbanbryan kadzban3497.14%150.00%
greg kroah-hartmangreg kroah-hartman12.86%150.00%
Total35100.00%2100.00%


static ssize_t max_user_freq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) { struct rtc_device *rtc = to_rtc_device(dev); unsigned long val; int err; err = kstrtoul(buf, 0, &val); if (err) return err; if (val >= 4096 || val == 0) return -EINVAL; rtc->max_user_freq = (int)val; return n; }

Contributors

PersonTokensPropCommitsCommitProp
bryan kadzbanbryan kadzban6777.91%133.33%
labbe corentinlabbe corentin1820.93%133.33%
greg kroah-hartmangreg kroah-hartman11.16%133.33%
Total86100.00%3100.00%

static DEVICE_ATTR_RW(max_user_freq); /** * rtc_sysfs_show_hctosys - indicate if the given RTC set the system time * * Returns 1 if the system clock was set by this RTC at the last * boot or resume event. */
static ssize_t hctosys_show(struct device *dev, struct device_attribute *attr, char *buf) { #ifdef CONFIG_RTC_HCTOSYS_DEVICE if (rtc_hctosys_ret == 0 && strcmp(dev_name(&to_rtc_device(dev)->dev), CONFIG_RTC_HCTOSYS_DEVICE) == 0) return sprintf(buf, "1\n"); else #endif return sprintf(buf, "0\n"); }

Contributors

PersonTokensPropCommitsCommitProp
matthew garrettmatthew garrett6192.42%133.33%
uwe kleine-koeniguwe kleine-koenig46.06%133.33%
greg kroah-hartmangreg kroah-hartman11.52%133.33%
Total66100.00%3100.00%

static DEVICE_ATTR_RO(hctosys);
static ssize_t wakealarm_show(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t retval; unsigned long alarm; struct rtc_wkalrm alm; /* Don't show disabled alarms. For uniformity, RTC alarms are * conceptually one-shot, even though some common RTCs (on PCs) * don't actually work that way. * * NOTE: RTC implementations where the alarm doesn't match an * exact YYYY-MM-DD HH:MM[:SS] date *must* disable their RTC * alarms after they trigger, to ensure one-shot semantics. */ retval = rtc_read_alarm(to_rtc_device(dev), &alm); if (retval == 0 && alm.enabled) { rtc_tm_to_time(&alm.time, &alarm); retval = sprintf(buf, "%lu\n", alarm); } return retval; }

Contributors

PersonTokensPropCommitsCommitProp
david brownelldavid brownell8198.78%480.00%
dmitry torokhovdmitry torokhov11.22%120.00%
Total82100.00%5100.00%


static ssize_t wakealarm_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) { ssize_t retval; unsigned long now, alarm; unsigned long push = 0; struct rtc_wkalrm alm; struct rtc_device *rtc = to_rtc_device(dev); char *buf_ptr; int adjust = 0; /* Only request alarms that trigger in the future. Disable them * by writing another time, e.g. 0 meaning Jan 1 1970 UTC. */ retval = rtc_read_time(rtc, &alm.time); if (retval < 0) return retval; rtc_tm_to_time(&alm.time, &now); buf_ptr = (char *)buf; if (*buf_ptr == '+') { buf_ptr++; if (*buf_ptr == '=') { buf_ptr++; push = 1; } else adjust = 1; } retval = kstrtoul(buf_ptr, 0, &alarm); if (retval) return retval; if (adjust) { alarm += now; } if (alarm > now || push) { /* Avoid accidentally clobbering active alarms; we can't * entirely prevent that here, without even the minimal * locking from the /dev/rtcN api. */ retval = rtc_read_alarm(rtc, &alm); if (retval < 0) return retval; if (alm.enabled) { if (push) { rtc_tm_to_time(&alm.time, &push); alarm += push; } else return -EBUSY; } else if (push) return -EINVAL; alm.enabled = 1; } else { alm.enabled = 0; /* Provide a valid future alarm time. Linux isn't EFI, * this time won't be ignored when disabling the alarm. */ alarm = now + 300; } rtc_time_to_tm(alarm, &alm.time); retval = rtc_set_alarm(rtc, &alm); return (retval < 0) ? retval : n; }

Contributors

PersonTokensPropCommitsCommitProp
david brownelldavid brownell17660.48%342.86%
bernie thompsonbernie thompson5819.93%114.29%
yakui zhaoyakui zhao4415.12%114.29%
labbe corentinlabbe corentin124.12%114.29%
dmitry torokhovdmitry torokhov10.34%114.29%
Total291100.00%7100.00%

static DEVICE_ATTR_RW(wakealarm);
static ssize_t offset_show(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t retval; long offset; retval = rtc_read_offset(to_rtc_device(dev), &offset); if (retval == 0) retval = sprintf(buf, "%ld\n", offset); return retval; }

Contributors

PersonTokensPropCommitsCommitProp
joshua claytonjoshua clayton59100.00%1100.00%
Total59100.00%1100.00%


static ssize_t offset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) { ssize_t retval; long offset; retval = kstrtol(buf, 10, &offset); if (retval == 0) retval = rtc_set_offset(to_rtc_device(dev), offset); return (retval < 0) ? retval : n; }

Contributors

PersonTokensPropCommitsCommitProp
joshua claytonjoshua clayton71100.00%1100.00%
Total71100.00%1100.00%

static DEVICE_ATTR_RW(offset); static struct attribute *rtc_attrs[] = { &dev_attr_name.attr, &dev_attr_date.attr, &dev_attr_time.attr, &dev_attr_since_epoch.attr, &dev_attr_max_user_freq.attr, &dev_attr_hctosys.attr, &dev_attr_wakealarm.attr, &dev_attr_offset.attr, NULL, }; /* The reason to trigger an alarm with no process watching it (via sysfs) * is its side effect: waking from a system state like suspend-to-RAM or * suspend-to-disk. So: no attribute unless that side effect is possible. * (Userspace may disable that mechanism later.) */
static bool rtc_does_wakealarm(struct rtc_device *rtc) { if (!device_can_wakeup(rtc->dev.parent)) return false; return rtc->ops->set_alarm != NULL; }

Contributors

PersonTokensPropCommitsCommitProp
david brownelldavid brownell3394.29%375.00%
dmitry torokhovdmitry torokhov25.71%125.00%
Total35100.00%4100.00%


static umode_t rtc_attr_is_visible(struct kobject *kobj, struct attribute *attr, int n) { struct device *dev = container_of(kobj, struct device, kobj); struct rtc_device *rtc = to_rtc_device(dev); umode_t mode = attr->mode; if (attr == &dev_attr_wakealarm.attr) { if (!rtc_does_wakealarm(rtc)) mode = 0; } else if (attr == &dev_attr_offset.attr) { if (!rtc->ops->set_offset) mode = 0; } return mode; }

Contributors

PersonTokensPropCommitsCommitProp
dmitry torokhovdmitry torokhov5250.98%116.67%
joshua claytonjoshua clayton2726.47%116.67%
david brownelldavid brownell1312.75%350.00%
alessandro zummoalessandro zummo109.80%116.67%
Total102100.00%6100.00%

static struct attribute_group rtc_attr_group = { .is_visible = rtc_attr_is_visible, .attrs = rtc_attrs, }; static const struct attribute_group *rtc_attr_groups[] = { &rtc_attr_group, NULL };
const struct attribute_group **rtc_get_dev_attribute_groups(void) { return rtc_attr_groups; }

Contributors

PersonTokensPropCommitsCommitProp
dmitry torokhovdmitry torokhov964.29%133.33%
alessandro zummoalessandro zummo321.43%133.33%
david brownelldavid brownell214.29%133.33%
Total14100.00%3100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
david brownelldavid brownell34827.97%527.78%
alessandro zummoalessandro zummo24219.45%15.56%
joshua claytonjoshua clayton16813.50%15.56%
dmitry torokhovdmitry torokhov14411.58%316.67%
bryan kadzbanbryan kadzban1018.12%15.56%
matthew garrettmatthew garrett614.90%15.56%
bernie thompsonbernie thompson584.66%15.56%
yakui zhaoyakui zhao443.54%15.56%
greg kroah-hartmangreg kroah-hartman433.46%15.56%
labbe corentinlabbe corentin302.41%15.56%
uwe kleine-koeniguwe kleine-koenig40.32%15.56%
david friesdavid fries10.08%15.56%
Total1244100.00%18100.00%
Directory: drivers/rtc
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}