]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Merge branch 'master' of http://git.denx.de/u-boot-sunxi
authorTom Rini <trini@ti.com>
Tue, 25 Nov 2014 16:09:48 +0000 (11:09 -0500)
committerTom Rini <trini@ti.com>
Wed, 26 Nov 2014 16:21:16 +0000 (11:21 -0500)
1  2 
common/fdt_support.c
include/fdt_support.h

diff --combined common/fdt_support.c
index ce32fe73aff2c7d42d683ee71bf4f4eedfcf6a81,2a20147286e6bfa53c164d93838482423d561039..ea42c63eaafd74300374dd5734726f6a64aaf8e3
  #include <fdt_support.h>
  #include <exports.h>
  
 -/*
 - * Get cells len in bytes
 - *     if #NNNN-cells property is 2 then len is 8
 - *     otherwise len is 4
 - */
 -static int get_cells_len(const void *fdt, const char *nr_cells_name)
 -{
 -      const fdt32_t *cell;
 -
 -      cell = fdt_getprop(fdt, 0, nr_cells_name, NULL);
 -      if (cell && fdt32_to_cpu(*cell) == 2)
 -              return 8;
 -
 -      return 4;
 -}
 -
  /**
   * fdt_getprop_u32_default_node - Return a node's property or a default
   *
@@@ -97,8 -113,7 +97,8 @@@ int fdt_find_and_setprop(void *fdt, con
  }
  
  /**
 - * fdt_find_or_add_subnode - find or possibly add a subnode of a given node
 + * fdt_find_or_add_subnode() - find or possibly add a subnode of a given node
 + *
   * @fdt: pointer to the device tree blob
   * @parentoffset: structure block offset of a node
   * @name: name of the subnode to locate
   * fdt_subnode_offset() finds a subnode of the node with a given name.
   * If the subnode does not exist, it will be created.
   */
 -static int fdt_find_or_add_subnode(void *fdt, int parentoffset,
 -                                 const char *name)
 +int fdt_find_or_add_subnode(void *fdt, int parentoffset, const char *name)
  {
        int offset;
  
@@@ -230,7 -246,7 +230,7 @@@ int fdt_initrd(void *fdt, ulong initrd_
                return err;
        }
  
 -      is_u64 = (get_cells_len(fdt, "#address-cells") == 8);
 +      is_u64 = (fdt_address_cells(fdt, 0) == 2);
  
        err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-start",
                              (uint64_t)initrd_start, is_u64);
@@@ -366,22 -382,22 +366,22 @@@ void do_fixup_by_compat_u32(void *fdt, 
  /*
   * fdt_pack_reg - pack address and size array into the "reg"-suitable stream
   */
 -static int fdt_pack_reg(const void *fdt, void *buf, uint64_t *address,
 -                      uint64_t *size, int n)
 +static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,
 +                      int n)
  {
        int i;
 -      int address_len = get_cells_len(fdt, "#address-cells");
 -      int size_len = get_cells_len(fdt, "#size-cells");
 +      int address_len = fdt_address_cells(fdt, 0);
 +      int size_len = fdt_size_cells(fdt, 0);
        char *p = buf;
  
        for (i = 0; i < n; i++) {
 -              if (address_len == 8)
 +              if (address_len == 2)
                        *(fdt64_t *)p = cpu_to_fdt64(address[i]);
                else
                        *(fdt32_t *)p = cpu_to_fdt32(address[i]);
                p += address_len;
  
 -              if (size_len == 8)
 +              if (size_len == 2)
                        *(fdt64_t *)p = cpu_to_fdt64(size[i]);
                else
                        *(fdt32_t *)p = cpu_to_fdt32(size[i]);
@@@ -952,8 -968,13 +952,8 @@@ void of_bus_default_count_cells(void *b
  {
        const fdt32_t *prop;
  
 -      if (addrc) {
 -              prop = fdt_getprop(blob, parentoffset, "#address-cells", NULL);
 -              if (prop)
 -                      *addrc = be32_to_cpup(prop);
 -              else
 -                      *addrc = 2;
 -      }
 +      if (addrc)
 +              *addrc = fdt_address_cells(blob, parentoffset);
  
        if (sizec) {
                prop = fdt_getprop(blob, parentoffset, "#size-cells", NULL);
@@@ -1399,7 -1420,11 +1399,7 @@@ u64 fdt_get_base_address(void *fdt, in
        u32 naddr;
        const fdt32_t *prop;
  
 -      prop = fdt_getprop(fdt, node, "#address-cells", &size);
 -      if (prop && size == 4)
 -              naddr = be32_to_cpup(prop);
 -      else
 -              naddr = 2;
 +      naddr = fdt_address_cells(fdt, node);
  
        prop = fdt_getprop(fdt, node, "ranges", &size);
  
@@@ -1499,3 -1524,65 +1499,65 @@@ int fdt_read_range(void *fdt, int node
  
        return 0;
  }
+ /**
+  * fdt_setup_simplefb_node - Fill and enable a simplefb node
+  *
+  * @fdt: ptr to device tree
+  * @node: offset of the simplefb node
+  * @base_address: framebuffer base address
+  * @width: width in pixels
+  * @height: height in pixels
+  * @stride: bytes per line
+  * @format: pixel format string
+  *
+  * Convenience function to fill and enable a simplefb node.
+  */
+ int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width,
+                           u32 height, u32 stride, const char *format)
+ {
+       char name[32];
+       fdt32_t cells[4];
+       int i, addrc, sizec, ret;
+       of_bus_default_count_cells(fdt, fdt_parent_offset(fdt, node),
+                                  &addrc, &sizec);
+       i = 0;
+       if (addrc == 2)
+               cells[i++] = cpu_to_fdt32(base_address >> 32);
+       cells[i++] = cpu_to_fdt32(base_address);
+       if (sizec == 2)
+               cells[i++] = 0;
+       cells[i++] = cpu_to_fdt32(height * stride);
+       ret = fdt_setprop(fdt, node, "reg", cells, sizeof(cells[0]) * i);
+       if (ret < 0)
+               return ret;
+       snprintf(name, sizeof(name), "framebuffer@%llx", base_address);
+       ret = fdt_set_name(fdt, node, name);
+       if (ret < 0)
+               return ret;
+       ret = fdt_setprop_u32(fdt, node, "width", width);
+       if (ret < 0)
+               return ret;
+       ret = fdt_setprop_u32(fdt, node, "height", height);
+       if (ret < 0)
+               return ret;
+       ret = fdt_setprop_u32(fdt, node, "stride", stride);
+       if (ret < 0)
+               return ret;
+       ret = fdt_setprop_string(fdt, node, "format", format);
+       if (ret < 0)
+               return ret;
+       ret = fdt_setprop_string(fdt, node, "status", "okay");
+       if (ret < 0)
+               return ret;
+       return 0;
+ }
diff --combined include/fdt_support.h
index 0fbc9bdd6717d48b7a9d9319c0ab2baab6c93e65,d5e09e658cda2160ce4714d5eef47ab49e5f8f13..1f19fe4c9622a84c365f500ff80b2b72bb61baf1
@@@ -64,20 -64,7 +64,20 @@@ static inline void fdt_fixup_crypto_nod
  int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose);
  #endif
  
 -void ft_board_setup(void *blob, bd_t *bd);
 +int fdt_find_or_add_subnode(void *fdt, int parentoffset, const char *name);
 +
 +/**
 + * Add board-specific data to the FDT before booting the OS.
 + *
 + * Use CONFIG_SYS_FDT_PAD to ensure there is sufficient space.
 + * This function is called if CONFIG_OF_BOARD_SETUP is defined
 + *
 + * @param blob                FDT blob to update
 + * @param bd_t                Pointer to board data
 + * @return 0 if ok, or -FDT_ERR_... on error
 + */
 +int ft_board_setup(void *blob, bd_t *bd);
 +
  /*
   * The keystone2 SOC requires all 32 bit aliased addresses to be converted
   * to their 36 physical format. This has to happen after all fdt nodes
@@@ -88,18 -75,6 +88,18 @@@ void ft_board_setup_ex(void *blob, bd_
  void ft_cpu_setup(void *blob, bd_t *bd);
  void ft_pci_setup(void *blob, bd_t *bd);
  
 +/**
 + * Add system-specific data to the FDT before booting the OS.
 + *
 + * Use CONFIG_SYS_FDT_PAD to ensure there is sufficient space.
 + * This function is called if CONFIG_OF_SYSTEM_SETUP is defined
 + *
 + * @param blob                FDT blob to update
 + * @param bd_t                Pointer to board data
 + * @return 0 if ok, or -FDT_ERR_... on error
 + */
 +int ft_system_setup(void *blob, bd_t *bd);
 +
  void set_working_fdt_addr(void *addr);
  int fdt_shrink_to_minimum(void *blob);
  int fdt_increase_size(void *fdt, int add_len);
@@@ -172,6 -147,9 +172,9 @@@ void of_bus_default_count_cells(void *b
  int ft_verify_fdt(void *fdt);
  int arch_fixup_memory_node(void *blob);
  
+ int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width,
+                           u32 height, u32 stride, const char *format);
  #endif /* ifdef CONFIG_OF_LIBFDT */
  
  #ifdef USE_HOSTCC