| From foo@baz Sun May 27 17:33:38 CEST 2018 |
| From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> |
| Date: Thu, 15 Feb 2018 12:25:09 +0000 |
| Subject: dmaengine: qcom: bam_dma: get num-channels and num-ees from dt |
| |
| 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 |
| @@ -387,6 +387,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; |
| @@ -1076,15 +1077,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; |
| @@ -1179,6 +1184,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); |