Loading drivers/rtc/rtc-m41t80.c +0 −88 Original line number Diff line number Diff line Loading @@ -446,96 +446,8 @@ static ssize_t flags_show(struct device *dev, } static DEVICE_ATTR_RO(flags); static ssize_t sqwfreq_show(struct device *dev, struct device_attribute *attr, char *buf) { struct i2c_client *client = to_i2c_client(dev); struct m41t80_data *clientdata = i2c_get_clientdata(client); int val, reg_sqw; if (!(clientdata->features & M41T80_FEATURE_SQ)) return -EINVAL; reg_sqw = M41T80_REG_SQW; if (clientdata->features & M41T80_FEATURE_SQ_ALT) reg_sqw = M41T80_REG_WDAY; val = i2c_smbus_read_byte_data(client, reg_sqw); if (val < 0) return val; val = (val >> 4) & 0xf; switch (val) { case 0: break; case 1: val = 32768; break; default: val = 32768 >> val; } return sprintf(buf, "%d\n", val); } static ssize_t sqwfreq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct i2c_client *client = to_i2c_client(dev); struct m41t80_data *clientdata = i2c_get_clientdata(client); int almon, sqw, reg_sqw, rc; unsigned long val; rc = kstrtoul(buf, 0, &val); if (rc < 0) return rc; if (!(clientdata->features & M41T80_FEATURE_SQ)) return -EINVAL; if (val) { if (!is_power_of_2(val)) return -EINVAL; val = ilog2(val); if (val == 15) val = 1; else if (val < 14) val = 15 - val; else return -EINVAL; } /* disable SQW, set SQW frequency & re-enable */ almon = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_MON); if (almon < 0) return almon; reg_sqw = M41T80_REG_SQW; if (clientdata->features & M41T80_FEATURE_SQ_ALT) reg_sqw = M41T80_REG_WDAY; sqw = i2c_smbus_read_byte_data(client, reg_sqw); if (sqw < 0) return sqw; sqw = (sqw & 0x0f) | (val << 4); rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON, almon & ~M41T80_ALMON_SQWE); if (rc < 0) return rc; if (val) { rc = i2c_smbus_write_byte_data(client, reg_sqw, sqw); if (rc < 0) return rc; rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON, almon | M41T80_ALMON_SQWE); if (rc < 0) return rc; } return count; } static DEVICE_ATTR_RW(sqwfreq); static struct attribute *attrs[] = { &dev_attr_flags.attr, &dev_attr_sqwfreq.attr, NULL, }; Loading Loading
drivers/rtc/rtc-m41t80.c +0 −88 Original line number Diff line number Diff line Loading @@ -446,96 +446,8 @@ static ssize_t flags_show(struct device *dev, } static DEVICE_ATTR_RO(flags); static ssize_t sqwfreq_show(struct device *dev, struct device_attribute *attr, char *buf) { struct i2c_client *client = to_i2c_client(dev); struct m41t80_data *clientdata = i2c_get_clientdata(client); int val, reg_sqw; if (!(clientdata->features & M41T80_FEATURE_SQ)) return -EINVAL; reg_sqw = M41T80_REG_SQW; if (clientdata->features & M41T80_FEATURE_SQ_ALT) reg_sqw = M41T80_REG_WDAY; val = i2c_smbus_read_byte_data(client, reg_sqw); if (val < 0) return val; val = (val >> 4) & 0xf; switch (val) { case 0: break; case 1: val = 32768; break; default: val = 32768 >> val; } return sprintf(buf, "%d\n", val); } static ssize_t sqwfreq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct i2c_client *client = to_i2c_client(dev); struct m41t80_data *clientdata = i2c_get_clientdata(client); int almon, sqw, reg_sqw, rc; unsigned long val; rc = kstrtoul(buf, 0, &val); if (rc < 0) return rc; if (!(clientdata->features & M41T80_FEATURE_SQ)) return -EINVAL; if (val) { if (!is_power_of_2(val)) return -EINVAL; val = ilog2(val); if (val == 15) val = 1; else if (val < 14) val = 15 - val; else return -EINVAL; } /* disable SQW, set SQW frequency & re-enable */ almon = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_MON); if (almon < 0) return almon; reg_sqw = M41T80_REG_SQW; if (clientdata->features & M41T80_FEATURE_SQ_ALT) reg_sqw = M41T80_REG_WDAY; sqw = i2c_smbus_read_byte_data(client, reg_sqw); if (sqw < 0) return sqw; sqw = (sqw & 0x0f) | (val << 4); rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON, almon & ~M41T80_ALMON_SQWE); if (rc < 0) return rc; if (val) { rc = i2c_smbus_write_byte_data(client, reg_sqw, sqw); if (rc < 0) return rc; rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON, almon | M41T80_ALMON_SQWE); if (rc < 0) return rc; } return count; } static DEVICE_ATTR_RW(sqwfreq); static struct attribute *attrs[] = { &dev_attr_flags.attr, &dev_attr_sqwfreq.attr, NULL, }; Loading