slimbus: Add snapshot of slimbus driver

This snapshot is taken as of msm-4.19 'commit <f08e34e48e72>
(Merge "defconfig: enable dcvs configs for bengal target")'.

Change-Id: I2f187a74814b1b04fa447a5664c5b170d075ffa4
Signed-off-by: Prudhvi Yarlagadda <[email protected]>
This commit is contained in:
Prudhvi Yarlagadda 2019-12-03 19:33:16 +05:30
commit 375c1eca79
13 changed files with 11016 additions and 15 deletions

View file

@ -99,6 +99,12 @@ config OF_RESERVED_MEM_CHECK
config OF_RESOLVE
bool
config OF_SLIMBUS
def_tristate SLIMBUS
depends on SLIMBUS
help
OpenFirmware SLIMBUS accessors
config OF_OVERLAY
bool "Device Tree overlays"
select OF_DYNAMIC

View file

@ -12,6 +12,7 @@ obj-$(CONFIG_OF_UNITTEST) += unittest.o
obj-$(CONFIG_OF_MDIO) += of_mdio.o
obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o
obj-$(CONFIG_OF_RESOLVE) += resolver.o
obj-$(CONFIG_OF_SLIMBUS) += of_slimbus.o
obj-$(CONFIG_OF_OVERLAY) += overlay.o
obj-$(CONFIG_OF_NUMA) += of_numa.o

85
drivers/of/of_slimbus.c Normal file
View file

@ -0,0 +1,85 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*/
/* OF helpers for SLIMbus */
#include <linux/slimbus/slimbus.h>
#include <linux/irq.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/of_slimbus.h>
int of_register_slim_devices(struct slim_controller *ctrl)
{
struct device_node *node;
struct slim_boardinfo *binfo = NULL;
struct slim_boardinfo *temp;
int n = 0;
int ret = 0;
if (!ctrl->dev.of_node)
return -EINVAL;
for_each_available_child_of_node(ctrl->dev.of_node, node) {
struct property *prop;
struct slim_device *slim;
char *name;
prop = of_find_property(node, "elemental-addr", NULL);
if (!prop || prop->length != 6) {
dev_err(&ctrl->dev, "of_slim: invalid E-addr\n");
continue;
}
name = kzalloc(SLIMBUS_NAME_SIZE, GFP_KERNEL);
if (!name) {
ret = -ENOMEM;
of_node_put(node);
goto of_slim_err;
}
if (of_modalias_node(node, name, SLIMBUS_NAME_SIZE) < 0) {
dev_err(&ctrl->dev, "of_slim: modalias failure on %s\n",
node->full_name);
kfree(name);
continue;
}
slim = kzalloc(sizeof(struct slim_device), GFP_KERNEL);
if (!slim) {
ret = -ENOMEM;
kfree(name);
of_node_put(node);
goto of_slim_err;
}
memcpy(slim->e_addr, prop->value, 6);
temp = krealloc(binfo, (n + 1) * sizeof(struct slim_boardinfo),
GFP_KERNEL);
if (!temp) {
kfree(name);
kfree(slim);
ret = -ENOMEM;
of_node_put(node);
goto of_slim_err;
}
binfo = temp;
slim->dev.of_node = of_node_get(node);
slim->name = (const char *)name;
binfo[n].bus_num = ctrl->nr;
binfo[n].slim_slave = slim;
n++;
}
ret = slim_register_board_info(binfo, n);
if (!ret)
goto of_slim_ret;
of_slim_err:
while (n-- > 0) {
kfree(binfo[n].slim_slave->name);
kfree(binfo[n].slim_slave);
}
of_slim_ret:
kfree(binfo);
return ret;
}
EXPORT_SYMBOL(of_register_slim_devices);