Lines Matching refs:ds1307
3 * rtc-ds1307.c - RTC driver for some mostly-compatible I2C chips.
18 #include <linux/rtc/ds1307.h>
171 struct ds1307 {
194 u8 (*do_trickle_setup)(struct ds1307 *, u32,
211 struct ds1307 *ds1307 = dev_get_drvdata(dev);
213 const struct chip_desc *chip = &chips[ds1307->type];
216 if (ds1307->type == rx_8130) {
218 ret = regmap_read(ds1307->regmap, RX8130_REG_FLAG, ®flag);
231 ret = regmap_bulk_read(ds1307->regmap, chip->offset, regs,
241 if (ds1307->type == m41t0 &&
248 switch (ds1307->type) {
261 ret = regmap_read(ds1307->regmap, DS1307_REG_CONTROL, &tmp);
271 ret = regmap_read(ds1307->regmap, DS1340_REG_FLAG, &tmp);
278 ret = regmap_read(ds1307->regmap, DS1388_REG_FLAG, &tmp);
298 if (ds1307->type == rx_8130)
322 struct ds1307 *ds1307 = dev_get_drvdata(dev);
323 const struct chip_desc *chip = &chips[ds1307->type];
349 if (ds1307->type == rx_8130)
365 switch (ds1307->type) {
368 regmap_update_bits(ds1307->regmap, DS1307_REG_CONTROL,
372 regmap_update_bits(ds1307->regmap, DS1340_REG_FLAG,
376 regmap_update_bits(ds1307->regmap, DS1388_REG_FLAG,
394 result = regmap_bulk_write(ds1307->regmap, chip->offset, regs,
401 if (ds1307->type == rx_8130) {
403 result = regmap_write(ds1307->regmap, RX8130_REG_FLAG,
416 struct ds1307 *ds1307 = dev_get_drvdata(dev);
421 ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS,
455 struct ds1307 *ds1307 = dev_get_drvdata(dev);
467 ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS, regs,
494 ret = regmap_bulk_write(ds1307->regmap, DS1339_REG_ALARM1_SECS, regs,
505 regmap_write(ds1307->regmap, DS1337_REG_CONTROL, regs[7]);
513 struct ds1307 *ds1307 = dev_get_drvdata(dev);
515 return regmap_update_bits(ds1307->regmap, DS1337_REG_CONTROL,
520 static u8 do_trickle_setup_ds1339(struct ds1307 *ds1307, u32 ohms, bool diode)
538 dev_warn(ds1307->dev,
545 static u8 do_trickle_setup_rx8130(struct ds1307 *ds1307, u32 ohms, bool diode)
557 struct ds1307 *ds1307 = dev_id;
561 rtc_lock(ds1307->rtc);
564 ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
573 ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
578 rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
581 rtc_unlock(ds1307->rtc);
588 struct ds1307 *ds1307 = dev_get_drvdata(dev);
593 ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_ALARM_MIN, ald,
599 ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
627 struct ds1307 *ds1307 = dev_get_drvdata(dev);
638 ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
647 ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
657 ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_ALARM_MIN, ald,
667 return regmap_write(ds1307->regmap, RX8130_REG_CONTROL0, ctl[2]);
672 struct ds1307 *ds1307 = dev_get_drvdata(dev);
675 ret = regmap_read(ds1307->regmap, RX8130_REG_CONTROL0, ®);
684 return regmap_write(ds1307->regmap, RX8130_REG_CONTROL0, reg);
689 struct ds1307 *ds1307 = dev_id;
690 struct mutex *lock = &ds1307->rtc->ops_lock;
696 ret = regmap_read(ds1307->regmap, MCP794XX_REG_ALARM0_CTRL, ®);
702 ret = regmap_write(ds1307->regmap, MCP794XX_REG_ALARM0_CTRL, reg);
707 ret = regmap_update_bits(ds1307->regmap, MCP794XX_REG_CONTROL,
712 rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
722 struct ds1307 *ds1307 = dev_get_drvdata(dev);
727 ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs,
777 struct ds1307 *ds1307 = dev_get_drvdata(dev);
792 ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs,
812 ret = regmap_bulk_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs,
820 return regmap_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs[0]);
825 struct ds1307 *ds1307 = dev_get_drvdata(dev);
827 return regmap_update_bits(ds1307->regmap, MCP794XX_REG_CONTROL,
834 struct ds1307 *ds1307 = dev_get_drvdata(dev);
838 regmap_read(ds1307->regmap, M41TXX_REG_CONTROL, &ctrl_reg);
853 struct ds1307 *ds1307 = dev_get_drvdata(dev);
868 return regmap_update_bits(ds1307->regmap, M41TXX_REG_CONTROL,
876 struct ds1307 *ds1307 = watchdog_get_drvdata(wdt_dev);
880 ret = regmap_update_bits(ds1307->regmap, DS1388_REG_FLAG,
885 ret = regmap_update_bits(ds1307->regmap, DS1388_REG_CONTROL,
897 ret = regmap_bulk_write(ds1307->regmap, DS1388_REG_WDOG_HUN_SECS, regs,
902 return regmap_update_bits(ds1307->regmap, DS1388_REG_CONTROL,
909 struct ds1307 *ds1307 = watchdog_get_drvdata(wdt_dev);
911 return regmap_update_bits(ds1307->regmap, DS1388_REG_CONTROL,
917 struct ds1307 *ds1307 = watchdog_get_drvdata(wdt_dev);
920 return regmap_bulk_read(ds1307->regmap, DS1388_REG_WDOG_HUN_SECS, regs,
927 struct ds1307 *ds1307 = watchdog_get_drvdata(wdt_dev);
934 return regmap_bulk_write(ds1307->regmap, DS1388_REG_WDOG_HUN_SECS, regs,
1050 { "ds1307", ds_1307 },
1074 .compatible = "dallas,ds1307",
1156 struct ds1307 *ds1307 = dev_id;
1157 struct mutex *lock = &ds1307->rtc->ops_lock;
1161 ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &stat);
1167 regmap_write(ds1307->regmap, DS1337_REG_STATUS, stat);
1169 ret = regmap_update_bits(ds1307->regmap, DS1337_REG_CONTROL,
1174 rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
1197 struct ds1307 *ds1307 = dev_get_drvdata(dev->parent);
1207 regmap_update_bits(ds1307->regmap, M41TXX_REG_CONTROL, M41TXX_BIT_FT,
1217 struct ds1307 *ds1307 = dev_get_drvdata(dev->parent);
1220 regmap_read(ds1307->regmap, M41TXX_REG_CONTROL, &ctrl_reg);
1236 static int ds1307_add_frequency_test(struct ds1307 *ds1307)
1240 switch (ds1307->type) {
1244 err = rtc_add_group(ds1307->rtc, &rtc_freq_test_attr_group);
1260 struct ds1307 *ds1307 = priv;
1261 const struct chip_desc *chip = &chips[ds1307->type];
1263 return regmap_bulk_read(ds1307->regmap, chip->nvram_offset + offset,
1270 struct ds1307 *ds1307 = priv;
1271 const struct chip_desc *chip = &chips[ds1307->type];
1273 return regmap_bulk_write(ds1307->regmap, chip->nvram_offset + offset,
1279 static u8 ds1307_trickle_init(struct ds1307 *ds1307,
1288 if (device_property_read_u32(ds1307->dev, "trickle-resistor-ohms",
1295 if (!device_property_read_u32(ds1307->dev, "aux-voltage-chargeable",
1305 dev_warn(ds1307->dev,
1309 } else if (device_property_read_bool(ds1307->dev,
1314 return chip->do_trickle_setup(ds1307, ohms, diode);
1333 struct ds1307 *ds1307 = dev_get_drvdata(dev);
1338 ret = regmap_bulk_read(ds1307->regmap, DS3231_REG_TEMPERATURE,
1374 static void ds1307_hwmon_register(struct ds1307 *ds1307)
1378 if (ds1307->type != ds_3231)
1381 dev = devm_hwmon_device_register_with_groups(ds1307->dev, ds1307->name,
1382 ds1307,
1385 dev_warn(ds1307->dev, "unable to register hwmon device %ld\n",
1392 static void ds1307_hwmon_register(struct ds1307 *ds1307)
1412 container_of(clk, struct ds1307, clks[DS3231_CLK_SQW])
1414 container_of(clk, struct ds1307, clks[DS3231_CLK_32KHZ])
1423 static int ds1337_write_control(struct ds1307 *ds1307, u8 mask, u8 value)
1425 struct mutex *lock = &ds1307->rtc->ops_lock;
1429 ret = regmap_update_bits(ds1307->regmap, DS1337_REG_CONTROL,
1439 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1443 ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
1470 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1488 return ds1337_write_control(ds1307, DS1337_BIT_RS1 | DS1337_BIT_RS2,
1494 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1496 return ds1337_write_control(ds1307, DS1337_BIT_INTCN, 0);
1501 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1503 ds1337_write_control(ds1307, DS1337_BIT_INTCN, DS1337_BIT_INTCN);
1508 struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
1511 ret = regmap_read(ds1307->regmap, DS1337_REG_CONTROL, &control);
1533 static int ds3231_clk_32khz_control(struct ds1307 *ds1307, bool enable)
1535 struct mutex *lock = &ds1307->rtc->ops_lock;
1539 ret = regmap_update_bits(ds1307->regmap, DS1337_REG_STATUS,
1549 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
1551 return ds3231_clk_32khz_control(ds1307, true);
1556 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
1558 ds3231_clk_32khz_control(ds1307, false);
1563 struct ds1307 *ds1307 = clk_32khz_to_ds1307(hw);
1566 ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &status);
1594 static int ds3231_clks_register(struct ds1307 *ds1307)
1596 struct device_node *node = ds1307->dev->of_node;
1600 onecell = devm_kzalloc(ds1307->dev, sizeof(*onecell), GFP_KERNEL);
1605 onecell->clks = devm_kcalloc(ds1307->dev, onecell->clk_num,
1611 device_property_read_string_array(ds1307->dev, "clock-output-names",
1622 if (i == DS3231_CLK_SQW && test_bit(RTC_FEATURE_ALARM, ds1307->rtc->features))
1626 ds1307->clks[i].init = &init;
1628 onecell->clks[i] = devm_clk_register(ds1307->dev,
1629 &ds1307->clks[i]);
1640 static void ds1307_clks_register(struct ds1307 *ds1307)
1644 if (ds1307->type != ds_3231)
1647 ret = ds3231_clks_register(ds1307);
1649 dev_warn(ds1307->dev, "unable to register clock device %d\n",
1656 static void ds1307_clks_register(struct ds1307 *ds1307)
1677 static void ds1307_wdt_register(struct ds1307 *ds1307)
1683 if (ds1307->type != ds_1388)
1686 wdt = devm_kzalloc(ds1307->dev, sizeof(*wdt), GFP_KERNEL);
1690 err = regmap_read(ds1307->regmap, DS1388_REG_FLAG, &val);
1700 watchdog_init_timeout(wdt, 0, ds1307->dev);
1701 watchdog_set_drvdata(wdt, ds1307);
1702 devm_watchdog_register_device(ds1307->dev, wdt);
1705 static void ds1307_wdt_register(struct ds1307 *ds1307)
1718 struct ds1307 *ds1307;
1729 ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
1730 if (!ds1307)
1733 dev_set_drvdata(&client->dev, ds1307);
1734 ds1307->dev = &client->dev;
1735 ds1307->name = client->name;
1737 ds1307->regmap = devm_regmap_init_i2c(client, ®map_config);
1738 if (IS_ERR(ds1307->regmap)) {
1739 dev_err(ds1307->dev, "regmap allocation failed\n");
1740 return PTR_ERR(ds1307->regmap);
1743 i2c_set_clientdata(client, ds1307);
1747 ds1307->type = (uintptr_t)match;
1748 chip = &chips[ds1307->type];
1751 ds1307->type = id->driver_data;
1759 trickle_charger_setup = ds1307_trickle_init(ds1307, chip);
1764 dev_dbg(ds1307->dev,
1767 regmap_write(ds1307->regmap, chip->trickle_charger_reg,
1782 switch (ds1307->type) {
1788 err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
1791 dev_dbg(ds1307->dev, "read error %d\n", err);
1810 regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
1815 regmap_write(ds1307->regmap, DS1337_REG_STATUS,
1817 dev_warn(ds1307->dev, "SET TIME!\n");
1822 err = regmap_bulk_read(ds1307->regmap,
1825 dev_dbg(ds1307->dev, "read error %d\n", err);
1832 regmap_write(ds1307->regmap,
1835 dev_warn(ds1307->dev,
1841 regmap_write(ds1307->regmap,
1844 dev_warn(ds1307->dev, "power-on detected\n");
1849 regmap_write(ds1307->regmap,
1852 dev_warn(ds1307->dev, "voltage drop detected\n");
1860 regmap_write(ds1307->regmap,
1864 err = regmap_bulk_read(ds1307->regmap,
1868 dev_dbg(ds1307->dev, "read error %d\n", err);
1879 regmap_write(ds1307->regmap,
1884 err = regmap_read(ds1307->regmap, DS1388_REG_CONTROL, &tmp);
1886 dev_dbg(ds1307->dev, "read error %d\n", err);
1893 regmap_write(ds1307->regmap, DS1388_REG_CONTROL, tmp);
1901 err = regmap_bulk_read(ds1307->regmap, chip->offset, regs,
1904 dev_dbg(ds1307->dev, "read error %d\n", err);
1908 if (ds1307->type == mcp794xx &&
1910 regmap_write(ds1307->regmap, DS1307_REG_WDAY,
1916 switch (ds1307->type) {
1941 regmap_write(ds1307->regmap, chip->offset + DS1307_REG_HOUR,
1945 ds1307->rtc = devm_rtc_allocate_device(ds1307->dev);
1946 if (IS_ERR(ds1307->rtc))
1947 return PTR_ERR(ds1307->rtc);
1950 device_set_wakeup_capable(ds1307->dev, true);
1952 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
1955 dev_info(ds1307->dev,
1958 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, ds1307->rtc->features);
1962 err = devm_request_threaded_irq(ds1307->dev, client->irq, NULL,
1965 ds1307->name, ds1307);
1968 device_set_wakeup_capable(ds1307->dev, false);
1969 clear_bit(RTC_FEATURE_ALARM, ds1307->rtc->features);
1970 dev_err(ds1307->dev, "unable to request IRQ!\n");
1972 dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
1976 ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops;
1977 err = ds1307_add_frequency_test(ds1307);
1981 err = devm_rtc_register_device(ds1307->rtc);
1993 .priv = ds1307,
1996 devm_rtc_nvmem_register(ds1307->rtc, &nvmem_cfg);
1999 ds1307_hwmon_register(ds1307);
2000 ds1307_clks_register(ds1307);
2001 ds1307_wdt_register(ds1307);
2011 .name = "rtc-ds1307",