Loading drivers/rtc/rtc-ds1685.c +0 −221 Original line number Diff line number Diff line Loading @@ -1520,217 +1520,6 @@ ds1685_rtc_sysfs_ctrl4b_grp = { .name = "ctrl4b", .attrs = ds1685_rtc_sysfs_ctrl4b_attrs, }; /** * struct ds1685_rtc_ctrl_regs. * @name: char pointer for the bit name. * @reg: control register the bit is in. * @bit: the bit's offset in the register. */ struct ds1685_rtc_time_regs { const char *name; const u8 reg; const u8 mask; const u8 min; const u8 max; }; /* * Time/Date register lookup tables. */ static const struct ds1685_rtc_time_regs ds1685_time_regs_bcd_table[] = { { "seconds", RTC_SECS, RTC_SECS_BCD_MASK, 0, 59 }, { "minutes", RTC_MINS, RTC_MINS_BCD_MASK, 0, 59 }, { "hours", RTC_HRS, RTC_HRS_24_BCD_MASK, 0, 23 }, { "wday", RTC_WDAY, RTC_WDAY_MASK, 1, 7 }, { "mday", RTC_MDAY, RTC_MDAY_BCD_MASK, 1, 31 }, { "month", RTC_MONTH, RTC_MONTH_BCD_MASK, 1, 12 }, { "year", RTC_YEAR, RTC_YEAR_BCD_MASK, 0, 99 }, { "century", RTC_CENTURY, RTC_CENTURY_MASK, 0, 99 }, { "alarm_seconds", RTC_SECS_ALARM, RTC_SECS_BCD_MASK, 0, 59 }, { "alarm_minutes", RTC_MINS_ALARM, RTC_MINS_BCD_MASK, 0, 59 }, { "alarm_hours", RTC_HRS_ALARM, RTC_HRS_24_BCD_MASK, 0, 23 }, { "alarm_mday", RTC_MDAY_ALARM, RTC_MDAY_ALARM_MASK, 1, 31 }, { NULL, 0, 0, 0, 0 }, }; static const struct ds1685_rtc_time_regs ds1685_time_regs_bin_table[] = { { "seconds", RTC_SECS, RTC_SECS_BIN_MASK, 0x00, 0x3b }, { "minutes", RTC_MINS, RTC_MINS_BIN_MASK, 0x00, 0x3b }, { "hours", RTC_HRS, RTC_HRS_24_BIN_MASK, 0x00, 0x17 }, { "wday", RTC_WDAY, RTC_WDAY_MASK, 0x01, 0x07 }, { "mday", RTC_MDAY, RTC_MDAY_BIN_MASK, 0x01, 0x1f }, { "month", RTC_MONTH, RTC_MONTH_BIN_MASK, 0x01, 0x0c }, { "year", RTC_YEAR, RTC_YEAR_BIN_MASK, 0x00, 0x63 }, { "century", RTC_CENTURY, RTC_CENTURY_MASK, 0x00, 0x63 }, { "alarm_seconds", RTC_SECS_ALARM, RTC_SECS_BIN_MASK, 0x00, 0x3b }, { "alarm_minutes", RTC_MINS_ALARM, RTC_MINS_BIN_MASK, 0x00, 0x3b }, { "alarm_hours", RTC_HRS_ALARM, RTC_HRS_24_BIN_MASK, 0x00, 0x17 }, { "alarm_mday", RTC_MDAY_ALARM, RTC_MDAY_ALARM_MASK, 0x01, 0x1f }, { NULL, 0, 0, 0x00, 0x00 }, }; /** * ds1685_rtc_sysfs_time_regs_bcd_lookup - time/date reg bit lookup function. * @name: register bit to look up in ds1685_time_regs_bcd_table. */ static const struct ds1685_rtc_time_regs* ds1685_rtc_sysfs_time_regs_lookup(const char *name, bool bcd_mode) { const struct ds1685_rtc_time_regs *p; if (bcd_mode) p = ds1685_time_regs_bcd_table; else p = ds1685_time_regs_bin_table; for (; p->name != NULL; ++p) if (strcmp(p->name, name) == 0) return p; return NULL; } /** * ds1685_rtc_sysfs_time_regs_show - reads a time/date register via sysfs. * @dev: pointer to device structure. * @attr: pointer to device_attribute structure. * @buf: pointer to char array to hold the output. */ static ssize_t ds1685_rtc_sysfs_time_regs_show(struct device *dev, struct device_attribute *attr, char *buf) { u8 tmp; struct ds1685_priv *rtc = dev_get_drvdata(dev); const struct ds1685_rtc_time_regs *bcd_reg_info = ds1685_rtc_sysfs_time_regs_lookup(attr->attr.name, true); const struct ds1685_rtc_time_regs *bin_reg_info = ds1685_rtc_sysfs_time_regs_lookup(attr->attr.name, false); /* Make sure we actually matched something. */ if (!bcd_reg_info || !bin_reg_info) return -EINVAL; /* bcd_reg_info->reg == bin_reg_info->reg. */ ds1685_rtc_begin_data_access(rtc); tmp = rtc->read(rtc, bcd_reg_info->reg); ds1685_rtc_end_data_access(rtc); tmp = ds1685_rtc_bcd2bin(rtc, tmp, bcd_reg_info->mask, bin_reg_info->mask); return sprintf(buf, "%d\n", tmp); } /** * ds1685_rtc_sysfs_time_regs_store - writes a time/date register via sysfs. * @dev: pointer to device structure. * @attr: pointer to device_attribute structure. * @buf: pointer to char array to hold the output. * @count: number of bytes written. */ static ssize_t ds1685_rtc_sysfs_time_regs_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { long int val = 0; struct ds1685_priv *rtc = dev_get_drvdata(dev); const struct ds1685_rtc_time_regs *bcd_reg_info = ds1685_rtc_sysfs_time_regs_lookup(attr->attr.name, true); const struct ds1685_rtc_time_regs *bin_reg_info = ds1685_rtc_sysfs_time_regs_lookup(attr->attr.name, false); /* We only accept numbers. */ if (kstrtol(buf, 10, &val) < 0) return -EINVAL; /* Make sure we actually matched something. */ if (!bcd_reg_info || !bin_reg_info) return -EINVAL; /* Check for a valid range. */ if (rtc->bcd_mode) { if ((val < bcd_reg_info->min) || (val > bcd_reg_info->max)) return -ERANGE; } else { if ((val < bin_reg_info->min) || (val > bin_reg_info->max)) return -ERANGE; } val = ds1685_rtc_bin2bcd(rtc, val, bin_reg_info->mask, bcd_reg_info->mask); /* bcd_reg_info->reg == bin_reg_info->reg. */ ds1685_rtc_begin_data_access(rtc); rtc->write(rtc, bcd_reg_info->reg, val); ds1685_rtc_end_data_access(rtc); return count; } /** * DS1685_RTC_SYSFS_REG_RW - device_attribute for a read-write time register. * @reg: time/date register to read or write. */ #define DS1685_RTC_SYSFS_TIME_REG_RW(reg) \ static DEVICE_ATTR(reg, S_IRUGO | S_IWUSR, \ ds1685_rtc_sysfs_time_regs_show, \ ds1685_rtc_sysfs_time_regs_store) /* * Time/Date Register bits. */ DS1685_RTC_SYSFS_TIME_REG_RW(seconds); DS1685_RTC_SYSFS_TIME_REG_RW(minutes); DS1685_RTC_SYSFS_TIME_REG_RW(hours); DS1685_RTC_SYSFS_TIME_REG_RW(wday); DS1685_RTC_SYSFS_TIME_REG_RW(mday); DS1685_RTC_SYSFS_TIME_REG_RW(month); DS1685_RTC_SYSFS_TIME_REG_RW(year); DS1685_RTC_SYSFS_TIME_REG_RW(century); DS1685_RTC_SYSFS_TIME_REG_RW(alarm_seconds); DS1685_RTC_SYSFS_TIME_REG_RW(alarm_minutes); DS1685_RTC_SYSFS_TIME_REG_RW(alarm_hours); DS1685_RTC_SYSFS_TIME_REG_RW(alarm_mday); static struct attribute* ds1685_rtc_sysfs_time_attrs[] = { &dev_attr_seconds.attr, &dev_attr_minutes.attr, &dev_attr_hours.attr, &dev_attr_wday.attr, &dev_attr_mday.attr, &dev_attr_month.attr, &dev_attr_year.attr, &dev_attr_century.attr, NULL, }; static const struct attribute_group ds1685_rtc_sysfs_time_grp = { .name = "datetime", .attrs = ds1685_rtc_sysfs_time_attrs, }; static struct attribute* ds1685_rtc_sysfs_alarm_attrs[] = { &dev_attr_alarm_seconds.attr, &dev_attr_alarm_minutes.attr, &dev_attr_alarm_hours.attr, &dev_attr_alarm_mday.attr, NULL, }; static const struct attribute_group ds1685_rtc_sysfs_alarm_grp = { .name = "alarm", .attrs = ds1685_rtc_sysfs_alarm_attrs, }; #endif /* CONFIG_RTC_DS1685_SYSFS_REGS */ Loading Loading @@ -1776,14 +1565,6 @@ ds1685_rtc_sysfs_register(struct device *dev) ret = sysfs_create_group(&dev->kobj, &ds1685_rtc_sysfs_ctrl4b_grp); if (ret) return ret; ret = sysfs_create_group(&dev->kobj, &ds1685_rtc_sysfs_time_grp); if (ret) return ret; ret = sysfs_create_group(&dev->kobj, &ds1685_rtc_sysfs_alarm_grp); if (ret) return ret; #endif return 0; } Loading @@ -1805,8 +1586,6 @@ ds1685_rtc_sysfs_unregister(struct device *dev) sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_ctrld_grp); sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_ctrl4a_grp); sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_ctrl4b_grp); sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_time_grp); sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_alarm_grp); #endif return 0; Loading Loading
drivers/rtc/rtc-ds1685.c +0 −221 Original line number Diff line number Diff line Loading @@ -1520,217 +1520,6 @@ ds1685_rtc_sysfs_ctrl4b_grp = { .name = "ctrl4b", .attrs = ds1685_rtc_sysfs_ctrl4b_attrs, }; /** * struct ds1685_rtc_ctrl_regs. * @name: char pointer for the bit name. * @reg: control register the bit is in. * @bit: the bit's offset in the register. */ struct ds1685_rtc_time_regs { const char *name; const u8 reg; const u8 mask; const u8 min; const u8 max; }; /* * Time/Date register lookup tables. */ static const struct ds1685_rtc_time_regs ds1685_time_regs_bcd_table[] = { { "seconds", RTC_SECS, RTC_SECS_BCD_MASK, 0, 59 }, { "minutes", RTC_MINS, RTC_MINS_BCD_MASK, 0, 59 }, { "hours", RTC_HRS, RTC_HRS_24_BCD_MASK, 0, 23 }, { "wday", RTC_WDAY, RTC_WDAY_MASK, 1, 7 }, { "mday", RTC_MDAY, RTC_MDAY_BCD_MASK, 1, 31 }, { "month", RTC_MONTH, RTC_MONTH_BCD_MASK, 1, 12 }, { "year", RTC_YEAR, RTC_YEAR_BCD_MASK, 0, 99 }, { "century", RTC_CENTURY, RTC_CENTURY_MASK, 0, 99 }, { "alarm_seconds", RTC_SECS_ALARM, RTC_SECS_BCD_MASK, 0, 59 }, { "alarm_minutes", RTC_MINS_ALARM, RTC_MINS_BCD_MASK, 0, 59 }, { "alarm_hours", RTC_HRS_ALARM, RTC_HRS_24_BCD_MASK, 0, 23 }, { "alarm_mday", RTC_MDAY_ALARM, RTC_MDAY_ALARM_MASK, 1, 31 }, { NULL, 0, 0, 0, 0 }, }; static const struct ds1685_rtc_time_regs ds1685_time_regs_bin_table[] = { { "seconds", RTC_SECS, RTC_SECS_BIN_MASK, 0x00, 0x3b }, { "minutes", RTC_MINS, RTC_MINS_BIN_MASK, 0x00, 0x3b }, { "hours", RTC_HRS, RTC_HRS_24_BIN_MASK, 0x00, 0x17 }, { "wday", RTC_WDAY, RTC_WDAY_MASK, 0x01, 0x07 }, { "mday", RTC_MDAY, RTC_MDAY_BIN_MASK, 0x01, 0x1f }, { "month", RTC_MONTH, RTC_MONTH_BIN_MASK, 0x01, 0x0c }, { "year", RTC_YEAR, RTC_YEAR_BIN_MASK, 0x00, 0x63 }, { "century", RTC_CENTURY, RTC_CENTURY_MASK, 0x00, 0x63 }, { "alarm_seconds", RTC_SECS_ALARM, RTC_SECS_BIN_MASK, 0x00, 0x3b }, { "alarm_minutes", RTC_MINS_ALARM, RTC_MINS_BIN_MASK, 0x00, 0x3b }, { "alarm_hours", RTC_HRS_ALARM, RTC_HRS_24_BIN_MASK, 0x00, 0x17 }, { "alarm_mday", RTC_MDAY_ALARM, RTC_MDAY_ALARM_MASK, 0x01, 0x1f }, { NULL, 0, 0, 0x00, 0x00 }, }; /** * ds1685_rtc_sysfs_time_regs_bcd_lookup - time/date reg bit lookup function. * @name: register bit to look up in ds1685_time_regs_bcd_table. */ static const struct ds1685_rtc_time_regs* ds1685_rtc_sysfs_time_regs_lookup(const char *name, bool bcd_mode) { const struct ds1685_rtc_time_regs *p; if (bcd_mode) p = ds1685_time_regs_bcd_table; else p = ds1685_time_regs_bin_table; for (; p->name != NULL; ++p) if (strcmp(p->name, name) == 0) return p; return NULL; } /** * ds1685_rtc_sysfs_time_regs_show - reads a time/date register via sysfs. * @dev: pointer to device structure. * @attr: pointer to device_attribute structure. * @buf: pointer to char array to hold the output. */ static ssize_t ds1685_rtc_sysfs_time_regs_show(struct device *dev, struct device_attribute *attr, char *buf) { u8 tmp; struct ds1685_priv *rtc = dev_get_drvdata(dev); const struct ds1685_rtc_time_regs *bcd_reg_info = ds1685_rtc_sysfs_time_regs_lookup(attr->attr.name, true); const struct ds1685_rtc_time_regs *bin_reg_info = ds1685_rtc_sysfs_time_regs_lookup(attr->attr.name, false); /* Make sure we actually matched something. */ if (!bcd_reg_info || !bin_reg_info) return -EINVAL; /* bcd_reg_info->reg == bin_reg_info->reg. */ ds1685_rtc_begin_data_access(rtc); tmp = rtc->read(rtc, bcd_reg_info->reg); ds1685_rtc_end_data_access(rtc); tmp = ds1685_rtc_bcd2bin(rtc, tmp, bcd_reg_info->mask, bin_reg_info->mask); return sprintf(buf, "%d\n", tmp); } /** * ds1685_rtc_sysfs_time_regs_store - writes a time/date register via sysfs. * @dev: pointer to device structure. * @attr: pointer to device_attribute structure. * @buf: pointer to char array to hold the output. * @count: number of bytes written. */ static ssize_t ds1685_rtc_sysfs_time_regs_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { long int val = 0; struct ds1685_priv *rtc = dev_get_drvdata(dev); const struct ds1685_rtc_time_regs *bcd_reg_info = ds1685_rtc_sysfs_time_regs_lookup(attr->attr.name, true); const struct ds1685_rtc_time_regs *bin_reg_info = ds1685_rtc_sysfs_time_regs_lookup(attr->attr.name, false); /* We only accept numbers. */ if (kstrtol(buf, 10, &val) < 0) return -EINVAL; /* Make sure we actually matched something. */ if (!bcd_reg_info || !bin_reg_info) return -EINVAL; /* Check for a valid range. */ if (rtc->bcd_mode) { if ((val < bcd_reg_info->min) || (val > bcd_reg_info->max)) return -ERANGE; } else { if ((val < bin_reg_info->min) || (val > bin_reg_info->max)) return -ERANGE; } val = ds1685_rtc_bin2bcd(rtc, val, bin_reg_info->mask, bcd_reg_info->mask); /* bcd_reg_info->reg == bin_reg_info->reg. */ ds1685_rtc_begin_data_access(rtc); rtc->write(rtc, bcd_reg_info->reg, val); ds1685_rtc_end_data_access(rtc); return count; } /** * DS1685_RTC_SYSFS_REG_RW - device_attribute for a read-write time register. * @reg: time/date register to read or write. */ #define DS1685_RTC_SYSFS_TIME_REG_RW(reg) \ static DEVICE_ATTR(reg, S_IRUGO | S_IWUSR, \ ds1685_rtc_sysfs_time_regs_show, \ ds1685_rtc_sysfs_time_regs_store) /* * Time/Date Register bits. */ DS1685_RTC_SYSFS_TIME_REG_RW(seconds); DS1685_RTC_SYSFS_TIME_REG_RW(minutes); DS1685_RTC_SYSFS_TIME_REG_RW(hours); DS1685_RTC_SYSFS_TIME_REG_RW(wday); DS1685_RTC_SYSFS_TIME_REG_RW(mday); DS1685_RTC_SYSFS_TIME_REG_RW(month); DS1685_RTC_SYSFS_TIME_REG_RW(year); DS1685_RTC_SYSFS_TIME_REG_RW(century); DS1685_RTC_SYSFS_TIME_REG_RW(alarm_seconds); DS1685_RTC_SYSFS_TIME_REG_RW(alarm_minutes); DS1685_RTC_SYSFS_TIME_REG_RW(alarm_hours); DS1685_RTC_SYSFS_TIME_REG_RW(alarm_mday); static struct attribute* ds1685_rtc_sysfs_time_attrs[] = { &dev_attr_seconds.attr, &dev_attr_minutes.attr, &dev_attr_hours.attr, &dev_attr_wday.attr, &dev_attr_mday.attr, &dev_attr_month.attr, &dev_attr_year.attr, &dev_attr_century.attr, NULL, }; static const struct attribute_group ds1685_rtc_sysfs_time_grp = { .name = "datetime", .attrs = ds1685_rtc_sysfs_time_attrs, }; static struct attribute* ds1685_rtc_sysfs_alarm_attrs[] = { &dev_attr_alarm_seconds.attr, &dev_attr_alarm_minutes.attr, &dev_attr_alarm_hours.attr, &dev_attr_alarm_mday.attr, NULL, }; static const struct attribute_group ds1685_rtc_sysfs_alarm_grp = { .name = "alarm", .attrs = ds1685_rtc_sysfs_alarm_attrs, }; #endif /* CONFIG_RTC_DS1685_SYSFS_REGS */ Loading Loading @@ -1776,14 +1565,6 @@ ds1685_rtc_sysfs_register(struct device *dev) ret = sysfs_create_group(&dev->kobj, &ds1685_rtc_sysfs_ctrl4b_grp); if (ret) return ret; ret = sysfs_create_group(&dev->kobj, &ds1685_rtc_sysfs_time_grp); if (ret) return ret; ret = sysfs_create_group(&dev->kobj, &ds1685_rtc_sysfs_alarm_grp); if (ret) return ret; #endif return 0; } Loading @@ -1805,8 +1586,6 @@ ds1685_rtc_sysfs_unregister(struct device *dev) sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_ctrld_grp); sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_ctrl4a_grp); sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_ctrl4b_grp); sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_time_grp); sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_alarm_grp); #endif return 0; Loading