summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-orion5x/ts78xx-setup.c
diff options
context:
space:
mode:
authorAlexander Clouter <alex@digriz.org.uk>2009-02-23 22:37:36 +0000
committerNicolas Pitre <nico@cam.org>2009-02-24 23:59:33 -0500
commitf5273fa3102fa4c25819f3034b8834c37d3e62a3 (patch)
tree8b58f9413702bbd91e85c90398e35f113435a286 /arch/arm/mach-orion5x/ts78xx-setup.c
parentf1f5465782a96201798ef1e8167ed3ffaefdb30d (diff)
downloadlinux-f5273fa3102fa4c25819f3034b8834c37d3e62a3.tar.gz
linux-f5273fa3102fa4c25819f3034b8834c37d3e62a3.tar.bz2
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.c22
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;
}