lkml.org 
[lkml]   [2017]   [Nov]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 05/13] slimbus: core: add support to device tree helper
    Date
    From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>

    This patch adds support to parse slim devices from device tree.

    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    ---
    drivers/slimbus/core.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 50 insertions(+)

    diff --git a/drivers/slimbus/core.c b/drivers/slimbus/core.c
    index 41e83c15591a..0c66f76b1a85 100644
    --- a/drivers/slimbus/core.c
    +++ b/drivers/slimbus/core.c
    @@ -15,6 +15,7 @@
    #include <linux/slab.h>
    #include <linux/init.h>
    #include <linux/idr.h>
    +#include <linux/of.h>
    #include <linux/slimbus.h>
    #include "slimbus.h"

    @@ -120,6 +121,9 @@ static int slim_add_device(struct slim_controller *ctrl,
    sbdev->dev.driver = NULL;
    sbdev->ctrl = ctrl;

    + if (node)
    + sbdev->dev.of_node = of_node_get(node);
    +
    dev_set_name(&sbdev->dev, "%x:%x:%x:%x",
    sbdev->e_addr.manf_id,
    sbdev->e_addr.prod_code,
    @@ -150,6 +154,50 @@ static struct slim_device *slim_alloc_device(struct slim_controller *ctrl,
    return sbdev;
    }

    +static void of_register_slim_devices(struct slim_controller *ctrl)
    +{
    + struct device *dev = ctrl->dev;
    + struct device_node *node;
    +
    + if (!ctrl->dev->of_node)
    + return;
    +
    + for_each_child_of_node(ctrl->dev->of_node, node) {
    + struct slim_device *sbdev;
    + struct slim_eaddr e_addr;
    + const char *compat = NULL;
    + int reg[2], ret;
    + int manf_id, prod_code;
    +
    + compat = of_get_property(node, "compatible", NULL);
    + if (!compat)
    + continue;
    +
    + ret = sscanf(compat, "slim%x,%x", &manf_id, &prod_code);
    + if (ret != 2) {
    + dev_err(dev, "Manf ID & Product code not found %s\n",
    + compat);
    + continue;
    + }
    +
    + ret = of_property_read_u32_array(node, "reg", reg, 2);
    + if (ret) {
    + dev_err(dev, "Device and Instance id not found:%d\n",
    + ret);
    + continue;
    + }
    +
    + e_addr.dev_index = reg[0];
    + e_addr.instance = reg[1];
    + e_addr.manf_id = manf_id;
    + e_addr.prod_code = prod_code;
    +
    + sbdev = slim_alloc_device(ctrl, &e_addr, node);
    + if (!sbdev)
    + continue;
    + }
    +}
    +
    /*
    * slim_register_controller() - Controller bring-up and registration.
    *
    @@ -181,6 +229,8 @@ int slim_register_controller(struct slim_controller *ctrl)
    dev_dbg(ctrl->dev, "Bus [%s] registered:dev:%p\n",
    ctrl->name, ctrl->dev);

    + of_register_slim_devices(ctrl);
    +
    return 0;
    }
    EXPORT_SYMBOL_GPL(slim_register_controller);
    --
    2.15.0
    \
     
     \ /
      Last update: 2017-11-30 18:49    [W:2.995 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site