devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andres Salomon <dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org>
To: Grant Likely
	<grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>,
	Daniel Drake <dsd-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Subject: Re: [RFC v2] OLPC: add missing elements to device tree
Date: Tue, 15 Mar 2011 15:27:26 -0700	[thread overview]
Message-ID: <20110315152726.4a116a4d@queued.net> (raw)
In-Reply-To: <20110315033335.GC5600-MrY2KI0G/OVr83L8+7iqerDks+cytr/Z@public.gmane.org>

Looks good to me as well.

Acked-by: Andres Salomon <dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org>

This should probably be forwarded to the x86 folks.

On Mon, 14 Mar 2011
21:33:35 -0600 Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org> wrote:

> On Sat, Mar 12, 2011 at 06:04:48PM +0000, Daniel Drake wrote:
> > In response to new device tree code in the kernel, OLPC will start
> > using it for probing of certain devices. However, some firmware
> > fixes are needed to put the devicetree into a usable state.
> > 
> > Retain compatibility with old firmware by fixing up the device tree
> > at boot-time if it does not contain the new nodes/properties that
> > we need for probing.
> > 
> > Signed-off-by: Daniel Drake <dsd-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org>
> 
> Looks okay to me.
> 
> Acked-by: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
> 
> g.
> 
> > ---
> >  arch/x86/platform/olpc/olpc_dt.c |  104
> > ++++++++++++++++++++++++++++++++++++++ 1 files changed, 104
> > insertions(+), 0 deletions(-)
> > 
> > v2: ask OpenFirmware to adjust the tree instead of manipulating the
> > tree on the linux level.
> > 
> > diff --git a/arch/x86/platform/olpc/olpc_dt.c
> > b/arch/x86/platform/olpc/olpc_dt.c index 24f2598..d6ee929 100644
> > --- a/arch/x86/platform/olpc/olpc_dt.c
> > +++ b/arch/x86/platform/olpc/olpc_dt.c
> > @@ -21,6 +21,7 @@
> >  #include <linux/of.h>
> >  #include <linux/of_platform.h>
> >  #include <linux/of_pdt.h>
> > +#include <asm/olpc.h>
> >  #include <asm/olpc_ofw.h>
> >  
> >  static phandle __init olpc_dt_getsibling(phandle node)
> > @@ -164,6 +165,107 @@ static struct of_pdt_ops prom_olpc_ops
> > __initdata = { .pkg2path = olpc_dt_pkg2path,
> >  };
> >  
> > +static phandle __init olpc_dt_finddevice(const char *path)
> > +{
> > +	phandle node;
> > +	const void *args[] = { path };
> > +	void *res[] = { &node };
> > +
> > +	if (olpc_ofw("finddevice", args, res)) {
> > +		pr_err("olpc_dt: finddevice failed!\n");
> > +		return 0;
> > +	}
> > +
> > +	if ((s32) node == -1)
> > +		return 0;
> > +
> > +	return node;
> > +}
> > +
> > +static int __init olpc_dt_interpret(const char *words)
> > +{
> > +	int result;
> > +	const void *args[] = { words };
> > +	void *res[] = { &result };
> > +
> > +	if (olpc_ofw("interpret", args, res)) {
> > +		pr_err("olpc_dt: interpret failed!\n");
> > +		return -1;
> > +	}
> > +
> > +	return result;
> > +}
> > +
> > +/*
> > + * Extract board revision directly from OFW device tree.
> > + * We can't use olpc_platform_info because that hasn't been set up
> > yet.
> > + */
> > +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);
> > +}
> > +
> > +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");
> > +	}
> > +}
> > +
> >  void __init olpc_dt_build_devicetree(void)
> >  {
> >  	phandle root;
> > @@ -171,6 +273,8 @@ void __init olpc_dt_build_devicetree(void)
> >  	if (!olpc_ofw_is_installed())
> >  		return;
> >  
> > +	olpc_dt_fixup();
> > +
> >  	root = olpc_dt_getsibling(0);
> >  	if (!root) {
> >  		pr_err("PROM: unable to get root node from
> > OFW!\n"); -- 
> > 1.7.4
> > 

      parent reply	other threads:[~2011-03-15 22:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-12 18:04 [RFC v2] OLPC: add missing elements to device tree Daniel Drake
     [not found] ` <20110312180448.572A49D401E-k/4jFdqg8LLlyo9zxV8I99HuzzzSOjJt@public.gmane.org>
2011-03-15  3:33   ` Grant Likely
     [not found]     ` <20110315033335.GC5600-MrY2KI0G/OVr83L8+7iqerDks+cytr/Z@public.gmane.org>
2011-03-15 22:27       ` Andres Salomon [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110315152726.4a116a4d@queued.net \
    --to=dilinger-pffuokh25lwstnjn9+bgxg@public.gmane.org \
    --cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
    --cc=dsd-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org \
    --cc=grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).