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");
	}
}
Example #2
0
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);
}