Explorar o código

[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>
Alexander Clouter %!s(int64=16) %!d(string=hai) anos
pai
achega
f5273fa310
Modificáronse 1 ficheiros con 14 adicións e 8 borrados
  1. 14 8
      arch/arm/mach-orion5x/ts78xx-setup.c

+ 14 - 8
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)
 static int ts78xx_ts_rtc_load(void)
 {
 {
+	int rc;
 	unsigned char tmp_rtc0, tmp_rtc1;
 	unsigned char tmp_rtc0, tmp_rtc1;
 
 
 	tmp_rtc0 = ts78xx_ts_rtc_readbyte(126);
 	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_readbyte(126) == 0x00) {
 			ts78xx_ts_rtc_writebyte(tmp_rtc0, 126);
 			ts78xx_ts_rtc_writebyte(tmp_rtc0, 126);
 			ts78xx_ts_rtc_writebyte(tmp_rtc1, 127);
 			ts78xx_ts_rtc_writebyte(tmp_rtc1, 127);
+
 			if (ts78xx_fpga.supports.ts_rtc.init == 0) {
 			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
 			} 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;
 	return -ENODEV;
 };
 };
 
 
@@ -150,7 +153,7 @@ static void ts78xx_ts_rtc_unload(void)
 #else
 #else
 static int ts78xx_ts_rtc_load(void)
 static int ts78xx_ts_rtc_load(void)
 {
 {
-	return 0;
+	return -ENODEV;
 }
 }
 
 
 static void ts78xx_ts_rtc_unload(void)
 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) {
 	if (ts78xx_fpga.supports.ts_rtc.present == 1) {
 		tmp = ts78xx_ts_rtc_load();
 		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;
 		ret |= tmp;
 	}
 	}