lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 398/757] i3c: master add i3c_master_attach_boardinfo to preserve boardinfo
    Date
    From: Parshuram Thombare <pthombar@cadence.com>

    [ Upstream commit 9da36a7ec42135428e1d41621e3703429bda3b2e ]

    Boardinfo was lost if I3C object for devices with boardinfo
    available are not created or not added to the I3C device list
    because of some failure e.g. SETDASA failed, retrieve info failed etc
    This patch adds i3c_master_attach_boardinfo which scan boardinfo list
    in the master object and 'attach' it to the I3C device object.

    Fixes: 3a379bbcea0a ("i3c: Add core I3C infrastructure")
    Signed-off-by: Parshuram Thombare <pthombar@cadence.com>
    Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
    Link: https://lore.kernel.org/linux-i3c/1590053542-389-1-git-send-email-pthombar@cadence.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/i3c/master.c | 19 +++++++++++++++++--
    1 file changed, 17 insertions(+), 2 deletions(-)

    diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
    index 97f2e29265da7..cc7564446ccd2 100644
    --- a/drivers/i3c/master.c
    +++ b/drivers/i3c/master.c
    @@ -1782,6 +1782,21 @@ static void i3c_master_bus_cleanup(struct i3c_master_controller *master)
    i3c_master_detach_free_devs(master);
    }

    +static void i3c_master_attach_boardinfo(struct i3c_dev_desc *i3cdev)
    +{
    + struct i3c_master_controller *master = i3cdev->common.master;
    + struct i3c_dev_boardinfo *i3cboardinfo;
    +
    + list_for_each_entry(i3cboardinfo, &master->boardinfo.i3c, node) {
    + if (i3cdev->info.pid != i3cboardinfo->pid)
    + continue;
    +
    + i3cdev->boardinfo = i3cboardinfo;
    + i3cdev->info.static_addr = i3cboardinfo->static_addr;
    + return;
    + }
    +}
    +
    static struct i3c_dev_desc *
    i3c_master_search_i3c_dev_duplicate(struct i3c_dev_desc *refdev)
    {
    @@ -1837,10 +1852,10 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master,
    if (ret)
    goto err_detach_dev;

    + i3c_master_attach_boardinfo(newdev);
    +
    olddev = i3c_master_search_i3c_dev_duplicate(newdev);
    if (olddev) {
    - newdev->boardinfo = olddev->boardinfo;
    - newdev->info.static_addr = olddev->info.static_addr;
    newdev->dev = olddev->dev;
    if (newdev->dev)
    newdev->dev->desc = newdev;
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:10    [W:2.411 / U:0.284 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site