From: "Marek Behún" <kabel@kernel.org>
To: linux-rtc@vger.kernel.org
Cc: Alessandro Zummo <a.zummo@towertech.it>,
Alexandre Belloni <alexandre.belloni@bootlin.com>
Subject: question about firmware RTC design (for rtcwake)
Date: Mon, 22 May 2023 16:46:38 +0200 [thread overview]
Message-ID: <20230522164638.68fea327@thinkpad> (raw)
Hello RTC guys,
this is a request for suggestions / question about how to implement a
RTC driver so that it will be accepted into upstream Linux.
Let me start with the description of the problem.
The MCU on the Turris Omnia router can disable / enable power
regulators basically for the whole board, giving capability for
platform specific poweroff and for powering the system on at a
specified time.
I want to add support for this to the MCU firmware and write a driver
for Linux. Since I know only of one utility by which users can request
the system to power on at a specified time - the rtcwake utility - I
want to write this as a RTC driver.
Because the MCU is not a true RTC in the sense that it does not have
battery to count time when not under power, I am wondering how exactly
to design this. One problem is that the RTC driver must implement the
read function, but the MCU does not know the real time unless it is
told beforehand.
Note that the board also has a true RTC with battery, handled by the
rtc-armada38x driver. We can make sure that this true RTC is used for
hctosys.
Proposal 1:
- the MCU will implement only one command, poweroff, with optional
argument wakeup_timeout, the number of seconds after which to power
the board up again
- the corresponding driver will register a system off handler and a RTC
device
- the RTC will implement methods as:
.read_time will use ktime_get(), so it will return monotonic clock
.set_alarm will store the requested wakeup time in an internal
structure
.alarm_irq_enable will just update the internal structure
.read_alarm will return information from the stored structure
- the system off handler will send the poweroff command and it will
take the requested wakeup time from the internal structure and
subtract current time (ktime_get()) to get the wakeup_timeout
argument for the MCU poweroff command
- advantages:
- MCU needs only to implement one command
- disadvantages:
- the new RTC device will not behave at all like a rtc device
regarding timekeeping, since .read_time returns system's monotonic
clock. This may confuse users who do not know about the fact that
this rtc device is only meant for rtcwake. We can print this info
into dmesg, but...
- removing the driver and loading it back loses information about set
wakeup time
Proposal 2:
- the MCU will implement:
- command for getting and setting clock that the MCU will count
The clock will be considered invalid unless it was set at least
once.
- command for getting and setting wakeup alarm
- command for power off
- the corresponding driver will again register a system off handler and
a RTC device
- the system off handler will just send the poweroff command
- the RTC device can now behave like a true RTC device, but without a
battery, the RTC_VL_BACKUP_EMPTY bit will be set.
The userspace can set time from the true RTC, so that rtcwake may be
used
Overall proposal 1 is easier to implement, but the resulting /dev/rtc
device will not be a true RTC, which may confuse users. Proposal 2
gives more complexity to MCU firmware.
Personally I prefer proposal one.
Do you guys have suggestions? Which kind of driver would you be willing
to accept?
Note that the driver will probably live under drivers/mfd or
drivers/platform, since the MCU implements other features, as well (a
GPIO controller, for example).
Marek
next reply other threads:[~2023-05-22 14:46 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-22 14:46 Marek Behún [this message]
2023-05-22 19:40 ` question about firmware RTC design (for rtcwake) Alexandre Belloni
2023-05-22 21:14 ` Marek Behún
2023-06-07 8:28 ` Alexandre Belloni
2023-06-08 9:05 ` Marek Behún
2023-06-08 9:25 ` Alexandre Belloni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230522164638.68fea327@thinkpad \
--to=kabel@kernel.org \
--cc=a.zummo@towertech.it \
--cc=alexandre.belloni@bootlin.com \
--cc=linux-rtc@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox