From: andrew@lunn.ch (Andrew Lunn)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/6] rtc: rtc-m48t86: add hooks to support driver side memory mapping
Date: Thu, 4 Apr 2013 09:25:03 +0200 [thread overview]
Message-ID: <20130404072503.GE28914@lunn.ch> (raw)
In-Reply-To: <1364858565-17192-3-git-send-email-alex@digriz.org.uk>
> -static int m48t86_rtc_probe(struct platform_device *dev)
> +static int m48t86_rtc_probe(struct platform_device *pdev)
> {
> unsigned char reg;
> - struct m48t86_ops *ops = dev->dev.platform_data;
> - struct rtc_device *rtc = rtc_device_register("m48t86",
> - &dev->dev, &m48t86_rtc_ops, THIS_MODULE);
> -
> - if (IS_ERR(rtc))
> - return PTR_ERR(rtc);
> -
> - platform_set_drvdata(dev, rtc);
> + int err;
> + struct resource *res_index, *res_data;
> + struct m48t86_rtc_private_data *priv;
> +
> + /* Allocate memory for the device structure (and zero it) */
> + priv = kzalloc(sizeof(struct m48t86_rtc_private_data), GFP_KERNEL);
> + if (!priv)
> + return -ENOMEM;
> +
> + platform_set_drvdata(pdev, priv);
> +
> + if (!pdev->dev.platform_data) {
> + res_index = platform_get_resource_byname(
> + pdev, IORESOURCE_MEM, "rtc_index");
> + if (!res_index) {
> + err = -ENXIO;
> + goto out_free;
> + }
> +
> + res_data = platform_get_resource_byname(
> + pdev, IORESOURCE_MEM, "rtc_data");
> + if (!res_data) {
> + err = -ENXIO;
> + goto out_free;
> + }
> +
> + if (!request_mem_region(res_index->start,
> + resource_size(res_index),
> + dev_name(&pdev->dev))) {
> + err = -EBUSY;
> + goto out_free;
> + }
> +
> + if (!request_mem_region(res_data->start,
> + resource_size(res_data),
> + dev_name(&pdev->dev))) {
> + err = -EBUSY;
> + goto out_release_index;
> + }
> +
> + priv->io_index = ioremap(res_index->start,
> + resource_size(res_index));
> + if (!priv->io_index) {
> + err = -EIO;
> + goto out_release_data;
> + }
> +
> + priv->io_data = ioremap(res_data->start,
> + resource_size(res_data));
> + if (!priv->io_data) {
> + err = -EIO;
> + goto out_io_index;
> + }
> + } else
Hi Alexander
It would be good to use the devm_ functions here. It will make the
cleanup on error much simpler, solve your warnings problem, and simply
the remove function.
> + priv->ops = pdev->dev.platform_data;
> +
> + priv->rtc = rtc_device_register("m48t86",
> + &pdev->dev, &m48t86_rtc_ops, THIS_MODULE);
> + if (IS_ERR(priv->rtc)) {
> + err = PTR_ERR(priv->rtc);
> + if (!pdev->dev.platform_data)
> + goto out_io_data;
> + else
> + goto out_free;
> + }
>
> /* read battery status */
> - reg = ops->readbyte(M48T86_REG_D);
> - dev_info(&dev->dev, "battery %s\n",
> + reg = m48t86_rtc_readbyte(&pdev->dev, M48T86_REG_D);
> + dev_info(&pdev->dev, "battery %s\n",
> (reg & M48T86_REG_D_VRT) ? "ok" : "exhausted");
>
> return 0;
> +
> +out_io_data:
> + iounmap(priv->io_data);
> +out_io_index:
> + iounmap(priv->io_index);
> +out_release_data:
> + release_mem_region(res_data->start, resource_size(res_data));
> +out_release_index:
> + release_mem_region(res_index->start, resource_size(res_index));
> +out_free:
> + platform_set_drvdata(pdev, NULL);
> + kfree(priv);
> + return err;
> }
>
> -static int m48t86_rtc_remove(struct platform_device *dev)
> +static int m48t86_rtc_remove(struct platform_device *pdev)
> {
> - struct rtc_device *rtc = platform_get_drvdata(dev);
> + struct resource *res;
> + struct m48t86_rtc_private_data *priv = platform_get_drvdata(pdev);
> +
> + if (priv->rtc)
> + rtc_device_unregister(priv->rtc);
> +
> + if (priv->io_data) {
> + iounmap(priv->io_data);
> + res = platform_get_resource_byname(
> + pdev, IORESOURCE_MEM, "rtc_data");
> + release_mem_region(res->start, resource_size(res));
> + }
> +
> + if (priv->io_index) {
> + iounmap(priv->io_index);
> + res = platform_get_resource_byname(
> + pdev, IORESOURCE_MEM, "rtc_index");
> + release_mem_region(res->start, resource_size(res));
> + }
>
> - if (rtc)
> - rtc_device_unregister(rtc);
> + platform_set_drvdata(pdev, NULL);
>
> - platform_set_drvdata(dev, NULL);
> + kfree(priv);
>
> return 0;
> }
> --
> 1.7.10.4
>
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>
To: Alexander Clouter <alex-L4GPcECwBoDe9xe1eoZjHA@public.gmane.org>
Cc: Alessandro Zummo
<a.zummo-BfzFCNDTiLLj+vYz1yj4TQ@public.gmane.org>,
Ryan Mallon <rmallon-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
rtc-linux-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org,
Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>,
Hartley Sweeten
<hsweeten-3FF4nKcrg1dE2c76skzGb0EOCMrvLtNR@public.gmane.org>,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
Jason Cooper <jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org>
Subject: Re: [PATCH 2/6] rtc: rtc-m48t86: add hooks to support driver side memory mapping
Date: Thu, 4 Apr 2013 09:25:03 +0200 [thread overview]
Message-ID: <20130404072503.GE28914@lunn.ch> (raw)
In-Reply-To: <1364858565-17192-3-git-send-email-alex-L4GPcECwBoDe9xe1eoZjHA@public.gmane.org>
> -static int m48t86_rtc_probe(struct platform_device *dev)
> +static int m48t86_rtc_probe(struct platform_device *pdev)
> {
> unsigned char reg;
> - struct m48t86_ops *ops = dev->dev.platform_data;
> - struct rtc_device *rtc = rtc_device_register("m48t86",
> - &dev->dev, &m48t86_rtc_ops, THIS_MODULE);
> -
> - if (IS_ERR(rtc))
> - return PTR_ERR(rtc);
> -
> - platform_set_drvdata(dev, rtc);
> + int err;
> + struct resource *res_index, *res_data;
> + struct m48t86_rtc_private_data *priv;
> +
> + /* Allocate memory for the device structure (and zero it) */
> + priv = kzalloc(sizeof(struct m48t86_rtc_private_data), GFP_KERNEL);
> + if (!priv)
> + return -ENOMEM;
> +
> + platform_set_drvdata(pdev, priv);
> +
> + if (!pdev->dev.platform_data) {
> + res_index = platform_get_resource_byname(
> + pdev, IORESOURCE_MEM, "rtc_index");
> + if (!res_index) {
> + err = -ENXIO;
> + goto out_free;
> + }
> +
> + res_data = platform_get_resource_byname(
> + pdev, IORESOURCE_MEM, "rtc_data");
> + if (!res_data) {
> + err = -ENXIO;
> + goto out_free;
> + }
> +
> + if (!request_mem_region(res_index->start,
> + resource_size(res_index),
> + dev_name(&pdev->dev))) {
> + err = -EBUSY;
> + goto out_free;
> + }
> +
> + if (!request_mem_region(res_data->start,
> + resource_size(res_data),
> + dev_name(&pdev->dev))) {
> + err = -EBUSY;
> + goto out_release_index;
> + }
> +
> + priv->io_index = ioremap(res_index->start,
> + resource_size(res_index));
> + if (!priv->io_index) {
> + err = -EIO;
> + goto out_release_data;
> + }
> +
> + priv->io_data = ioremap(res_data->start,
> + resource_size(res_data));
> + if (!priv->io_data) {
> + err = -EIO;
> + goto out_io_index;
> + }
> + } else
Hi Alexander
It would be good to use the devm_ functions here. It will make the
cleanup on error much simpler, solve your warnings problem, and simply
the remove function.
> + priv->ops = pdev->dev.platform_data;
> +
> + priv->rtc = rtc_device_register("m48t86",
> + &pdev->dev, &m48t86_rtc_ops, THIS_MODULE);
> + if (IS_ERR(priv->rtc)) {
> + err = PTR_ERR(priv->rtc);
> + if (!pdev->dev.platform_data)
> + goto out_io_data;
> + else
> + goto out_free;
> + }
>
> /* read battery status */
> - reg = ops->readbyte(M48T86_REG_D);
> - dev_info(&dev->dev, "battery %s\n",
> + reg = m48t86_rtc_readbyte(&pdev->dev, M48T86_REG_D);
> + dev_info(&pdev->dev, "battery %s\n",
> (reg & M48T86_REG_D_VRT) ? "ok" : "exhausted");
>
> return 0;
> +
> +out_io_data:
> + iounmap(priv->io_data);
> +out_io_index:
> + iounmap(priv->io_index);
> +out_release_data:
> + release_mem_region(res_data->start, resource_size(res_data));
> +out_release_index:
> + release_mem_region(res_index->start, resource_size(res_index));
> +out_free:
> + platform_set_drvdata(pdev, NULL);
> + kfree(priv);
> + return err;
> }
>
> -static int m48t86_rtc_remove(struct platform_device *dev)
> +static int m48t86_rtc_remove(struct platform_device *pdev)
> {
> - struct rtc_device *rtc = platform_get_drvdata(dev);
> + struct resource *res;
> + struct m48t86_rtc_private_data *priv = platform_get_drvdata(pdev);
> +
> + if (priv->rtc)
> + rtc_device_unregister(priv->rtc);
> +
> + if (priv->io_data) {
> + iounmap(priv->io_data);
> + res = platform_get_resource_byname(
> + pdev, IORESOURCE_MEM, "rtc_data");
> + release_mem_region(res->start, resource_size(res));
> + }
> +
> + if (priv->io_index) {
> + iounmap(priv->io_index);
> + res = platform_get_resource_byname(
> + pdev, IORESOURCE_MEM, "rtc_index");
> + release_mem_region(res->start, resource_size(res));
> + }
>
> - if (rtc)
> - rtc_device_unregister(rtc);
> + platform_set_drvdata(pdev, NULL);
>
> - platform_set_drvdata(dev, NULL);
> + kfree(priv);
>
> return 0;
> }
> --
> 1.7.10.4
>
next prev parent reply other threads:[~2013-04-04 7:25 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-01 23:22 [PATCHv2 0/6] add devicetree bindings for rtc-m48t86 Alexander Clouter
2013-04-01 23:22 ` Alexander Clouter
2013-04-01 23:22 ` [PATCH 1/6] rtc: rtc-m48t86: move m48t86.h to platform_data Alexander Clouter
2013-04-01 23:22 ` Alexander Clouter
2013-04-01 23:22 ` [PATCH 2/6] rtc: rtc-m48t86: add hooks to support driver side memory mapping Alexander Clouter
2013-04-01 23:22 ` Alexander Clouter
2013-04-01 23:36 ` Ryan Mallon
2013-04-01 23:36 ` Ryan Mallon
2013-04-01 23:42 ` Alexander Clouter
2013-04-01 23:42 ` Alexander Clouter
2013-04-02 5:37 ` Ryan Mallon
2013-04-02 5:37 ` Ryan Mallon
2013-04-02 5:34 ` Ryan Mallon
2013-04-02 5:34 ` Ryan Mallon
2013-04-02 11:04 ` [PATCHv2 " Alexander Clouter
2013-04-02 11:04 ` Alexander Clouter
2013-04-04 7:25 ` Andrew Lunn [this message]
2013-04-04 7:25 ` [PATCH " Andrew Lunn
2013-04-01 23:22 ` [PATCH 3/6] rtc: rtc-m48t86: add detect method for RTC Alexander Clouter
2013-04-01 23:22 ` Alexander Clouter
2013-04-01 23:22 ` [PATCH 4/6] arm: orion5x: move ts78xx to use rtc-m48t86 driver side memory interface Alexander Clouter
2013-04-01 23:22 ` Alexander Clouter
2013-04-02 11:50 ` Jason Cooper
2013-04-02 11:50 ` Jason Cooper
2013-04-01 23:22 ` [PATCH 5/6] arm: ep93xx: move ts72xx " Alexander Clouter
2013-04-01 23:22 ` Alexander Clouter
2013-04-01 23:22 ` [PATCH 6/6] rtc: rtc-m48t86: add devicetree bindings Alexander Clouter
2013-04-01 23:22 ` Alexander Clouter
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=20130404072503.GE28914@lunn.ch \
--to=andrew@lunn.ch \
--cc=linux-arm-kernel@lists.infradead.org \
/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.