summaryrefslogtreecommitdiff
path: root/drivers/core
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/core')
-rw-r--r--drivers/core/Kconfig10
-rw-r--r--drivers/core/Makefile2
-rw-r--r--drivers/core/acpi.c7
-rw-r--r--drivers/core/device.c2
-rw-r--r--drivers/core/of_access.c2
-rw-r--r--drivers/core/ofnode.c7
-rw-r--r--drivers/core/read.c34
-rw-r--r--drivers/core/root.c5
-rw-r--r--drivers/core/tag.c4
9 files changed, 46 insertions, 27 deletions
diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig
index 5419bf65b5d..ae0c3466772 100644
--- a/drivers/core/Kconfig
+++ b/drivers/core/Kconfig
@@ -337,11 +337,19 @@ config SIMPLE_BUS_CORRECT_RANGE
config SIMPLE_PM_BUS
bool "Support simple-pm-bus driver"
- depends on DM && OF_CONTROL && CLK && POWER_DOMAIN
+ depends on DM && OF_CONTROL && POWER_DOMAIN
help
Supports the 'simple-pm-bus' driver, which is used for busses that
have power domains and/or clocks which need to be enabled before use.
+config SPL_SIMPLE_PM_BUS
+ bool "Support simple-pm-bus driver in SPL"
+ depends on SPL_DM && SPL_OF_CONTROL && SPL_POWER_DOMAIN
+ help
+ Supports the 'simple-pm-bus' driver, which is used for busses that
+ have power domains and/or clocks which need to be enabled before use,
+ in SPL.
+
config OF_TRANSLATE
bool "Translate addresses using fdt_translate_address"
depends on DM && OF_CONTROL
diff --git a/drivers/core/Makefile b/drivers/core/Makefile
index a549890c22b..1073c26b2ed 100644
--- a/drivers/core/Makefile
+++ b/drivers/core/Makefile
@@ -7,7 +7,7 @@ obj-$(CONFIG_$(PHASE_)ACPIGEN) += acpi.o
obj-$(CONFIG_$(PHASE_)DEVRES) += devres.o
obj-$(CONFIG_$(PHASE_)DM_DEVICE_REMOVE) += device-remove.o
obj-$(CONFIG_$(PHASE_)SIMPLE_BUS) += simple-bus.o
-obj-$(CONFIG_SIMPLE_PM_BUS) += simple-pm-bus.o
+obj-$(CONFIG_$(PHASE_)SIMPLE_PM_BUS) += simple-pm-bus.o
obj-$(CONFIG_DM) += dump.o
obj-$(CONFIG_$(PHASE_)REGMAP) += regmap.o
obj-$(CONFIG_$(PHASE_)SYSCON) += syscon-uclass.o
diff --git a/drivers/core/acpi.c b/drivers/core/acpi.c
index 4763963914b..284fb70b036 100644
--- a/drivers/core/acpi.c
+++ b/drivers/core/acpi.c
@@ -87,7 +87,7 @@ int acpi_copy_name(char *out_name, const char *name)
int acpi_get_name(const struct udevice *dev, char *out_name)
{
- struct acpi_ops *aops;
+ const struct acpi_ops *aops;
const char *name;
int ret;
@@ -154,10 +154,9 @@ static int add_item(struct acpi_ctx *ctx, struct udevice *dev,
if (!item->size)
return 0;
if (type != TYPE_OTHER) {
- item->buf = malloc(item->size);
+ item->buf = memdup(start, item->size);
if (!item->buf)
return log_msg_ret("mem", -ENOMEM);
- memcpy(item->buf, start, item->size);
}
item_count++;
log_debug("* %s: Added type %d, %p, size %x\n",
@@ -276,7 +275,7 @@ static int sort_acpi_item_type(struct acpi_ctx *ctx, void *start,
acpi_method acpi_get_method(struct udevice *dev, enum method_t method)
{
- struct acpi_ops *aops;
+ const struct acpi_ops *aops;
aops = device_get_acpi_ops(dev);
if (aops) {
diff --git a/drivers/core/device.c b/drivers/core/device.c
index d365204ba11..6024534ff93 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -1147,6 +1147,8 @@ int device_set_name(struct udevice *dev, const char *name)
name = strdup(name);
if (!name)
return -ENOMEM;
+ if (dev_get_flags(dev) & DM_FLAG_NAME_ALLOCED)
+ free((char *)dev->name);
dev->name = name;
device_set_name_alloced(dev);
diff --git a/drivers/core/of_access.c b/drivers/core/of_access.c
index 969492aae37..f910cc9a31b 100644
--- a/drivers/core/of_access.c
+++ b/drivers/core/of_access.c
@@ -1071,7 +1071,7 @@ int of_add_subnode(struct device_node *parent, const char *name, int len,
* make sure we don't use a child called "trevor" when we are
* searching for "trev".
*/
- if (!strncmp(child->name, name, len) && strlen(name) == len) {
+ if (!strncmp(child->name, name, len) && strlen(child->name) == len) {
*childp = child;
return -EEXIST;
}
diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
index d605c0f7b7c..b5d13c43db1 100644
--- a/drivers/core/ofnode.c
+++ b/drivers/core/ofnode.c
@@ -130,8 +130,10 @@ int oftree_new(oftree *treep)
if (!fdt)
return log_msg_ret("fla", -ENOMEM);
ret = fdt_create_empty_tree(fdt, size);
- if (ret)
+ if (ret) {
+ free(fdt);
return log_msg_ret("fla", -EINVAL);
+ }
oftree_list[oftree_count++] = fdt;
tree.fdt = fdt;
}
@@ -1798,10 +1800,9 @@ int ofnode_write_prop(ofnode node, const char *propname, const void *value,
void *newval;
if (copy) {
- newval = malloc(len);
+ newval = memdup(value, len);
if (!newval)
return log_ret(-ENOMEM);
- memcpy(newval, value, len);
value = newval;
}
ret = of_write_prop(ofnode_to_np(node), propname, len, value);
diff --git a/drivers/core/read.c b/drivers/core/read.c
index c0d7a969db2..ba48862f44b 100644
--- a/drivers/core/read.c
+++ b/drivers/core/read.c
@@ -132,12 +132,14 @@ fdt_addr_t dev_read_addr_index(const struct udevice *dev, int index)
void *dev_read_addr_index_ptr(const struct udevice *dev, int index)
{
- fdt_addr_t addr = dev_read_addr_index(dev, index);
+ fdt_addr_t addr;
+ fdt_size_t size = 0;
+ addr = dev_read_addr_size_index(dev, index, &size);
if (addr == FDT_ADDR_T_NONE)
return NULL;
- return map_sysmem(addr, 0);
+ return map_sysmem(addr, size);
}
fdt_addr_t dev_read_addr_size_index(const struct udevice *dev, int index,
@@ -157,17 +159,19 @@ void *dev_read_addr_size_index_ptr(const struct udevice *dev, int index,
if (addr == FDT_ADDR_T_NONE)
return NULL;
- return map_sysmem(addr, 0);
+ return map_sysmem(addr, *size);
}
void *dev_remap_addr_index(const struct udevice *dev, int index)
{
- fdt_addr_t addr = dev_read_addr_index(dev, index);
+ fdt_addr_t addr;
+ fdt_size_t size = 0;
+ addr = dev_read_addr_size_index(dev, index, &size);
if (addr == FDT_ADDR_T_NONE)
return NULL;
- return map_physmem(addr, 0, MAP_NOCACHE);
+ return map_physmem(addr, size, MAP_NOCACHE);
}
fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name)
@@ -182,12 +186,14 @@ fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name)
void *dev_read_addr_name_ptr(const struct udevice *dev, const char *name)
{
- fdt_addr_t addr = dev_read_addr_name(dev, name);
+ fdt_addr_t addr;
+ fdt_size_t size = 0;
+ addr = dev_read_addr_size_name(dev, name, &size);
if (addr == FDT_ADDR_T_NONE)
return NULL;
- return map_sysmem(addr, 0);
+ return map_sysmem(addr, size);
}
fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name,
@@ -209,17 +215,19 @@ void *dev_read_addr_size_name_ptr(const struct udevice *dev, const char *name,
if (addr == FDT_ADDR_T_NONE)
return NULL;
- return map_sysmem(addr, 0);
+ return map_sysmem(addr, *size);
}
void *dev_remap_addr_name(const struct udevice *dev, const char *name)
{
- fdt_addr_t addr = dev_read_addr_name(dev, name);
+ fdt_addr_t addr;
+ fdt_size_t size = 0;
+ addr = dev_read_addr_size_name(dev, name, &size);
if (addr == FDT_ADDR_T_NONE)
return NULL;
- return map_physmem(addr, 0, MAP_NOCACHE);
+ return map_physmem(addr, size, MAP_NOCACHE);
}
fdt_addr_t dev_read_addr(const struct udevice *dev)
@@ -229,12 +237,14 @@ fdt_addr_t dev_read_addr(const struct udevice *dev)
void *dev_read_addr_ptr(const struct udevice *dev)
{
- fdt_addr_t addr = dev_read_addr(dev);
+ fdt_addr_t addr;
+ fdt_size_t size = 0;
+ addr = dev_read_addr_size(dev, &size);
if (addr == FDT_ADDR_T_NONE)
return NULL;
- return map_sysmem(addr, 0);
+ return map_sysmem(addr, size);
}
void *dev_remap_addr(const struct udevice *dev)
diff --git a/drivers/core/root.c b/drivers/core/root.c
index d43645f34dd..2aa16d59b69 100644
--- a/drivers/core/root.c
+++ b/drivers/core/root.c
@@ -81,10 +81,9 @@ static int dm_setup_inst(void)
/* Now allocate space for the priv/plat data, and copy it in */
size = __priv_data_end - __priv_data_start;
- base = calloc(1, size);
+ base = memdup(__priv_data_start, size);
if (!base)
return log_msg_ret("priv", -ENOMEM);
- memcpy(base, __priv_data_start, size);
gd_set_dm_priv_base(base);
}
@@ -460,7 +459,7 @@ static int root_acpi_get_name(const struct udevice *dev, char *out_name)
return acpi_copy_name(out_name, "\\_SB");
}
-struct acpi_ops root_acpi_ops = {
+static const struct acpi_ops root_acpi_ops = {
.get_name = root_acpi_get_name,
};
#endif
diff --git a/drivers/core/tag.c b/drivers/core/tag.c
index a3c5cb7e57c..78b5ee6dc07 100644
--- a/drivers/core/tag.c
+++ b/drivers/core/tag.c
@@ -46,7 +46,7 @@ int dev_tag_set_ptr(struct udevice *dev, enum dm_tag_t tag, void *ptr)
return -EEXIST;
}
- node = calloc(sizeof(*node), 1);
+ node = calloc(1, sizeof(*node));
if (!node)
return -ENOMEM;
@@ -70,7 +70,7 @@ int dev_tag_set_val(struct udevice *dev, enum dm_tag_t tag, ulong val)
return -EEXIST;
}
- node = calloc(sizeof(*node), 1);
+ node = calloc(1, sizeof(*node));
if (!node)
return -ENOMEM;