diff options
Diffstat (limited to 'drivers/rtc/rtc-davinci.c')
| -rw-r--r-- | drivers/rtc/rtc-davinci.c | 151 | 
1 files changed, 19 insertions, 132 deletions
diff --git a/drivers/rtc/rtc-davinci.c b/drivers/rtc/rtc-davinci.c index 34647fc1ee9..c0a3b59f65a 100644 --- a/drivers/rtc/rtc-davinci.c +++ b/drivers/rtc/rtc-davinci.c @@ -117,10 +117,8 @@  static DEFINE_SPINLOCK(davinci_rtc_lock);  struct davinci_rtc { -	struct rtc_device 		*rtc; +	struct rtc_device		*rtc;  	void __iomem			*base; -	resource_size_t			pbase; -	size_t				base_size;  	int				irq;  }; @@ -231,10 +229,6 @@ davinci_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)  	case RTC_WIE_OFF:  		rtc_ctrl &= ~PRTCSS_RTC_CTRL_WEN;  		break; -	case RTC_UIE_OFF: -	case RTC_UIE_ON: -		ret = -ENOTTY; -		break;  	default:  		ret = -ENOIOCTLCMD;  	} @@ -473,55 +467,6 @@ static int davinci_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)  	return 0;  } -static int davinci_rtc_irq_set_state(struct device *dev, int enabled) -{ -	struct davinci_rtc *davinci_rtc = dev_get_drvdata(dev); -	unsigned long flags; -	u8 rtc_ctrl; - -	spin_lock_irqsave(&davinci_rtc_lock, flags); - -	rtc_ctrl = rtcss_read(davinci_rtc, PRTCSS_RTC_CTRL); - -	if (enabled) { -		while (rtcss_read(davinci_rtc, PRTCSS_RTC_CTRL) -		       & PRTCSS_RTC_CTRL_WDTBUS) -			cpu_relax(); - -		rtc_ctrl |= PRTCSS_RTC_CTRL_TE; -		rtcss_write(davinci_rtc, rtc_ctrl, PRTCSS_RTC_CTRL); - -		rtcss_write(davinci_rtc, 0x0, PRTCSS_RTC_CLKC_CNT); - -		rtc_ctrl |= PRTCSS_RTC_CTRL_TIEN | -			    PRTCSS_RTC_CTRL_TMMD | -			    PRTCSS_RTC_CTRL_TMRFLG; -	} else -		rtc_ctrl &= ~PRTCSS_RTC_CTRL_TIEN; - -	rtcss_write(davinci_rtc, rtc_ctrl, PRTCSS_RTC_CTRL); - -	spin_unlock_irqrestore(&davinci_rtc_lock, flags); - -	return 0; -} - -static int davinci_rtc_irq_set_freq(struct device *dev, int freq) -{ -	struct davinci_rtc *davinci_rtc = dev_get_drvdata(dev); -	unsigned long flags; -	u16 tmr_counter = (0x8000 >> (ffs(freq) - 1)); - -	spin_lock_irqsave(&davinci_rtc_lock, flags); - -	rtcss_write(davinci_rtc, tmr_counter & 0xFF, PRTCSS_RTC_TMR0); -	rtcss_write(davinci_rtc, (tmr_counter & 0xFF00) >> 8, PRTCSS_RTC_TMR1); - -	spin_unlock_irqrestore(&davinci_rtc_lock, flags); - -	return 0; -} -  static struct rtc_class_ops davinci_rtc_ops = {  	.ioctl			= davinci_rtc_ioctl,  	.read_time		= davinci_rtc_read_time, @@ -529,62 +474,38 @@ static struct rtc_class_ops davinci_rtc_ops = {  	.alarm_irq_enable	= davinci_rtc_alarm_irq_enable,  	.read_alarm		= davinci_rtc_read_alarm,  	.set_alarm		= davinci_rtc_set_alarm, -	.irq_set_state		= davinci_rtc_irq_set_state, -	.irq_set_freq		= davinci_rtc_irq_set_freq,  };  static int __init davinci_rtc_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct davinci_rtc *davinci_rtc; -	struct resource *res, *mem; +	struct resource *res;  	int ret = 0; -	davinci_rtc = kzalloc(sizeof(struct davinci_rtc), GFP_KERNEL); -	if (!davinci_rtc) { -		dev_dbg(dev, "could not allocate memory for private data\n"); +	davinci_rtc = devm_kzalloc(&pdev->dev, sizeof(struct davinci_rtc), GFP_KERNEL); +	if (!davinci_rtc)  		return -ENOMEM; -	}  	davinci_rtc->irq = platform_get_irq(pdev, 0);  	if (davinci_rtc->irq < 0) {  		dev_err(dev, "no RTC irq\n"); -		ret = davinci_rtc->irq; -		goto fail1; +		return davinci_rtc->irq;  	}  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!res) { -		dev_err(dev, "no mem resource\n"); -		ret = -EINVAL; -		goto fail1; -	} +	davinci_rtc->base = devm_ioremap_resource(dev, res); +	if (IS_ERR(davinci_rtc->base)) +		return PTR_ERR(davinci_rtc->base); -	davinci_rtc->pbase = res->start; -	davinci_rtc->base_size = resource_size(res); - -	mem = request_mem_region(davinci_rtc->pbase, davinci_rtc->base_size, -				 pdev->name); -	if (!mem) { -		dev_err(dev, "RTC registers at %08x are not free\n", -			davinci_rtc->pbase); -		ret = -EBUSY; -		goto fail1; -	} - -	davinci_rtc->base = ioremap(davinci_rtc->pbase, davinci_rtc->base_size); -	if (!davinci_rtc->base) { -		dev_err(dev, "unable to ioremap MEM resource\n"); -		ret = -ENOMEM; -		goto fail2; -	} +	platform_set_drvdata(pdev, davinci_rtc); -	davinci_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, +	davinci_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,  				    &davinci_rtc_ops, THIS_MODULE);  	if (IS_ERR(davinci_rtc->rtc)) { -		dev_err(dev, "unable to register RTC device, err %ld\n", -				PTR_ERR(davinci_rtc->rtc)); -		goto fail3; +		dev_err(dev, "unable to register RTC device, err %d\n", +				ret); +		return PTR_ERR(davinci_rtc->rtc);  	}  	rtcif_write(davinci_rtc, PRTCIF_INTFLG_RTCSS, PRTCIF_INTFLG); @@ -594,11 +515,11 @@ static int __init davinci_rtc_probe(struct platform_device *pdev)  	rtcss_write(davinci_rtc, 0, PRTCSS_RTC_CTRL);  	rtcss_write(davinci_rtc, 0, PRTCSS_RTC_CCTRL); -	ret = request_irq(davinci_rtc->irq, davinci_rtc_interrupt, -			  IRQF_DISABLED, "davinci_rtc", davinci_rtc); +	ret = devm_request_irq(dev, davinci_rtc->irq, davinci_rtc_interrupt, +			  0, "davinci_rtc", davinci_rtc);  	if (ret < 0) {  		dev_err(dev, "unable to register davinci RTC interrupt\n"); -		goto fail4; +		return ret;  	}  	/* Enable interrupts */ @@ -608,25 +529,12 @@ static int __init davinci_rtc_probe(struct platform_device *pdev)  	rtcss_write(davinci_rtc, PRTCSS_RTC_CCTRL_CAEN, PRTCSS_RTC_CCTRL); -	platform_set_drvdata(pdev, davinci_rtc); -  	device_init_wakeup(&pdev->dev, 0);  	return 0; - -fail4: -	rtc_device_unregister(davinci_rtc->rtc); -fail3: -	iounmap(davinci_rtc->base); -fail2: -	release_mem_region(davinci_rtc->pbase, davinci_rtc->base_size); -fail1: -	kfree(davinci_rtc); - -	return ret;  } -static int __devexit davinci_rtc_remove(struct platform_device *pdev) +static int __exit davinci_rtc_remove(struct platform_device *pdev)  {  	struct davinci_rtc *davinci_rtc = platform_get_drvdata(pdev); @@ -634,40 +542,19 @@ static int __devexit davinci_rtc_remove(struct platform_device *pdev)  	rtcif_write(davinci_rtc, 0, PRTCIF_INTEN); -	free_irq(davinci_rtc->irq, davinci_rtc); - -	rtc_device_unregister(davinci_rtc->rtc); - -	iounmap(davinci_rtc->base); -	release_mem_region(davinci_rtc->pbase, davinci_rtc->base_size); - -	platform_set_drvdata(pdev, NULL); - -	kfree(davinci_rtc); -  	return 0;  }  static struct platform_driver davinci_rtc_driver = {  	.probe		= davinci_rtc_probe, -	.remove		= __devexit_p(davinci_rtc_remove), +	.remove		= __exit_p(davinci_rtc_remove),  	.driver		= {  		.name = "rtc_davinci",  		.owner = THIS_MODULE,  	},  }; -static int __init rtc_init(void) -{ -	return platform_driver_probe(&davinci_rtc_driver, davinci_rtc_probe); -} -module_init(rtc_init); - -static void __exit rtc_exit(void) -{ -	platform_driver_unregister(&davinci_rtc_driver); -} -module_exit(rtc_exit); +module_platform_driver_probe(davinci_rtc_driver, davinci_rtc_probe);  MODULE_AUTHOR("Miguel Aguilar <miguel.aguilar@ridgerun.com>");  MODULE_DESCRIPTION("Texas Instruments DaVinci PRTC Driver");  | 
