diff options
author | Alexander Clouter <alex@digriz.org.uk> | 2009-02-23 22:37:36 +0000 |
---|---|---|
committer | Nicolas Pitre <nico@cam.org> | 2009-02-24 23:59:33 -0500 |
commit | f5273fa3102fa4c25819f3034b8834c37d3e62a3 (patch) | |
tree | 8b58f9413702bbd91e85c90398e35f113435a286 /arch/arm/mach-orion5x/ts78xx-setup.c | |
parent | f1f5465782a96201798ef1e8167ed3ffaefdb30d (diff) | |
download | talos-op-linux-f5273fa3102fa4c25819f3034b8834c37d3e62a3.tar.gz talos-op-linux-f5273fa3102fa4c25819f3034b8834c37d3e62a3.zip |
[ARM] orion5x: ts78xx make more bulletproof the RTC load/unload code
Added checks to the platform_device_(register|add) calls so that if
a device failed to load it would then not later be unloaded; also
added the hooks so that it would not try to unload when the RTC
driver support is compiled out.
Signed-off-by: Alexander Clouter <alex@digriz.org.uk>
Signed-off-by: Nicolas Pitre <nico@cam.org>
Diffstat (limited to 'arch/arm/mach-orion5x/ts78xx-setup.c')
-rw-r--r-- | arch/arm/mach-orion5x/ts78xx-setup.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c index baa25d0fd5c9..778b11860ee6 100644 --- a/arch/arm/mach-orion5x/ts78xx-setup.c +++ b/arch/arm/mach-orion5x/ts78xx-setup.c @@ -117,6 +117,7 @@ static struct platform_device ts78xx_ts_rtc_device = { */ static int ts78xx_ts_rtc_load(void) { + int rc; unsigned char tmp_rtc0, tmp_rtc1; tmp_rtc0 = ts78xx_ts_rtc_readbyte(126); @@ -130,16 +131,18 @@ static int ts78xx_ts_rtc_load(void) && ts78xx_ts_rtc_readbyte(126) == 0x00) { ts78xx_ts_rtc_writebyte(tmp_rtc0, 126); ts78xx_ts_rtc_writebyte(tmp_rtc1, 127); + if (ts78xx_fpga.supports.ts_rtc.init == 0) { - ts78xx_fpga.supports.ts_rtc.init = 1; - platform_device_register(&ts78xx_ts_rtc_device); + rc = platform_device_register(&ts78xx_ts_rtc_device); + if (!rc) + ts78xx_fpga.supports.ts_rtc.init = 1; } else - platform_device_add(&ts78xx_ts_rtc_device); - return 0; + rc = platform_device_add(&ts78xx_ts_rtc_device); + + return rc; } } - ts78xx_fpga.supports.ts_rtc.present = 0; return -ENODEV; }; @@ -150,7 +153,7 @@ static void ts78xx_ts_rtc_unload(void) #else static int ts78xx_ts_rtc_load(void) { - return 0; + return -ENODEV; } static void ts78xx_ts_rtc_unload(void) @@ -184,8 +187,11 @@ static int ts78xx_fpga_load_devices(void) if (ts78xx_fpga.supports.ts_rtc.present == 1) { tmp = ts78xx_ts_rtc_load(); - if (tmp) - printk(KERN_INFO "TS-78xx RTC not detected or enabled\n"); + if (tmp) { + printk(KERN_INFO "TS-78xx RTC" + " not detected or enabled\n"); + ts78xx_fpga.supports.ts_rtc.present = 0; + } ret |= tmp; } |