From: Wolfram Sang <w.sang@pengutronix.de>
To: Michal Simek <monstr@monstr.eu>
Cc: devicetree-discuss@lists.ozlabs.org, grant.likely@secretlab.ca,
john.williams@petalogix.com, linux-kernel@vger.kernel.org,
hjk@linutronix.de, gregkh@suse.de
Subject: Re: [PATCH] uio/pdrv_genirq: Add OF support
Date: Thu, 31 Mar 2011 14:49:26 +0200 [thread overview]
Message-ID: <20110331124925.GA2202@pengutronix.de> (raw)
In-Reply-To: <1301574600-4861-2-git-send-email-monstr@monstr.eu>
[-- Attachment #1: Type: text/plain, Size: 4741 bytes --]
On Thu, Mar 31, 2011 at 02:30:00PM +0200, Michal Simek wrote:
> Support OF support. "generic-uio" compatible property is used.
And exactly this was the issue last time (when I tried). This is a
generic property, which is linux-specific and not describing HW. The
agreement back then was to we probably need to add compatible-entries at
runtime (something like new_id for USB). So the uio-of-driver could be
matched against any device. Otherwise, we would collect a lot of
potential entries like "vendor,special-card1". Although I wonder
meanwhile if it is really going to be that bad; we don't have so much
UIO-driver in tree as well. Maybe worth a try?
> Signed-off-by: Michal Simek <monstr@monstr.eu>
> ---
> drivers/uio/uio_pdrv_genirq.c | 60 ++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 57 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c
> index 7174d51..9e89806 100644
> --- a/drivers/uio/uio_pdrv_genirq.c
> +++ b/drivers/uio/uio_pdrv_genirq.c
> @@ -23,6 +23,10 @@
> #include <linux/pm_runtime.h>
> #include <linux/slab.h>
>
> +#include <linux/of.h>
> +#include <linux/of_platform.h>
> +#include <linux/of_address.h>
> +
> #define DRIVER_NAME "uio_pdrv_genirq"
>
> struct uio_pdrv_genirq_platdata {
> @@ -92,11 +96,44 @@ static int uio_pdrv_genirq_irqcontrol(struct uio_info *dev_info, s32 irq_on)
> static int uio_pdrv_genirq_probe(struct platform_device *pdev)
> {
> struct uio_info *uioinfo = pdev->dev.platform_data;
> - struct uio_pdrv_genirq_platdata *priv;
> + struct uio_pdrv_genirq_platdata *priv = NULL;
unrelated?
> struct uio_mem *uiomem;
> int ret = -EINVAL;
> int i;
>
> + if (!uioinfo) {
> + struct resource r_irq; /* Interrupt resources */
> + int rc = 0;
> +
> + rc = of_address_to_resource(pdev->dev.of_node, 0,
> + &pdev->resource[0]);
> + if (rc) {
> + dev_err(&pdev->dev, "invalid address\n");
> + goto bad2;
> + }
> + pdev->num_resources = 1;
> +
> + /* alloc uioinfo for one device */
> + uioinfo = kzalloc(sizeof(*uioinfo), GFP_KERNEL);
> + if (!uioinfo) {
> + ret = -ENOMEM;
> + dev_err(&pdev->dev, "unable to kmalloc\n");
> + goto bad2;
> + }
> + uioinfo->name = pdev->dev.of_node->name;
> + /* Use version for storing full IP name for identification */
> + uioinfo->version = pdev->dev.of_node->full_name;
I don't think this is apropriate, but will leave that to Hans.
> + /* Get IRQ for the device */
> + rc = of_irq_to_resource(pdev->dev.of_node, 0, &r_irq);
> + if (rc == NO_IRQ)
> + dev_err(&pdev->dev, "no IRQ found\n");
No error, I think. Sometimes just mmaping the registers is enough.
> + else {
> + uioinfo->irq = r_irq.start;
> + dev_info(&pdev->dev, "irq %d\n", (u32)uioinfo->irq);
> + }
> + }
> +
> if (!uioinfo || !uioinfo->name || !uioinfo->version) {
> dev_err(&pdev->dev, "missing platform_data\n");
> goto bad0;
> @@ -176,10 +213,15 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
>
> platform_set_drvdata(pdev, priv);
> return 0;
> - bad1:
> +
> +bad1:
The spaces before labels are intentional, better keep them.
> kfree(priv);
> pm_runtime_disable(&pdev->dev);
> - bad0:
> +bad0:
> + /* kfree uioinfo for CONFIG_OF */
> + if (!pdev->dev.platform_data)
> + kfree(uioinfo);
> +bad2:
> return ret;
> }
>
> @@ -215,6 +257,17 @@ static const struct dev_pm_ops uio_pdrv_genirq_dev_pm_ops = {
> .runtime_resume = uio_pdrv_genirq_runtime_nop,
> };
>
> +#ifdef CONFIG_OF
> +/* Match table for of_platform binding */
> +static const struct of_device_id __devinitconst uio_of_genirq_match[] = {
> + { .compatible = "generic-uio", },
> + { /* end of list */ },
> +};
> +MODULE_DEVICE_TABLE(of, uio_of_genirq_match);
> +#else
> +# define uio_of_genirq_match NULL
> +#endif
> +
> static struct platform_driver uio_pdrv_genirq = {
> .probe = uio_pdrv_genirq_probe,
> .remove = uio_pdrv_genirq_remove,
> @@ -222,6 +275,7 @@ static struct platform_driver uio_pdrv_genirq = {
> .name = DRIVER_NAME,
> .owner = THIS_MODULE,
> .pm = &uio_pdrv_genirq_dev_pm_ops,
> + .of_match_table = uio_of_genirq_match,
> },
> };
>
> --
> 1.5.5.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
To: Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org>
Cc: gregkh-l3A5Bk7waGM@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
hjk-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
john.williams-g5w7nrANp4BDPfheJLI6IQ@public.gmane.org
Subject: Re: [PATCH] uio/pdrv_genirq: Add OF support
Date: Thu, 31 Mar 2011 14:49:26 +0200 [thread overview]
Message-ID: <20110331124925.GA2202@pengutronix.de> (raw)
In-Reply-To: <1301574600-4861-2-git-send-email-monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org>
[-- Attachment #1.1: Type: text/plain, Size: 4795 bytes --]
On Thu, Mar 31, 2011 at 02:30:00PM +0200, Michal Simek wrote:
> Support OF support. "generic-uio" compatible property is used.
And exactly this was the issue last time (when I tried). This is a
generic property, which is linux-specific and not describing HW. The
agreement back then was to we probably need to add compatible-entries at
runtime (something like new_id for USB). So the uio-of-driver could be
matched against any device. Otherwise, we would collect a lot of
potential entries like "vendor,special-card1". Although I wonder
meanwhile if it is really going to be that bad; we don't have so much
UIO-driver in tree as well. Maybe worth a try?
> Signed-off-by: Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org>
> ---
> drivers/uio/uio_pdrv_genirq.c | 60 ++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 57 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c
> index 7174d51..9e89806 100644
> --- a/drivers/uio/uio_pdrv_genirq.c
> +++ b/drivers/uio/uio_pdrv_genirq.c
> @@ -23,6 +23,10 @@
> #include <linux/pm_runtime.h>
> #include <linux/slab.h>
>
> +#include <linux/of.h>
> +#include <linux/of_platform.h>
> +#include <linux/of_address.h>
> +
> #define DRIVER_NAME "uio_pdrv_genirq"
>
> struct uio_pdrv_genirq_platdata {
> @@ -92,11 +96,44 @@ static int uio_pdrv_genirq_irqcontrol(struct uio_info *dev_info, s32 irq_on)
> static int uio_pdrv_genirq_probe(struct platform_device *pdev)
> {
> struct uio_info *uioinfo = pdev->dev.platform_data;
> - struct uio_pdrv_genirq_platdata *priv;
> + struct uio_pdrv_genirq_platdata *priv = NULL;
unrelated?
> struct uio_mem *uiomem;
> int ret = -EINVAL;
> int i;
>
> + if (!uioinfo) {
> + struct resource r_irq; /* Interrupt resources */
> + int rc = 0;
> +
> + rc = of_address_to_resource(pdev->dev.of_node, 0,
> + &pdev->resource[0]);
> + if (rc) {
> + dev_err(&pdev->dev, "invalid address\n");
> + goto bad2;
> + }
> + pdev->num_resources = 1;
> +
> + /* alloc uioinfo for one device */
> + uioinfo = kzalloc(sizeof(*uioinfo), GFP_KERNEL);
> + if (!uioinfo) {
> + ret = -ENOMEM;
> + dev_err(&pdev->dev, "unable to kmalloc\n");
> + goto bad2;
> + }
> + uioinfo->name = pdev->dev.of_node->name;
> + /* Use version for storing full IP name for identification */
> + uioinfo->version = pdev->dev.of_node->full_name;
I don't think this is apropriate, but will leave that to Hans.
> + /* Get IRQ for the device */
> + rc = of_irq_to_resource(pdev->dev.of_node, 0, &r_irq);
> + if (rc == NO_IRQ)
> + dev_err(&pdev->dev, "no IRQ found\n");
No error, I think. Sometimes just mmaping the registers is enough.
> + else {
> + uioinfo->irq = r_irq.start;
> + dev_info(&pdev->dev, "irq %d\n", (u32)uioinfo->irq);
> + }
> + }
> +
> if (!uioinfo || !uioinfo->name || !uioinfo->version) {
> dev_err(&pdev->dev, "missing platform_data\n");
> goto bad0;
> @@ -176,10 +213,15 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
>
> platform_set_drvdata(pdev, priv);
> return 0;
> - bad1:
> +
> +bad1:
The spaces before labels are intentional, better keep them.
> kfree(priv);
> pm_runtime_disable(&pdev->dev);
> - bad0:
> +bad0:
> + /* kfree uioinfo for CONFIG_OF */
> + if (!pdev->dev.platform_data)
> + kfree(uioinfo);
> +bad2:
> return ret;
> }
>
> @@ -215,6 +257,17 @@ static const struct dev_pm_ops uio_pdrv_genirq_dev_pm_ops = {
> .runtime_resume = uio_pdrv_genirq_runtime_nop,
> };
>
> +#ifdef CONFIG_OF
> +/* Match table for of_platform binding */
> +static const struct of_device_id __devinitconst uio_of_genirq_match[] = {
> + { .compatible = "generic-uio", },
> + { /* end of list */ },
> +};
> +MODULE_DEVICE_TABLE(of, uio_of_genirq_match);
> +#else
> +# define uio_of_genirq_match NULL
> +#endif
> +
> static struct platform_driver uio_pdrv_genirq = {
> .probe = uio_pdrv_genirq_probe,
> .remove = uio_pdrv_genirq_remove,
> @@ -222,6 +275,7 @@ static struct platform_driver uio_pdrv_genirq = {
> .name = DRIVER_NAME,
> .owner = THIS_MODULE,
> .pm = &uio_pdrv_genirq_dev_pm_ops,
> + .of_match_table = uio_of_genirq_match,
> },
> };
>
> --
> 1.5.5.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
[-- Attachment #2: Type: text/plain, Size: 192 bytes --]
_______________________________________________
devicetree-discuss mailing list
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
https://lists.ozlabs.org/listinfo/devicetree-discuss
next prev parent reply other threads:[~2011-03-31 12:49 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-31 12:29 UIO OF support Michal Simek
2011-03-31 12:29 ` Michal Simek
2011-03-31 12:30 ` [PATCH] uio/pdrv_genirq: Add " Michal Simek
2011-03-31 12:30 ` Michal Simek
2011-03-31 12:49 ` Wolfram Sang [this message]
2011-03-31 12:49 ` Wolfram Sang
[not found] ` <20110331124925.GA2202-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2011-03-31 13:10 ` John Williams
2011-03-31 13:23 ` Wolfram Sang
2011-03-31 13:23 ` Wolfram Sang
2011-03-31 13:37 ` Michal Simek
2011-03-31 13:37 ` Michal Simek
2011-03-31 13:47 ` John Williams
2011-03-31 13:47 ` John Williams
2011-03-31 16:25 ` Grant Likely
2011-03-31 16:25 ` Grant Likely
2011-03-31 13:11 ` John Williams
2011-03-31 13:11 ` John Williams
2011-03-31 13:25 ` Arnd Bergmann
2011-03-31 13:25 ` Arnd Bergmann
2011-03-31 13:51 ` Michal Simek
2011-03-31 16:34 ` Grant Likely
2011-03-31 13:28 ` Michal Simek
2011-03-31 17:03 ` Hans J. Koch
2011-03-31 17:57 ` Michal Simek
2011-03-31 19:23 ` Hans J. Koch
2011-03-31 19:48 ` Grant Likely
2011-03-31 20:30 ` Hans J. Koch
2011-04-02 10:35 ` Wolfram Sang
2011-04-02 10:35 ` Wolfram Sang
2011-04-04 17:04 ` Hans J. Koch
2011-04-04 17:04 ` Hans J. Koch
2011-04-04 17:31 ` Wolfram Sang
2011-04-04 17:31 ` Wolfram Sang
2011-04-04 18:24 ` Hans J. Koch
2011-04-04 18:24 ` Hans J. Koch
2011-04-05 6:25 ` Michal Simek
2011-04-05 6:25 ` Michal Simek
2011-04-05 11:50 ` Hans J. Koch
2011-04-05 11:50 ` Hans J. Koch
2011-03-31 16:43 ` Grant Likely
2011-03-31 16:43 ` Grant Likely
2011-03-31 17:54 ` Michal Simek
2011-03-31 17:54 ` Michal Simek
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=20110331124925.GA2202@pengutronix.de \
--to=w.sang@pengutronix.de \
--cc=devicetree-discuss@lists.ozlabs.org \
--cc=grant.likely@secretlab.ca \
--cc=gregkh@suse.de \
--cc=hjk@linutronix.de \
--cc=john.williams@petalogix.com \
--cc=linux-kernel@vger.kernel.org \
--cc=monstr@monstr.eu \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.