void __init olpc_dt_fixup(void) { int r; char buf[64]; phandle node; u32 board_rev; node = olpc_dt_finddevice("/battery@0"); if (!node) return; /* */ r = olpc_dt_getproperty(node, "compatible", buf, sizeof(buf)); if (r > 0) return; pr_info("PROM DT: Old firmware detected, applying fixes\n"); /* */ olpc_dt_interpret("\" /battery@0\" find-device" " \" olpc,xo1-battery\" +compatible" " device-end"); board_rev = olpc_dt_get_board_revision(); if (!board_rev) return; if (board_rev >= olpc_board_pre(0xd0)) { /* */ olpc_dt_interpret("\" /pci/display@1\" find-device" " new-device" " \" dcon\" device-name \" olpc,xo1-dcon\" +compatible" " finish-device device-end"); } else { /* */ olpc_dt_interpret("\" /pci/display@1,1\" find-device" " new-device" " \" dcon\" device-name \" olpc,xo1-dcon\" +compatible" " finish-device device-end" " \" /rtc\" find-device" " \" olpc,xo1-rtc\" +compatible" " device-end"); } }
void __init olpc_dt_fixup(void) { int r; char buf[64]; phandle node; u32 board_rev; node = olpc_dt_finddevice("/battery@0"); 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"); /* Add olpc,xo1-battery compatible marker to battery node */ olpc_dt_interpret("\" /battery@0\" find-device" " \" olpc,xo1-battery\" +compatible" " device-end"); board_rev = olpc_dt_get_board_revision(); if (!board_rev) return; if (board_rev >= olpc_board_pre(0xd0)) { /* XO-1.5: add dcon device */ olpc_dt_interpret("\" /pci/display@1\" find-device" " new-device" " \" dcon\" device-name \" olpc,xo1-dcon\" +compatible" " finish-device device-end"); } else { /* XO-1: add dcon device, mark RTC as olpc,xo1-rtc */ olpc_dt_interpret("\" /pci/display@1,1\" find-device" " new-device" " \" dcon\" device-name \" olpc,xo1-dcon\" +compatible" " finish-device device-end" " \" /rtc\" find-device" " \" olpc,xo1-rtc\" +compatible" " device-end"); } }
static u32 __init olpc_dt_get_board_revision(void) { phandle node; __be32 rev; int r; node = olpc_dt_finddevice("/"); if (!node) return 0; r = olpc_dt_getproperty(node, "board-revision-int", (char *) &rev, sizeof(rev)); if (r < 0) return 0; return be32_to_cpu(rev); }