Skip to content

Commit ac38126

Browse files
committed
Merge tag 'rtc-4.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
Pull RTC fixes from Alexandre Belloni: "Here are a few driver fixes for 4.9. It has been calm for a while so I don't expect more for this cycle. Drivers: - asm9260: fix module autoload - cmos: fix crashes - omap: fix clock handling" * tag 'rtc-4.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: rtc: omap: prevent disabling of clock/module during suspend rtc: omap: Fix selecting external osc rtc: cmos: Don't enable interrupts in the middle of the interrupt handler rtc: cmos: remove all __exit_p annotations rtc: asm9260: fix module autoload
2 parents ee2bd21 + efce21f commit ac38126

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

drivers/rtc/rtc-asm9260.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ static const struct of_device_id asm9260_dt_ids[] = {
327327
{ .compatible = "alphascale,asm9260-rtc", },
328328
{}
329329
};
330+
MODULE_DEVICE_TABLE(of, asm9260_dt_ids);
330331

331332
static struct platform_driver asm9260_rtc_driver = {
332333
.probe = asm9260_rtc_probe,

drivers/rtc/rtc-cmos.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -776,7 +776,7 @@ static void cmos_do_shutdown(int rtc_irq)
776776
spin_unlock_irq(&rtc_lock);
777777
}
778778

779-
static void __exit cmos_do_remove(struct device *dev)
779+
static void cmos_do_remove(struct device *dev)
780780
{
781781
struct cmos_rtc *cmos = dev_get_drvdata(dev);
782782
struct resource *ports;
@@ -996,8 +996,9 @@ static u32 rtc_handler(void *context)
996996
struct cmos_rtc *cmos = dev_get_drvdata(dev);
997997
unsigned char rtc_control = 0;
998998
unsigned char rtc_intr;
999+
unsigned long flags;
9991000

1000-
spin_lock_irq(&rtc_lock);
1001+
spin_lock_irqsave(&rtc_lock, flags);
10011002
if (cmos_rtc.suspend_ctrl)
10021003
rtc_control = CMOS_READ(RTC_CONTROL);
10031004
if (rtc_control & RTC_AIE) {
@@ -1006,7 +1007,7 @@ static u32 rtc_handler(void *context)
10061007
rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
10071008
rtc_update_irq(cmos->rtc, 1, rtc_intr);
10081009
}
1009-
spin_unlock_irq(&rtc_lock);
1010+
spin_unlock_irqrestore(&rtc_lock, flags);
10101011

10111012
pm_wakeup_event(dev, 0);
10121013
acpi_clear_event(ACPI_EVENT_RTC);
@@ -1129,7 +1130,7 @@ static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
11291130
pnp_irq(pnp, 0));
11301131
}
11311132

1132-
static void __exit cmos_pnp_remove(struct pnp_dev *pnp)
1133+
static void cmos_pnp_remove(struct pnp_dev *pnp)
11331134
{
11341135
cmos_do_remove(&pnp->dev);
11351136
}
@@ -1161,7 +1162,7 @@ static struct pnp_driver cmos_pnp_driver = {
11611162
.name = (char *) driver_name,
11621163
.id_table = rtc_ids,
11631164
.probe = cmos_pnp_probe,
1164-
.remove = __exit_p(cmos_pnp_remove),
1165+
.remove = cmos_pnp_remove,
11651166
.shutdown = cmos_pnp_shutdown,
11661167

11671168
/* flag ensures resume() gets called, and stops syslog spam */
@@ -1238,7 +1239,7 @@ static int __init cmos_platform_probe(struct platform_device *pdev)
12381239
return cmos_do_probe(&pdev->dev, resource, irq);
12391240
}
12401241

1241-
static int __exit cmos_platform_remove(struct platform_device *pdev)
1242+
static int cmos_platform_remove(struct platform_device *pdev)
12421243
{
12431244
cmos_do_remove(&pdev->dev);
12441245
return 0;
@@ -1263,7 +1264,7 @@ static void cmos_platform_shutdown(struct platform_device *pdev)
12631264
MODULE_ALIAS("platform:rtc_cmos");
12641265

12651266
static struct platform_driver cmos_platform_driver = {
1266-
.remove = __exit_p(cmos_platform_remove),
1267+
.remove = cmos_platform_remove,
12671268
.shutdown = cmos_platform_shutdown,
12681269
.driver = {
12691270
.name = driver_name,

drivers/rtc/rtc-omap.c

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
/* OMAP_RTC_OSC_REG bit fields: */
114114
#define OMAP_RTC_OSC_32KCLK_EN BIT(6)
115115
#define OMAP_RTC_OSC_SEL_32KCLK_SRC BIT(3)
116+
#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE BIT(4)
116117

117118
/* OMAP_RTC_IRQWAKEEN bit fields: */
118119
#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)
@@ -146,6 +147,7 @@ struct omap_rtc {
146147
u8 interrupts_reg;
147148
bool is_pmic_controller;
148149
bool has_ext_clk;
150+
bool is_suspending;
149151
const struct omap_rtc_device_type *type;
150152
struct pinctrl_dev *pctldev;
151153
};
@@ -786,8 +788,9 @@ static int omap_rtc_probe(struct platform_device *pdev)
786788
*/
787789
if (rtc->has_ext_clk) {
788790
reg = rtc_read(rtc, OMAP_RTC_OSC_REG);
789-
rtc_write(rtc, OMAP_RTC_OSC_REG,
790-
reg | OMAP_RTC_OSC_SEL_32KCLK_SRC);
791+
reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE;
792+
reg |= OMAP_RTC_OSC_32KCLK_EN | OMAP_RTC_OSC_SEL_32KCLK_SRC;
793+
rtc_writel(rtc, OMAP_RTC_OSC_REG, reg);
791794
}
792795

793796
rtc->type->lock(rtc);
@@ -898,8 +901,7 @@ static int omap_rtc_suspend(struct device *dev)
898901
rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, 0);
899902
rtc->type->lock(rtc);
900903

901-
/* Disable the clock/module */
902-
pm_runtime_put_sync(dev);
904+
rtc->is_suspending = true;
903905

904906
return 0;
905907
}
@@ -908,21 +910,41 @@ static int omap_rtc_resume(struct device *dev)
908910
{
909911
struct omap_rtc *rtc = dev_get_drvdata(dev);
910912

911-
/* Enable the clock/module so that we can access the registers */
912-
pm_runtime_get_sync(dev);
913-
914913
rtc->type->unlock(rtc);
915914
if (device_may_wakeup(dev))
916915
disable_irq_wake(rtc->irq_alarm);
917916
else
918917
rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, rtc->interrupts_reg);
919918
rtc->type->lock(rtc);
920919

920+
rtc->is_suspending = false;
921+
921922
return 0;
922923
}
923924
#endif
924925

925-
static SIMPLE_DEV_PM_OPS(omap_rtc_pm_ops, omap_rtc_suspend, omap_rtc_resume);
926+
#ifdef CONFIG_PM
927+
static int omap_rtc_runtime_suspend(struct device *dev)
928+
{
929+
struct omap_rtc *rtc = dev_get_drvdata(dev);
930+
931+
if (rtc->is_suspending && !rtc->has_ext_clk)
932+
return -EBUSY;
933+
934+
return 0;
935+
}
936+
937+
static int omap_rtc_runtime_resume(struct device *dev)
938+
{
939+
return 0;
940+
}
941+
#endif
942+
943+
static const struct dev_pm_ops omap_rtc_pm_ops = {
944+
SET_SYSTEM_SLEEP_PM_OPS(omap_rtc_suspend, omap_rtc_resume)
945+
SET_RUNTIME_PM_OPS(omap_rtc_runtime_suspend,
946+
omap_rtc_runtime_resume, NULL)
947+
};
926948

927949
static void omap_rtc_shutdown(struct platform_device *pdev)
928950
{

0 commit comments

Comments
 (0)