x86/platform/olpc: Use a correct version when making up a battery node
The XO-1 and XO-1.5 batteries apparently differ in an ability to report ambient temperature. We need to use a different compatible string for the XO-1.5 battery. Previously olpc_dt_fixup() used the presence of the battery node's compatible property to decide whether the DT is up to date. Now we need to look for a particular value in the compatible string, to decide Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> Acked-by: Pavel Machek <pavel@ucw.cz> Acked-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
		
							parent
							
								
									47e120d333
								
							
						
					
					
						commit
						a7a9bacb9a
					
				| @ -220,10 +220,26 @@ static u32 __init olpc_dt_get_board_revision(void) | ||||
| 	return be32_to_cpu(rev); | ||||
| } | ||||
| 
 | ||||
| int olpc_dt_compatible_match(phandle node, const char *compat) | ||||
| { | ||||
| 	char buf[64], *p; | ||||
| 	int plen, len; | ||||
| 
 | ||||
| 	plen = olpc_dt_getproperty(node, "compatible", buf, sizeof(buf)); | ||||
| 	if (plen <= 0) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	len = strlen(compat); | ||||
| 	for (p = buf; p < buf + plen; p += strlen(p) + 1) { | ||||
| 		if (strcmp(p, compat) == 0) | ||||
| 			return 1; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void __init olpc_dt_fixup(void) | ||||
| { | ||||
| 	int r; | ||||
| 	char buf[64]; | ||||
| 	phandle node; | ||||
| 	u32 board_rev; | ||||
| 
 | ||||
| @ -231,22 +247,31 @@ void __init olpc_dt_fixup(void) | ||||
| 	if (!node) | ||||
| 		return; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If the battery node has a compatible property, we are running a new | ||||
| 	 * enough firmware and don't have fixups to make. | ||||
| 	 */ | ||||
| 	r = olpc_dt_getproperty(node, "compatible", buf, sizeof(buf)); | ||||
| 	if (r > 0) | ||||
| 		return; | ||||
| 
 | ||||
| 	pr_info("PROM DT: Old firmware detected, applying fixes\n"); | ||||
| 
 | ||||
| 	board_rev = olpc_dt_get_board_revision(); | ||||
| 	if (!board_rev) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (board_rev >= olpc_board_pre(0xd0)) { | ||||
| 		/* XO-1.5: add dcon device */ | ||||
| 		/* XO-1.5 */ | ||||
| 
 | ||||
| 		if (olpc_dt_compatible_match(node, "olpc,xo1.5-battery")) | ||||
| 			return; | ||||
| 
 | ||||
| 		/* Add olpc,xo1.5-battery compatible marker to battery node */ | ||||
| 		olpc_dt_interpret("\" /battery@0\" find-device"); | ||||
| 		olpc_dt_interpret("  \" olpc,xo1.5-battery\" +compatible"); | ||||
| 		olpc_dt_interpret("device-end"); | ||||
| 
 | ||||
| 		if (olpc_dt_compatible_match(node, "olpc,xo1-battery")) { | ||||
| 			/*
 | ||||
| 			 * If we have a olpc,xo1-battery compatible, then we're | ||||
| 			 * running a new enough firmware that already has | ||||
| 			 * the dcon node. | ||||
| 			 */ | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		/* Add dcon device */ | ||||
| 		olpc_dt_interpret("\" /pci/display@1\" find-device"); | ||||
| 		olpc_dt_interpret("  new-device"); | ||||
| 		olpc_dt_interpret("    \" dcon\" device-name"); | ||||
| @ -254,7 +279,18 @@ void __init olpc_dt_fixup(void) | ||||
| 		olpc_dt_interpret("  finish-device"); | ||||
| 		olpc_dt_interpret("device-end"); | ||||
| 	} else { | ||||
| 		/* XO-1: add dcon device, mark RTC as olpc,xo1-rtc */ | ||||
| 		/* XO-1 */ | ||||
| 
 | ||||
| 		if (olpc_dt_compatible_match(node, "olpc,xo1-battery")) { | ||||
| 			/*
 | ||||
| 			 * If we have a olpc,xo1-battery compatible, then we're | ||||
| 			 * running a new enough firmware that already has | ||||
| 			 * the dcon and RTC nodes. | ||||
| 			 */ | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		/* Add dcon device, mark RTC as olpc,xo1-rtc */ | ||||
| 		olpc_dt_interpret("\" /pci/display@1,1\" find-device"); | ||||
| 		olpc_dt_interpret("  new-device"); | ||||
| 		olpc_dt_interpret("    \" dcon\" device-name"); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user