diff mbox series

[1/2] r8a77961 CMT0 device exposed via UIO

Message ID 160056201373.9912.14240039764408484073.sendpatchset@octo (mailing list archive)
State Changes Requested
Delegated to: Geert Uytterhoeven
Headers show
Series r8a77961 CMT test setup using UIO | expand

Commit Message

Magnus Damm Sept. 20, 2020, 12:33 a.m. UTC
From: Magnus Damm <damm+renesas@opensource.se>

Device Tree modifications to expose CMT0 via UIO, code to add UIO driver
debug code and also adjust the compat string matching in MODULE_DEVICE_TABLE()

Signed-off-by: Magnus Damm <damm+renesas@opensource.se>
---

 arch/arm64/boot/dts/renesas/r8a77961.dtsi |   10 ++++++++++
 drivers/uio/uio.c                         |    3 ++-
 drivers/uio/uio_pdrv_genirq.c             |   10 ++++++++--
 3 files changed, 20 insertions(+), 3 deletions(-)

Comments

Geert Uytterhoeven Sept. 23, 2020, 1:48 p.m. UTC | #1
Hi Magnus,

On Sun, Sep 20, 2020 at 3:04 AM Magnus Damm <damm@opensource.se> wrote:
> From: Magnus Damm <damm+renesas@opensource.se>
>
> Device Tree modifications to expose CMT0 via UIO, code to add UIO driver
> debug code and also adjust the compat string matching in MODULE_DEVICE_TABLE()
>
> Signed-off-by: Magnus Damm <damm+renesas@opensource.se>

Thanks for your patch!

>  arch/arm64/boot/dts/renesas/r8a77961.dtsi |   10 ++++++++++
>  drivers/uio/uio.c                         |    3 ++-
>  drivers/uio/uio_pdrv_genirq.c             |   10 ++++++++--
>  3 files changed, 20 insertions(+), 3 deletions(-)

Please don't mix DTS and driver changes in a single patch.

> --- 0001/arch/arm64/boot/dts/renesas/r8a77961.dtsi
> +++ work/arch/arm64/boot/dts/renesas/r8a77961.dtsi      2020-09-20 06:37:14.578864063 +0900
> @@ -453,6 +453,16 @@
>                         reg = <0 0xe6060000 0 0x50c>;
>                 };
>
> +               cmt0: timer@e60f0000 {
> +                       compatible = "uio_pdrv_genirq";

Please use an appropriate compatible value, describing the device.
DT describes hardware, not software policy.

> +                       reg = <0 0xe60f0000 0 0x1004>;
> +                       interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
> +                       clocks = <&cpg CPG_MOD 303>;
> +                       clock-names = "fck";
> +                       power-domains = <&sysc R8A77961_PD_ALWAYS_ON>;
> +                       resets = <&cpg 303>;

status = "disabled"; ?

> +               };

While at it, please add the other CMT instances, too.

> +
>                 cpg: clock-controller@e6150000 {
>                         compatible = "renesas,r8a77961-cpg-mssr";
>                         reg = <0 0xe6150000 0 0x1000>;
> --- 0001/drivers/uio/uio.c
> +++ work/drivers/uio/uio.c      2020-09-20 07:58:51.295172430 +0900
> @@ -11,7 +11,7 @@
>   *
>   * Base Functions
>   */
> -
> +#define DEBUG

I don't think this is appropriate for upstream inclusion.

> --- 0001/drivers/uio/uio_pdrv_genirq.c
> +++ work/drivers/uio/uio_pdrv_genirq.c  2020-09-20 07:58:07.417169667 +0900
> @@ -10,7 +10,7 @@
>   * Copyright (C) 2008 by Digi International Inc.
>   * All rights reserved.
>   */
> -
> +#define DEBUG

Likewise.

>  #include <linux/platform_device.h>
>  #include <linux/uio_driver.h>
>  #include <linux/spinlock.h>

> @@ -276,7 +282,7 @@ static const struct dev_pm_ops uio_pdrv_
>
>  #ifdef CONFIG_OF
>  static struct of_device_id uio_of_genirq_match[] = {
> -       { /* This is filled with module_parm */ },
> +       { .compatible = "uio_pdrv_genirq", },

This does not look like a proper compatible value.

>         { /* Sentinel */ },
>  };
>  MODULE_DEVICE_TABLE(of, uio_of_genirq_match);

Note that you can bind this driver to your device without modifying this
driver, by using one of:
  1. modprobe uio_pdrv_genirq of_id=my-compatible-value
  2. echo uio_pdrv_genirq >
/sys/bus/platform/devices/e60f0000.timer/driver_override
     echo e60f0000.timer > sys/bus/platform/drivers/uio_pdrv_genirq/bind

Gr{oetje,eeting}s,

                        Geert
diff mbox series

Patch

--- 0001/arch/arm64/boot/dts/renesas/r8a77961.dtsi
+++ work/arch/arm64/boot/dts/renesas/r8a77961.dtsi	2020-09-20 06:37:14.578864063 +0900
@@ -453,6 +453,16 @@ 
 			reg = <0 0xe6060000 0 0x50c>;
 		};
 
+		cmt0: timer@e60f0000 {
+			compatible = "uio_pdrv_genirq";
+			reg = <0 0xe60f0000 0 0x1004>;
+			interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cpg CPG_MOD 303>;
+			clock-names = "fck";
+			power-domains = <&sysc R8A77961_PD_ALWAYS_ON>;
+			resets = <&cpg 303>;
+		};
+
 		cpg: clock-controller@e6150000 {
 			compatible = "renesas,r8a77961-cpg-mssr";
 			reg = <0 0xe6150000 0 0x1000>;
--- 0001/drivers/uio/uio.c
+++ work/drivers/uio/uio.c	2020-09-20 07:58:51.295172430 +0900
@@ -11,7 +11,7 @@ 
  *
  * Base Functions
  */
-
+#define DEBUG
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/poll.h>
@@ -975,6 +975,7 @@  int __uio_register_device(struct module
 		 * FDs at the time of unregister and therefore may not be
 		 * freed until they are released.
 		 */
+		pr_debug("uio request_irq %lu\n", info->irq);
 		ret = request_irq(info->irq, uio_interrupt,
 				  info->irq_flags, info->name, idev);
 		if (ret) {
--- 0001/drivers/uio/uio_pdrv_genirq.c
+++ work/drivers/uio/uio_pdrv_genirq.c	2020-09-20 07:58:07.417169667 +0900
@@ -10,7 +10,7 @@ 
  * Copyright (C) 2008 by Digi International Inc.
  * All rights reserved.
  */
-
+#define DEBUG
 #include <linux/platform_device.h>
 #include <linux/uio_driver.h>
 #include <linux/spinlock.h>
@@ -66,6 +66,8 @@  static irqreturn_t uio_pdrv_genirq_handl
 	 * remember the state so we can allow user space to enable it later.
 	 */
 
+	pr_debug("irqhandler %d\n", irq);
+
 	spin_lock(&priv->lock);
 	if (!__test_and_set_bit(UIO_IRQ_DISABLED, &priv->flags))
 		disable_irq_nosync(irq);
@@ -87,6 +89,8 @@  static int uio_pdrv_genirq_irqcontrol(st
 	 * with irq handler on SMP systems.
 	 */
 
+	pr_debug("irqcontrol %d\n", irq_on);
+	
 	spin_lock_irqsave(&priv->lock, flags);
 	if (irq_on) {
 		if (__test_and_clear_bit(UIO_IRQ_DISABLED, &priv->flags))
@@ -172,6 +176,8 @@  static int uio_pdrv_genirq_probe(struct
 		}
 	}
 
+	pr_debug("uio irq %lu\n", uioinfo->irq);
+	
 	if (uioinfo->irq) {
 		struct irq_data *irq_data = irq_get_irq_data(uioinfo->irq);
 
@@ -276,7 +282,7 @@  static const struct dev_pm_ops uio_pdrv_
 
 #ifdef CONFIG_OF
 static struct of_device_id uio_of_genirq_match[] = {
-	{ /* This is filled with module_parm */ },
+	{ .compatible = "uio_pdrv_genirq", },
 	{ /* Sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, uio_of_genirq_match);