From: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
To: Daniel Drake <dsd-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org
Subject: Re: [RFC v2] OLPC: add missing elements to device tree
Date: Mon, 14 Mar 2011 21:33:35 -0600 [thread overview]
Message-ID: <20110315033335.GC5600@angua.secretlab.ca> (raw)
In-Reply-To: <20110312180448.572A49D401E-k/4jFdqg8LLlyo9zxV8I99HuzzzSOjJt@public.gmane.org>
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
>
next prev parent reply other threads:[~2011-03-15 3:33 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 [this message]
[not found] ` <20110315033335.GC5600-MrY2KI0G/OVr83L8+7iqerDks+cytr/Z@public.gmane.org>
2011-03-15 22:27 ` Andres Salomon
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=20110315033335.GC5600@angua.secretlab.ca \
--to=grant.likely-s3s/wqlpoipyb63q8fvjnq@public.gmane.org \
--cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
--cc=dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org \
--cc=dsd-2X9k7bc8m7Mdnm+yROfE0A@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).