Commit 497d7d85 authored by Abhishek Sahu's avatar Abhishek Sahu Committed by Boris Brezillon

mtd: nand: qcom: add and initialize QPIC DMA resources

1. QPIC NAND controller uses 3 BAM channels: command, data tx
   and data rx while EBI2 NAND controller uses only single ADM
   channel.
2. CRCI is only required for ADM DMA and it's not required for
   BAM DMA.
Reviewed-by: default avatarArchit Taneja <architt@codeaurora.org>
Signed-off-by: default avatarAbhishek Sahu <absahu@codeaurora.org>
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
parent 8c5d5d6a
...@@ -255,9 +255,22 @@ struct qcom_nand_controller { ...@@ -255,9 +255,22 @@ struct qcom_nand_controller {
struct clk *core_clk; struct clk *core_clk;
struct clk *aon_clk; struct clk *aon_clk;
struct dma_chan *chan; union {
unsigned int cmd_crci; /* will be used only by QPIC for BAM DMA */
unsigned int data_crci; struct {
struct dma_chan *tx_chan;
struct dma_chan *rx_chan;
struct dma_chan *cmd_chan;
};
/* will be used only by EBI2 for ADM DMA */
struct {
struct dma_chan *chan;
unsigned int cmd_crci;
unsigned int data_crci;
};
};
struct list_head desc_list; struct list_head desc_list;
u8 *data_buffer; u8 *data_buffer;
...@@ -1989,10 +2002,31 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc) ...@@ -1989,10 +2002,31 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
if (!nandc->reg_read_buf) if (!nandc->reg_read_buf)
return -ENOMEM; return -ENOMEM;
nandc->chan = dma_request_slave_channel(nandc->dev, "rxtx"); if (nandc->props->is_bam) {
if (!nandc->chan) { nandc->tx_chan = dma_request_slave_channel(nandc->dev, "tx");
dev_err(nandc->dev, "failed to request slave channel\n"); if (!nandc->tx_chan) {
return -ENODEV; dev_err(nandc->dev, "failed to request tx channel\n");
return -ENODEV;
}
nandc->rx_chan = dma_request_slave_channel(nandc->dev, "rx");
if (!nandc->rx_chan) {
dev_err(nandc->dev, "failed to request rx channel\n");
return -ENODEV;
}
nandc->cmd_chan = dma_request_slave_channel(nandc->dev, "cmd");
if (!nandc->cmd_chan) {
dev_err(nandc->dev, "failed to request cmd channel\n");
return -ENODEV;
}
} else {
nandc->chan = dma_request_slave_channel(nandc->dev, "rxtx");
if (!nandc->chan) {
dev_err(nandc->dev,
"failed to request slave channel\n");
return -ENODEV;
}
} }
INIT_LIST_HEAD(&nandc->desc_list); INIT_LIST_HEAD(&nandc->desc_list);
...@@ -2005,7 +2039,19 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc) ...@@ -2005,7 +2039,19 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
static void qcom_nandc_unalloc(struct qcom_nand_controller *nandc) static void qcom_nandc_unalloc(struct qcom_nand_controller *nandc)
{ {
dma_release_channel(nandc->chan); if (nandc->props->is_bam) {
if (nandc->tx_chan)
dma_release_channel(nandc->tx_chan);
if (nandc->rx_chan)
dma_release_channel(nandc->rx_chan);
if (nandc->cmd_chan)
dma_release_channel(nandc->cmd_chan);
} else {
if (nandc->chan)
dma_release_channel(nandc->chan);
}
} }
/* one time setup of a few nand controller registers */ /* one time setup of a few nand controller registers */
...@@ -2146,16 +2192,20 @@ static int qcom_nandc_parse_dt(struct platform_device *pdev) ...@@ -2146,16 +2192,20 @@ static int qcom_nandc_parse_dt(struct platform_device *pdev)
struct device_node *np = nandc->dev->of_node; struct device_node *np = nandc->dev->of_node;
int ret; int ret;
ret = of_property_read_u32(np, "qcom,cmd-crci", &nandc->cmd_crci); if (!nandc->props->is_bam) {
if (ret) { ret = of_property_read_u32(np, "qcom,cmd-crci",
dev_err(nandc->dev, "command CRCI unspecified\n"); &nandc->cmd_crci);
return ret; if (ret) {
} dev_err(nandc->dev, "command CRCI unspecified\n");
return ret;
}
ret = of_property_read_u32(np, "qcom,data-crci", &nandc->data_crci); ret = of_property_read_u32(np, "qcom,data-crci",
if (ret) { &nandc->data_crci);
dev_err(nandc->dev, "data CRCI unspecified\n"); if (ret) {
return ret; dev_err(nandc->dev, "data CRCI unspecified\n");
return ret;
}
} }
return 0; return 0;
...@@ -2205,7 +2255,7 @@ static int qcom_nandc_probe(struct platform_device *pdev) ...@@ -2205,7 +2255,7 @@ static int qcom_nandc_probe(struct platform_device *pdev)
ret = qcom_nandc_alloc(nandc); ret = qcom_nandc_alloc(nandc);
if (ret) if (ret)
return ret; goto err_core_clk;
ret = clk_prepare_enable(nandc->core_clk); ret = clk_prepare_enable(nandc->core_clk);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment