diff options
Diffstat (limited to 'drivers/rtc/rtc-mt6397.c')
| -rw-r--r-- | drivers/rtc/rtc-mt6397.c | 107 | 
1 files changed, 21 insertions, 86 deletions
diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c index 704229eb0cac..5249fc99fd5f 100644 --- a/drivers/rtc/rtc-mt6397.c +++ b/drivers/rtc/rtc-mt6397.c @@ -4,69 +4,19 @@  * Author: Tianping.Fang <[email protected]>  */ -#include <linux/delay.h> -#include <linux/init.h> +#include <linux/err.h> +#include <linux/interrupt.h> +#include <linux/mfd/mt6397/core.h>  #include <linux/module.h> +#include <linux/mutex.h> +#include <linux/platform_device.h>  #include <linux/regmap.h>  #include <linux/rtc.h> -#include <linux/irqdomain.h> -#include <linux/platform_device.h> -#include <linux/of_address.h> -#include <linux/of_irq.h> -#include <linux/io.h> -#include <linux/mfd/mt6397/core.h> - -#define RTC_BBPU		0x0000 -#define RTC_BBPU_CBUSY		BIT(6) - -#define RTC_WRTGR		0x003c - -#define RTC_IRQ_STA		0x0002 -#define RTC_IRQ_STA_AL		BIT(0) -#define RTC_IRQ_STA_LP		BIT(3) - -#define RTC_IRQ_EN		0x0004 -#define RTC_IRQ_EN_AL		BIT(0) -#define RTC_IRQ_EN_ONESHOT	BIT(2) -#define RTC_IRQ_EN_LP		BIT(3) -#define RTC_IRQ_EN_ONESHOT_AL	(RTC_IRQ_EN_ONESHOT | RTC_IRQ_EN_AL) - -#define RTC_AL_MASK		0x0008 -#define RTC_AL_MASK_DOW		BIT(4) - -#define RTC_TC_SEC		0x000a -/* Min, Hour, Dom... register offset to RTC_TC_SEC */ -#define RTC_OFFSET_SEC		0 -#define RTC_OFFSET_MIN		1 -#define RTC_OFFSET_HOUR		2 -#define RTC_OFFSET_DOM		3 -#define RTC_OFFSET_DOW		4 -#define RTC_OFFSET_MTH		5 -#define RTC_OFFSET_YEAR		6 -#define RTC_OFFSET_COUNT	7 - -#define RTC_AL_SEC		0x0018 - -#define RTC_PDN2		0x002e -#define RTC_PDN2_PWRON_ALARM	BIT(4) - -#define RTC_MIN_YEAR		1968 -#define RTC_BASE_YEAR		1900 -#define RTC_NUM_YEARS		128 -#define RTC_MIN_YEAR_OFFSET	(RTC_MIN_YEAR - RTC_BASE_YEAR) - -struct mt6397_rtc { -	struct device		*dev; -	struct rtc_device	*rtc_dev; -	struct mutex		lock; -	struct regmap		*regmap; -	int			irq; -	u32			addr_base; -}; +#include <linux/mfd/mt6397/rtc.h> +#include <linux/mod_devicetable.h>  static int mtk_rtc_write_trigger(struct mt6397_rtc *rtc)  { -	unsigned long timeout = jiffies + HZ;  	int ret;  	u32 data; @@ -74,19 +24,13 @@ static int mtk_rtc_write_trigger(struct mt6397_rtc *rtc)  	if (ret < 0)  		return ret; -	while (1) { -		ret = regmap_read(rtc->regmap, rtc->addr_base + RTC_BBPU, -				  &data); -		if (ret < 0) -			break; -		if (!(data & RTC_BBPU_CBUSY)) -			break; -		if (time_after(jiffies, timeout)) { -			ret = -ETIMEDOUT; -			break; -		} -		cpu_relax(); -	} +	ret = regmap_read_poll_timeout(rtc->regmap, +					rtc->addr_base + RTC_BBPU, data, +					!(data & RTC_BBPU_CBUSY), +					MTK_RTC_POLL_DELAY_US, +					MTK_RTC_POLL_TIMEOUT); +	if (ret < 0) +		dev_err(rtc->dev, "failed to write WRTGE: %d\n", ret);  	return ret;  } @@ -319,19 +263,19 @@ static int mtk_rtc_probe(struct platform_device *pdev)  		return rtc->irq;  	rtc->regmap = mt6397_chip->regmap; -	rtc->dev = &pdev->dev;  	mutex_init(&rtc->lock);  	platform_set_drvdata(pdev, rtc); -	rtc->rtc_dev = devm_rtc_allocate_device(rtc->dev); +	rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev);  	if (IS_ERR(rtc->rtc_dev))  		return PTR_ERR(rtc->rtc_dev); -	ret = request_threaded_irq(rtc->irq, NULL, -				   mtk_rtc_irq_handler_thread, -				   IRQF_ONESHOT | IRQF_TRIGGER_HIGH, -				   "mt6397-rtc", rtc); +	ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL, +					mtk_rtc_irq_handler_thread, +					IRQF_ONESHOT | IRQF_TRIGGER_HIGH, +					"mt6397-rtc", rtc); +  	if (ret) {  		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",  			rtc->irq, ret); @@ -353,15 +297,6 @@ out_free_irq:  	return ret;  } -static int mtk_rtc_remove(struct platform_device *pdev) -{ -	struct mt6397_rtc *rtc = platform_get_drvdata(pdev); - -	free_irq(rtc->irq, rtc); - -	return 0; -} -  #ifdef CONFIG_PM_SLEEP  static int mt6397_rtc_suspend(struct device *dev)  { @@ -388,6 +323,7 @@ static SIMPLE_DEV_PM_OPS(mt6397_pm_ops, mt6397_rtc_suspend,  			mt6397_rtc_resume);  static const struct of_device_id mt6397_rtc_of_match[] = { +	{ .compatible = "mediatek,mt6323-rtc", },  	{ .compatible = "mediatek,mt6397-rtc", },  	{ }  }; @@ -400,7 +336,6 @@ static struct platform_driver mtk_rtc_driver = {  		.pm = &mt6397_pm_ops,  	},  	.probe	= mtk_rtc_probe, -	.remove = mtk_rtc_remove,  };  module_platform_driver(mtk_rtc_driver);  |