lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 453/496] dmaengine: qcom: bam_dma: get num-channels and num-ees from dt
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>

    [ Upstream commit 48d163b1aa6e7f650c0b7a4f9c61c387a6def868 ]

    When Linux is master of BAM, it can directly read registers to know number
    of supported channels, however when its remotely controlled reading these
    registers would trigger a crash if the BAM is not yet initialized or
    powered up on the remote side.

    This patch allows driver to read num-channels and num-ees from Device Tree
    for remotely controlled BAM.

    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Signed-off-by: Vinod Koul <vinod.koul@intel.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/dma/qcom/bam_dma.c | 27 ++++++++++++++++++++++-----
    1 file changed, 22 insertions(+), 5 deletions(-)

    --- a/drivers/dma/qcom/bam_dma.c
    +++ b/drivers/dma/qcom/bam_dma.c
    @@ -388,6 +388,7 @@ struct bam_device {
    struct device_dma_parameters dma_parms;
    struct bam_chan *channels;
    u32 num_channels;
    + u32 num_ees;

    /* execution environment ID, from DT */
    u32 ee;
    @@ -1080,15 +1081,19 @@ static int bam_init(struct bam_device *b
    u32 val;

    /* read revision and configuration information */
    - val = readl_relaxed(bam_addr(bdev, 0, BAM_REVISION)) >> NUM_EES_SHIFT;
    - val &= NUM_EES_MASK;
    + if (!bdev->num_ees) {
    + val = readl_relaxed(bam_addr(bdev, 0, BAM_REVISION));
    + bdev->num_ees = (val >> NUM_EES_SHIFT) & NUM_EES_MASK;
    + }

    /* check that configured EE is within range */
    - if (bdev->ee >= val)
    + if (bdev->ee >= bdev->num_ees)
    return -EINVAL;

    - val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES));
    - bdev->num_channels = val & BAM_NUM_PIPES_MASK;
    + if (!bdev->num_channels) {
    + val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES));
    + bdev->num_channels = val & BAM_NUM_PIPES_MASK;
    + }

    if (bdev->controlled_remotely)
    return 0;
    @@ -1183,6 +1188,18 @@ static int bam_dma_probe(struct platform
    bdev->controlled_remotely = of_property_read_bool(pdev->dev.of_node,
    "qcom,controlled-remotely");

    + if (bdev->controlled_remotely) {
    + ret = of_property_read_u32(pdev->dev.of_node, "num-channels",
    + &bdev->num_channels);
    + if (ret)
    + dev_err(bdev->dev, "num-channels unspecified in dt\n");
    +
    + ret = of_property_read_u32(pdev->dev.of_node, "qcom,num-ees",
    + &bdev->num_ees);
    + if (ret)
    + dev_err(bdev->dev, "num-ees unspecified in dt\n");
    + }
    +
    bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
    if (IS_ERR(bdev->bamclk))
    return PTR_ERR(bdev->bamclk);

    \
     
     \ /
      Last update: 2018-05-28 14:18    [W:4.081 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site