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 |
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 */ >
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 */ > >
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 */ >>> >
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 */ >>>> >>
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.
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 --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 */
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(-)