Re: [PATCH] rtc: opal: Implement rtc_class_ops.alarm_irq_enable callback

2017-06-23 Thread Alexandre Belloni
On 31/05/2017 at 18:39:01 +0530, Vaibhav Jain wrote:
> Provide an implementation of the callback
> rtc_class_ops.alarm_irq_enable for rtc-opal driver. This callback is
> called when the wake alarm is disabled via the command:
> 
> 'echo 0 > /sys/class/rtc/rtc0/wakealarm'
> 
> Without this the Timed-Power-On(TPO) config remains set even when its
> disabled by the above command and FSP will still force machine
> boot at previously configured alarm time.
> 
> The callback is implemented as function opal_tpo_alarm_irq_enable()
> which calls opal_set_tpo_time() with alarm.enabled == 0. A branch is
> added to opal_set_tpo_time() to handle this case by passing y_m_d ==
> h_m_s_ms == 0 to opal as arguments for opal_tpo_write() call.
> 
> Signed-off-by: Vaibhav Jain 
> ---
>  drivers/rtc/rtc-opal.c | 22 +-
>  1 file changed, 21 insertions(+), 1 deletion(-)
> 
Applied, thanks.

-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com


Re: [PATCH] rtc: opal: Implement rtc_class_ops.alarm_irq_enable callback

2017-06-23 Thread Alexandre Belloni
On 31/05/2017 at 18:39:01 +0530, Vaibhav Jain wrote:
> Provide an implementation of the callback
> rtc_class_ops.alarm_irq_enable for rtc-opal driver. This callback is
> called when the wake alarm is disabled via the command:
> 
> 'echo 0 > /sys/class/rtc/rtc0/wakealarm'
> 
> Without this the Timed-Power-On(TPO) config remains set even when its
> disabled by the above command and FSP will still force machine
> boot at previously configured alarm time.
> 
> The callback is implemented as function opal_tpo_alarm_irq_enable()
> which calls opal_set_tpo_time() with alarm.enabled == 0. A branch is
> added to opal_set_tpo_time() to handle this case by passing y_m_d ==
> h_m_s_ms == 0 to opal as arguments for opal_tpo_write() call.
> 
> Signed-off-by: Vaibhav Jain 
> ---
>  drivers/rtc/rtc-opal.c | 22 +-
>  1 file changed, 21 insertions(+), 1 deletion(-)
> 
Applied, thanks.

-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com


[PATCH] rtc: opal: Implement rtc_class_ops.alarm_irq_enable callback

2017-05-31 Thread Vaibhav Jain
Provide an implementation of the callback
rtc_class_ops.alarm_irq_enable for rtc-opal driver. This callback is
called when the wake alarm is disabled via the command:

'echo 0 > /sys/class/rtc/rtc0/wakealarm'

Without this the Timed-Power-On(TPO) config remains set even when its
disabled by the above command and FSP will still force machine
boot at previously configured alarm time.

The callback is implemented as function opal_tpo_alarm_irq_enable()
which calls opal_set_tpo_time() with alarm.enabled == 0. A branch is
added to opal_set_tpo_time() to handle this case by passing y_m_d ==
h_m_s_ms == 0 to opal as arguments for opal_tpo_write() call.

Signed-off-by: Vaibhav Jain 
---
 drivers/rtc/rtc-opal.c | 22 +-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/rtc/rtc-opal.c b/drivers/rtc/rtc-opal.c
index 2d84e2a..e2a946c 100644
--- a/drivers/rtc/rtc-opal.c
+++ b/drivers/rtc/rtc-opal.c
@@ -167,7 +167,14 @@ static int opal_set_tpo_time(struct device *dev, struct 
rtc_wkalrm *alarm)
u32 y_m_d = 0;
int token, rc;
 
-   tm_to_opal(>time, _m_d, _m_s_ms);
+   /* if alarm is enabled */
+   if (alarm->enabled) {
+   tm_to_opal(>time, _m_d, _m_s_ms);
+   pr_debug("Alarm set to %x %llx\n", y_m_d, h_m_s_ms);
+
+   } else {
+   pr_debug("Alarm getting disabled\n");
+   }
 
token = opal_async_get_token_interruptible();
if (token < 0) {
@@ -200,6 +207,18 @@ static int opal_set_tpo_time(struct device *dev, struct 
rtc_wkalrm *alarm)
return rc;
 }
 
+int opal_tpo_alarm_irq_enable(struct device *dev, unsigned int enabled)
+{
+   struct rtc_wkalrm alarm = { .enabled = 0 };
+
+   /*
+* TPO is automatically enabled when opal_set_tpo_time() is called with
+* non-zero rtc-time. We only handle disable case which needs to be
+* explicitly told to opal.
+*/
+   return enabled ? 0 : opal_set_tpo_time(dev, );
+}
+
 static struct rtc_class_ops opal_rtc_ops = {
.read_time  = opal_get_rtc_time,
.set_time   = opal_set_rtc_time,
@@ -215,6 +234,7 @@ static int opal_rtc_probe(struct platform_device *pdev)
device_set_wakeup_capable(>dev, true);
opal_rtc_ops.read_alarm = opal_get_tpo_time;
opal_rtc_ops.set_alarm = opal_set_tpo_time;
+   opal_rtc_ops.alarm_irq_enable = opal_tpo_alarm_irq_enable;
}
 
rtc = devm_rtc_device_register(>dev, DRVNAME, _rtc_ops,
-- 
2.9.4



[PATCH] rtc: opal: Implement rtc_class_ops.alarm_irq_enable callback

2017-05-31 Thread Vaibhav Jain
Provide an implementation of the callback
rtc_class_ops.alarm_irq_enable for rtc-opal driver. This callback is
called when the wake alarm is disabled via the command:

'echo 0 > /sys/class/rtc/rtc0/wakealarm'

Without this the Timed-Power-On(TPO) config remains set even when its
disabled by the above command and FSP will still force machine
boot at previously configured alarm time.

The callback is implemented as function opal_tpo_alarm_irq_enable()
which calls opal_set_tpo_time() with alarm.enabled == 0. A branch is
added to opal_set_tpo_time() to handle this case by passing y_m_d ==
h_m_s_ms == 0 to opal as arguments for opal_tpo_write() call.

Signed-off-by: Vaibhav Jain 
---
 drivers/rtc/rtc-opal.c | 22 +-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/rtc/rtc-opal.c b/drivers/rtc/rtc-opal.c
index 2d84e2a..e2a946c 100644
--- a/drivers/rtc/rtc-opal.c
+++ b/drivers/rtc/rtc-opal.c
@@ -167,7 +167,14 @@ static int opal_set_tpo_time(struct device *dev, struct 
rtc_wkalrm *alarm)
u32 y_m_d = 0;
int token, rc;
 
-   tm_to_opal(>time, _m_d, _m_s_ms);
+   /* if alarm is enabled */
+   if (alarm->enabled) {
+   tm_to_opal(>time, _m_d, _m_s_ms);
+   pr_debug("Alarm set to %x %llx\n", y_m_d, h_m_s_ms);
+
+   } else {
+   pr_debug("Alarm getting disabled\n");
+   }
 
token = opal_async_get_token_interruptible();
if (token < 0) {
@@ -200,6 +207,18 @@ static int opal_set_tpo_time(struct device *dev, struct 
rtc_wkalrm *alarm)
return rc;
 }
 
+int opal_tpo_alarm_irq_enable(struct device *dev, unsigned int enabled)
+{
+   struct rtc_wkalrm alarm = { .enabled = 0 };
+
+   /*
+* TPO is automatically enabled when opal_set_tpo_time() is called with
+* non-zero rtc-time. We only handle disable case which needs to be
+* explicitly told to opal.
+*/
+   return enabled ? 0 : opal_set_tpo_time(dev, );
+}
+
 static struct rtc_class_ops opal_rtc_ops = {
.read_time  = opal_get_rtc_time,
.set_time   = opal_set_rtc_time,
@@ -215,6 +234,7 @@ static int opal_rtc_probe(struct platform_device *pdev)
device_set_wakeup_capable(>dev, true);
opal_rtc_ops.read_alarm = opal_get_tpo_time;
opal_rtc_ops.set_alarm = opal_set_tpo_time;
+   opal_rtc_ops.alarm_irq_enable = opal_tpo_alarm_irq_enable;
}
 
rtc = devm_rtc_device_register(>dev, DRVNAME, _rtc_ops,
-- 
2.9.4