|
@@ -442,6 +442,7 @@ static void mx51_ecspi_reset(struct spi_imx_data *spi_imx)
|
|
|
#define MX31_CSPICTRL_ENABLE (1 << 0)
|
|
|
#define MX31_CSPICTRL_MASTER (1 << 1)
|
|
|
#define MX31_CSPICTRL_XCH (1 << 2)
|
|
|
+#define MX31_CSPICTRL_SMC (1 << 3)
|
|
|
#define MX31_CSPICTRL_POL (1 << 4)
|
|
|
#define MX31_CSPICTRL_PHA (1 << 5)
|
|
|
#define MX31_CSPICTRL_SSCTL (1 << 6)
|
|
@@ -452,6 +453,10 @@ static void mx51_ecspi_reset(struct spi_imx_data *spi_imx)
|
|
|
#define MX35_CSPICTRL_CS_SHIFT 12
|
|
|
#define MX31_CSPICTRL_DR_SHIFT 16
|
|
|
|
|
|
+#define MX31_CSPI_DMAREG 0x10
|
|
|
+#define MX31_DMAREG_RH_DEN (1<<4)
|
|
|
+#define MX31_DMAREG_TH_DEN (1<<1)
|
|
|
+
|
|
|
#define MX31_CSPISTATUS 0x14
|
|
|
#define MX31_STATUS_RR (1 << 3)
|
|
|
|
|
@@ -511,6 +516,9 @@ static int mx31_config(struct spi_device *spi, struct spi_imx_config *config)
|
|
|
(is_imx35_cspi(spi_imx) ? MX35_CSPICTRL_CS_SHIFT :
|
|
|
MX31_CSPICTRL_CS_SHIFT);
|
|
|
|
|
|
+ if (spi_imx->usedma)
|
|
|
+ reg |= MX31_CSPICTRL_SMC;
|
|
|
+
|
|
|
writel(reg, spi_imx->base + MXC_CSPICTRL);
|
|
|
|
|
|
reg = readl(spi_imx->base + MX31_CSPI_TESTREG);
|
|
@@ -520,6 +528,13 @@ static int mx31_config(struct spi_device *spi, struct spi_imx_config *config)
|
|
|
reg &= ~MX31_TEST_LBC;
|
|
|
writel(reg, spi_imx->base + MX31_CSPI_TESTREG);
|
|
|
|
|
|
+ if (spi_imx->usedma) {
|
|
|
+ /* configure DMA requests when RXFIFO is half full and
|
|
|
+ when TXFIFO is half empty */
|
|
|
+ writel(MX31_DMAREG_RH_DEN | MX31_DMAREG_TH_DEN,
|
|
|
+ spi_imx->base + MX31_CSPI_DMAREG);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1244,10 +1259,10 @@ static int spi_imx_probe(struct platform_device *pdev)
|
|
|
|
|
|
spi_imx->spi_clk = clk_get_rate(spi_imx->clk_per);
|
|
|
/*
|
|
|
- * Only validated on i.mx6 now, can remove the constrain if validated on
|
|
|
- * other chips.
|
|
|
+ * Only validated on i.mx35 and i.mx6 now, can remove the constraint
|
|
|
+ * if validated on other chips.
|
|
|
*/
|
|
|
- if (is_imx51_ecspi(spi_imx)) {
|
|
|
+ if (is_imx35_cspi(spi_imx) || is_imx51_ecspi(spi_imx)) {
|
|
|
ret = spi_imx_sdma_init(&pdev->dev, spi_imx, master);
|
|
|
if (ret == -EPROBE_DEFER)
|
|
|
goto out_clk_put;
|