Commit b7d5b9a9 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz Committed by Linus Torvalds

drivers/rtc/rtc-s5m.c: re-add support for devices without irq specified

The rtc-s5m driver used to support devices without irq specified in the
past.  Re-add this support.

The patch fixes boot for Insignal's Exynos4412 based Origen board.

Error messages before the patch:

  ...
  Unable to handle kernel NULL pointer dereference at virtual address 00000094
  pgd = c0004000
  [00000094] *pgd=00000000
  Internal error: Oops: 5 [#1] PREEMPT SMP ARM
  Modules linked in:
  CPU: 1 PID: 1 Comm: swapper/0 Not tainted 3.16.0-next-20140804-00008-ga59480f-dirty #701
  task: ea80f000 ti: ea882000 task.ti: ea882000
  PC is at regmap_irq_get_virq+0x0/0x28
  LR is at s5m_rtc_probe+0xdc/0x310
  pc : [<c02574fc>]    lr : [<c02de75c>]    psr: 80000153
  sp : ea883e48  ip : 00000000  fp : 00000000
  r10: 0000000c  r9 : c05de7ac  r8 : eaabc600
  r7 : eaa6b4d0  r6 : c0439e8c  r5 : eaabc610  r4 : eab30e50
  r3 : 00000000  r2 : 00000000  r1 : 0000000c  r0 : 00000000
  Flags: Nzcv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
  Control: 10c5387d  Table: 4000404a  DAC: 00000015
  Process swapper/0 (pid: 1, stack limit = 0xea882240)
  Backtrace:
    regmap_irq_get_virq
    s5m_rtc_probe
    platform_drv_probe
    driver_probe_device
    __driver_attach
    bus_for_each_dev
    bus_add_driver
    driver_register
    do_one_initcall
    kernel_init_freeable
    kernel_init
  ---[ end trace a954d7f019122700 ]---
  Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
  ...
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Reviewed-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
Tested-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
Acked-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent bfcfd44c
...@@ -717,6 +717,7 @@ static int s5m_rtc_probe(struct platform_device *pdev) ...@@ -717,6 +717,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
info->device_type = s5m87xx->device_type; info->device_type = s5m87xx->device_type;
info->wtsr_smpl = s5m87xx->wtsr_smpl; info->wtsr_smpl = s5m87xx->wtsr_smpl;
if (s5m87xx->irq_data) {
info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq); info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq);
if (info->irq <= 0) { if (info->irq <= 0) {
ret = -EINVAL; ret = -EINVAL;
...@@ -724,6 +725,7 @@ static int s5m_rtc_probe(struct platform_device *pdev) ...@@ -724,6 +725,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
alarm_irq); alarm_irq);
goto err; goto err;
} }
}
platform_set_drvdata(pdev, info); platform_set_drvdata(pdev, info);
...@@ -744,6 +746,11 @@ static int s5m_rtc_probe(struct platform_device *pdev) ...@@ -744,6 +746,11 @@ static int s5m_rtc_probe(struct platform_device *pdev)
goto err; goto err;
} }
if (!info->irq) {
dev_info(&pdev->dev, "Alarm IRQ not available\n");
return 0;
}
ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
s5m_rtc_alarm_irq, 0, "rtc-alarm0", s5m_rtc_alarm_irq, 0, "rtc-alarm0",
info); info);
...@@ -802,7 +809,7 @@ static int s5m_rtc_resume(struct device *dev) ...@@ -802,7 +809,7 @@ static int s5m_rtc_resume(struct device *dev)
struct s5m_rtc_info *info = dev_get_drvdata(dev); struct s5m_rtc_info *info = dev_get_drvdata(dev);
int ret = 0; int ret = 0;
if (device_may_wakeup(dev)) if (info->irq && device_may_wakeup(dev))
ret = disable_irq_wake(info->irq); ret = disable_irq_wake(info->irq);
return ret; return ret;
...@@ -813,7 +820,7 @@ static int s5m_rtc_suspend(struct device *dev) ...@@ -813,7 +820,7 @@ static int s5m_rtc_suspend(struct device *dev)
struct s5m_rtc_info *info = dev_get_drvdata(dev); struct s5m_rtc_info *info = dev_get_drvdata(dev);
int ret = 0; int ret = 0;
if (device_may_wakeup(dev)) if (info->irq && device_may_wakeup(dev))
ret = enable_irq_wake(info->irq); ret = enable_irq_wake(info->irq);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment