lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <AM0PR04MB4211C3DA99287071FD102EDB802D0@AM0PR04MB4211.eurprd04.prod.outlook.com>
Date:   Tue, 9 Apr 2019 03:08:37 +0000
From:   Aisheng Dong <aisheng.dong@....com>
To:     Anson Huang <anson.huang@....com>,
        "robh+dt@...nel.org" <robh+dt@...nel.org>,
        "mark.rutland@....com" <mark.rutland@....com>,
        "shawnguo@...nel.org" <shawnguo@...nel.org>,
        "s.hauer@...gutronix.de" <s.hauer@...gutronix.de>,
        "kernel@...gutronix.de" <kernel@...gutronix.de>,
        "festevam@...il.com" <festevam@...il.com>,
        "a.zummo@...ertech.it" <a.zummo@...ertech.it>,
        "alexandre.belloni@...tlin.com" <alexandre.belloni@...tlin.com>,
        "ulf.hansson@...aro.org" <ulf.hansson@...aro.org>,
        Daniel Baluta <daniel.baluta@....com>,
        "devicetree@...r.kernel.org" <devicetree@...r.kernel.org>,
        "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
        "linux-arm-kernel@...ts.infradead.org" 
        <linux-arm-kernel@...ts.infradead.org>,
        "linux-rtc@...r.kernel.org" <linux-rtc@...r.kernel.org>
CC:     dl-linux-imx <linux-imx@....com>
Subject: RE: [PATCH V5 4/4] rtc: imx-sc: add rtc alarm support

[...]

> so I will add another API in imx-scu-irq
> driver to provide function of enabling/disabling irq, each driver can just call the
> API to enable/disable its own IRQ, ONLY need to pass the corresponding
> arguments:
> 

That's exactly what I mean.

> >
> > > +	msg.group = SC_IRQ_GROUP_RTC;
> > > +	msg.mask = SC_IRQ_RTC;
> > > +	msg.enable = enable;
> > > +
> > > +	ret = imx_scu_call_rpc(rtc_ipc_handle, &msg, true);
> > > +	if (ret) {
> > > +		dev_err(dev, "enable rtc irq failed, ret %d\n", ret);
> > > +		return ret;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int imx_sc_rtc_read_alarm(struct device *dev, struct
> > > +rtc_wkalrm
> > > +*alrm) {
> > > +	return 0;
> > > +}
> >
> > Can't avoid define NULL function?
> 
> We have to implement it as NULL function, as SCFW does NOT provide such
> feature, But rtc alarm ONLY available when .read_alarm ops is implemented:
> 

If the framework mandantorily requires it, then we'd probably better to add
doc before this function and explain why it's safe to be NULL.

> 147 static ssize_t
> 148 wakealarm_store(struct device *dev, struct device_attribute *attr,
> 149                 const char *buf, size_t n)
> 150 {
> 
> ...
> 
> 187                 retval = rtc_read_alarm(rtc, &alm);
> 188                 if (retval < 0)
> 189                         return retval;
> 
> 
> >
> > > +
> > > +static int imx_sc_rtc_set_alarm(struct device *dev, struct
> > > +rtc_wkalrm
> > > +*alrm) {
> > > +	struct imx_sc_msg_timer_rtc_set_alarm msg;
> > > +	struct imx_sc_rpc_msg *hdr = &msg.hdr;
> > > +	int ret;
> > > +	struct rtc_time *alrm_tm = &alrm->time;
> > > +
> > > +	hdr->ver = IMX_SC_RPC_VERSION;
> > > +	hdr->svc = IMX_SC_RPC_SVC_TIMER;
> > > +	hdr->func = IMX_SC_TIMER_FUNC_SET_RTC_ALARM;
> > > +	hdr->size = 3;
> > > +
> > > +	msg.year = alrm_tm->tm_year + 1900;
> > > +	msg.mon = alrm_tm->tm_mon + 1;
> > > +	msg.day = alrm_tm->tm_mday;
> > > +	msg.hour = alrm_tm->tm_hour;
> > > +	msg.min = alrm_tm->tm_min;
> > > +	msg.sec = alrm_tm->tm_sec;
> > > +
> > > +	ret = imx_scu_call_rpc(rtc_ipc_handle, &msg, true);
> > > +	if (ret) {
> > > +		dev_err(dev, "set rtc alarm failed, ret %d\n", ret);
> > > +		return ret;
> > > +	}
> > > +
> > > +	ret = imx_sc_rtc_alarm_irq_enable(dev, alrm->enabled);
> >
> > Just curious we already have .alarm_irq_enable().
> > Why do we need call it again here?
> 
> That is because the  set_alarm function  pass alarm time and alarm->enabled
> argument, it could be to enable alarm or to disable alarm, so we have to
> control the alarm function here, all other rtc drivers also do it this way.
> The .alarm_irq_enable() callback is for just enable or disable alarm.
> 

Got it, thanks for the explanation.

Regards
Dong Aisheng

> Thanks,
> Anson
> 
> 
> >
> > Regards
> > Dong Aisheng
> >
> > > +	if (ret) {
> > > +		dev_err(dev, "enable rtc alarm failed, ret %d\n", ret);
> > > +		return ret;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > >  static const struct rtc_class_ops imx_sc_rtc_ops = {
> > >  	.read_time = imx_sc_rtc_read_time,
> > >  	.set_time = imx_sc_rtc_set_time,
> > > +	.read_alarm = imx_sc_rtc_read_alarm,
> > > +	.set_alarm = imx_sc_rtc_set_alarm,
> > > +	.alarm_irq_enable = imx_sc_rtc_alarm_irq_enable, };
> > > +
> > > +static int imx_sc_rtc_alarm_sc_notify(struct notifier_block *nb,
> > > +					unsigned long event, void *group) {
> > > +	/* ignore non-rtc irq */
> > > +	if (!((event & SC_IRQ_RTC) && (*(u8 *)group ==
> > SC_IRQ_GROUP_RTC)))
> > > +		return 0;
> > > +
> > > +	rtc_update_irq(imx_sc_rtc, 1, RTC_IRQF | RTC_AF);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static struct notifier_block imx_sc_rtc_alarm_sc_notifier = {
> > > +	.notifier_call = imx_sc_rtc_alarm_sc_notify,
> > >  };
> > >
> > >  static int imx_sc_rtc_probe(struct platform_device *pdev) @@ -73,6
> > > +181,8 @@ static int imx_sc_rtc_probe(struct platform_device *pdev)
> > >  	if (ret)
> > >  		return ret;
> > >
> > > +	device_init_wakeup(&pdev->dev, true);
> > > +
> > >  	imx_sc_rtc = devm_rtc_allocate_device(&pdev->dev);
> > >  	if (IS_ERR(imx_sc_rtc))
> > >  		return PTR_ERR(imx_sc_rtc);
> > > @@ -87,6 +197,8 @@ static int imx_sc_rtc_probe(struct
> > > platform_device
> > > *pdev)
> > >  		return ret;
> > >  	}
> > >
> > > +	imx_scu_irq_register_notifier(&imx_sc_rtc_alarm_sc_notifier);
> > > +
> > >  	return 0;
> > >  }
> > >
> > > --
> > > 2.7.4

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ