diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-12-02 23:38:13 -0800 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-12-02 23:38:13 -0800 | 
| commit | 467832032cc07626880363efa8625719c16c04eb (patch) | |
| tree | ee9a62c04f0b3106e412bc1b2dd1cea5566d5ca7 /drivers/rtc | |
| parent | 66d2a5952eab875f1286e04f738ef029afdaf013 (diff) | |
| parent | 22763c5cf3690a681551162c15d34d935308c8d7 (diff) | |
| download | olio-linux-3.10-467832032cc07626880363efa8625719c16c04eb.tar.xz olio-linux-3.10-467832032cc07626880363efa8625719c16c04eb.zip  | |
Merge commit 'v2.6.32' into next
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/rtc-coh901331.c | 11 | ||||
| -rw-r--r-- | drivers/rtc/rtc-pcf50633.c | 10 | ||||
| -rw-r--r-- | drivers/rtc/rtc-v3020.c | 2 | ||||
| -rw-r--r-- | drivers/rtc/rtc-vr41xx.c | 9 | ||||
| -rw-r--r-- | drivers/rtc/rtc-x1205.c | 6 | 
5 files changed, 25 insertions, 13 deletions
diff --git a/drivers/rtc/rtc-coh901331.c b/drivers/rtc/rtc-coh901331.c index 7fe1fa26c52..03ea530981d 100644 --- a/drivers/rtc/rtc-coh901331.c +++ b/drivers/rtc/rtc-coh901331.c @@ -58,7 +58,16 @@ static irqreturn_t coh901331_interrupt(int irq, void *data)  	clk_enable(rtap->clk);  	/* Ack IRQ */  	writel(1, rtap->virtbase + COH901331_IRQ_EVENT); +	/* +	 * Disable the interrupt. This is necessary because +	 * the RTC lives on a lower-clocked line and will +	 * not release the IRQ line until after a few (slower) +	 * clock cycles. The interrupt will be re-enabled when +	 * a new alarm is set anyway. +	 */ +	writel(0, rtap->virtbase + COH901331_IRQ_MASK);  	clk_disable(rtap->clk); +  	/* Set alarm flag */  	rtc_update_irq(rtap->rtc, 1, RTC_AF); @@ -128,6 +137,8 @@ static int coh901331_alarm_irq_enable(struct device *dev, unsigned int enabled)  	else  		writel(0, rtap->virtbase + COH901331_IRQ_MASK);  	clk_disable(rtap->clk); + +	return 0;  }  static struct rtc_class_ops coh901331_ops = { diff --git a/drivers/rtc/rtc-pcf50633.c b/drivers/rtc/rtc-pcf50633.c index f4dd87e2907..4c5d5d0c4cf 100644 --- a/drivers/rtc/rtc-pcf50633.c +++ b/drivers/rtc/rtc-pcf50633.c @@ -70,7 +70,7 @@ static void pcf2rtc_time(struct rtc_time *rtc, struct pcf50633_time *pcf)  	rtc->tm_hour = bcd2bin(pcf->time[PCF50633_TI_HOUR]);  	rtc->tm_wday = bcd2bin(pcf->time[PCF50633_TI_WKDAY]);  	rtc->tm_mday = bcd2bin(pcf->time[PCF50633_TI_DAY]); -	rtc->tm_mon = bcd2bin(pcf->time[PCF50633_TI_MONTH]); +	rtc->tm_mon = bcd2bin(pcf->time[PCF50633_TI_MONTH]) - 1;  	rtc->tm_year = bcd2bin(pcf->time[PCF50633_TI_YEAR]) + 100;  } @@ -81,7 +81,7 @@ static void rtc2pcf_time(struct pcf50633_time *pcf, struct rtc_time *rtc)  	pcf->time[PCF50633_TI_HOUR] = bin2bcd(rtc->tm_hour);  	pcf->time[PCF50633_TI_WKDAY] = bin2bcd(rtc->tm_wday);  	pcf->time[PCF50633_TI_DAY] = bin2bcd(rtc->tm_mday); -	pcf->time[PCF50633_TI_MONTH] = bin2bcd(rtc->tm_mon); +	pcf->time[PCF50633_TI_MONTH] = bin2bcd(rtc->tm_mon + 1);  	pcf->time[PCF50633_TI_YEAR] = bin2bcd(rtc->tm_year % 100);  } @@ -245,8 +245,9 @@ static int pcf50633_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)  	ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSCA,  				PCF50633_TI_EXTENT, &pcf_tm.time[0]); -	if (!alarm_masked) +	if (!alarm_masked || alrm->enabled)  		pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM); +	rtc->alarm_enabled = alrm->enabled;  	return ret;  } @@ -291,8 +292,9 @@ static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)  				&pcf50633_rtc_ops, THIS_MODULE);  	if (IS_ERR(rtc->rtc_dev)) { +		int ret =  PTR_ERR(rtc->rtc_dev);  		kfree(rtc); -		return PTR_ERR(rtc->rtc_dev); +		return ret;  	}  	pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_ALARM, diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c index ad164056feb..423cd5a30b1 100644 --- a/drivers/rtc/rtc-v3020.c +++ b/drivers/rtc/rtc-v3020.c @@ -96,7 +96,7 @@ static void v3020_mmio_write_bit(struct v3020 *chip, unsigned char bit)  static unsigned char v3020_mmio_read_bit(struct v3020 *chip)  { -	return readl(chip->ioaddress) & (1 << chip->leftshift); +	return !!(readl(chip->ioaddress) & (1 << chip->leftshift));  }  static struct v3020_chip_ops v3020_mmio_ops = { diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c index 2c839d0d21b..fadddac1e5a 100644 --- a/drivers/rtc/rtc-vr41xx.c +++ b/drivers/rtc/rtc-vr41xx.c @@ -209,19 +209,18 @@ static int vr41xx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)  static int vr41xx_rtc_irq_set_freq(struct device *dev, int freq)  { -	unsigned long count; +	u64 count;  	if (!is_power_of_2(freq))  		return -EINVAL;  	count = RTC_FREQUENCY;  	do_div(count, freq); -	periodic_count = count; -  	spin_lock_irq(&rtc_lock); -	rtc1_write(RTCL1LREG, count); -	rtc1_write(RTCL1HREG, count >> 16); +	periodic_count = count; +	rtc1_write(RTCL1LREG, periodic_count); +	rtc1_write(RTCL1HREG, periodic_count >> 16);  	spin_unlock_irq(&rtc_lock); diff --git a/drivers/rtc/rtc-x1205.c b/drivers/rtc/rtc-x1205.c index 310c10795e9..6583c1a8b07 100644 --- a/drivers/rtc/rtc-x1205.c +++ b/drivers/rtc/rtc-x1205.c @@ -195,7 +195,7 @@ static int x1205_set_datetime(struct i2c_client *client, struct rtc_time *tm,  		/* year, since the rtc epoch*/  		buf[CCR_YEAR] = bin2bcd(tm->tm_year % 100);  		buf[CCR_WDAY] = tm->tm_wday & 0x07; -		buf[CCR_Y2K] = bin2bcd(tm->tm_year / 100); +		buf[CCR_Y2K] = bin2bcd((tm->tm_year + 1900) / 100);  	}  	/* If writing alarm registers, set compare bits on registers 0-4 */ @@ -280,9 +280,9 @@ static int x1205_fix_osc(struct i2c_client *client)  	int err;  	struct rtc_time tm; -	tm.tm_hour = tm.tm_min = tm.tm_sec = 0; +	memset(&tm, 0, sizeof(tm)); -	err = x1205_set_datetime(client, &tm, 0, X1205_CCR_BASE, 0); +	err = x1205_set_datetime(client, &tm, 1, X1205_CCR_BASE, 0);  	if (err < 0)  		dev_err(&client->dev, "unable to restart the oscillator\n");  |