mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-18 15:08:59 +00:00
Merge git://git.denx.de/u-boot-dm
This commit is contained in:
commit
d0ffda8ed2
4 changed files with 72 additions and 14 deletions
|
@ -70,6 +70,7 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
|
|||
int addr_len, size_len, both_len;
|
||||
int parent;
|
||||
int len;
|
||||
int index;
|
||||
|
||||
parent = dev_of_offset(dev->parent);
|
||||
addr_len = fdt_address_cells(blob, parent);
|
||||
|
@ -86,13 +87,14 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
|
|||
if (!map)
|
||||
return -ENOMEM;
|
||||
|
||||
map->base = fdtdec_get_number(cell, addr_len);
|
||||
|
||||
for (range = map->range; count > 0;
|
||||
count--, cell += both_len, range++) {
|
||||
range->start = fdtdec_get_number(cell, addr_len);
|
||||
range->size = fdtdec_get_number(cell + addr_len, size_len);
|
||||
for (range = map->range, index = 0; count > 0;
|
||||
count--, cell += both_len, range++, index++) {
|
||||
fdt_size_t sz;
|
||||
range->start = fdtdec_get_addr_size_fixed(blob, dev->of_offset,
|
||||
"reg", index, addr_len, size_len, &sz, true);
|
||||
range->size = sz;
|
||||
}
|
||||
map->base = map->range[0].start;
|
||||
|
||||
*mapp = map;
|
||||
|
||||
|
|
|
@ -44,8 +44,10 @@ struct udevice *dm_root(void)
|
|||
void dm_fixup_for_gd_move(struct global_data *new_gd)
|
||||
{
|
||||
/* The sentinel node has moved, so update things that point to it */
|
||||
new_gd->uclass_root.next->prev = &new_gd->uclass_root;
|
||||
new_gd->uclass_root.prev->next = &new_gd->uclass_root;
|
||||
if (gd->dm_root) {
|
||||
new_gd->uclass_root.next->prev = &new_gd->uclass_root;
|
||||
new_gd->uclass_root.prev->next = &new_gd->uclass_root;
|
||||
}
|
||||
}
|
||||
|
||||
fdt_addr_t dm_get_translation_offset(void)
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
#include <asm/omap_common.h>
|
||||
#include <asm/ti-common/ti-edma3.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
|
@ -549,21 +551,56 @@ static int ti_qspi_probe(struct udevice *bus)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void *map_syscon_chipselects(struct udevice *bus)
|
||||
{
|
||||
#if CONFIG_IS_ENABLED(SYSCON)
|
||||
struct udevice *syscon;
|
||||
struct regmap *regmap;
|
||||
const fdt32_t *cell;
|
||||
int len, err;
|
||||
|
||||
err = uclass_get_device_by_phandle(UCLASS_SYSCON, bus,
|
||||
"syscon-chipselects", &syscon);
|
||||
if (err) {
|
||||
debug("%s: unable to find syscon device (%d)\n", __func__,
|
||||
err);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
regmap = syscon_get_regmap(syscon);
|
||||
if (IS_ERR(regmap)) {
|
||||
debug("%s: unable to find regmap (%ld)\n", __func__,
|
||||
PTR_ERR(regmap));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cell = fdt_getprop(gd->fdt_blob, bus->of_offset, "syscon-chipselects",
|
||||
&len);
|
||||
if (len < 2*sizeof(fdt32_t)) {
|
||||
debug("%s: offset not available\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fdtdec_get_number(cell + 1, 1) + regmap_get_range(regmap, 0);
|
||||
#else
|
||||
fdt_addr_t addr;
|
||||
addr = dev_get_addr_index(bus, 2);
|
||||
return (addr == FDT_ADDR_T_NONE) ? NULL :
|
||||
map_physmem(addr, 0, MAP_NOCACHE);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int ti_qspi_ofdata_to_platdata(struct udevice *bus)
|
||||
{
|
||||
struct ti_qspi_priv *priv = dev_get_priv(bus);
|
||||
const void *blob = gd->fdt_blob;
|
||||
int node = dev_of_offset(bus);
|
||||
fdt_addr_t addr;
|
||||
void *mmap;
|
||||
|
||||
priv->ctrl_mod_mmap = map_syscon_chipselects(bus);
|
||||
priv->base = map_physmem(dev_get_addr(bus), sizeof(struct ti_qspi_regs),
|
||||
MAP_NOCACHE);
|
||||
priv->memory_map = map_physmem(dev_get_addr_index(bus, 1), 0,
|
||||
MAP_NOCACHE);
|
||||
addr = dev_get_addr_index(bus, 2);
|
||||
mmap = map_physmem(dev_get_addr_index(bus, 2), 0, MAP_NOCACHE);
|
||||
priv->ctrl_mod_mmap = (addr == FDT_ADDR_T_NONE) ? NULL : mmap;
|
||||
|
||||
priv->max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", -1);
|
||||
if (priv->max_hz < 0) {
|
||||
|
|
|
@ -172,6 +172,21 @@ class DtbPlatdata:
|
|||
"""
|
||||
self.fdt = fdt_select.FdtScan(self._dtb_fname)
|
||||
|
||||
def ScanNode(self, root):
|
||||
for node in root.subnodes:
|
||||
if 'compatible' in node.props:
|
||||
status = node.props.get('status')
|
||||
if (not options.include_disabled and not status or
|
||||
status.value != 'disabled'):
|
||||
self._valid_nodes.append(node)
|
||||
phandle_prop = node.props.get('phandle')
|
||||
if phandle_prop:
|
||||
phandle = phandle_prop.GetPhandle()
|
||||
self._phandle_node[phandle] = node
|
||||
|
||||
# recurse to handle any subnodes
|
||||
self.ScanNode(node);
|
||||
|
||||
def ScanTree(self):
|
||||
"""Scan the device tree for useful information
|
||||
|
||||
|
@ -180,8 +195,10 @@ class DtbPlatdata:
|
|||
_valid_nodes: A list of nodes we wish to consider include in the
|
||||
platform data
|
||||
"""
|
||||
node_list = []
|
||||
self._phandle_node = {}
|
||||
self._valid_nodes = []
|
||||
return self.ScanNode(self.fdt.GetRoot());
|
||||
|
||||
for node in self.fdt.GetRoot().subnodes:
|
||||
if 'compatible' in node.props:
|
||||
status = node.props.get('status')
|
||||
|
|
Loading…
Add table
Reference in a new issue