diff options
author | Scott Wood <scottwood@freescale.com> | 2014-04-08 01:00:49 (GMT) |
---|---|---|
committer | Scott Wood <scottwood@freescale.com> | 2014-04-08 19:58:35 (GMT) |
commit | 47d2261a3fa71cde24263559a4219a25e50d8c89 (patch) | |
tree | 28774d5b330ccf1b777a3af222d8356918328013 /drivers/rtc | |
parent | fb7f27080adc65cd5f341bdf56a1d0c14f316c1b (diff) | |
parent | 5fb9d37f27351e42f002e372074249f92cbdf815 (diff) | |
download | linux-fsl-qoriq-47d2261a3fa71cde24263559a4219a25e50d8c89.tar.xz |
Merge branch 'merge' into sdk-v1.6.x
This reverts v3.13-rc3+ (78fd82238d0e5716) to v3.12, except for
commits which I noticed which appear relevant to the SDK.
Signed-off-by: Scott Wood <scottwood@freescale.com>
Conflicts:
arch/powerpc/include/asm/kvm_host.h
arch/powerpc/kvm/book3s_hv_rmhandlers.S
arch/powerpc/kvm/book3s_interrupts.S
arch/powerpc/kvm/e500.c
arch/powerpc/kvm/e500mc.c
arch/powerpc/sysdev/fsl_soc.h
drivers/Kconfig
drivers/cpufreq/ppc-corenet-cpufreq.c
drivers/dma/fsldma.c
drivers/dma/s3c24xx-dma.c
drivers/misc/Makefile
drivers/mmc/host/sdhci-of-esdhc.c
drivers/mtd/devices/m25p80.c
drivers/net/ethernet/freescale/gianfar.h
drivers/platform/Kconfig
drivers/platform/Makefile
drivers/spi/spi-fsl-espi.c
include/crypto/algapi.h
include/linux/netdev_features.h
include/linux/skbuff.h
include/net/ip.h
net/core/ethtool.c
Diffstat (limited to 'drivers/rtc')
35 files changed, 157 insertions, 1076 deletions
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 0077302..9654aa3 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -153,16 +153,6 @@ config RTC_DRV_88PM80X This driver can also be built as a module. If so, the module will be called rtc-88pm80x. -config RTC_DRV_AS3722 - tristate "ams AS3722 RTC driver" - depends on MFD_AS3722 - help - If you say yes here you get support for the RTC of ams AS3722 PMIC - chips. - - This driver can also be built as a module. If so, the module - will be called rtc-as3722. - config RTC_DRV_DS1307 tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025" help @@ -507,16 +497,6 @@ config RTC_DRV_RV3029C2 This driver can also be built as a module. If so, the module will be called rtc-rv3029c2. -config RTC_DRV_S5M - tristate "Samsung S5M series" - depends on MFD_SEC_CORE - help - If you say yes here you will get support for the - RTC of Samsung S5M PMIC series. - - This driver can also be built as a module. If so, the module - will be called rtc-s5m. - endif # I2C comment "SPI RTC drivers" @@ -626,7 +606,7 @@ comment "Platform RTC drivers" config RTC_DRV_CMOS tristate "PC-style 'CMOS'" - depends on X86 || ARM || M32R || ATARI || PPC || MIPS || SPARC64 + depends on X86 || ALPHA || ARM || M32R || ATARI || PPC || MIPS || SPARC64 default y if X86 help Say "yes" here to get direct support for the real time clock @@ -643,14 +623,6 @@ config RTC_DRV_CMOS This driver can also be built as a module. If so, the module will be called rtc-cmos. -config RTC_DRV_ALPHA - bool "Alpha PC-style CMOS" - depends on ALPHA - default y - help - Direct support for the real-time clock found on every Alpha - system, specifically MC146818 compatibles. If in doubt, say Y. - config RTC_DRV_VRTC tristate "Virtual RTC for Intel MID platforms" depends on X86_INTEL_MID diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 27b4bd8..2dff3d2 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -20,7 +20,6 @@ obj-$(CONFIG_RTC_DRV_88PM860X) += rtc-88pm860x.o obj-$(CONFIG_RTC_DRV_88PM80X) += rtc-88pm80x.o obj-$(CONFIG_RTC_DRV_AB3100) += rtc-ab3100.o obj-$(CONFIG_RTC_DRV_AB8500) += rtc-ab8500.o -obj-$(CONFIG_RTC_DRV_AS3722) += rtc-as3722.o obj-$(CONFIG_RTC_DRV_AT32AP700X)+= rtc-at32ap700x.o obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o obj-$(CONFIG_RTC_DRV_AT91SAM9) += rtc-at91sam9.o @@ -108,7 +107,6 @@ obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o -obj-$(CONFIG_RTC_DRV_S5M) += rtc-s5m.o obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o obj-$(CONFIG_RTC_DRV_SNVS) += rtc-snvs.o diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 544be72..72c5cdb 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c @@ -72,7 +72,6 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) } else err = -EINVAL; - pm_stay_awake(rtc->dev.parent); mutex_unlock(&rtc->ops_lock); /* A timer might have just expired */ schedule_work(&rtc->irqwork); @@ -114,7 +113,6 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs) err = -EINVAL; } - pm_stay_awake(rtc->dev.parent); mutex_unlock(&rtc->ops_lock); /* A timer might have just expired */ schedule_work(&rtc->irqwork); @@ -773,10 +771,9 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer) alarm.time = rtc_ktime_to_tm(timer->node.expires); alarm.enabled = 1; err = __rtc_set_alarm(rtc, &alarm); - if (err == -ETIME) { - pm_stay_awake(rtc->dev.parent); + if (err == -ETIME) schedule_work(&rtc->irqwork); - } else if (err) { + else if (err) { timerqueue_del(&rtc->timerqueue, &timer->node); timer->enabled = 0; return err; @@ -821,10 +818,8 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer) alarm.time = rtc_ktime_to_tm(next->expires); alarm.enabled = 1; err = __rtc_set_alarm(rtc, &alarm); - if (err == -ETIME) { - pm_stay_awake(rtc->dev.parent); + if (err == -ETIME) schedule_work(&rtc->irqwork); - } } } @@ -850,6 +845,7 @@ void rtc_timer_do_work(struct work_struct *work) mutex_lock(&rtc->ops_lock); again: + pm_relax(rtc->dev.parent); __rtc_read_time(rtc, &tm); now = rtc_tm_to_ktime(tm); while ((next = timerqueue_getnext(&rtc->timerqueue))) { @@ -884,7 +880,6 @@ again: } else rtc_alarm_disable(rtc); - pm_relax(rtc->dev.parent); mutex_unlock(&rtc->ops_lock); } diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c index 0916089..354c937 100644 --- a/drivers/rtc/rtc-88pm80x.c +++ b/drivers/rtc/rtc-88pm80x.c @@ -251,15 +251,14 @@ static SIMPLE_DEV_PM_OPS(pm80x_rtc_pm_ops, pm80x_rtc_suspend, pm80x_rtc_resume); static int pm80x_rtc_probe(struct platform_device *pdev) { struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); - struct pm80x_platform_data *pm80x_pdata = - dev_get_platdata(pdev->dev.parent); + struct pm80x_platform_data *pm80x_pdata; struct pm80x_rtc_pdata *pdata = NULL; struct pm80x_rtc_info *info; struct rtc_time tm; unsigned long ticks = 0; int ret; - pdata = dev_get_platdata(&pdev->dev); + pdata = pdev->dev.platform_data; if (pdata == NULL) dev_warn(&pdev->dev, "No platform data!\n"); @@ -327,7 +326,8 @@ static int pm80x_rtc_probe(struct platform_device *pdev) regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_RTC1_USE_XO, PM800_RTC1_USE_XO); - if (pm80x_pdata) { + if (pdev->dev.parent->platform_data) { + pm80x_pdata = pdev->dev.parent->platform_data; pdata = pm80x_pdata->rtc; if (pdata) info->rtc_dev->dev.platform_data = &pdata->rtc_wakeup; diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c index 81650484..4e30c85 100644 --- a/drivers/rtc/rtc-88pm860x.c +++ b/drivers/rtc/rtc-88pm860x.c @@ -316,7 +316,7 @@ static int pm860x_rtc_probe(struct platform_device *pdev) unsigned long ticks = 0; int ret; - pdata = dev_get_platdata(&pdev->dev); + pdata = pdev->dev.platform_data; info = devm_kzalloc(&pdev->dev, sizeof(struct pm860x_rtc_info), GFP_KERNEL); diff --git a/drivers/rtc/rtc-as3722.c b/drivers/rtc/rtc-as3722.c deleted file mode 100644 index 9cfa817..0000000 --- a/drivers/rtc/rtc-as3722.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * rtc-as3722.c - Real Time Clock driver for ams AS3722 PMICs - * - * Copyright (C) 2013 ams AG - * Copyright (c) 2013, NVIDIA Corporation. All rights reserved. - * - * Author: Florian Lobmaier <florian.lobmaier@ams.com> - * Author: Laxman Dewangan <ldewangan@nvidia.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <linux/bcd.h> -#include <linux/completion.h> -#include <linux/delay.h> -#include <linux/interrupt.h> -#include <linux/ioctl.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/mfd/as3722.h> -#include <linux/platform_device.h> -#include <linux/rtc.h> -#include <linux/time.h> - -#define AS3722_RTC_START_YEAR 2000 -struct as3722_rtc { - struct rtc_device *rtc; - struct device *dev; - struct as3722 *as3722; - int alarm_irq; - bool irq_enable; -}; - -static void as3722_time_to_reg(u8 *rbuff, struct rtc_time *tm) -{ - rbuff[0] = bin2bcd(tm->tm_sec); - rbuff[1] = bin2bcd(tm->tm_min); - rbuff[2] = bin2bcd(tm->tm_hour); - rbuff[3] = bin2bcd(tm->tm_mday); - rbuff[4] = bin2bcd(tm->tm_mon); - rbuff[5] = bin2bcd(tm->tm_year - (AS3722_RTC_START_YEAR - 1900)); -} - -static void as3722_reg_to_time(u8 *rbuff, struct rtc_time *tm) -{ - tm->tm_sec = bcd2bin(rbuff[0] & 0x7F); - tm->tm_min = bcd2bin(rbuff[1] & 0x7F); - tm->tm_hour = bcd2bin(rbuff[2] & 0x3F); - tm->tm_mday = bcd2bin(rbuff[3] & 0x3F); - tm->tm_mon = bcd2bin(rbuff[4] & 0x1F); - tm->tm_year = (AS3722_RTC_START_YEAR - 1900) + bcd2bin(rbuff[5] & 0x7F); - return; -} - -static int as3722_rtc_read_time(struct device *dev, struct rtc_time *tm) -{ - struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); - struct as3722 *as3722 = as3722_rtc->as3722; - u8 as_time_array[6]; - int ret; - - ret = as3722_block_read(as3722, AS3722_RTC_SECOND_REG, - 6, as_time_array); - if (ret < 0) { - dev_err(dev, "RTC_SECOND reg block read failed %d\n", ret); - return ret; - } - as3722_reg_to_time(as_time_array, tm); - return 0; -} - -static int as3722_rtc_set_time(struct device *dev, struct rtc_time *tm) -{ - struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); - struct as3722 *as3722 = as3722_rtc->as3722; - u8 as_time_array[6]; - int ret; - - if (tm->tm_year < (AS3722_RTC_START_YEAR - 1900)) - return -EINVAL; - - as3722_time_to_reg(as_time_array, tm); - ret = as3722_block_write(as3722, AS3722_RTC_SECOND_REG, 6, - as_time_array); - if (ret < 0) - dev_err(dev, "RTC_SECOND reg block write failed %d\n", ret); - return ret; -} - -static int as3722_rtc_alarm_irq_enable(struct device *dev, - unsigned int enabled) -{ - struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); - - if (enabled && !as3722_rtc->irq_enable) { - enable_irq(as3722_rtc->alarm_irq); - as3722_rtc->irq_enable = true; - } else if (!enabled && as3722_rtc->irq_enable) { - disable_irq(as3722_rtc->alarm_irq); - as3722_rtc->irq_enable = false; - } - return 0; -} - -static int as3722_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) -{ - struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); - struct as3722 *as3722 = as3722_rtc->as3722; - u8 as_time_array[6]; - int ret; - - ret = as3722_block_read(as3722, AS3722_RTC_ALARM_SECOND_REG, 6, - as_time_array); - if (ret < 0) { - dev_err(dev, "RTC_ALARM_SECOND block read failed %d\n", ret); - return ret; - } - - as3722_reg_to_time(as_time_array, &alrm->time); - return 0; -} - -static int as3722_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) -{ - struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); - struct as3722 *as3722 = as3722_rtc->as3722; - u8 as_time_array[6]; - int ret; - - if (alrm->time.tm_year < (AS3722_RTC_START_YEAR - 1900)) - return -EINVAL; - - ret = as3722_rtc_alarm_irq_enable(dev, 0); - if (ret < 0) { - dev_err(dev, "Disable RTC alarm failed\n"); - return ret; - } - - as3722_time_to_reg(as_time_array, &alrm->time); - ret = as3722_block_write(as3722, AS3722_RTC_ALARM_SECOND_REG, 6, - as_time_array); - if (ret < 0) { - dev_err(dev, "RTC_ALARM_SECOND block write failed %d\n", ret); - return ret; - } - - if (alrm->enabled) - ret = as3722_rtc_alarm_irq_enable(dev, alrm->enabled); - return ret; -} - -static irqreturn_t as3722_alarm_irq(int irq, void *data) -{ - struct as3722_rtc *as3722_rtc = data; - - rtc_update_irq(as3722_rtc->rtc, 1, RTC_IRQF | RTC_AF); - return IRQ_HANDLED; -} - -static const struct rtc_class_ops as3722_rtc_ops = { - .read_time = as3722_rtc_read_time, - .set_time = as3722_rtc_set_time, - .read_alarm = as3722_rtc_read_alarm, - .set_alarm = as3722_rtc_set_alarm, - .alarm_irq_enable = as3722_rtc_alarm_irq_enable, -}; - -static int as3722_rtc_probe(struct platform_device *pdev) -{ - struct as3722 *as3722 = dev_get_drvdata(pdev->dev.parent); - struct as3722_rtc *as3722_rtc; - int ret; - - as3722_rtc = devm_kzalloc(&pdev->dev, sizeof(*as3722_rtc), GFP_KERNEL); - if (!as3722_rtc) - return -ENOMEM; - - as3722_rtc->as3722 = as3722; - as3722_rtc->dev = &pdev->dev; - platform_set_drvdata(pdev, as3722_rtc); - - /* Enable the RTC to make sure it is running. */ - ret = as3722_update_bits(as3722, AS3722_RTC_CONTROL_REG, - AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN, - AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN); - if (ret < 0) { - dev_err(&pdev->dev, "RTC_CONTROL reg write failed: %d\n", ret); - return ret; - } - - device_init_wakeup(&pdev->dev, 1); - - as3722_rtc->rtc = rtc_device_register("as3722", &pdev->dev, - &as3722_rtc_ops, THIS_MODULE); - if (IS_ERR(as3722_rtc->rtc)) { - ret = PTR_ERR(as3722_rtc->rtc); - dev_err(&pdev->dev, "RTC register failed: %d\n", ret); - return ret; - } - - as3722_rtc->alarm_irq = platform_get_irq(pdev, 0); - dev_info(&pdev->dev, "RTC interrupt %d\n", as3722_rtc->alarm_irq); - - ret = request_threaded_irq(as3722_rtc->alarm_irq, NULL, - as3722_alarm_irq, IRQF_ONESHOT | IRQF_EARLY_RESUME, - "rtc-alarm", as3722_rtc); - if (ret < 0) { - dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n", - as3722_rtc->alarm_irq, ret); - goto scrub; - } - disable_irq(as3722_rtc->alarm_irq); - return 0; -scrub: - rtc_device_unregister(as3722_rtc->rtc); - return ret; -} - -static int as3722_rtc_remove(struct platform_device *pdev) -{ - struct as3722_rtc *as3722_rtc = platform_get_drvdata(pdev); - - free_irq(as3722_rtc->alarm_irq, as3722_rtc); - rtc_device_unregister(as3722_rtc->rtc); - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int as3722_rtc_suspend(struct device *dev) -{ - struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); - - if (device_may_wakeup(dev)) - enable_irq_wake(as3722_rtc->alarm_irq); - - return 0; -} - -static int as3722_rtc_resume(struct device *dev) -{ - struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); - - if (device_may_wakeup(dev)) - disable_irq_wake(as3722_rtc->alarm_irq); - return 0; -} -#endif - -static const struct dev_pm_ops as3722_rtc_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(as3722_rtc_suspend, as3722_rtc_resume) -}; - -static struct platform_driver as3722_rtc_driver = { - .probe = as3722_rtc_probe, - .remove = as3722_rtc_remove, - .driver = { - .name = "as3722-rtc", - .pm = &as3722_rtc_pm_ops, - }, -}; -module_platform_driver(as3722_rtc_driver); - -MODULE_DESCRIPTION("RTC driver for AS3722 PMICs"); -MODULE_ALIAS("platform:as3722-rtc"); -MODULE_AUTHOR("Florian Lobmaier <florian.lobmaier@ams.com>"); -MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>"); -MODULE_LICENSE("GPL"); diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index c0da95e..7418926 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c @@ -376,8 +376,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev) return -ENXIO; } - at91_rtc_regs = devm_ioremap(&pdev->dev, regs->start, - resource_size(regs)); + at91_rtc_regs = ioremap(regs->start, resource_size(regs)); if (!at91_rtc_regs) { dev_err(&pdev->dev, "failed to map registers, aborting.\n"); return -ENOMEM; @@ -391,12 +390,12 @@ static int __init at91_rtc_probe(struct platform_device *pdev) AT91_RTC_SECEV | AT91_RTC_TIMEV | AT91_RTC_CALEV); - ret = devm_request_irq(&pdev->dev, irq, at91_rtc_interrupt, + ret = request_irq(irq, at91_rtc_interrupt, IRQF_SHARED, "at91_rtc", pdev); if (ret) { dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); - return ret; + goto err_unmap; } /* cpu init code should really have flagged this device as @@ -405,14 +404,23 @@ static int __init at91_rtc_probe(struct platform_device *pdev) if (!device_can_wakeup(&pdev->dev)) device_init_wakeup(&pdev->dev, 1); - rtc = devm_rtc_device_register(&pdev->dev, pdev->name, + rtc = rtc_device_register(pdev->name, &pdev->dev, &at91_rtc_ops, THIS_MODULE); - if (IS_ERR(rtc)) - return PTR_ERR(rtc); + if (IS_ERR(rtc)) { + ret = PTR_ERR(rtc); + goto err_free_irq; + } platform_set_drvdata(pdev, rtc); dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); return 0; + +err_free_irq: + free_irq(irq, pdev); +err_unmap: + iounmap(at91_rtc_regs); + + return ret; } /* @@ -420,20 +428,18 @@ static int __init at91_rtc_probe(struct platform_device *pdev) */ static int __exit at91_rtc_remove(struct platform_device *pdev) { + struct rtc_device *rtc = platform_get_drvdata(pdev); + /* Disable all interrupts */ at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | AT91_RTC_SECEV | AT91_RTC_TIMEV | AT91_RTC_CALEV); + free_irq(irq, pdev); - return 0; -} + rtc_device_unregister(rtc); + iounmap(at91_rtc_regs); -static void at91_rtc_shutdown(struct platform_device *pdev) -{ - /* Disable all interrupts */ - at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | - AT91_RTC_SECEV | AT91_RTC_TIMEV | - AT91_RTC_CALEV); + return 0; } #ifdef CONFIG_PM_SLEEP @@ -474,7 +480,6 @@ static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume); static struct platform_driver at91_rtc_driver = { .remove = __exit_p(at91_rtc_remove), - .shutdown = at91_rtc_shutdown, .driver = { .name = "at91_rtc", .owner = THIS_MODULE, diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index f148762..24e733c 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -595,7 +595,7 @@ static irqreturn_t cmos_interrupt(int irq, void *p) static int INITSECTION cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) { - struct cmos_rtc_board_info *info = dev_get_platdata(dev); + struct cmos_rtc_board_info *info = dev->platform_data; int retval = 0; unsigned char rtc_control; unsigned address_space; @@ -789,6 +789,7 @@ static void __exit cmos_do_remove(struct device *dev) cmos->iomem = NULL; cmos->dev = NULL; + dev_set_drvdata(dev, NULL); } #ifdef CONFIG_PM diff --git a/drivers/rtc/rtc-da9055.c b/drivers/rtc/rtc-da9055.c index 48cb2ac3..e00642b 100644 --- a/drivers/rtc/rtc-da9055.c +++ b/drivers/rtc/rtc-da9055.c @@ -278,7 +278,7 @@ static int da9055_rtc_probe(struct platform_device *pdev) return -ENOMEM; rtc->da9055 = dev_get_drvdata(pdev->dev.parent); - pdata = dev_get_platdata(rtc->da9055->dev); + pdata = rtc->da9055->dev->platform_data; platform_set_drvdata(pdev, rtc); ret = da9055_rtc_device_init(rtc->da9055, pdata); diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index 80f3237..dd6170a 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c @@ -606,7 +606,7 @@ static int ds1305_probe(struct spi_device *spi) struct ds1305 *ds1305; int status; u8 addr, value; - struct ds1305_platform_data *pdata = dev_get_platdata(&spi->dev); + struct ds1305_platform_data *pdata = spi->dev.platform_data; bool write_ctrl = false; /* Sanity check board setup data. This may be hooked up diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 4e75345..ca18fd1 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -670,9 +670,9 @@ static int ds1307_probe(struct i2c_client *client, int tmp; const struct chip_desc *chip = &chips[id->driver_data]; struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); - bool want_irq = false; + int want_irq = false; unsigned char *buf; - struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev); + struct ds1307_platform_data *pdata = client->dev.platform_data; static const int bbsqi_bitpos[] = { [ds_1337] = 0, [ds_1339] = DS1339_BIT_BBSQI, @@ -956,7 +956,7 @@ read_rtc: GFP_KERNEL); if (!ds1307->nvram) { err = -ENOMEM; - goto err_irq; + goto exit; } ds1307->nvram->attr.name = "nvram"; ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; @@ -967,15 +967,13 @@ read_rtc: ds1307->nvram_offset = chip->nvram_offset; err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); if (err) - goto err_irq; + goto exit; set_bit(HAS_NVRAM, &ds1307->flags); dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); } return 0; -err_irq: - free_irq(client->irq, client); exit: return err; } diff --git a/drivers/rtc/rtc-ds2404.c b/drivers/rtc/rtc-ds2404.c index fc209dc..2ca5a23 100644 --- a/drivers/rtc/rtc-ds2404.c +++ b/drivers/rtc/rtc-ds2404.c @@ -224,7 +224,7 @@ static const struct rtc_class_ops ds2404_rtc_ops = { static int rtc_probe(struct platform_device *pdev) { - struct ds2404_platform_data *pdata = dev_get_platdata(&pdev->dev); + struct ds2404_platform_data *pdata = pdev->dev.platform_data; struct ds2404 *chip; int retval = -EBUSY; diff --git a/drivers/rtc/rtc-ep93xx.c b/drivers/rtc/rtc-ep93xx.c index 5e4f5dc..580e7b5 100644 --- a/drivers/rtc/rtc-ep93xx.c +++ b/drivers/rtc/rtc-ep93xx.c @@ -42,7 +42,7 @@ struct ep93xx_rtc { static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, unsigned short *delete) { - struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); + struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; unsigned long comp; comp = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_SWCOMP); @@ -60,7 +60,7 @@ static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) { - struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); + struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; unsigned long time; time = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA); @@ -71,7 +71,7 @@ static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) { - struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); + struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; __raw_writel(secs + 1, ep93xx_rtc->mmio_base + EP93XX_RTC_LOAD); return 0; diff --git a/drivers/rtc/rtc-hid-sensor-time.c b/drivers/rtc/rtc-hid-sensor-time.c index 965a9da..4e2a818 100644 --- a/drivers/rtc/rtc-hid-sensor-time.c +++ b/drivers/rtc/rtc-hid-sensor-time.c @@ -209,7 +209,7 @@ static int hid_rtc_read_time(struct device *dev, struct rtc_time *tm) platform_get_drvdata(to_platform_device(dev)); int ret; - reinit_completion(&time_state->comp_last_time); + INIT_COMPLETION(time_state->comp_last_time); /* get a report with all values through requesting one value */ sensor_hub_input_attr_get_raw_value(time_state->common_attributes.hsdev, HID_USAGE_SENSOR_TIME, hid_time_addresses[0], @@ -236,7 +236,7 @@ static const struct rtc_class_ops hid_time_rtc_ops = { static int hid_time_probe(struct platform_device *pdev) { int ret = 0; - struct hid_sensor_hub_device *hsdev = dev_get_platdata(&pdev->dev); + struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; struct hid_time_state *time_state = devm_kzalloc(&pdev->dev, sizeof(struct hid_time_state), GFP_KERNEL); @@ -275,44 +275,24 @@ static int hid_time_probe(struct platform_device *pdev) return ret; } - ret = sensor_hub_device_open(hsdev); - if (ret) { - dev_err(&pdev->dev, "failed to open sensor hub device!\n"); - goto err_open; - } - - /* - * Enable HID input processing early in order to be able to read the - * clock already in devm_rtc_device_register(). - */ - hid_device_io_start(hsdev->hdev); - time_state->rtc = devm_rtc_device_register(&pdev->dev, "hid-sensor-time", &hid_time_rtc_ops, THIS_MODULE); if (IS_ERR_OR_NULL(time_state->rtc)) { - hid_device_io_stop(hsdev->hdev); ret = time_state->rtc ? PTR_ERR(time_state->rtc) : -ENODEV; time_state->rtc = NULL; + sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME); dev_err(&pdev->dev, "rtc device register failed!\n"); - goto err_rtc; } return ret; - -err_rtc: - sensor_hub_device_close(hsdev); -err_open: - sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME); - return ret; } static int hid_time_remove(struct platform_device *pdev) { - struct hid_sensor_hub_device *hsdev = dev_get_platdata(&pdev->dev); + struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; - sensor_hub_device_close(hsdev); sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME); return 0; diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c index c3c549d..c016ad8 100644 --- a/drivers/rtc/rtc-isl1208.c +++ b/drivers/rtc/rtc-isl1208.c @@ -144,7 +144,11 @@ isl1208_i2c_validate_client(struct i2c_client *client) static int isl1208_i2c_get_sr(struct i2c_client *client) { - return i2c_smbus_read_byte_data(client, ISL1208_REG_SR); + int sr = i2c_smbus_read_byte_data(client, ISL1208_REG_SR); + if (sr < 0) + return -EIO; + + return sr; } static int @@ -643,11 +647,10 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) "chip found, driver version " DRV_VERSION "\n"); if (client->irq > 0) { - rc = devm_request_threaded_irq(&client->dev, client->irq, NULL, - isl1208_rtc_interrupt, - IRQF_SHARED, - isl1208_driver.driver.name, - client); + rc = request_threaded_irq(client->irq, NULL, + isl1208_rtc_interrupt, + IRQF_SHARED, + isl1208_driver.driver.name, client); if (!rc) { device_init_wakeup(&client->dev, 1); enable_irq_wake(client->irq); @@ -659,18 +662,20 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) } } - rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name, - &isl1208_rtc_ops, + rtc = rtc_device_register(isl1208_driver.driver.name, + &client->dev, &isl1208_rtc_ops, THIS_MODULE); - if (IS_ERR(rtc)) - return PTR_ERR(rtc); + if (IS_ERR(rtc)) { + rc = PTR_ERR(rtc); + goto exit_free_irq; + } i2c_set_clientdata(client, rtc); rc = isl1208_i2c_get_sr(client); if (rc < 0) { dev_err(&client->dev, "reading status failed\n"); - return rc; + goto exit_unregister; } if (rc & ISL1208_REG_SR_RTCF) @@ -679,15 +684,28 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); if (rc) - return rc; + goto exit_unregister; return 0; + +exit_unregister: + rtc_device_unregister(rtc); +exit_free_irq: + if (client->irq) + free_irq(client->irq, client); + + return rc; } static int isl1208_remove(struct i2c_client *client) { + struct rtc_device *rtc = i2c_get_clientdata(client); + sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); + rtc_device_unregister(rtc); + if (client->irq) + free_irq(client->irq, client); return 0; } diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c index 11880c1..fcb0329 100644 --- a/drivers/rtc/rtc-m48t59.c +++ b/drivers/rtc/rtc-m48t59.c @@ -68,7 +68,7 @@ m48t59_mem_readb(struct device *dev, u32 ofs) static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) { struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); unsigned long flags; u8 val; @@ -111,7 +111,7 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) { struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); unsigned long flags; u8 val = 0; @@ -158,7 +158,7 @@ static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) { struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); struct rtc_time *tm = &alrm->time; unsigned long flags; @@ -205,7 +205,7 @@ static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) { struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); struct rtc_time *tm = &alrm->time; u8 mday, hour, min, sec; @@ -266,7 +266,7 @@ static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) { struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); unsigned long flags; @@ -283,7 +283,7 @@ static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) static int m48t59_rtc_proc(struct device *dev, struct seq_file *seq) { struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); unsigned long flags; u8 val; @@ -304,7 +304,7 @@ static irqreturn_t m48t59_rtc_interrupt(int irq, void *dev_id) { struct device *dev = (struct device *)dev_id; struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); u8 event; @@ -340,7 +340,7 @@ static ssize_t m48t59_nvram_read(struct file *filp, struct kobject *kobj, { struct device *dev = container_of(kobj, struct device, kobj); struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); ssize_t cnt = 0; unsigned long flags; @@ -360,7 +360,7 @@ static ssize_t m48t59_nvram_write(struct file *filp, struct kobject *kobj, { struct device *dev = container_of(kobj, struct device, kobj); struct platform_device *pdev = to_platform_device(dev); - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = platform_get_drvdata(pdev); ssize_t cnt = 0; unsigned long flags; @@ -385,7 +385,7 @@ static struct bin_attribute m48t59_nvram_attr = { static int m48t59_rtc_probe(struct platform_device *pdev) { - struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); + struct m48t59_plat_data *pdata = pdev->dev.platform_data; struct m48t59_private *m48t59 = NULL; struct resource *res; int ret = -ENOMEM; diff --git a/drivers/rtc/rtc-m48t86.c b/drivers/rtc/rtc-m48t86.c index 32f64c9..2d30314 100644 --- a/drivers/rtc/rtc-m48t86.c +++ b/drivers/rtc/rtc-m48t86.c @@ -46,7 +46,7 @@ static int m48t86_rtc_read_time(struct device *dev, struct rtc_time *tm) { unsigned char reg; struct platform_device *pdev = to_platform_device(dev); - struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); + struct m48t86_ops *ops = pdev->dev.platform_data; reg = ops->readbyte(M48T86_REG_B); @@ -84,7 +84,7 @@ static int m48t86_rtc_set_time(struct device *dev, struct rtc_time *tm) { unsigned char reg; struct platform_device *pdev = to_platform_device(dev); - struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); + struct m48t86_ops *ops = pdev->dev.platform_data; reg = ops->readbyte(M48T86_REG_B); @@ -123,7 +123,7 @@ static int m48t86_rtc_proc(struct device *dev, struct seq_file *seq) { unsigned char reg; struct platform_device *pdev = to_platform_device(dev); - struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); + struct m48t86_ops *ops = pdev->dev.platform_data; reg = ops->readbyte(M48T86_REG_B); @@ -147,7 +147,7 @@ static const struct rtc_class_ops m48t86_rtc_ops = { static int m48t86_rtc_probe(struct platform_device *dev) { unsigned char reg; - struct m48t86_ops *ops = dev_get_platdata(&dev->dev); + struct m48t86_ops *ops = dev->dev.platform_data; struct rtc_device *rtc; rtc = devm_rtc_device_register(&dev->dev, "m48t86", diff --git a/drivers/rtc/rtc-max6900.c b/drivers/rtc/rtc-max6900.c index 4804985..55969b1 100644 --- a/drivers/rtc/rtc-max6900.c +++ b/drivers/rtc/rtc-max6900.c @@ -164,7 +164,14 @@ static int max6900_i2c_read_time(struct i2c_client *client, struct rtc_time *tm) static int max6900_i2c_clear_write_protect(struct i2c_client *client) { - return i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0); + int rc; + rc = i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0); + if (rc < 0) { + dev_err(&client->dev, "%s: control register write failed\n", + __func__); + return -EIO; + } + return 0; } static int diff --git a/drivers/rtc/rtc-mpc5121.c b/drivers/rtc/rtc-mpc5121.c index dc4f142..9c8f609 100644 --- a/drivers/rtc/rtc-mpc5121.c +++ b/drivers/rtc/rtc-mpc5121.c @@ -14,9 +14,7 @@ #include <linux/module.h> #include <linux/rtc.h> #include <linux/of.h> -#include <linux/of_address.h> #include <linux/of_device.h> -#include <linux/of_irq.h> #include <linux/of_platform.h> #include <linux/io.h> #include <linux/slab.h> diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c index e2436d1..578baf9 100644 --- a/drivers/rtc/rtc-mrst.c +++ b/drivers/rtc/rtc-mrst.c @@ -38,8 +38,8 @@ #include <asm-generic/rtc.h> #include <asm/intel_scu_ipc.h> -#include <asm/intel-mid.h> -#include <asm/intel_mid_vrtc.h> +#include <asm/mrst.h> +#include <asm/mrst-vrtc.h> struct mrst_rtc { struct rtc_device *rtc; @@ -380,6 +380,7 @@ static int vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, cleanup1: rtc_device_unregister(mrst_rtc.rtc); cleanup0: + dev_set_drvdata(dev, NULL); mrst_rtc.dev = NULL; release_mem_region(iomem->start, resource_size(iomem)); dev_err(dev, "rtc-mrst: unable to initialise\n"); @@ -411,6 +412,7 @@ static void rtc_mrst_do_remove(struct device *dev) mrst->iomem = NULL; mrst->dev = NULL; + dev_set_drvdata(dev, NULL); } #ifdef CONFIG_PM diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 26de5f8..c7d97ee 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c @@ -553,7 +553,7 @@ static struct platform_driver omap_rtc_driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, .pm = &omap_rtc_pm_ops, - .of_match_table = omap_rtc_of_match, + .of_match_table = of_match_ptr(omap_rtc_of_match), }, .id_table = omap_rtc_devtype, }; diff --git a/drivers/rtc/rtc-pcf2123.c b/drivers/rtc/rtc-pcf2123.c index d1953bb..1725b50 100644 --- a/drivers/rtc/rtc-pcf2123.c +++ b/drivers/rtc/rtc-pcf2123.c @@ -327,7 +327,7 @@ kfree_exit: static int pcf2123_remove(struct spi_device *spi) { - struct pcf2123_plat_data *pdata = dev_get_platdata(&spi->dev); + struct pcf2123_plat_data *pdata = spi->dev.platform_data; int i; if (pdata) { diff --git a/drivers/rtc/rtc-pl030.c b/drivers/rtc/rtc-pl030.c index f85a1a9..22bacdb 100644 --- a/drivers/rtc/rtc-pl030.c +++ b/drivers/rtc/rtc-pl030.c @@ -106,7 +106,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) if (ret) goto err_req; - rtc = devm_kzalloc(&dev->dev, sizeof(*rtc), GFP_KERNEL); + rtc = kmalloc(sizeof(*rtc), GFP_KERNEL); if (!rtc) { ret = -ENOMEM; goto err_rtc; @@ -115,7 +115,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) rtc->base = ioremap(dev->res.start, resource_size(&dev->res)); if (!rtc->base) { ret = -ENOMEM; - goto err_rtc; + goto err_map; } __raw_writel(0, rtc->base + RTC_CR); @@ -141,6 +141,8 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) free_irq(dev->irq[0], rtc); err_irq: iounmap(rtc->base); + err_map: + kfree(rtc); err_rtc: amba_release_regions(dev); err_req: @@ -151,11 +153,14 @@ static int pl030_remove(struct amba_device *dev) { struct pl030_rtc *rtc = amba_get_drvdata(dev); + amba_set_drvdata(dev, NULL); + writel(0, rtc->base + RTC_CR); free_irq(dev->irq[0], rtc); rtc_device_unregister(rtc->rtc); iounmap(rtc->base); + kfree(rtc); amba_release_regions(dev); return 0; diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c index 99181fff..0f0609b 100644 --- a/drivers/rtc/rtc-pl031.c +++ b/drivers/rtc/rtc-pl031.c @@ -305,6 +305,7 @@ static int pl031_remove(struct amba_device *adev) { struct pl031_local *ldata = dev_get_drvdata(&adev->dev); + amba_set_drvdata(adev, NULL); free_irq(adev->irq[0], ldata); rtc_device_unregister(ldata->rtc); iounmap(ldata->base); @@ -370,7 +371,6 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) } } - device_init_wakeup(&adev->dev, 1); ldata->rtc = rtc_device_register("pl031", &adev->dev, ops, THIS_MODULE); if (IS_ERR(ldata->rtc)) { @@ -384,12 +384,15 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) goto out_no_irq; } + device_init_wakeup(&adev->dev, 1); + return 0; out_no_irq: rtc_device_unregister(ldata->rtc); out_no_rtc: iounmap(ldata->base); + amba_set_drvdata(adev, NULL); out_no_remap: kfree(ldata); out: diff --git a/drivers/rtc/rtc-puv3.c b/drivers/rtc/rtc-puv3.c index 1ecfe3b..402732c 100644 --- a/drivers/rtc/rtc-puv3.c +++ b/drivers/rtc/rtc-puv3.c @@ -53,11 +53,11 @@ static irqreturn_t puv3_rtc_tickirq(int irq, void *id) } /* Update control registers */ -static void puv3_rtc_setaie(struct device *dev, int to) +static void puv3_rtc_setaie(int to) { unsigned int tmp; - dev_dbg(dev, "%s: aie=%d\n", __func__, to); + pr_debug("%s: aie=%d\n", __func__, to); tmp = readl(RTC_RTSR) & ~RTC_RTSR_ALE; @@ -71,7 +71,7 @@ static int puv3_rtc_setpie(struct device *dev, int enabled) { unsigned int tmp; - dev_debug(dev, "%s: pie=%d\n", __func__, enabled); + pr_debug("%s: pie=%d\n", __func__, enabled); spin_lock_irq(&puv3_rtc_pie_lock); tmp = readl(RTC_RTSR) & ~RTC_RTSR_HZE; @@ -90,7 +90,7 @@ static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) { rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); - dev_dbg(dev, "read time %02x.%02x.%02x %02x/%02x/%02x\n", + pr_debug("read time %02x.%02x.%02x %02x/%02x/%02x\n", rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); @@ -101,7 +101,7 @@ static int puv3_rtc_settime(struct device *dev, struct rtc_time *tm) { unsigned long rtc_count = 0; - dev_dbg(dev, "set time %02d.%02d.%02d %02d/%02d/%02d\n", + pr_debug("set time %02d.%02d.%02d %02d/%02d/%02d\n", tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); @@ -119,7 +119,7 @@ static int puv3_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm) alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE; - dev_dbg(dev, "read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n", + pr_debug("read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n", alrm->enabled, alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); @@ -132,7 +132,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) struct rtc_time *tm = &alrm->time; unsigned long rtcalarm_count = 0; - dev_dbg(dev, "puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n", + pr_debug("puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n", alrm->enabled, tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff, tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec); @@ -140,7 +140,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) rtc_tm_to_time(tm, &rtcalarm_count); writel(rtcalarm_count, RTC_RTAR); - puv3_rtc_setaie(&dev->dev, alrm->enabled); + puv3_rtc_setaie(alrm->enabled); if (alrm->enabled) enable_irq_wake(puv3_rtc_alarmno); @@ -227,7 +227,7 @@ static int puv3_rtc_remove(struct platform_device *dev) rtc_device_unregister(rtc); puv3_rtc_setpie(&dev->dev, 0); - puv3_rtc_setaie(&dev->dev, 0); + puv3_rtc_setaie(0); release_resource(puv3_rtc_mem); kfree(puv3_rtc_mem); @@ -241,7 +241,7 @@ static int puv3_rtc_probe(struct platform_device *pdev) struct resource *res; int ret; - dev_dbg(&pdev->dev, "%s: probe=%p\n", __func__, pdev); + pr_debug("%s: probe=%p\n", __func__, pdev); /* find the IRQs */ puv3_rtc_tickno = platform_get_irq(pdev, 1); @@ -256,7 +256,7 @@ static int puv3_rtc_probe(struct platform_device *pdev) return -ENOENT; } - dev_dbg(&pdev->dev, "PKUnity_rtc: tick irq %d, alarm irq %d\n", + pr_debug("PKUnity_rtc: tick irq %d, alarm irq %d\n", puv3_rtc_tickno, puv3_rtc_alarmno); /* get the memory region */ diff --git a/drivers/rtc/rtc-rs5c348.c b/drivers/rtc/rtc-rs5c348.c index 090a101..f7a90a1 100644 --- a/drivers/rtc/rtc-rs5c348.c +++ b/drivers/rtc/rtc-rs5c348.c @@ -64,7 +64,7 @@ static int rs5c348_rtc_set_time(struct device *dev, struct rtc_time *tm) { struct spi_device *spi = to_spi_device(dev); - struct rs5c348_plat_data *pdata = dev_get_platdata(&spi->dev); + struct rs5c348_plat_data *pdata = spi->dev.platform_data; u8 txbuf[5+7], *txp; int ret; @@ -100,7 +100,7 @@ static int rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) { struct spi_device *spi = to_spi_device(dev); - struct rs5c348_plat_data *pdata = dev_get_platdata(&spi->dev); + struct rs5c348_plat_data *pdata = spi->dev.platform_data; u8 txbuf[5], rxbuf[7]; int ret; diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c deleted file mode 100644 index b7fd02b..0000000 --- a/drivers/rtc/rtc-s5m.c +++ /dev/null @@ -1,635 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd - * http://www.samsung.com - * - * Copyright (C) 2013 Google, Inc - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <linux/module.h> -#include <linux/i2c.h> -#include <linux/slab.h> -#include <linux/bcd.h> -#include <linux/bitops.h> -#include <linux/regmap.h> -#include <linux/rtc.h> -#include <linux/delay.h> -#include <linux/platform_device.h> -#include <linux/mfd/samsung/core.h> -#include <linux/mfd/samsung/irq.h> -#include <linux/mfd/samsung/rtc.h> - -struct s5m_rtc_info { - struct device *dev; - struct sec_pmic_dev *s5m87xx; - struct regmap *rtc; - struct rtc_device *rtc_dev; - int irq; - int device_type; - int rtc_24hr_mode; - bool wtsr_smpl; -}; - -static void s5m8767_data_to_tm(u8 *data, struct rtc_time *tm, - int rtc_24hr_mode) -{ - tm->tm_sec = data[RTC_SEC] & 0x7f; - tm->tm_min = data[RTC_MIN] & 0x7f; - if (rtc_24hr_mode) { - tm->tm_hour = data[RTC_HOUR] & 0x1f; - } else { - tm->tm_hour = data[RTC_HOUR] & 0x0f; - if (data[RTC_HOUR] & HOUR_PM_MASK) - tm->tm_hour += 12; - } - - tm->tm_wday = ffs(data[RTC_WEEKDAY] & 0x7f); - tm->tm_mday = data[RTC_DATE] & 0x1f; - tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1; - tm->tm_year = (data[RTC_YEAR1] & 0x7f) + 100; - tm->tm_yday = 0; - tm->tm_isdst = 0; -} - -static int s5m8767_tm_to_data(struct rtc_time *tm, u8 *data) -{ - data[RTC_SEC] = tm->tm_sec; - data[RTC_MIN] = tm->tm_min; - - if (tm->tm_hour >= 12) - data[RTC_HOUR] = tm->tm_hour | HOUR_PM_MASK; - else - data[RTC_HOUR] = tm->tm_hour & ~HOUR_PM_MASK; - - data[RTC_WEEKDAY] = 1 << tm->tm_wday; - data[RTC_DATE] = tm->tm_mday; - data[RTC_MONTH] = tm->tm_mon + 1; - data[RTC_YEAR1] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0; - - if (tm->tm_year < 100) { - pr_err("s5m8767 RTC cannot handle the year %d.\n", - 1900 + tm->tm_year); - return -EINVAL; - } else { - return 0; - } -} - -static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info) -{ - int ret; - unsigned int data; - - ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data); - if (ret < 0) { - dev_err(info->dev, "failed to read update reg(%d)\n", ret); - return ret; - } - - data |= RTC_TIME_EN_MASK; - data |= RTC_UDR_MASK; - - ret = regmap_write(info->rtc, SEC_RTC_UDR_CON, data); - if (ret < 0) { - dev_err(info->dev, "failed to write update reg(%d)\n", ret); - return ret; - } - - do { - ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data); - } while ((data & RTC_UDR_MASK) && !ret); - - return ret; -} - -static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info) -{ - int ret; - unsigned int data; - - ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data); - if (ret < 0) { - dev_err(info->dev, "%s: fail to read update reg(%d)\n", - __func__, ret); - return ret; - } - - data &= ~RTC_TIME_EN_MASK; - data |= RTC_UDR_MASK; - - ret = regmap_write(info->rtc, SEC_RTC_UDR_CON, data); - if (ret < 0) { - dev_err(info->dev, "%s: fail to write update reg(%d)\n", - __func__, ret); - return ret; - } - - do { - ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data); - } while ((data & RTC_UDR_MASK) && !ret); - - return ret; -} - -static void s5m8763_data_to_tm(u8 *data, struct rtc_time *tm) -{ - tm->tm_sec = bcd2bin(data[RTC_SEC]); - tm->tm_min = bcd2bin(data[RTC_MIN]); - - if (data[RTC_HOUR] & HOUR_12) { - tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x1f); - if (data[RTC_HOUR] & HOUR_PM) - tm->tm_hour += 12; - } else { - tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x3f); - } - - tm->tm_wday = data[RTC_WEEKDAY] & 0x07; - tm->tm_mday = bcd2bin(data[RTC_DATE]); - tm->tm_mon = bcd2bin(data[RTC_MONTH]); - tm->tm_year = bcd2bin(data[RTC_YEAR1]) + bcd2bin(data[RTC_YEAR2]) * 100; - tm->tm_year -= 1900; -} - -static void s5m8763_tm_to_data(struct rtc_time *tm, u8 *data) -{ - data[RTC_SEC] = bin2bcd(tm->tm_sec); - data[RTC_MIN] = bin2bcd(tm->tm_min); - data[RTC_HOUR] = bin2bcd(tm->tm_hour); - data[RTC_WEEKDAY] = tm->tm_wday; - data[RTC_DATE] = bin2bcd(tm->tm_mday); - data[RTC_MONTH] = bin2bcd(tm->tm_mon); - data[RTC_YEAR1] = bin2bcd(tm->tm_year % 100); - data[RTC_YEAR2] = bin2bcd((tm->tm_year + 1900) / 100); -} - -static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) -{ - struct s5m_rtc_info *info = dev_get_drvdata(dev); - u8 data[8]; - int ret; - - ret = regmap_bulk_read(info->rtc, SEC_RTC_SEC, data, 8); - if (ret < 0) - return ret; - - switch (info->device_type) { - case S5M8763X: - s5m8763_data_to_tm(data, tm); - break; - - case S5M8767X: - s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode); - break; - - default: - return -EINVAL; - } - - dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, - 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); - - return rtc_valid_tm(tm); -} - -static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) -{ - struct s5m_rtc_info *info = dev_get_drvdata(dev); - u8 data[8]; - int ret = 0; - - switch (info->device_type) { - case S5M8763X: - s5m8763_tm_to_data(tm, data); - break; - case S5M8767X: - ret = s5m8767_tm_to_data(tm, data); - break; - default: - return -EINVAL; - } - - if (ret < 0) - return ret; - - dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, - 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); - - ret = regmap_raw_write(info->rtc, SEC_RTC_SEC, data, 8); - if (ret < 0) - return ret; - - ret = s5m8767_rtc_set_time_reg(info); - - return ret; -} - -static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) -{ - struct s5m_rtc_info *info = dev_get_drvdata(dev); - u8 data[8]; - unsigned int val; - int ret, i; - - ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8); - if (ret < 0) - return ret; - - switch (info->device_type) { - case S5M8763X: - s5m8763_data_to_tm(data, &alrm->time); - ret = regmap_read(info->rtc, SEC_ALARM0_CONF, &val); - if (ret < 0) - return ret; - - alrm->enabled = !!val; - - ret = regmap_read(info->rtc, SEC_RTC_STATUS, &val); - if (ret < 0) - return ret; - - break; - - case S5M8767X: - s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode); - dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, - 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, - alrm->time.tm_mday, alrm->time.tm_hour, - alrm->time.tm_min, alrm->time.tm_sec, - alrm->time.tm_wday); - - alrm->enabled = 0; - for (i = 0; i < 7; i++) { - if (data[i] & ALARM_ENABLE_MASK) { - alrm->enabled = 1; - break; - } - } - - alrm->pending = 0; - ret = regmap_read(info->rtc, SEC_RTC_STATUS, &val); - if (ret < 0) - return ret; - break; - - default: - return -EINVAL; - } - - if (val & ALARM0_STATUS) - alrm->pending = 1; - else - alrm->pending = 0; - - return 0; -} - -static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) -{ - u8 data[8]; - int ret, i; - struct rtc_time tm; - - ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8); - if (ret < 0) - return ret; - - s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); - dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, - 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday); - - switch (info->device_type) { - case S5M8763X: - ret = regmap_write(info->rtc, SEC_ALARM0_CONF, 0); - break; - - case S5M8767X: - for (i = 0; i < 7; i++) - data[i] &= ~ALARM_ENABLE_MASK; - - ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8); - if (ret < 0) - return ret; - - ret = s5m8767_rtc_set_alarm_reg(info); - - break; - - default: - return -EINVAL; - } - - return ret; -} - -static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) -{ - int ret; - u8 data[8]; - u8 alarm0_conf; - struct rtc_time tm; - - ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8); - if (ret < 0) - return ret; - - s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); - dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, - 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday); - - switch (info->device_type) { - case S5M8763X: - alarm0_conf = 0x77; - ret = regmap_write(info->rtc, SEC_ALARM0_CONF, alarm0_conf); - break; - - case S5M8767X: - data[RTC_SEC] |= ALARM_ENABLE_MASK; - data[RTC_MIN] |= ALARM_ENABLE_MASK; - data[RTC_HOUR] |= ALARM_ENABLE_MASK; - data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK; - if (data[RTC_DATE] & 0x1f) - data[RTC_DATE] |= ALARM_ENABLE_MASK; - if (data[RTC_MONTH] & 0xf) - data[RTC_MONTH] |= ALARM_ENABLE_MASK; - if (data[RTC_YEAR1] & 0x7f) - data[RTC_YEAR1] |= ALARM_ENABLE_MASK; - - ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8); - if (ret < 0) - return ret; - ret = s5m8767_rtc_set_alarm_reg(info); - - break; - - default: - return -EINVAL; - } - - return ret; -} - -static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) -{ - struct s5m_rtc_info *info = dev_get_drvdata(dev); - u8 data[8]; - int ret; - - switch (info->device_type) { - case S5M8763X: - s5m8763_tm_to_data(&alrm->time, data); - break; - - case S5M8767X: - s5m8767_tm_to_data(&alrm->time, data); - break; - - default: - return -EINVAL; - } - - dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, - 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, - alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min, - alrm->time.tm_sec, alrm->time.tm_wday); - - ret = s5m_rtc_stop_alarm(info); - if (ret < 0) - return ret; - - ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8); - if (ret < 0) - return ret; - - ret = s5m8767_rtc_set_alarm_reg(info); - if (ret < 0) - return ret; - - if (alrm->enabled) - ret = s5m_rtc_start_alarm(info); - - return ret; -} - -static int s5m_rtc_alarm_irq_enable(struct device *dev, - unsigned int enabled) -{ - struct s5m_rtc_info *info = dev_get_drvdata(dev); - - if (enabled) - return s5m_rtc_start_alarm(info); - else - return s5m_rtc_stop_alarm(info); -} - -static irqreturn_t s5m_rtc_alarm_irq(int irq, void *data) -{ - struct s5m_rtc_info *info = data; - - rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF); - - return IRQ_HANDLED; -} - -static const struct rtc_class_ops s5m_rtc_ops = { - .read_time = s5m_rtc_read_time, - .set_time = s5m_rtc_set_time, - .read_alarm = s5m_rtc_read_alarm, - .set_alarm = s5m_rtc_set_alarm, - .alarm_irq_enable = s5m_rtc_alarm_irq_enable, -}; - -static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable) -{ - int ret; - ret = regmap_update_bits(info->rtc, SEC_WTSR_SMPL_CNTL, - WTSR_ENABLE_MASK, - enable ? WTSR_ENABLE_MASK : 0); - if (ret < 0) - dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n", - __func__, ret); -} - -static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable) -{ - int ret; - ret = regmap_update_bits(info->rtc, SEC_WTSR_SMPL_CNTL, - SMPL_ENABLE_MASK, - enable ? SMPL_ENABLE_MASK : 0); - if (ret < 0) - dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n", - __func__, ret); -} - -static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info) -{ - u8 data[2]; - unsigned int tp_read; - int ret; - struct rtc_time tm; - - ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &tp_read); - if (ret < 0) { - dev_err(info->dev, "%s: fail to read control reg(%d)\n", - __func__, ret); - return ret; - } - - /* Set RTC control register : Binary mode, 24hour mode */ - data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); - data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); - - info->rtc_24hr_mode = 1; - ret = regmap_raw_write(info->rtc, SEC_ALARM0_CONF, data, 2); - if (ret < 0) { - dev_err(info->dev, "%s: fail to write controlm reg(%d)\n", - __func__, ret); - return ret; - } - - /* In first boot time, Set rtc time to 1/1/2012 00:00:00(SUN) */ - if ((tp_read & RTC_TCON_MASK) == 0) { - dev_dbg(info->dev, "rtc init\n"); - tm.tm_sec = 0; - tm.tm_min = 0; - tm.tm_hour = 0; - tm.tm_wday = 0; - tm.tm_mday = 1; - tm.tm_mon = 0; - tm.tm_year = 112; - tm.tm_yday = 0; - tm.tm_isdst = 0; - ret = s5m_rtc_set_time(info->dev, &tm); - } - - ret = regmap_update_bits(info->rtc, SEC_RTC_UDR_CON, - RTC_TCON_MASK, tp_read | RTC_TCON_MASK); - if (ret < 0) - dev_err(info->dev, "%s: fail to update TCON reg(%d)\n", - __func__, ret); - - return ret; -} - -static int s5m_rtc_probe(struct platform_device *pdev) -{ - struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent); - struct sec_platform_data *pdata = s5m87xx->pdata; - struct s5m_rtc_info *info; - int ret; - - if (!pdata) { - dev_err(pdev->dev.parent, "Platform data not supplied\n"); - return -ENODEV; - } - - info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); - if (!info) - return -ENOMEM; - - info->dev = &pdev->dev; - info->s5m87xx = s5m87xx; - info->rtc = s5m87xx->rtc; - info->device_type = s5m87xx->device_type; - info->wtsr_smpl = s5m87xx->wtsr_smpl; - - switch (pdata->device_type) { - case S5M8763X: - info->irq = s5m87xx->irq_base + S5M8763_IRQ_ALARM0; - break; - - case S5M8767X: - info->irq = s5m87xx->irq_base + S5M8767_IRQ_RTCA1; - break; - - default: - ret = -EINVAL; - dev_err(&pdev->dev, "Unsupported device type: %d\n", ret); - return ret; - } - - platform_set_drvdata(pdev, info); - - ret = s5m8767_rtc_init_reg(info); - - if (info->wtsr_smpl) { - s5m_rtc_enable_wtsr(info, true); - s5m_rtc_enable_smpl(info, true); - } - - device_init_wakeup(&pdev->dev, 1); - - info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc", - &s5m_rtc_ops, THIS_MODULE); - - if (IS_ERR(info->rtc_dev)) - return PTR_ERR(info->rtc_dev); - - ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, - s5m_rtc_alarm_irq, 0, "rtc-alarm0", - info); - if (ret < 0) - dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", - info->irq, ret); - - return ret; -} - -static void s5m_rtc_shutdown(struct platform_device *pdev) -{ - struct s5m_rtc_info *info = platform_get_drvdata(pdev); - int i; - unsigned int val = 0; - if (info->wtsr_smpl) { - for (i = 0; i < 3; i++) { - s5m_rtc_enable_wtsr(info, false); - regmap_read(info->rtc, SEC_WTSR_SMPL_CNTL, &val); - pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val); - if (val & WTSR_ENABLE_MASK) - pr_emerg("%s: fail to disable WTSR\n", - __func__); - else { - pr_info("%s: success to disable WTSR\n", - __func__); - break; - } - } - } - /* Disable SMPL when power off */ - s5m_rtc_enable_smpl(info, false); -} - -static const struct platform_device_id s5m_rtc_id[] = { - { "s5m-rtc", 0 }, -}; - -static struct platform_driver s5m_rtc_driver = { - .driver = { - .name = "s5m-rtc", - .owner = THIS_MODULE, - }, - .probe = s5m_rtc_probe, - .shutdown = s5m_rtc_shutdown, - .id_table = s5m_rtc_id, -}; - -module_platform_driver(s5m_rtc_driver); - -/* Module information */ -MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>"); -MODULE_DESCRIPTION("Samsung S5M RTC driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:s5m-rtc"); diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c index d0d2b04..6d87e26 100644 --- a/drivers/rtc/rtc-sh.c +++ b/drivers/rtc/rtc-sh.c @@ -649,9 +649,8 @@ static int __init sh_rtc_probe(struct platform_device *pdev) clk_enable(rtc->clk); rtc->capabilities = RTC_DEF_CAPABILITIES; - if (dev_get_platdata(&pdev->dev)) { - struct sh_rtc_platform_info *pinfo = - dev_get_platdata(&pdev->dev); + if (pdev->dev.platform_data) { + struct sh_rtc_platform_info *pinfo = pdev->dev.platform_data; /* * Some CPUs have special capabilities in addition to the diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index 3eb3642..63460cf 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c @@ -59,7 +59,7 @@ static int sirfsoc_rtc_read_alarm(struct device *dev, unsigned long rtc_alarm, rtc_count; struct sirfsoc_rtc_drv *rtcdrv; - rtcdrv = dev_get_drvdata(dev); + rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); local_irq_disable(); @@ -94,7 +94,7 @@ static int sirfsoc_rtc_set_alarm(struct device *dev, { unsigned long rtc_status_reg, rtc_alarm; struct sirfsoc_rtc_drv *rtcdrv; - rtcdrv = dev_get_drvdata(dev); + rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); if (alrm->enabled) { rtc_tm_to_time(&(alrm->time), &rtc_alarm); @@ -157,7 +157,7 @@ static int sirfsoc_rtc_read_time(struct device *dev, { unsigned long tmp_rtc = 0; struct sirfsoc_rtc_drv *rtcdrv; - rtcdrv = dev_get_drvdata(dev); + rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); /* * This patch is taken from WinCE - Need to validate this for * correctness. To work around sirfsoc RTC counter double sync logic @@ -178,7 +178,7 @@ static int sirfsoc_rtc_set_time(struct device *dev, { unsigned long rtc_time; struct sirfsoc_rtc_drv *rtcdrv; - rtcdrv = dev_get_drvdata(dev); + rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); rtc_tm_to_time(tm, &rtc_time); @@ -274,7 +274,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); if (err) { dev_err(&pdev->dev, "unable to find base address of rtc node in dtb\n"); - return err; + goto error; } platform_set_drvdata(pdev, rtcdrv); @@ -290,7 +290,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) rtc_div = ((32768 / RTC_HZ) / 2) - 1; sirfsoc_rtc_iobrg_writel(rtc_div, rtcdrv->rtc_base + RTC_DIV); - rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, + rtcdrv->rtc = rtc_device_register(pdev->name, &(pdev->dev), &sirfsoc_rtc_ops, THIS_MODULE); if (IS_ERR(rtcdrv->rtc)) { err = PTR_ERR(rtcdrv->rtc); @@ -322,15 +322,24 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) rtcdrv); if (err) { dev_err(&pdev->dev, "Unable to register for the SiRF SOC RTC IRQ\n"); - return err; + goto error; } return 0; + +error: + if (rtcdrv->rtc) + rtc_device_unregister(rtcdrv->rtc); + + return err; } static int sirfsoc_rtc_remove(struct platform_device *pdev) { + struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); + device_init_wakeup(&pdev->dev, 0); + rtc_device_unregister(rtcdrv->rtc); return 0; } @@ -364,7 +373,7 @@ static int sirfsoc_rtc_thaw(struct device *dev) { u32 tmp; struct sirfsoc_rtc_drv *rtcdrv; - rtcdrv = dev_get_drvdata(dev); + rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); /* * if resume from snapshot and the rtc power is losed, @@ -458,7 +467,7 @@ static struct platform_driver sirfsoc_rtc_driver = { #ifdef CONFIG_PM .pm = &sirfsoc_rtc_pm_ops, #endif - .of_match_table = sirfsoc_rtc_of_match, + .of_match_table = of_match_ptr(sirfsoc_rtc_of_match), }, .probe = sirfsoc_rtc_probe, .remove = sirfsoc_rtc_remove, diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c index fa384fe..316a342 100644 --- a/drivers/rtc/rtc-snvs.c +++ b/drivers/rtc/rtc-snvs.c @@ -329,7 +329,7 @@ static struct platform_driver snvs_rtc_driver = { .name = "snvs_rtc", .owner = THIS_MODULE, .pm = &snvs_rtc_pm_ops, - .of_match_table = snvs_dt_ids, + .of_match_table = of_match_ptr(snvs_dt_ids), }, .probe = snvs_rtc_probe, }; diff --git a/drivers/rtc/rtc-stmp3xxx.c b/drivers/rtc/rtc-stmp3xxx.c index ea96492..2601953 100644 --- a/drivers/rtc/rtc-stmp3xxx.c +++ b/drivers/rtc/rtc-stmp3xxx.c @@ -343,7 +343,7 @@ static struct platform_driver stmp3xxx_rtcdrv = { .name = "stmp3xxx-rtc", .owner = THIS_MODULE, .pm = &stmp3xxx_rtc_pm_ops, - .of_match_table = rtc_dt_ids, + .of_match_table = of_match_ptr(rtc_dt_ids), }, }; diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c index 7af0020..a9caf04 100644 --- a/drivers/rtc/rtc-tps65910.c +++ b/drivers/rtc/rtc-tps65910.c @@ -22,6 +22,7 @@ #include <linux/rtc.h> #include <linux/bcd.h> #include <linux/platform_device.h> +#include <linux/pm_runtime.h> #include <linux/interrupt.h> #include <linux/mfd/tps65910.h> diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c index 25222cd..d07d898 100644 --- a/drivers/rtc/rtc-v3020.c +++ b/drivers/rtc/rtc-v3020.c @@ -303,7 +303,7 @@ static const struct rtc_class_ops v3020_rtc_ops = { static int rtc_probe(struct platform_device *pdev) { - struct v3020_platform_data *pdata = dev_get_platdata(&pdev->dev); + struct v3020_platform_data *pdata = pdev->dev.platform_data; struct v3020 *chip; int retval = -EBUSY; int i; diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c index aabc22c..54e104e 100644 --- a/drivers/rtc/rtc-vr41xx.c +++ b/drivers/rtc/rtc-vr41xx.c @@ -20,7 +20,6 @@ #include <linux/err.h> #include <linux/fs.h> #include <linux/init.h> -#include <linux/io.h> #include <linux/ioport.h> #include <linux/interrupt.h> #include <linux/module.h> @@ -28,10 +27,11 @@ #include <linux/rtc.h> #include <linux/spinlock.h> #include <linux/types.h> -#include <linux/uaccess.h> #include <linux/log2.h> #include <asm/div64.h> +#include <asm/io.h> +#include <asm/uaccess.h> MODULE_AUTHOR("Yoichi Yuasa <yuasa@linux-mips.org>"); MODULE_DESCRIPTION("NEC VR4100 series RTC driver"); diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c index df2ef3e..c2d6331 100644 --- a/drivers/rtc/rtc-vt8500.c +++ b/drivers/rtc/rtc-vt8500.c @@ -228,7 +228,7 @@ static int vt8500_rtc_probe(struct platform_device *pdev) vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0); if (vt8500_rtc->irq_alarm < 0) { dev_err(&pdev->dev, "No alarm IRQ resource defined\n"); - return vt8500_rtc->irq_alarm; + return -ENXIO; } vt8500_rtc->res = devm_request_mem_region(&pdev->dev, @@ -296,7 +296,7 @@ static struct platform_driver vt8500_rtc_driver = { .driver = { .name = "vt8500-rtc", .owner = THIS_MODULE, - .of_match_table = wmt_dt_ids, + .of_match_table = of_match_ptr(wmt_dt_ids), }, }; |