[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <20250226-m68k-rtc-v1-2-404641ec62e6@igalia.com>
Date: Wed, 26 Feb 2025 09:26:28 -0300
From: Thadeu Lima de Souza Cascardo <cascardo@...lia.com>
To: Geert Uytterhoeven <geert@...ux-m68k.org>
Cc: linux-m68k@...ts.linux-m68k.org, linux-kernel@...r.kernel.org,
Alexandre Belloni <alexandre.belloni@...tlin.com>,
linux-rtc@...r.kernel.org,
Thadeu Lima de Souza Cascardo <cascardo@...lia.com>, kernel-dev@...lia.com
Subject: [PATCH 2/2] m68k: rtc: dp8570a: make it a proper RTC class driver
In the past, each rtc implementation had to rewrite the same ioctls in
order to be compatible. But since 2006, a common RTC interface has been
introduced. Use it for the last user of RTC_MINOR.
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@...lia.com>
---
arch/m68k/bvme6000/rtc.c | 91 ++++++++----------------------------------------
1 file changed, 15 insertions(+), 76 deletions(-)
diff --git a/arch/m68k/bvme6000/rtc.c b/arch/m68k/bvme6000/rtc.c
index a84996bd1491da3c1d9bd8dae7e1a92805c735e0..7e7b40863e5eb3423c53b44c2d63c8806e7a1bbe 100644
--- a/arch/m68k/bvme6000/rtc.c
+++ b/arch/m68k/bvme6000/rtc.c
@@ -16,7 +16,8 @@
#include <linux/init.h>
#include <linux/poll.h>
#include <linux/module.h>
-#include <linux/rtc.h> /* For struct rtc_time and ioctls, etc */
+#include <linux/rtc.h> /* For struct rtc_time and etc */
+#include <linux/platform_device.h>
#include <linux/bcd.h>
#include <asm/bvme6000hw.h>
@@ -24,19 +25,10 @@
#include <linux/uaccess.h>
#include <asm/setup.h>
-/*
- * We sponge a minor off of the misc major. No need slurping
- * up another valuable major dev number for this. If you add
- * an ioctl, make sure you don't conflict with SPARC's RTC
- * ioctls.
- */
-
static unsigned char days_in_mo[] =
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-static atomic_t rtc_status = ATOMIC_INIT(1);
-
-static int dp8570a_rtc_read_time(struct rtc_time *wtime)
+static int dp8570a_rtc_read_time(struct device *dev, struct rtc_time *wtime)
{
volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
unsigned char msr;
@@ -63,7 +55,7 @@ static int dp8570a_rtc_read_time(struct rtc_time *wtime)
return 0;
}
-static int dp8570a_rtc_set_time(struct rtc_time *rtc_tm)
+static int dp8570a_rtc_set_time(struct device *dev, struct rtc_time *rtc_tm)
{
volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
unsigned char msr;
@@ -117,77 +109,24 @@ static int dp8570a_rtc_set_time(struct rtc_time *rtc_tm)
return 0;
}
-static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
-
- switch (cmd) {
- case RTC_RD_TIME: /* Read the time/date from RTC */
- {
- struct rtc_time wtime;
-
- dp8570a_rtc_read_time(&wtime);
- return copy_to_user(argp, &wtime, sizeof wtime) ?
- -EFAULT : 0;
- }
- case RTC_SET_TIME: /* Set the RTC */
- {
- struct rtc_time rtc_tm;
-
- if (!capable(CAP_SYS_ADMIN))
- return -EACCES;
-
- if (copy_from_user(&rtc_tm, argp, sizeof(struct rtc_time)))
- return -EFAULT;
-
- return dp8570a_rtc_set_time(&rtc_tm);
- }
- default:
- return -EINVAL;
- }
-}
-
-/*
- * We enforce only one user at a time here with the open/close.
- */
-static int rtc_open(struct inode *inode, struct file *file)
-{
- if (!atomic_dec_and_test(&rtc_status)) {
- atomic_inc(&rtc_status);
- return -EBUSY;
- }
- return 0;
-}
-
-static int rtc_release(struct inode *inode, struct file *file)
-{
- atomic_inc(&rtc_status);
- return 0;
-}
-
-/*
- * The various file operations we support.
- */
-
-static const struct file_operations rtc_fops = {
- .unlocked_ioctl = rtc_ioctl,
- .open = rtc_open,
- .release = rtc_release,
- .llseek = noop_llseek,
-};
-
-static struct miscdevice rtc_dev = {
- .minor = RTC_MINOR,
- .name = "rtc",
- .fops = &rtc_fops
+static const struct rtc_class_ops dp8570a_rtc_ops = {
+ .read_time = dp8570a_rtc_read_time,
+ .set_time = dp8570a_rtc_set_time,
};
static int __init rtc_DP8570A_init(void)
{
+ struct platform_device *pdev;
+
if (!MACH_IS_BVME6000)
return -ENODEV;
pr_info("DP8570A Real Time Clock Driver v%s\n", RTC_VERSION);
- return misc_register(&rtc_dev);
+
+ pdev = platform_device_register_data(NULL, "rtc-generic", -1,
+ &dp8570a_rtc_ops,
+ sizeof(dp8570a_rtc_ops));
+
+ return PTR_ERR_OR_ZERO(pdev);
}
module_init(rtc_DP8570A_init);
--
2.47.2
Powered by blists - more mailing lists