Lines Matching +full:start +full:- +full:year

1 // SPDX-License-Identifier: GPL-2.0-only
12 #define DRIVER_NAME "rtc-pcf8523"
20 #define REG_CONTROL3_PM_VDD (1 << 6) /* switch-over disabled */
23 #define REG_CONTROL3_BLF (1 << 2) /* battery low bit, read-only */
44 msgs[0].addr = client->addr; in pcf8523_read()
49 msgs[1].addr = client->addr; in pcf8523_read()
54 err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in pcf8523_read()
69 msg.addr = client->addr; in pcf8523_write()
74 err = i2c_transfer(client->adapter, &msg, 1); in pcf8523_write()
104 of_property_read_u32(client->dev.of_node, "quartz-load-femtofarads", in pcf8523_load_capacitance()
109 dev_warn(&client->dev, "Unknown quartz-load-femtofarads value: %d. Assuming 12500", in pcf8523_load_capacitance()
182 u8 start = REG_SECONDS, regs[7]; in pcf8523_rtc_read_time() local
191 return -EINVAL; in pcf8523_rtc_read_time()
194 msgs[0].addr = client->addr; in pcf8523_rtc_read_time()
197 msgs[0].buf = &start; in pcf8523_rtc_read_time()
199 msgs[1].addr = client->addr; in pcf8523_rtc_read_time()
204 err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in pcf8523_rtc_read_time()
209 return -EINVAL; in pcf8523_rtc_read_time()
211 tm->tm_sec = bcd2bin(regs[0] & 0x7f); in pcf8523_rtc_read_time()
212 tm->tm_min = bcd2bin(regs[1] & 0x7f); in pcf8523_rtc_read_time()
213 tm->tm_hour = bcd2bin(regs[2] & 0x3f); in pcf8523_rtc_read_time()
214 tm->tm_mday = bcd2bin(regs[3] & 0x3f); in pcf8523_rtc_read_time()
215 tm->tm_wday = regs[4] & 0x7; in pcf8523_rtc_read_time()
216 tm->tm_mon = bcd2bin(regs[5] & 0x1f) - 1; in pcf8523_rtc_read_time()
217 tm->tm_year = bcd2bin(regs[6]) + 100; in pcf8523_rtc_read_time()
230 * The hardware can only store values between 0 and 99 in it's YEAR in pcf8523_rtc_set_time()
232 * After 2100-02-28 we could start interpreting the year to be in the in pcf8523_rtc_set_time()
234 * because the chip handles YEAR=0x00 (and the out-of-spec in pcf8523_rtc_set_time()
235 * YEAR=0xa0) as a leap year, but 2100 isn't. in pcf8523_rtc_set_time()
237 if (tm->tm_year < 100 || tm->tm_year >= 200) in pcf8523_rtc_set_time()
238 return -EINVAL; in pcf8523_rtc_set_time()
246 regs[1] = bin2bcd(tm->tm_sec); in pcf8523_rtc_set_time()
247 regs[2] = bin2bcd(tm->tm_min); in pcf8523_rtc_set_time()
248 regs[3] = bin2bcd(tm->tm_hour); in pcf8523_rtc_set_time()
249 regs[4] = bin2bcd(tm->tm_mday); in pcf8523_rtc_set_time()
250 regs[5] = tm->tm_wday; in pcf8523_rtc_set_time()
251 regs[6] = bin2bcd(tm->tm_mon + 1); in pcf8523_rtc_set_time()
252 regs[7] = bin2bcd(tm->tm_year - 100); in pcf8523_rtc_set_time()
254 msg.addr = client->addr; in pcf8523_rtc_set_time()
259 err = i2c_transfer(client->adapter, &msg, 1); in pcf8523_rtc_set_time()
291 return -ENOIOCTLCMD; in pcf8523_rtc_ioctl()
309 /* sign extend the 7-bit offset value */ in pcf8523_rtc_read_offset()
322 reg_m0 = clamp(DIV_ROUND_CLOSEST(offset, 4340), -64L, 63L); in pcf8523_rtc_set_offset()
323 reg_m1 = clamp(DIV_ROUND_CLOSEST(offset, 4069), -64L, 63L); in pcf8523_rtc_set_offset()
325 if (abs(reg_m0 * 4340 - offset) < abs(reg_m1 * 4069 - offset)) in pcf8523_rtc_set_offset()
347 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in pcf8523_probe()
348 return -ENODEV; in pcf8523_probe()
352 dev_warn(&client->dev, "failed to set xtal load capacitance: %d", in pcf8523_probe()
359 rtc = devm_rtc_device_register(&client->dev, DRIVER_NAME, in pcf8523_probe()
392 MODULE_AUTHOR("Thierry Reding <thierry.reding@avionic-design.de>");