[PATCH] DRIVERS: rtc: Change rtc_device_register() API prototype

49 views
Skip to first unread message

Anup Patel

unread,
Aug 15, 2018, 4:04:27 AM8/15/18
to xvisor...@googlegroups.com, Anup Patel
This patch makes rtc_device_register() API prototype linux-like.

Signed-off-by: Anup Patel <an...@brainfault.org>
---
drivers/include/drv/rtc.h | 5 +++-
drivers/rtc/rtc-dev.c | 51 ++++++++++++++++++++++++++++++++-------
drivers/rtc/rtc-pl031.c | 27 +++++++++------------
drivers/rtc/rtc-s3c.c | 33 +++++++++----------------
4 files changed, 69 insertions(+), 47 deletions(-)

diff --git a/drivers/include/drv/rtc.h b/drivers/include/drv/rtc.h
index 79c87071..9aa4d8e9 100644
--- a/drivers/include/drv/rtc.h
+++ b/drivers/include/drv/rtc.h
@@ -125,7 +125,10 @@ int rtc_device_sync_wallclock(struct rtc_device *rdev);
int rtc_device_sync_device(struct rtc_device *rdev);

/** Register rtc device to device driver framework */
-int rtc_device_register(struct rtc_device *rdev);
+struct rtc_device *rtc_device_register(struct vmm_device *parent,
+ const char *name,
+ struct rtc_class_ops *ops,
+ void *priv);

/** Unregister rtc device from device driver framework */
int rtc_device_unregister(struct rtc_device *rdev);
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c
index bb46ea4e..af3adc26 100644
--- a/drivers/rtc/rtc-dev.c
+++ b/drivers/rtc/rtc-dev.c
@@ -131,33 +131,66 @@ static struct vmm_class rtc_class = {
.name = RTC_DEVICE_CLASS_NAME,
};

-int rtc_device_register(struct rtc_device *rdev)
+struct rtc_device *rtc_device_register(struct vmm_device *parent,
+ const char *name,
+ struct rtc_class_ops *ops,
+ void *priv)
{
- if (!rdev || !rdev->ops ||
- !rdev->ops->set_time || !rdev->ops->read_time) {
- return VMM_EFAIL;
+ int ret;
+ struct rtc_device *rdev;
+
+ if (!name || !ops || !ops->set_time || !ops->read_time) {
+ return VMM_ERR_PTR(VMM_EINVALID);
+ }
+
+ rdev = vmm_zalloc(sizeof(*rdev));
+ if (!rdev) {
+ return VMM_ERR_PTR(VMM_ENOMEM);
+ }
+
+ if (strlcpy(rdev->name, name, sizeof(rdev->name)) >=
+ sizeof(rdev->name)) {
+ vmm_free(rdev);
+ return VMM_ERR_PTR(VMM_EOVERFLOW);
}

vmm_devdrv_initialize_device(&rdev->dev);
- if (strlcpy(rdev->dev.name, rdev->name, sizeof(rdev->dev.name)) >=
+ if (strlcpy(rdev->dev.name, name, sizeof(rdev->dev.name)) >=
sizeof(rdev->dev.name)) {
- return VMM_EOVERFLOW;
+ vmm_free(rdev);
+ return VMM_ERR_PTR(VMM_EOVERFLOW);
}
rdev->dev.class = &rtc_class;
vmm_devdrv_set_data(&rdev->dev, rdev);
+ rdev->ops = ops;
+ rdev->priv = priv;

- return vmm_devdrv_register_device(&rdev->dev);
+ ret = vmm_devdrv_register_device(&rdev->dev);
+ if (ret) {
+ vmm_free(rdev);
+ return VMM_ERR_PTR(ret);
+ }

+ return rdev;
}
VMM_EXPORT_SYMBOL(rtc_device_register);

int rtc_device_unregister(struct rtc_device *rdev)
{
+ int ret;
+
if (!rdev) {
- return VMM_EFAIL;
+ return VMM_EINVALID;
}

- return vmm_devdrv_unregister_device(&rdev->dev);
+ ret = vmm_devdrv_unregister_device(&rdev->dev);
+ if (ret) {
+ return ret;
+ }
+
+ vmm_free(rdev);
+
+ return VMM_OK;
}
VMM_EXPORT_SYMBOL(rtc_device_unregister);

diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
index 433a696a..6982d9d7 100644
--- a/drivers/rtc/rtc-pl031.c
+++ b/drivers/rtc/rtc-pl031.c
@@ -98,7 +98,7 @@
#define RTC_TIMER_FREQ 32768

struct pl031_local {
- struct rtc_device rtc;
+ struct rtc_device *rtc;
void *base;
u32 irq;
u8 hw_designer;
@@ -354,6 +354,7 @@ static int pl031_driver_probe(struct vmm_device *dev,
int rc;
u32 periphid;
virtual_addr_t reg_base;
+ struct rtc_class_ops *ops = NULL;
struct pl031_local *ldata;

ldata = vmm_zalloc(sizeof(struct pl031_local));
@@ -381,34 +382,28 @@ static int pl031_driver_probe(struct vmm_device *dev,
goto free_reg;
}

- if (strlcpy(ldata->rtc.name, dev->name, sizeof(ldata->rtc.name))
- >= sizeof(ldata->rtc.name)) {
- rc = VMM_EOVERFLOW;
- goto free_irq;
- }
- ldata->rtc.dev.parent = dev;
periphid = amba_periphid(dev);
if ((periphid & 0x000fffff) == 0x00041031) {
/* ARM variant */
- ldata->rtc.ops = &pl031_arm_ops;
+ ops = &pl031_arm_ops;
} else if ((periphid & 0x00ffffff) == 0x00180031) {
/* ST Micro variant - stv1 */
- ldata->rtc.ops = &pl031_stv1_ops;
+ ops = &pl031_stv1_ops;
} else if ((periphid & 0x00ffffff) == 0x00280031) {
/* ST Micro variant - stv2 */
- ldata->rtc.ops = &pl031_stv2_ops;
+ ops = &pl031_stv2_ops;
} else {
rc = VMM_EFAIL;
goto free_irq;
}
- ldata->rtc.priv = ldata;

- rc = rtc_device_register(&ldata->rtc);
- if (rc) {
+ ldata->rtc = rtc_device_register(dev, dev->name, ops, ldata);
+ if (VMM_IS_ERR(ldata->rtc)) {
+ rc = VMM_PTR_ERR(ldata->rtc);
goto free_irq;
}

- dev->priv = ldata;
+ vmm_devdrv_set_data(dev, ldata);

return VMM_OK;

@@ -425,10 +420,10 @@ free_nothing:

static int pl031_driver_remove(struct vmm_device *dev)
{
- struct pl031_local *ldata = dev->priv;
+ struct pl031_local *ldata = vmm_devdrv_get_data(dev);

if (ldata) {
- rtc_device_unregister(&ldata->rtc);
+ rtc_device_unregister(ldata->rtc);
vmm_host_irq_unregister(ldata->irq, ldata);
vmm_devtree_regunmap_release(dev->of_node,
(virtual_addr_t)ldata->base, 0);
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
index 4e53a513..f99447a1 100644
--- a/drivers/rtc/rtc-s3c.c
+++ b/drivers/rtc/rtc-s3c.c
@@ -418,11 +418,6 @@ static struct rtc_class_ops s3c_rtc_ops = {
.alarm_irq_enable = s3c_rtc_setaie,
};

-static struct rtc_device s3c_rtc_device = {
- .name = "s3c-rtc",
- .ops = &s3c_rtc_ops,
-};
-
static void s3c_rtc_enable(struct vmm_device *pdev, int en)
{
void __iomem *base = s3c_rtc_base;
@@ -472,13 +467,13 @@ static int s3c_rtc_driver_remove(struct vmm_device *dev)
{
struct rtc_device *rtc = dev->priv;

+ s3c_rtc_setaie(rtc, 0);
+
vmm_host_irq_unregister(s3c_rtc_alarmno, rtc);
vmm_host_irq_unregister(s3c_rtc_tickno, rtc);

- dev->priv = NULL;
rtc_device_unregister(rtc);
-
- s3c_rtc_setaie(rtc, 0);
+ dev->priv = NULL;

clk_put(rtc_clk);
rtc_clk = NULL;
@@ -494,6 +489,7 @@ static int s3c_rtc_driver_probe(struct vmm_device *pdev,
{
u32 alarmno, tickno;
struct rtc_time rtc_tm;
+ struct rtc_device *rtc;
int ret = VMM_OK, tmp, rc;

/* find the IRQs */
@@ -539,13 +535,10 @@ static int s3c_rtc_driver_probe(struct vmm_device *pdev,

/* register RTC and exit */

- s3c_rtc_device.dev.parent = pdev;
-
- rc = rtc_device_register(&s3c_rtc_device);
-
- if (rc) {
+ rtc = rtc_device_register(pdev, pdev->name, &s3c_rtc_ops, NULL);
+ if (VMM_IS_ERR(rtc)) {
dev_err(pdev, "cannot attach rtc\n");
- ret = rc;
+ ret = VMM_PTR_ERR(rtc);
goto err_nortc;
}

@@ -581,20 +574,18 @@ static int s3c_rtc_driver_probe(struct vmm_device *pdev,
writew(tmp, s3c_rtc_base + S3C2410_RTCCON);
}

- pdev->priv = &s3c_rtc_device;
-
- s3c_rtc_setfreq(&s3c_rtc_device, 1);
+ s3c_rtc_setfreq(rtc, 1);

if ((rc =
vmm_host_irq_register(s3c_rtc_alarmno, "s3c_rtc_alarm",
- s3c_rtc_alarmirq, &s3c_rtc_device))) {
+ s3c_rtc_alarmirq, rtc))) {
dev_err(pdev, "IRQ%d error %d\n", s3c_rtc_alarmno, rc);
goto err_alarm_irq;
}

if ((rc =
vmm_host_irq_register(s3c_rtc_tickno, "s3c_rtc_tick",
- s3c_rtc_tickirq, &s3c_rtc_device))) {
+ s3c_rtc_tickirq, rtc))) {
dev_err(pdev, "IRQ%d error %d\n", s3c_rtc_tickno, rc);
goto err_tick_irq;
}
@@ -604,11 +595,11 @@ static int s3c_rtc_driver_probe(struct vmm_device *pdev,
return 0;

err_tick_irq:
- vmm_host_irq_unregister(s3c_rtc_alarmno, &s3c_rtc_device);
+ vmm_host_irq_unregister(s3c_rtc_alarmno, rtc);

err_alarm_irq:
pdev->priv = NULL;
- rtc_device_unregister(&s3c_rtc_device);
+ rtc_device_unregister(rtc);

err_nortc:
s3c_rtc_enable(pdev, 0);
--
2.17.1

Anup Patel

unread,
Aug 16, 2018, 8:41:01 AM8/16/18
to Xvisor Devel, Anup Patel
Applied this patch on xvisor-next tree.

Regards,
Anup
Reply all
Reply to author
Forward
0 new messages