diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/rtc-dev.c | 3 | ||||
| -rw-r--r-- | drivers/rtc/rtc-m48t59.c | 34 |
2 files changed, 30 insertions, 7 deletions
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index 079e9ed907e0..ecdea44ae4e5 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c | |||
| @@ -446,9 +446,6 @@ static int rtc_dev_release(struct inode *inode, struct file *file) | |||
| 446 | if (rtc->ops->release) | 446 | if (rtc->ops->release) |
| 447 | rtc->ops->release(rtc->dev.parent); | 447 | rtc->ops->release(rtc->dev.parent); |
| 448 | 448 | ||
| 449 | if (file->f_flags & FASYNC) | ||
| 450 | rtc_dev_fasync(-1, file, 0); | ||
| 451 | |||
| 452 | clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); | 449 | clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); |
| 453 | return 0; | 450 | return 0; |
| 454 | } | 451 | } |
diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c index 04b63dab6932..43afb7ab5289 100644 --- a/drivers/rtc/rtc-m48t59.c +++ b/drivers/rtc/rtc-m48t59.c | |||
| @@ -87,6 +87,10 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 87 | dev_dbg(dev, "Century bit is enabled\n"); | 87 | dev_dbg(dev, "Century bit is enabled\n"); |
| 88 | tm->tm_year += 100; /* one century */ | 88 | tm->tm_year += 100; /* one century */ |
| 89 | } | 89 | } |
| 90 | #ifdef CONFIG_SPARC | ||
| 91 | /* Sun SPARC machines count years since 1968 */ | ||
| 92 | tm->tm_year += 68; | ||
| 93 | #endif | ||
| 90 | 94 | ||
| 91 | tm->tm_wday = bcd2bin(val & 0x07); | 95 | tm->tm_wday = bcd2bin(val & 0x07); |
| 92 | tm->tm_hour = bcd2bin(M48T59_READ(M48T59_HOUR) & 0x3F); | 96 | tm->tm_hour = bcd2bin(M48T59_READ(M48T59_HOUR) & 0x3F); |
| @@ -110,11 +114,20 @@ static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 110 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 114 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
| 111 | unsigned long flags; | 115 | unsigned long flags; |
| 112 | u8 val = 0; | 116 | u8 val = 0; |
| 117 | int year = tm->tm_year; | ||
| 118 | |||
| 119 | #ifdef CONFIG_SPARC | ||
| 120 | /* Sun SPARC machines count years since 1968 */ | ||
| 121 | year -= 68; | ||
| 122 | #endif | ||
| 113 | 123 | ||
| 114 | dev_dbg(dev, "RTC set time %04d-%02d-%02d %02d/%02d/%02d\n", | 124 | dev_dbg(dev, "RTC set time %04d-%02d-%02d %02d/%02d/%02d\n", |
| 115 | tm->tm_year + 1900, tm->tm_mon, tm->tm_mday, | 125 | year + 1900, tm->tm_mon, tm->tm_mday, |
| 116 | tm->tm_hour, tm->tm_min, tm->tm_sec); | 126 | tm->tm_hour, tm->tm_min, tm->tm_sec); |
| 117 | 127 | ||
| 128 | if (year < 0) | ||
| 129 | return -EINVAL; | ||
| 130 | |||
| 118 | spin_lock_irqsave(&m48t59->lock, flags); | 131 | spin_lock_irqsave(&m48t59->lock, flags); |
| 119 | /* Issue the WRITE command */ | 132 | /* Issue the WRITE command */ |
| 120 | M48T59_SET_BITS(M48T59_CNTL_WRITE, M48T59_CNTL); | 133 | M48T59_SET_BITS(M48T59_CNTL_WRITE, M48T59_CNTL); |
| @@ -125,9 +138,9 @@ static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 125 | M48T59_WRITE((bin2bcd(tm->tm_mday) & 0x3F), M48T59_MDAY); | 138 | M48T59_WRITE((bin2bcd(tm->tm_mday) & 0x3F), M48T59_MDAY); |
| 126 | /* tm_mon is 0-11 */ | 139 | /* tm_mon is 0-11 */ |
| 127 | M48T59_WRITE((bin2bcd(tm->tm_mon + 1) & 0x1F), M48T59_MONTH); | 140 | M48T59_WRITE((bin2bcd(tm->tm_mon + 1) & 0x1F), M48T59_MONTH); |
| 128 | M48T59_WRITE(bin2bcd(tm->tm_year % 100), M48T59_YEAR); | 141 | M48T59_WRITE(bin2bcd(year % 100), M48T59_YEAR); |
| 129 | 142 | ||
| 130 | if (pdata->type == M48T59RTC_TYPE_M48T59 && (tm->tm_year / 100)) | 143 | if (pdata->type == M48T59RTC_TYPE_M48T59 && (year / 100)) |
| 131 | val = (M48T59_WDAY_CEB | M48T59_WDAY_CB); | 144 | val = (M48T59_WDAY_CEB | M48T59_WDAY_CB); |
| 132 | val |= (bin2bcd(tm->tm_wday) & 0x07); | 145 | val |= (bin2bcd(tm->tm_wday) & 0x07); |
| 133 | M48T59_WRITE(val, M48T59_WDAY); | 146 | M48T59_WRITE(val, M48T59_WDAY); |
| @@ -159,6 +172,10 @@ static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 159 | M48T59_SET_BITS(M48T59_CNTL_READ, M48T59_CNTL); | 172 | M48T59_SET_BITS(M48T59_CNTL_READ, M48T59_CNTL); |
| 160 | 173 | ||
| 161 | tm->tm_year = bcd2bin(M48T59_READ(M48T59_YEAR)); | 174 | tm->tm_year = bcd2bin(M48T59_READ(M48T59_YEAR)); |
| 175 | #ifdef CONFIG_SPARC | ||
| 176 | /* Sun SPARC machines count years since 1968 */ | ||
| 177 | tm->tm_year += 68; | ||
| 178 | #endif | ||
| 162 | /* tm_mon is 0-11 */ | 179 | /* tm_mon is 0-11 */ |
| 163 | tm->tm_mon = bcd2bin(M48T59_READ(M48T59_MONTH)) - 1; | 180 | tm->tm_mon = bcd2bin(M48T59_READ(M48T59_MONTH)) - 1; |
| 164 | 181 | ||
| @@ -192,11 +209,20 @@ static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 192 | struct rtc_time *tm = &alrm->time; | 209 | struct rtc_time *tm = &alrm->time; |
| 193 | u8 mday, hour, min, sec; | 210 | u8 mday, hour, min, sec; |
| 194 | unsigned long flags; | 211 | unsigned long flags; |
| 212 | int year = tm->tm_year; | ||
| 213 | |||
| 214 | #ifdef CONFIG_SPARC | ||
| 215 | /* Sun SPARC machines count years since 1968 */ | ||
| 216 | year -= 68; | ||
| 217 | #endif | ||
| 195 | 218 | ||
| 196 | /* If no irq, we don't support ALARM */ | 219 | /* If no irq, we don't support ALARM */ |
| 197 | if (m48t59->irq == NO_IRQ) | 220 | if (m48t59->irq == NO_IRQ) |
| 198 | return -EIO; | 221 | return -EIO; |
| 199 | 222 | ||
| 223 | if (year < 0) | ||
| 224 | return -EINVAL; | ||
| 225 | |||
| 200 | /* | 226 | /* |
| 201 | * 0xff means "always match" | 227 | * 0xff means "always match" |
| 202 | */ | 228 | */ |
| @@ -228,7 +254,7 @@ static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 228 | spin_unlock_irqrestore(&m48t59->lock, flags); | 254 | spin_unlock_irqrestore(&m48t59->lock, flags); |
| 229 | 255 | ||
| 230 | dev_dbg(dev, "RTC set alarm time %04d-%02d-%02d %02d/%02d/%02d\n", | 256 | dev_dbg(dev, "RTC set alarm time %04d-%02d-%02d %02d/%02d/%02d\n", |
| 231 | tm->tm_year + 1900, tm->tm_mon, tm->tm_mday, | 257 | year + 1900, tm->tm_mon, tm->tm_mday, |
| 232 | tm->tm_hour, tm->tm_min, tm->tm_sec); | 258 | tm->tm_hour, tm->tm_min, tm->tm_sec); |
| 233 | return 0; | 259 | return 0; |
| 234 | } | 260 | } |
