diff mbox series

rtc: omap: let the core handle range

Message ID 20190318124438.26327-2-alexandre.belloni@bootlin.com (mailing list archive)
State New, archived
Headers show
Series rtc: omap: let the core handle range | expand

Commit Message

Alexandre Belloni March 18, 2019, 12:44 p.m. UTC
Let the core handle the RTC range instead of open coding it.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-omap.c | 22 ++++++----------------
 1 file changed, 6 insertions(+), 16 deletions(-)

Comments

J, KEERTHY March 20, 2019, 4:50 a.m. UTC | #1
On 18/03/19 6:14 PM, Alexandre Belloni wrote:
> Let the core handle the RTC range instead of open coding it.

Tested for rtcwake and checked for rtc time ticking on am437x-gp-evm.

Tested-by: Keerthy <j-keerthy@ti.com>
Reviewed-by: Keerthy <j-keerthy@ti.com>

> 
> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> ---
>   drivers/rtc/rtc-omap.c | 22 ++++++----------------
>   1 file changed, 6 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
> index bbff0e2deb84..ea0eb48f3bb9 100644
> --- a/drivers/rtc/rtc-omap.c
> +++ b/drivers/rtc/rtc-omap.c
> @@ -271,7 +271,7 @@ static int omap_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
>   }
>   
>   /* this hardware doesn't support "don't care" alarm fields */
> -static int tm2bcd(struct rtc_time *tm)
> +static void tm2bcd(struct rtc_time *tm)
>   {
>   	tm->tm_sec = bin2bcd(tm->tm_sec);
>   	tm->tm_min = bin2bcd(tm->tm_min);
> @@ -279,13 +279,7 @@ static int tm2bcd(struct rtc_time *tm)
>   	tm->tm_mday = bin2bcd(tm->tm_mday);
>   
>   	tm->tm_mon = bin2bcd(tm->tm_mon + 1);
> -
> -	/* epoch == 1900 */
> -	if (tm->tm_year < 100 || tm->tm_year > 199)
> -		return -EINVAL;
>   	tm->tm_year = bin2bcd(tm->tm_year - 100);
> -
> -	return 0;
>   }
>   
>   static void bcd2tm(struct rtc_time *tm)
> @@ -328,8 +322,7 @@ static int omap_rtc_set_time(struct device *dev, struct rtc_time *tm)
>   {
>   	struct omap_rtc *rtc = dev_get_drvdata(dev);
>   
> -	if (tm2bcd(tm) < 0)
> -		return -EINVAL;
> +	tm2bcd(tm);
>   
>   	local_irq_disable();
>   	rtc_wait_not_busy(rtc);
> @@ -378,8 +371,7 @@ static int omap_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
>   	struct omap_rtc *rtc = dev_get_drvdata(dev);
>   	u8 reg, irqwake_reg = 0;
>   
> -	if (tm2bcd(&alm->time) < 0)
> -		return -EINVAL;
> +	tm2bcd(&alm->time);
>   
>   	local_irq_disable();
>   	rtc_wait_not_busy(rtc);
> @@ -444,11 +436,7 @@ static void omap_rtc_power_off(void)
>   	rtc_tm_to_time(&tm, &now);
>   	rtc_time_to_tm(now + 1, &tm);
>   
> -	if (tm2bcd(&tm) < 0) {
> -		dev_err(&rtc->rtc->dev, "power off failed\n");
> -		rtc->type->lock(rtc);
> -		return;
> -	}
> +	tm2bcd(&tm);
>   
>   	rtc_wait_not_busy(rtc);
>   
> @@ -845,6 +833,8 @@ static int omap_rtc_probe(struct platform_device *pdev)
>   	}
>   
>   	rtc->rtc->ops = &omap_rtc_ops;
> +	rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_1900;
> +	rtc->rtc->range_max = RTC_TIMESTAMP_END_2099;
>   	omap_rtc_nvmem_config.priv = rtc;
>   
>   	/* handle periodic and alarm irqs */
>
Alexandre Belloni March 20, 2019, 5:10 a.m. UTC | #2
On 20/03/2019 10:20:17+0530, Keerthy wrote:
> 
> 
> On 18/03/19 6:14 PM, Alexandre Belloni wrote:
> > Let the core handle the RTC range instead of open coding it.
> 
> Tested for rtcwake and checked for rtc time ticking on am437x-gp-evm.
> 

Thanks!

BTW, I couldn't get the RTC to wake my BBB from suspend to mem.
I used:

echo +5 > /sys/class/rtc/rtc0/wakealarm ; echo mem > /sys/power/state

The interrupt seems to fire correctly when I'm not suspended, is
there something I'm missing?

> Tested-by: Keerthy <j-keerthy@ti.com>
> Reviewed-by: Keerthy <j-keerthy@ti.com>
> 
> > 
> > Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> > ---
> >   drivers/rtc/rtc-omap.c | 22 ++++++----------------
> >   1 file changed, 6 insertions(+), 16 deletions(-)
> > 
> > diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
> > index bbff0e2deb84..ea0eb48f3bb9 100644
> > --- a/drivers/rtc/rtc-omap.c
> > +++ b/drivers/rtc/rtc-omap.c
> > @@ -271,7 +271,7 @@ static int omap_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
> >   }
> >   /* this hardware doesn't support "don't care" alarm fields */
> > -static int tm2bcd(struct rtc_time *tm)
> > +static void tm2bcd(struct rtc_time *tm)
> >   {
> >   	tm->tm_sec = bin2bcd(tm->tm_sec);
> >   	tm->tm_min = bin2bcd(tm->tm_min);
> > @@ -279,13 +279,7 @@ static int tm2bcd(struct rtc_time *tm)
> >   	tm->tm_mday = bin2bcd(tm->tm_mday);
> >   	tm->tm_mon = bin2bcd(tm->tm_mon + 1);
> > -
> > -	/* epoch == 1900 */
> > -	if (tm->tm_year < 100 || tm->tm_year > 199)
> > -		return -EINVAL;
> >   	tm->tm_year = bin2bcd(tm->tm_year - 100);
> > -
> > -	return 0;
> >   }
> >   static void bcd2tm(struct rtc_time *tm)
> > @@ -328,8 +322,7 @@ static int omap_rtc_set_time(struct device *dev, struct rtc_time *tm)
> >   {
> >   	struct omap_rtc *rtc = dev_get_drvdata(dev);
> > -	if (tm2bcd(tm) < 0)
> > -		return -EINVAL;
> > +	tm2bcd(tm);
> >   	local_irq_disable();
> >   	rtc_wait_not_busy(rtc);
> > @@ -378,8 +371,7 @@ static int omap_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
> >   	struct omap_rtc *rtc = dev_get_drvdata(dev);
> >   	u8 reg, irqwake_reg = 0;
> > -	if (tm2bcd(&alm->time) < 0)
> > -		return -EINVAL;
> > +	tm2bcd(&alm->time);
> >   	local_irq_disable();
> >   	rtc_wait_not_busy(rtc);
> > @@ -444,11 +436,7 @@ static void omap_rtc_power_off(void)
> >   	rtc_tm_to_time(&tm, &now);
> >   	rtc_time_to_tm(now + 1, &tm);
> > -	if (tm2bcd(&tm) < 0) {
> > -		dev_err(&rtc->rtc->dev, "power off failed\n");
> > -		rtc->type->lock(rtc);
> > -		return;
> > -	}
> > +	tm2bcd(&tm);
> >   	rtc_wait_not_busy(rtc);
> > @@ -845,6 +833,8 @@ static int omap_rtc_probe(struct platform_device *pdev)
> >   	}
> >   	rtc->rtc->ops = &omap_rtc_ops;
> > +	rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_1900;
> > +	rtc->rtc->range_max = RTC_TIMESTAMP_END_2099;
> >   	omap_rtc_nvmem_config.priv = rtc;
> >   	/* handle periodic and alarm irqs */
> >
J, KEERTHY March 20, 2019, 5:30 a.m. UTC | #3
On 20/03/19 10:40 AM, Alexandre Belloni wrote:
> On 20/03/2019 10:20:17+0530, Keerthy wrote:
>>
>>
>> On 18/03/19 6:14 PM, Alexandre Belloni wrote:
>>> Let the core handle the RTC range instead of open coding it.
>>
>> Tested for rtcwake and checked for rtc time ticking on am437x-gp-evm.
>>
> 
> Thanks!
> 
> BTW, I couldn't get the RTC to wake my BBB from suspend to mem.
> I used:
> 
> echo +5 > /sys/class/rtc/rtc0/wakealarm ; echo mem > /sys/power/state
> 
> The interrupt seems to fire correctly when I'm not suspended, is
> there something I'm missing?

Let me check what is happening with bbb. BTW I generally use:

rtcwake -d /dev/rtc0 -m mem -s 5

to wake up from mem via rtc.

> 
>> Tested-by: Keerthy <j-keerthy@ti.com>
>> Reviewed-by: Keerthy <j-keerthy@ti.com>
>>
>>>
>>> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
>>> ---
>>>    drivers/rtc/rtc-omap.c | 22 ++++++----------------
>>>    1 file changed, 6 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
>>> index bbff0e2deb84..ea0eb48f3bb9 100644
>>> --- a/drivers/rtc/rtc-omap.c
>>> +++ b/drivers/rtc/rtc-omap.c
>>> @@ -271,7 +271,7 @@ static int omap_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
>>>    }
>>>    /* this hardware doesn't support "don't care" alarm fields */
>>> -static int tm2bcd(struct rtc_time *tm)
>>> +static void tm2bcd(struct rtc_time *tm)
>>>    {
>>>    	tm->tm_sec = bin2bcd(tm->tm_sec);
>>>    	tm->tm_min = bin2bcd(tm->tm_min);
>>> @@ -279,13 +279,7 @@ static int tm2bcd(struct rtc_time *tm)
>>>    	tm->tm_mday = bin2bcd(tm->tm_mday);
>>>    	tm->tm_mon = bin2bcd(tm->tm_mon + 1);
>>> -
>>> -	/* epoch == 1900 */
>>> -	if (tm->tm_year < 100 || tm->tm_year > 199)
>>> -		return -EINVAL;
>>>    	tm->tm_year = bin2bcd(tm->tm_year - 100);
>>> -
>>> -	return 0;
>>>    }
>>>    static void bcd2tm(struct rtc_time *tm)
>>> @@ -328,8 +322,7 @@ static int omap_rtc_set_time(struct device *dev, struct rtc_time *tm)
>>>    {
>>>    	struct omap_rtc *rtc = dev_get_drvdata(dev);
>>> -	if (tm2bcd(tm) < 0)
>>> -		return -EINVAL;
>>> +	tm2bcd(tm);
>>>    	local_irq_disable();
>>>    	rtc_wait_not_busy(rtc);
>>> @@ -378,8 +371,7 @@ static int omap_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
>>>    	struct omap_rtc *rtc = dev_get_drvdata(dev);
>>>    	u8 reg, irqwake_reg = 0;
>>> -	if (tm2bcd(&alm->time) < 0)
>>> -		return -EINVAL;
>>> +	tm2bcd(&alm->time);
>>>    	local_irq_disable();
>>>    	rtc_wait_not_busy(rtc);
>>> @@ -444,11 +436,7 @@ static void omap_rtc_power_off(void)
>>>    	rtc_tm_to_time(&tm, &now);
>>>    	rtc_time_to_tm(now + 1, &tm);
>>> -	if (tm2bcd(&tm) < 0) {
>>> -		dev_err(&rtc->rtc->dev, "power off failed\n");
>>> -		rtc->type->lock(rtc);
>>> -		return;
>>> -	}
>>> +	tm2bcd(&tm);
>>>    	rtc_wait_not_busy(rtc);
>>> @@ -845,6 +833,8 @@ static int omap_rtc_probe(struct platform_device *pdev)
>>>    	}
>>>    	rtc->rtc->ops = &omap_rtc_ops;
>>> +	rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_1900;
>>> +	rtc->rtc->range_max = RTC_TIMESTAMP_END_2099;
>>>    	omap_rtc_nvmem_config.priv = rtc;
>>>    	/* handle periodic and alarm irqs */
>>>
>
J, KEERTHY March 20, 2019, 5:55 a.m. UTC | #4
On 20/03/19 11:00 AM, Keerthy wrote:
> 
> 
> On 20/03/19 10:40 AM, Alexandre Belloni wrote:
>> On 20/03/2019 10:20:17+0530, Keerthy wrote:
>>>
>>>
>>> On 18/03/19 6:14 PM, Alexandre Belloni wrote:
>>>> Let the core handle the RTC range instead of open coding it.
>>>
>>> Tested for rtcwake and checked for rtc time ticking on am437x-gp-evm.
>>>
>>
>> Thanks!
>>
>> BTW, I couldn't get the RTC to wake my BBB from suspend to mem.
>> I used:
>>
>> echo +5 > /sys/class/rtc/rtc0/wakealarm ; echo mem > /sys/power/state
>>
>> The interrupt seems to fire correctly when I'm not suspended, is
>> there something I'm missing?
> 
> Let me check what is happening with bbb. BTW I generally use:

Hi Alexandre,

https://pastebin.ubuntu.com/p/8w6HXKV6St/

I applied this patch on top of linux-next. I am able to wake up from rtc 
from suspend to memory on am33-bbb.

Also i tried your commands:

echo +5 > /sys/class/rtc/rtc0/wakealarm ; echo mem > /sys/power/state
[  147.046018] PM: suspend entry (deep)
[  147.049675] PM: Syncing filesystems ... done.
[  147.071869] Freezing user space processes ... (elapsed 0.001 seconds) 
done.
[  147.080658] OOM killer disabled.
[  147.083974] Freezing remaining freezable tasks ... (elapsed 0.001 
seconds) done.
[  147.092830] printk: Suspending console(s) (use no_console_suspend to 
debug)
[  147.233280] cpsw 4a100000.ethernet eth0: Link is Down
[  147.248012] Disabling non-boot CPUs ...
[  147.248048] pm33xx pm33xx: PM: Successfully put all powerdomains to 
target state
[  147.270934] net eth0: initializing cpsw version 1.12 (0)
[  147.374824] SMSC LAN8710/LAN8720 4a101000.mdio:00: attached PHY 
driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=4a101000.mdio:00, irq=POLL)
[  147.562211] OOM killer enabled.
[  147.565489] Restarting tasks ... done.
[  147.616203] PM: suspend exit

That also worked fine.

For am335x-boneblack as well this patch works.

Thanks,
Keerthy


> 
> rtcwake -d /dev/rtc0 -m mem -s 5
> 
> to wake up from mem via rtc.
> 
>>
>>> Tested-by: Keerthy <j-keerthy@ti.com>
>>> Reviewed-by: Keerthy <j-keerthy@ti.com>
>>>
>>>>
>>>> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
>>>> ---
>>>>    drivers/rtc/rtc-omap.c | 22 ++++++----------------
>>>>    1 file changed, 6 insertions(+), 16 deletions(-)
>>>>
>>>> diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
>>>> index bbff0e2deb84..ea0eb48f3bb9 100644
>>>> --- a/drivers/rtc/rtc-omap.c
>>>> +++ b/drivers/rtc/rtc-omap.c
>>>> @@ -271,7 +271,7 @@ static int omap_rtc_alarm_irq_enable(struct 
>>>> device *dev, unsigned int enabled)
>>>>    }
>>>>    /* this hardware doesn't support "don't care" alarm fields */
>>>> -static int tm2bcd(struct rtc_time *tm)
>>>> +static void tm2bcd(struct rtc_time *tm)
>>>>    {
>>>>        tm->tm_sec = bin2bcd(tm->tm_sec);
>>>>        tm->tm_min = bin2bcd(tm->tm_min);
>>>> @@ -279,13 +279,7 @@ static int tm2bcd(struct rtc_time *tm)
>>>>        tm->tm_mday = bin2bcd(tm->tm_mday);
>>>>        tm->tm_mon = bin2bcd(tm->tm_mon + 1);
>>>> -
>>>> -    /* epoch == 1900 */
>>>> -    if (tm->tm_year < 100 || tm->tm_year > 199)
>>>> -        return -EINVAL;
>>>>        tm->tm_year = bin2bcd(tm->tm_year - 100);
>>>> -
>>>> -    return 0;
>>>>    }
>>>>    static void bcd2tm(struct rtc_time *tm)
>>>> @@ -328,8 +322,7 @@ static int omap_rtc_set_time(struct device *dev, 
>>>> struct rtc_time *tm)
>>>>    {
>>>>        struct omap_rtc *rtc = dev_get_drvdata(dev);
>>>> -    if (tm2bcd(tm) < 0)
>>>> -        return -EINVAL;
>>>> +    tm2bcd(tm);
>>>>        local_irq_disable();
>>>>        rtc_wait_not_busy(rtc);
>>>> @@ -378,8 +371,7 @@ static int omap_rtc_set_alarm(struct device 
>>>> *dev, struct rtc_wkalrm *alm)
>>>>        struct omap_rtc *rtc = dev_get_drvdata(dev);
>>>>        u8 reg, irqwake_reg = 0;
>>>> -    if (tm2bcd(&alm->time) < 0)
>>>> -        return -EINVAL;
>>>> +    tm2bcd(&alm->time);
>>>>        local_irq_disable();
>>>>        rtc_wait_not_busy(rtc);
>>>> @@ -444,11 +436,7 @@ static void omap_rtc_power_off(void)
>>>>        rtc_tm_to_time(&tm, &now);
>>>>        rtc_time_to_tm(now + 1, &tm);
>>>> -    if (tm2bcd(&tm) < 0) {
>>>> -        dev_err(&rtc->rtc->dev, "power off failed\n");
>>>> -        rtc->type->lock(rtc);
>>>> -        return;
>>>> -    }
>>>> +    tm2bcd(&tm);
>>>>        rtc_wait_not_busy(rtc);
>>>> @@ -845,6 +833,8 @@ static int omap_rtc_probe(struct platform_device 
>>>> *pdev)
>>>>        }
>>>>        rtc->rtc->ops = &omap_rtc_ops;
>>>> +    rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_1900;
>>>> +    rtc->rtc->range_max = RTC_TIMESTAMP_END_2099;
>>>>        omap_rtc_nvmem_config.priv = rtc;
>>>>        /* handle periodic and alarm irqs */
>>>>
>>
Alexandre Belloni March 20, 2019, 6:08 a.m. UTC | #5
On 20/03/2019 11:25:31+0530, Keerthy wrote:
> Hi Alexandre,
> 
> https://pastebin.ubuntu.com/p/8w6HXKV6St/
> 
> I applied this patch on top of linux-next. I am able to wake up from rtc
> from suspend to memory on am33-bbb.
> 
> Also i tried your commands:
> 
> echo +5 > /sys/class/rtc/rtc0/wakealarm ; echo mem > /sys/power/state
> [  147.046018] PM: suspend entry (deep)
> [  147.049675] PM: Syncing filesystems ... done.
> [  147.071869] Freezing user space processes ... (elapsed 0.001 seconds)
> done.
> [  147.080658] OOM killer disabled.
> [  147.083974] Freezing remaining freezable tasks ... (elapsed 0.001
> seconds) done.
> [  147.092830] printk: Suspending console(s) (use no_console_suspend to
> debug)
> [  147.233280] cpsw 4a100000.ethernet eth0: Link is Down
> [  147.248012] Disabling non-boot CPUs ...
> [  147.248048] pm33xx pm33xx: PM: Successfully put all powerdomains to
> target state
> [  147.270934] net eth0: initializing cpsw version 1.12 (0)
> [  147.374824] SMSC LAN8710/LAN8720 4a101000.mdio:00: attached PHY driver
> [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=4a101000.mdio:00, irq=POLL)
> [  147.562211] OOM killer enabled.
> [  147.565489] Restarting tasks ... done.
> [  147.616203] PM: suspend exit
> 
> That also worked fine.
> 
> For am335x-boneblack as well this patch works.
> 

Ok, thanks a lot for confirming, I'll try to fix my setup, I'm probably
just missing the m3 firmware.
J, KEERTHY March 20, 2019, 6:18 a.m. UTC | #6
On 20/03/19 11:38 AM, Alexandre Belloni wrote:
> On 20/03/2019 11:25:31+0530, Keerthy wrote:
>> Hi Alexandre,
>>
>> https://pastebin.ubuntu.com/p/8w6HXKV6St/
>>
>> I applied this patch on top of linux-next. I am able to wake up from rtc
>> from suspend to memory on am33-bbb.
>>
>> Also i tried your commands:
>>
>> echo +5 > /sys/class/rtc/rtc0/wakealarm ; echo mem > /sys/power/state
>> [  147.046018] PM: suspend entry (deep)
>> [  147.049675] PM: Syncing filesystems ... done.
>> [  147.071869] Freezing user space processes ... (elapsed 0.001 seconds)
>> done.
>> [  147.080658] OOM killer disabled.
>> [  147.083974] Freezing remaining freezable tasks ... (elapsed 0.001
>> seconds) done.
>> [  147.092830] printk: Suspending console(s) (use no_console_suspend to
>> debug)
>> [  147.233280] cpsw 4a100000.ethernet eth0: Link is Down
>> [  147.248012] Disabling non-boot CPUs ...
>> [  147.248048] pm33xx pm33xx: PM: Successfully put all powerdomains to
>> target state
>> [  147.270934] net eth0: initializing cpsw version 1.12 (0)
>> [  147.374824] SMSC LAN8710/LAN8720 4a101000.mdio:00: attached PHY driver
>> [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=4a101000.mdio:00, irq=POLL)
>> [  147.562211] OOM killer enabled.
>> [  147.565489] Restarting tasks ... done.
>> [  147.616203] PM: suspend exit
>>
>> That also worked fine.
>>
>> For am335x-boneblack as well this patch works.
>>
> 
> Ok, thanks a lot for confirming, I'll try to fix my setup, I'm probably
> just missing the m3 firmware.

Yes. Just try:

echo mem > /sys/power/state

and try waking up from uart and if that fails then we need to look at m3
firmware. If this works only then move to rtcwake.

Regards,
Keerthy
> 
>
diff mbox series

Patch

diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
index bbff0e2deb84..ea0eb48f3bb9 100644
--- a/drivers/rtc/rtc-omap.c
+++ b/drivers/rtc/rtc-omap.c
@@ -271,7 +271,7 @@  static int omap_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
 }
 
 /* this hardware doesn't support "don't care" alarm fields */
-static int tm2bcd(struct rtc_time *tm)
+static void tm2bcd(struct rtc_time *tm)
 {
 	tm->tm_sec = bin2bcd(tm->tm_sec);
 	tm->tm_min = bin2bcd(tm->tm_min);
@@ -279,13 +279,7 @@  static int tm2bcd(struct rtc_time *tm)
 	tm->tm_mday = bin2bcd(tm->tm_mday);
 
 	tm->tm_mon = bin2bcd(tm->tm_mon + 1);
-
-	/* epoch == 1900 */
-	if (tm->tm_year < 100 || tm->tm_year > 199)
-		return -EINVAL;
 	tm->tm_year = bin2bcd(tm->tm_year - 100);
-
-	return 0;
 }
 
 static void bcd2tm(struct rtc_time *tm)
@@ -328,8 +322,7 @@  static int omap_rtc_set_time(struct device *dev, struct rtc_time *tm)
 {
 	struct omap_rtc *rtc = dev_get_drvdata(dev);
 
-	if (tm2bcd(tm) < 0)
-		return -EINVAL;
+	tm2bcd(tm);
 
 	local_irq_disable();
 	rtc_wait_not_busy(rtc);
@@ -378,8 +371,7 @@  static int omap_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
 	struct omap_rtc *rtc = dev_get_drvdata(dev);
 	u8 reg, irqwake_reg = 0;
 
-	if (tm2bcd(&alm->time) < 0)
-		return -EINVAL;
+	tm2bcd(&alm->time);
 
 	local_irq_disable();
 	rtc_wait_not_busy(rtc);
@@ -444,11 +436,7 @@  static void omap_rtc_power_off(void)
 	rtc_tm_to_time(&tm, &now);
 	rtc_time_to_tm(now + 1, &tm);
 
-	if (tm2bcd(&tm) < 0) {
-		dev_err(&rtc->rtc->dev, "power off failed\n");
-		rtc->type->lock(rtc);
-		return;
-	}
+	tm2bcd(&tm);
 
 	rtc_wait_not_busy(rtc);
 
@@ -845,6 +833,8 @@  static int omap_rtc_probe(struct platform_device *pdev)
 	}
 
 	rtc->rtc->ops = &omap_rtc_ops;
+	rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_1900;
+	rtc->rtc->range_max = RTC_TIMESTAMP_END_2099;
 	omap_rtc_nvmem_config.priv = rtc;
 
 	/* handle periodic and alarm irqs */