AF:
NF:0
PS:10
SRH:1
SFN:
DSR:
MID:<20090106105318.7d0eaf99@ripper.onstor.net>
CFG:
PT:0
S:andy.sharp@onstor.com
RQ:
SSV:exch1.onstor.net
NSV:
SSH:
R:<a.zummo@towertech.it>
MAID:1
X-Sylpheed-Privacy-System:
X-Sylpheed-Sign:0
SCF:#mh/Mailbox/sent
RMID:#imap/andys@onstor.net@exch1.onstor.net/INBOX	0	20081114145131.24949.86165.stgit@i1501.lan.towertech.it
X-Sylpheed-End-Special-Headers: 1
Date: Tue, 6 Jan 2009 10:54:20 -0800
From: Andrew Sharp <andy.sharp@onstor.com>
To: Alessandro Zummo <a.zummo@towertech.it>
Subject: Re: [RFC PATCH] rtc: rtc-ds1511 misc fixes
Message-ID: <20090106105420.24322f58@ripper.onstor.net>
In-Reply-To: <20081114145131.24949.86165.stgit@i1501.lan.towertech.it>
References: <20081114145131.24949.86165.stgit@i1501.lan.towertech.it>
Organization: Onstor
X-Mailer: Sylpheed-Claws 2.6.0 (GTK+ 2.8.20; x86_64-pc-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

On Fri, 14 Nov 2008 06:51:31 -0800 Alessandro Zummo
<a.zummo@towertech.it> wrote:

My long overdue response ... this patch probably went in already, but
what they heck, just to keep things tidy, some minor comments:

> Miscellaneuous fixes for the ds1511 rtc driver:
> 
> - implemented rtc_irq_set_state
> - use platform_driver_probe
> - fixed probe/remove sequence
> - this patch requires the latest rtc alarm/update patch
> available in -mm
> 
> Please provide a Tested-by
> 
> Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
> Cc: Andrew Sharp <andy.sharp@onstor.com>
> ---
> 
>  drivers/rtc/rtc-ds1511.c |  125
> ++++++++++++++++++++++++---------------------- 1 files changed, 65
> insertions(+), 60 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-ds1511.c b/drivers/rtc/rtc-ds1511.c
> index 25caada..4d74279 100644
> --- a/drivers/rtc/rtc-ds1511.c
> +++ b/drivers/rtc/rtc-ds1511.c
> @@ -23,7 +23,7 @@
>  #include <linux/platform_device.h>
>  #include <linux/io.h>
>  
> -#define DRV_VERSION "0.6"
> +#define DRV_VERSION "0.7"
>  
>  enum ds1511reg {
>  	DS1511_SEC = 0x0,
> @@ -282,11 +282,7 @@ static int ds1511_rtc_read_time(struct device
> *dev, struct rtc_time *rtc_tm) 
>  	rtc_tm->tm_mon--;
>  
> -	if (rtc_valid_tm(rtc_tm) < 0) {
> -		dev_err(dev, "retrieved date/time is not valid.\n");
> -		rtc_time_to_tm(0, rtc_tm);
> -	}
> -	return 0;
> +	return rtc_valid_tm(rtc_tm);
>  }
>  
>  /*
> @@ -380,43 +376,52 @@ ds1511_interrupt(int irq, void *dev_id)
>  }
>  
>   static int
> -ds1511_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long
> arg) +ds1511_rtc_alarm_irq_enable(struct device *dev, unsigned int
> enable) {
>  	struct platform_device *pdev = to_platform_device(dev);
>  	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
>  
> -	if (pdata->irq < 0) {
> -		return -ENOIOCTLCMD; /* fall back into rtc-dev's
> emulation */
> -	}
> -	switch (cmd) {
> -	case RTC_AIE_OFF:
> -		pdata->irqen &= ~RTC_AF;
> -		ds1511_rtc_update_alarm(pdata);
> -		break;
> -	case RTC_AIE_ON:
> +	if (pdata->irq < 0)
> +                return -EINVAL;
> +
> +	/* cannot mix alarm and update */
> +	if (pdata->irqen & RTC_UF)
> +		return -EBUSY;
> +
> +	if (enable)
>  		pdata->irqen |= RTC_AF;
> -		ds1511_rtc_update_alarm(pdata);
> -		break;
> -	case RTC_UIE_OFF:
> -		pdata->irqen &= ~RTC_UF;
> -		ds1511_rtc_update_alarm(pdata);
> -		break;
> -	case RTC_UIE_ON:
> +	else
> +		pdata->irqen &= ~RTC_AF;
> +
> +	ds1511_rtc_update_alarm(pdata);
> +	return 0;
> +}
> +
> +static int ds1511_rtc_update_irq_enable(struct device *dev, unsigned
> int enable) +{

I wouldn't mind if you wanted to follow the style of the file so far.

> +	struct platform_device *pdev = to_platform_device(dev);
> +	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
> +
> +	/* cannot mix alarm and update */
> +	if (pdata->irqen & RTC_AF)
> +		return -EBUSY;
> +
> +	if (enable)
>  		pdata->irqen |= RTC_UF;
> -		ds1511_rtc_update_alarm(pdata);
> -		break;
> -	default:
> -		return -ENOIOCTLCMD;
> -	}
> +	else
> +		pdata->irqen &= ~RTC_UF;
> +
> +	ds1511_rtc_update_alarm(pdata);
>  	return 0;
>  }
>  
> -static const struct rtc_class_ops ds1511_rtc_ops = {
> +static struct rtc_class_ops ds1511_rtc_ops = {

no more const?  These shouldn't change after compilation should they?

>  	.read_time	= ds1511_rtc_read_time,
>  	.set_time	= ds1511_rtc_set_time,
>  	.read_alarm	= ds1511_rtc_read_alarm,
>  	.set_alarm	= ds1511_rtc_set_alarm,
> -	.ioctl		= ds1511_rtc_ioctl,
> +	.update_irq_enable = ds1511_rtc_update_irq_enable,
> +	.alarm_irq_enable = ds1511_rtc_alarm_irq_enable,
>  };
>  
>   static ssize_t
> @@ -487,10 +492,9 @@ static struct bin_attribute ds1511_nvram_attr = {
>  	.write = ds1511_nvram_write,
>  };
>  
> - static int __devinit
> + static int __init

Should be __devinit shouldn't it?  __init gets released too soon.

>  ds1511_rtc_probe(struct platform_device *pdev)
>  {
> -	struct rtc_device *rtc;
>  	struct resource *res;
>  	struct rtc_plat_data *pdata = NULL;
>  	int ret = 0;
> @@ -504,20 +508,21 @@ ds1511_rtc_probe(struct platform_device *pdev)
>  		return -ENOMEM;
>  	}
>  	pdata->irq = -1;
> -	pdata->size = res->end - res->start + 1;
> +	pdata->size = resource_size(res);
> +	pdata->baseaddr = res->start;
> +	platform_set_drvdata(pdev, pdata);
> +
>  	if (!request_mem_region(res->start, pdata->size,
> pdev->name)) { ret = -EBUSY;
>  		goto out;
>  	}
> -	pdata->baseaddr = res->start;
> -	pdata->size = pdata->size;
> +
>  	ds1511_base = ioremap(pdata->baseaddr, pdata->size);
>  	if (!ds1511_base) {
>  		ret = -ENOMEM;
>  		goto out;
>  	}
>  	pdata->ioaddr = ds1511_base;
> -	pdata->irq = platform_get_irq(pdev, 0);
>  
>  	/*
>  	 * turn on the clock and the crystal, etc.
> @@ -533,52 +538,54 @@ ds1511_rtc_probe(struct platform_device *pdev)
>  	 * start the clock
>  	 */
>  	rtc_enable_update();
> -
>  	/*
>  	 * check for a dying bat-tree
>  	 */
>  	if (rtc_read(RTC_CMD1) & DS1511_BLF1) {
>  		dev_warn(&pdev->dev, "voltage-low detected.\n");
>  	}
> -
>  	/*
>  	 * if the platform has an interrupt in mind for this device,
>  	 * then by all means, set it
>  	 */
> +	pdata->irq = platform_get_irq(pdev, 0);
>  	if (pdata->irq >= 0) {
>  		rtc_read(RTC_CMD1);
> -		if (request_irq(pdata->irq, ds1511_interrupt,
> -			IRQF_DISABLED | IRQF_SHARED, pdev->name,
> pdev) < 0) { 
> +		ret = request_irq(pdata->irq, ds1511_interrupt,
> +			IRQF_DISABLED | IRQF_SHARED, pdev->name,
> pdev); +
> +		if (ret < 0) {
>  			dev_warn(&pdev->dev, "interrupt not
> available.\n"); pdata->irq = -1;
>  		}
>  	}
>  
> -	rtc = rtc_device_register(pdev->name, &pdev->dev,
> &ds1511_rtc_ops,
> -		THIS_MODULE);
> -	if (IS_ERR(rtc)) {
> -		ret = PTR_ERR(rtc);
> +	pdata->rtc = rtc_device_register(pdev->name, &pdev->dev,
> +				&ds1511_rtc_ops, THIS_MODULE);
> +	if (IS_ERR(pdata->rtc)) {
> +		ret = PTR_ERR(pdata->rtc);
>  		goto out;
>  	}
> -	pdata->rtc = rtc;
> -	platform_set_drvdata(pdev, pdata);
> +
>  	ret = sysfs_create_bin_file(&pdev->dev.kobj,
> &ds1511_nvram_attr); if (ret) {
>  		goto out;
>  	}
>  	return 0;
> +
>   out:
> -	if (pdata->rtc) {
> -		rtc_device_unregister(pdata->rtc);
> -	}
>  	if (pdata->irq >= 0) {
>  		free_irq(pdata->irq, pdev);
>  	}
> +	if (pdata->rtc) {
> +		rtc_device_unregister(pdata->rtc);
> +	}
>  	if (ds1511_base) {
>  		iounmap(ds1511_base);
>  		ds1511_base = NULL;
>  	}
> +
>  	if (pdata->baseaddr) {
>  		release_mem_region(pdata->baseaddr, pdata->size);
>  	}
> @@ -587,14 +594,11 @@ ds1511_rtc_probe(struct platform_device *pdev)
>  	return ret;
>  }
>  
> - static int __devexit
> + static int __exit

did devinit and devexit go away or something?

>  ds1511_rtc_remove(struct platform_device *pdev)
>  {
>  	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
>  
> -	sysfs_remove_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
> -	rtc_device_unregister(pdata->rtc);
> -	pdata->rtc = NULL;
>  	if (pdata->irq >= 0) {
>  		/*
>  		 * disable the alarm interrupt
> @@ -603,19 +607,19 @@ ds1511_rtc_remove(struct platform_device *pdev)
>  		rtc_read(RTC_CMD1);
>  		free_irq(pdata->irq, pdev);
>  	}
> +
> +	sysfs_remove_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
> +	rtc_device_unregister(pdata->rtc);
> +
>  	iounmap(pdata->ioaddr);
> -	ds1511_base = NULL;
>  	release_mem_region(pdata->baseaddr, pdata->size);
>  	kfree(pdata);
> +
>  	return 0;
>  }
>  
> -/* work with hotplug and coldplug */
> -MODULE_ALIAS("platform:ds1511");
> -
>  static struct platform_driver ds1511_rtc_driver = {
> -	.probe		= ds1511_rtc_probe,
> -	.remove		= __devexit_p(ds1511_rtc_remove),
> +	.remove		= __exit_p(ds1511_rtc_remove),
>  	.driver		= {
>  		.name	= "ds1511",
>  		.owner	= THIS_MODULE,
> @@ -625,7 +629,7 @@ static struct platform_driver ds1511_rtc_driver =
> { static int __init
>  ds1511_rtc_init(void)
>  {
> -	return platform_driver_register(&ds1511_rtc_driver);
> +	return platform_driver_probe(&ds1511_rtc_driver,
> ds1511_rtc_probe); }
>  
>   static void __exit
> @@ -641,3 +645,4 @@ MODULE_AUTHOR("Andrew Sharp
> <andy.sharp@onstor.com>"); MODULE_DESCRIPTION("Dallas DS1511 RTC
> driver"); MODULE_LICENSE("GPL");
>  MODULE_VERSION(DRV_VERSION);
> +MODULE_ALIAS("platform:ds1511");
> 
