* [PATCH 1/4] rtc: pl031: constify amba_ids
2017-07-20 23:17 [PATCH 0/4] Make PL031 interrupt optional Russell King - ARM Linux
@ 2017-07-20 23:18 ` Russell King
2017-08-02 12:30 ` Linus Walleij
2017-07-20 23:18 ` [PATCH 2/4] rtc: pl031: use devm_* for allocating memory and mapping resource Russell King
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Russell King @ 2017-07-20 23:18 UTC (permalink / raw)
To: linux-arm-kernel
The AMBA device IDs should be marked const. Make that so.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---
drivers/rtc/rtc-pl031.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
index e1687e19c59f..0d87b90b1903 100644
--- a/drivers/rtc/rtc-pl031.c
+++ b/drivers/rtc/rtc-pl031.c
@@ -446,7 +446,7 @@ static struct pl031_vendor_data stv2_pl031 = {
.irqflags = IRQF_SHARED | IRQF_COND_SUSPEND,
};
-static struct amba_id pl031_ids[] = {
+static const struct amba_id pl031_ids[] = {
{
.id = 0x00041031,
.mask = 0x000fffff,
--
2.7.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 2/4] rtc: pl031: use devm_* for allocating memory and mapping resource
2017-07-20 23:17 [PATCH 0/4] Make PL031 interrupt optional Russell King - ARM Linux
2017-07-20 23:18 ` [PATCH 1/4] rtc: pl031: constify amba_ids Russell King
@ 2017-07-20 23:18 ` Russell King
2017-08-02 12:31 ` Linus Walleij
2017-08-10 21:05 ` Alexandre Belloni
2017-07-20 23:18 ` [PATCH 3/4] rtc: pl031: avoid exposing alarm if no interrupt Russell King
2017-07-20 23:18 ` [PATCH 4/4] rtc: pl031: make interrupt optional Russell King
3 siblings, 2 replies; 10+ messages in thread
From: Russell King @ 2017-07-20 23:18 UTC (permalink / raw)
To: linux-arm-kernel
Use the devm_* APIs for allocating memory and mapping the memory in
the probe function to relieve the driver from having to deal with
this in the cleanup paths.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---
drivers/rtc/rtc-pl031.c | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
index 0d87b90b1903..5960fbd08b05 100644
--- a/drivers/rtc/rtc-pl031.c
+++ b/drivers/rtc/rtc-pl031.c
@@ -310,8 +310,6 @@ static int pl031_remove(struct amba_device *adev)
device_init_wakeup(&adev->dev, false);
free_irq(adev->irq[0], ldata);
rtc_device_unregister(ldata->rtc);
- iounmap(ldata->base);
- kfree(ldata);
amba_release_regions(adev);
return 0;
@@ -322,25 +320,26 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
int ret;
struct pl031_local *ldata;
struct pl031_vendor_data *vendor = id->data;
- struct rtc_class_ops *ops = &vendor->ops;
+ struct rtc_class_ops *ops;
unsigned long time, data;
ret = amba_request_regions(adev, NULL);
if (ret)
goto err_req;
- ldata = kzalloc(sizeof(struct pl031_local), GFP_KERNEL);
+ ldata = devm_kzalloc(&adev->dev, sizeof(struct pl031_local),
+ GFP_KERNEL);
if (!ldata) {
ret = -ENOMEM;
goto out;
}
ldata->vendor = vendor;
- ldata->base = ioremap(adev->res.start, resource_size(&adev->res));
-
+ ldata->base = devm_ioremap(&adev->dev, adev->res.start,
+ resource_size(&adev->res));
if (!ldata->base) {
ret = -ENOMEM;
- goto out_no_remap;
+ goto out;
}
amba_set_drvdata(adev, ldata);
@@ -378,7 +377,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
THIS_MODULE);
if (IS_ERR(ldata->rtc)) {
ret = PTR_ERR(ldata->rtc);
- goto out_no_rtc;
+ goto out;
}
if (request_irq(adev->irq[0], pl031_interrupt,
@@ -391,10 +390,6 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
out_no_irq:
rtc_device_unregister(ldata->rtc);
-out_no_rtc:
- iounmap(ldata->base);
-out_no_remap:
- kfree(ldata);
out:
amba_release_regions(adev);
err_req:
--
2.7.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 2/4] rtc: pl031: use devm_* for allocating memory and mapping resource
2017-07-20 23:18 ` [PATCH 2/4] rtc: pl031: use devm_* for allocating memory and mapping resource Russell King
@ 2017-08-02 12:31 ` Linus Walleij
2017-08-10 21:05 ` Alexandre Belloni
1 sibling, 0 replies; 10+ messages in thread
From: Linus Walleij @ 2017-08-02 12:31 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jul 21, 2017 at 1:18 AM, Russell King
<rmk+kernel@armlinux.org.uk> wrote:
> Use the devm_* APIs for allocating memory and mapping the memory in
> the probe function to relieve the driver from having to deal with
> this in the cleanup paths.
>
> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/4] rtc: pl031: use devm_* for allocating memory and mapping resource
2017-07-20 23:18 ` [PATCH 2/4] rtc: pl031: use devm_* for allocating memory and mapping resource Russell King
2017-08-02 12:31 ` Linus Walleij
@ 2017-08-10 21:05 ` Alexandre Belloni
1 sibling, 0 replies; 10+ messages in thread
From: Alexandre Belloni @ 2017-08-10 21:05 UTC (permalink / raw)
To: linux-arm-kernel
Hi Russell,
On 21/07/2017 at 00:18:31 +0100, Russell King wrote:
> Use the devm_* APIs for allocating memory and mapping the memory in
> the probe function to relieve the driver from having to deal with
> this in the cleanup paths.
>
> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
> ---
> drivers/rtc/rtc-pl031.c | 19 +++++++------------
> 1 file changed, 7 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
> index 0d87b90b1903..5960fbd08b05 100644
> --- a/drivers/rtc/rtc-pl031.c
> +++ b/drivers/rtc/rtc-pl031.c
> @@ -310,8 +310,6 @@ static int pl031_remove(struct amba_device *adev)
> device_init_wakeup(&adev->dev, false);
> free_irq(adev->irq[0], ldata);
> rtc_device_unregister(ldata->rtc);
> - iounmap(ldata->base);
> - kfree(ldata);
> amba_release_regions(adev);
>
> return 0;
> @@ -322,25 +320,26 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
> int ret;
> struct pl031_local *ldata;
> struct pl031_vendor_data *vendor = id->data;
> - struct rtc_class_ops *ops = &vendor->ops;
> + struct rtc_class_ops *ops;
This change should probably go in patch 3/4
--
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/4] rtc: pl031: avoid exposing alarm if no interrupt
2017-07-20 23:17 [PATCH 0/4] Make PL031 interrupt optional Russell King - ARM Linux
2017-07-20 23:18 ` [PATCH 1/4] rtc: pl031: constify amba_ids Russell King
2017-07-20 23:18 ` [PATCH 2/4] rtc: pl031: use devm_* for allocating memory and mapping resource Russell King
@ 2017-07-20 23:18 ` Russell King
2017-08-02 12:32 ` Linus Walleij
2017-07-20 23:18 ` [PATCH 4/4] rtc: pl031: make interrupt optional Russell King
3 siblings, 1 reply; 10+ messages in thread
From: Russell King @ 2017-07-20 23:18 UTC (permalink / raw)
To: linux-arm-kernel
If the RTC has no interrupt, there is little point in exposing the RTC
alarm capabilities, as it can't be used as a wakeup source nor can it
deliver an event to userspace.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---
drivers/rtc/rtc-pl031.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
index 5960fbd08b05..64c77ec1b4ea 100644
--- a/drivers/rtc/rtc-pl031.c
+++ b/drivers/rtc/rtc-pl031.c
@@ -329,12 +329,14 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
ldata = devm_kzalloc(&adev->dev, sizeof(struct pl031_local),
GFP_KERNEL);
- if (!ldata) {
+ ops = devm_kmemdup(&adev->dev, &vendor->ops, sizeof(vendor->ops),
+ GFP_KERNEL);
+ if (!ldata || !ops) {
ret = -ENOMEM;
goto out;
}
- ldata->vendor = vendor;
+ ldata->vendor = vendor;
ldata->base = devm_ioremap(&adev->dev, adev->res.start,
resource_size(&adev->res));
if (!ldata->base) {
@@ -372,6 +374,13 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
}
}
+ if (!adev->irq[0]) {
+ /* When there's no interrupt, no point in exposing the alarm */
+ ops->read_alarm = NULL;
+ ops->set_alarm = NULL;
+ ops->alarm_irq_enable = NULL;
+ }
+
device_init_wakeup(&adev->dev, true);
ldata->rtc = rtc_device_register("pl031", &adev->dev, ops,
THIS_MODULE);
--
2.7.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 4/4] rtc: pl031: make interrupt optional
2017-07-20 23:17 [PATCH 0/4] Make PL031 interrupt optional Russell King - ARM Linux
` (2 preceding siblings ...)
2017-07-20 23:18 ` [PATCH 3/4] rtc: pl031: avoid exposing alarm if no interrupt Russell King
@ 2017-07-20 23:18 ` Russell King
2017-08-02 12:33 ` Linus Walleij
3 siblings, 1 reply; 10+ messages in thread
From: Russell King @ 2017-07-20 23:18 UTC (permalink / raw)
To: linux-arm-kernel
On some platforms, the interrupt for the PL031 is optional. Avoid
trying to claim the interrupt if it's not specified.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---
drivers/rtc/rtc-pl031.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
index 64c77ec1b4ea..82eb7da2c478 100644
--- a/drivers/rtc/rtc-pl031.c
+++ b/drivers/rtc/rtc-pl031.c
@@ -308,7 +308,8 @@ static int pl031_remove(struct amba_device *adev)
dev_pm_clear_wake_irq(&adev->dev);
device_init_wakeup(&adev->dev, false);
- free_irq(adev->irq[0], ldata);
+ if (adev->irq[0])
+ free_irq(adev->irq[0], ldata);
rtc_device_unregister(ldata->rtc);
amba_release_regions(adev);
@@ -389,12 +390,13 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
goto out;
}
- if (request_irq(adev->irq[0], pl031_interrupt,
- vendor->irqflags, "rtc-pl031", ldata)) {
- ret = -EIO;
- goto out_no_irq;
+ if (adev->irq[0]) {
+ ret = request_irq(adev->irq[0], pl031_interrupt,
+ vendor->irqflags, "rtc-pl031", ldata);
+ if (ret)
+ goto out_no_irq;
+ dev_pm_set_wake_irq(&adev->dev, adev->irq[0]);
}
- dev_pm_set_wake_irq(&adev->dev, adev->irq[0]);
return 0;
out_no_irq:
--
2.7.4
^ permalink raw reply related [flat|nested] 10+ messages in thread