H A D | rtc-ds1305.c | 2 * rtc-ds1305.c -- driver for DS1305 and DS1306 SPI RTC chips 19 #include <linux/spi/ds1305.h> 80 /* trickle bits are defined in <linux/spi/ds1305.h> */ 88 struct ds1305 { struct 145 struct ds1305 *ds1305 = dev_get_drvdata(dev); ds1305_alarm_irq_enable() local 150 buf[1] = ds1305->ctrl[0]; ds1305_alarm_irq_enable() 153 if (ds1305->ctrl[0] & DS1305_AEI0) ds1305_alarm_irq_enable() 161 err = spi_write_then_read(ds1305->spi, buf, sizeof(buf), NULL, 0); ds1305_alarm_irq_enable() 163 ds1305->ctrl[0] = buf[1]; ds1305_alarm_irq_enable() 176 struct ds1305 *ds1305 = dev_get_drvdata(dev); ds1305_get_time() local 184 status = spi_write_then_read(ds1305->spi, &addr, sizeof(addr), ds1305_get_time() 214 struct ds1305 *ds1305 = dev_get_drvdata(dev); ds1305_set_time() local 229 *bp++ = hour2bcd(ds1305->hr12, time->tm_hour); ds1305_set_time() 240 return spi_write_then_read(ds1305->spi, buf, sizeof(buf), ds1305_set_time() 273 * Context: caller holds rtc->ops_lock (to protect ds1305->ctrl) 277 struct ds1305 *ds1305 = dev_get_drvdata(dev); ds1305_get_alarm() local 278 struct spi_device *spi = ds1305->spi; ds1305_get_alarm() 290 ds1305->ctrl, sizeof(ds1305->ctrl)); ds1305_get_alarm() 294 alm->enabled = !!(ds1305->ctrl[0] & DS1305_AEI0); ds1305_get_alarm() 295 alm->pending = !!(ds1305->ctrl[1] & DS1305_AEI0); ds1305_get_alarm() 332 * Context: caller holds rtc->ops_lock (to protect ds1305->ctrl) 336 struct ds1305 *ds1305 = dev_get_drvdata(dev); ds1305_set_alarm() local 337 struct spi_device *spi = ds1305->spi; ds1305_set_alarm() 363 if (ds1305->ctrl[0] & DS1305_AEI0) { ds1305_set_alarm() 364 ds1305->ctrl[0] &= ~DS1305_AEI0; ds1305_set_alarm() 367 buf[1] = ds1305->ctrl[0]; ds1305_set_alarm() 368 status = spi_write_then_read(ds1305->spi, buf, 2, NULL, 0); ds1305_set_alarm() 377 buf[1 + DS1305_HOUR] = hour2bcd(ds1305->hr12, alm->time.tm_hour); ds1305_set_alarm() 390 ds1305->ctrl[0] |= DS1305_AEI0; ds1305_set_alarm() 393 buf[1] = ds1305->ctrl[0]; ds1305_set_alarm() 394 status = spi_write_then_read(ds1305->spi, buf, 2, NULL, 0); ds1305_set_alarm() 404 struct ds1305 *ds1305 = dev_get_drvdata(dev); ds1305_proc() local 409 if ((ds1305->ctrl[2] & 0xf0) == DS1305_TRICKLE_MAGIC) { ds1305_proc() 410 switch (ds1305->ctrl[2] & 0x0c) { ds1305_proc() 420 switch (ds1305->ctrl[2] & 0x03) { ds1305_proc() 457 struct ds1305 *ds1305 = container_of(work, struct ds1305, work); ds1305_work() local 458 struct mutex *lock = &ds1305->rtc->ops_lock; ds1305_work() 459 struct spi_device *spi = ds1305->spi; ds1305_work() 463 /* lock to protect ds1305->ctrl */ ds1305_work() 470 ds1305->ctrl[0] &= ~(DS1305_AEI1 | DS1305_AEI0); ds1305_work() 471 ds1305->ctrl[1] = 0; ds1305_work() 474 buf[1] = ds1305->ctrl[0]; ds1305_work() 484 if (!test_bit(FLAG_EXITING, &ds1305->flags)) ds1305_work() 487 rtc_update_irq(ds1305->rtc, 1, RTC_AF | RTC_IRQF); ds1305_work() 492 * mutex locking for ds1305->ctrl ... unlike I2C, we could issue async 497 struct ds1305 *ds1305 = p; ds1305_irq() local 500 schedule_work(&ds1305->work); ds1305_irq() 606 struct ds1305 *ds1305; ds1305_probe() local 622 ds1305 = devm_kzalloc(&spi->dev, sizeof(*ds1305), GFP_KERNEL); ds1305_probe() 623 if (!ds1305) ds1305_probe() 625 ds1305->spi = spi; ds1305_probe() 626 spi_set_drvdata(spi, ds1305); ds1305_probe() 631 ds1305->ctrl, sizeof(ds1305->ctrl)); ds1305_probe() 638 dev_dbg(&spi->dev, "ctrl %s: %3ph\n", "read", ds1305->ctrl); ds1305_probe() 645 if ((ds1305->ctrl[0] & 0x38) != 0 || (ds1305->ctrl[1] & 0xfc) != 0) { ds1305_probe() 649 if (ds1305->ctrl[2] == 0) ds1305_probe() 655 if (ds1305->ctrl[0] & DS1305_WP) { ds1305_probe() 658 ds1305->ctrl[0] &= ~DS1305_WP; ds1305_probe() 661 buf[1] = ds1305->ctrl[0]; ds1305_probe() 672 if (ds1305->ctrl[0] & DS1305_nEOSC) { ds1305_probe() 673 ds1305->ctrl[0] &= ~DS1305_nEOSC; ds1305_probe() 679 if (ds1305->ctrl[1]) { ds1305_probe() 680 ds1305->ctrl[1] = 0; ds1305_probe() 687 if (((ds1305->ctrl[2] & 0xf0) != DS1305_TRICKLE_MAGIC)) { ds1305_probe() 688 ds1305->ctrl[2] = DS1305_TRICKLE_MAGIC ds1305_probe() 696 if (!(ds1305->ctrl[0] & DS1306_1HZ)) { ds1305_probe() 697 ds1305->ctrl[0] |= DS1306_1HZ; ds1305_probe() 701 if (ds1305->ctrl[0] & DS1306_1HZ) { ds1305_probe() 702 ds1305->ctrl[0] &= ~DS1306_1HZ; ds1305_probe() 713 buf[1] = ds1305->ctrl[0]; ds1305_probe() 714 buf[2] = ds1305->ctrl[1]; ds1305_probe() 715 buf[3] = ds1305->ctrl[2]; ds1305_probe() 723 dev_dbg(&spi->dev, "ctrl %s: %3ph\n", "write", ds1305->ctrl); ds1305_probe() 735 ds1305->hr12 = (DS1305_HR_12 & value) != 0; ds1305_probe() 736 if (ds1305->hr12) ds1305_probe() 739 /* register RTC ... from here on, ds1305->ctrl needs locking */ ds1305_probe() 740 ds1305->rtc = devm_rtc_device_register(&spi->dev, "ds1305", ds1305_probe() 742 if (IS_ERR(ds1305->rtc)) { ds1305_probe() 743 status = PTR_ERR(ds1305->rtc); ds1305_probe() 755 INIT_WORK(&ds1305->work, ds1305_work); ds1305_probe() 757 0, dev_name(&ds1305->rtc->dev), ds1305); ds1305_probe() 777 struct ds1305 *ds1305 = spi_get_drvdata(spi); ds1305_remove() local 783 set_bit(FLAG_EXITING, &ds1305->flags); ds1305_remove() 784 devm_free_irq(&spi->dev, spi->irq, ds1305); ds1305_remove() 785 cancel_work_sync(&ds1305->work); ds1305_remove() 792 .driver.name = "rtc-ds1305", 803 MODULE_ALIAS("spi:rtc-ds1305");
|