Skip to content
Snippets Groups Projects
Commit 02f78598 authored by Yuri Mazzuoli's avatar Yuri Mazzuoli
Browse files

[DRIVER][RTC] fix alarm feature on PCF2123 and improve debug logging

- fix PCF2123_REG_CTRL2 write in pcf2123_shutdown
- improve debugging log (when PCF_LOGGING is defined):
 - dump registers more often
 - dump all 16 regitsers
parent f27d6d09
No related branches found
No related tags found
No related merge requests found
......@@ -419,16 +419,17 @@ static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm)
(reg) & ~(mask))
int pcf2123_rtc_read_reg_alrm (struct device *dev) {
int ret;
s8 rxbuf[4];
int ret, i=0;
u8 rxbuf[16];
ret = pcf2123_read(dev, PCF2123_REG_ALRM_MN, &rxbuf[0], sizeof(rxbuf));
ret = pcf2123_read(dev, 0x0, &rxbuf[0], sizeof(rxbuf));
if (ret < 0)
return ret;
pcf2123_delay_trec();
printk (KERN_ERR "dump alarm reg:\n %02x %02x %02x %02x\n",
rxbuf[0], rxbuf[1], rxbuf[2], rxbuf[3]);
printk (KERN_ERR "dump alarm reg:\n");
for(i=0;i<16;i++)
printk (KERN_ERR "reg: %02x val: %02x\n", i, rxbuf[i]);
ret = pcf2123_read(dev, PCF2123_REG_CTRL2, &rxbuf[0], 1);
if (ret < 0)
......@@ -455,7 +456,9 @@ int pcf2123_rtc_clear_int_alrm (struct device *dev) {
return ret;
pcf2123_delay_trec();
//pcf2123_rtc_read_reg_alrm (dev);
#if PCF_LOGGING
pcf2123_rtc_read_reg_alrm (dev);
#endif
return 0;
}
......@@ -469,7 +472,7 @@ int pcf2123_rtc_read_alrm (struct device *dev, struct rtc_wkalrm *alrm) {
return ret;
pcf2123_delay_trec();
//ret = pcf2123_rtc_read_time (dev, &alrm->time);
ret = pcf2123_rtc_read_time (dev, &alrm->time);
alrm->time.tm_min = bcd2bin(rxbuf[0] & 0x7F);
SET_REG_ALM_EN (alrm->enabled, PCF2123_MASK_ALM_EN_MN, GET_ALM_EN(rxbuf[0]));
......@@ -482,6 +485,8 @@ int pcf2123_rtc_read_alrm (struct device *dev, struct rtc_wkalrm *alrm) {
alrm->enabled &= 0xF;
dev_dbg(dev, "%s: alrm is enabled=%d\n", __func__,
alrm->enabled);
dev_dbg(dev, "%s: alrm is mins=%d, hours=%d, mday=%d, wday=%d\n",
__func__,
alrm->time.tm_min, alrm->time.tm_hour,
......@@ -538,6 +543,9 @@ int pcf2123_rtc_set_alrm (struct device *dev, struct rtc_wkalrm *alrm) {
return ret;
pcf2123_delay_trec();
#if PCF_LOGGING
pcf2123_rtc_read_reg_alrm (dev);
#endif
/* Set the AIE flag, if needed (enable == 1) */
......@@ -855,6 +863,7 @@ static ssize_t pcf2123_rtc_sysfs_set_alarm_en (struct device *dev, struct device
if (flag != 0 && flag != 1)
return -EINVAL;
enable = !flag ? enable | (1 << (idx / 2)) : enable & ~(1 << (idx / 2));
dev_err(dev, "enable %d\n", enable);
buf_ptr++;
break;
case 1:
......@@ -992,6 +1001,7 @@ static int pcf2123_probe(struct spi_device *spi)
ret = pcf2123_rtc_read_time(&spi->dev, &tm);
if (ret < 0) {
dev_dbg(&spi->dev, "chip resetted\n");
ret = pcf2123_reset(&spi->dev);
if (ret < 0) {
dev_err(&spi->dev, "chip not found\n");
......@@ -1067,6 +1077,9 @@ static int pcf2123_remove(struct spi_device *spi)
struct pcf2123_plat_data *pdata = dev_get_platdata(&spi->dev);
int i;
#if PCF_LOGGING
pcf2123_rtc_read_reg_alrm (&spi->dev);
#endif
if (pdata) {
for (i = 0; i < 16; i++)
if (pdata->regs[i].name[0])
......@@ -1081,11 +1094,14 @@ static void pcf2123_shutdown(struct spi_device *spi) {
s8 rxbuf[1];
int ret;
ret = pcf2123_read(&spi->dev, PCF2123_READ, &rxbuf[0], 1);
ret = pcf2123_read(&spi->dev, PCF2123_REG_CTRL2, &rxbuf[0], 1);
if ( ret < 0 )
return;
ret = pcf2123_write_reg(&spi->dev, PCF2123_REG_CTRL2, rxbuf[0] & 0xF7);
#if PCF_LOGGING
pcf2123_rtc_read_reg_alrm (&spi->dev);
#endif
}
#ifdef CONFIG_OF
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment