[PATCH 3/3] dmaengine: sirf: enable the driver support new SiRFmarco SoC

Vinod Koul vkoul at infradead.org
Wed Oct 24 07:03:01 EDT 2012


On Thu, 2012-09-27 at 16:36 +0800, Barry Song wrote:
> From: Barry Song <Baohua.Song at csr.com>
> 
> The driver supports old up SiRFprimaII SoCs, this patch makes it support
> the new SiRFmarco as well.
> SiRFmarco, as a SMP SoC, adds new DMA_INT_EN_CLR and DMA_CH_LOOP_CTRL_CLR
> registers, to disable IRQ/Channel, we should write 1 to the corresponding
> bit in the two CLEAR register.
> 
> Tested on SiRFmarco using SPI driver:
>     $ /mnt/spidev-sirftest -D /dev/spidev32766.0
>     spi mode: 0
>     bits per word: 8
>     max speed: 500000 Hz (500 KHz)
> 
>     00 00 00 00 00 00
>     00 00 00 00 00 00
>     00 00 00 00 00 00
>     00 00 00 00 00 00
>     00 00 00 00 00 00
>     00 00 00 00 00 00
>     00 00 00 00
> 
>     $ cat /proc/interrupts
>                CPU0       CPU1
>      32:       1593          0       GIC  sirfsoc_timer0
>      33:          0       3533       GIC  sirfsoc_timer1
>      44:          0          0       GIC  sirfsoc_dma
>      45:         16          0       GIC  sirfsoc_dma
>      47:          6          0       GIC  sirfsoc_spi
>      50:       5654          0       GIC  sirfsoc-uart
>      ...
> 
> Signed-off-by: Barry Song <Baohua.Song at csr.com>
> ---
>  depends on pulled CSR SiRFmarco preparing patches:
>  http://www.spinics.net/lists/arm-kernel/msg191412.html
> 
>  drivers/dma/Kconfig    |    2 +-
>  drivers/dma/sirf-dma.c |   25 +++++++++++++++++++------
>  2 files changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
> index d06ea29..bf5f405 100644
> --- a/drivers/dma/Kconfig
> +++ b/drivers/dma/Kconfig
> @@ -203,7 +203,7 @@ config TIMB_DMA
>  
>  config SIRF_DMA
>  	tristate "CSR SiRFprimaII DMA support"
> -	depends on ARCH_PRIMA2
> +	depends on ARCH_SIRF
patch description says adding support, but now your are removing for
PRIMA2, did I miss anything?
>  	select DMA_ENGINE
>  	help
>  	  Enable support for the CSR SiRFprimaII DMA engine.
> diff --git a/drivers/dma/sirf-dma.c b/drivers/dma/sirf-dma.c
> index c439489..fbb0199 100644
> --- a/drivers/dma/sirf-dma.c
> +++ b/drivers/dma/sirf-dma.c
> @@ -32,7 +32,9 @@
>  #define SIRFSOC_DMA_CH_VALID                    0x140
>  #define SIRFSOC_DMA_CH_INT                      0x144
>  #define SIRFSOC_DMA_INT_EN                      0x148
> +#define SIRFSOC_DMA_INT_EN_CLR			0x14C
can you pls align this
>  #define SIRFSOC_DMA_CH_LOOP_CTRL                0x150
> +#define SIRFSOC_DMA_CH_LOOP_CTRL_CLR            0x15C
>  
>  #define SIRFSOC_DMA_MODE_CTRL_BIT               4
>  #define SIRFSOC_DMA_DIR_CTRL_BIT                5
> @@ -76,6 +78,7 @@ struct sirfsoc_dma {
>  	struct sirfsoc_dma_chan		channels[SIRFSOC_DMA_CHANNELS];
>  	void __iomem			*base;
>  	int				irq;
> +	bool				is_marco;
>  };
>  
>  #define DRV_NAME	"sirfsoc_dma"
> @@ -288,13 +291,19 @@ static int sirfsoc_dma_terminate_all(struct sirfsoc_dma_chan *schan)
>  	int cid = schan->chan.chan_id;
>  	unsigned long flags;
>  
> -	writel_relaxed(readl_relaxed(sdma->base + SIRFSOC_DMA_INT_EN) &
> -		~(1 << cid), sdma->base + SIRFSOC_DMA_INT_EN);
> -	writel_relaxed(1 << cid, sdma->base + SIRFSOC_DMA_CH_VALID);
> -
> -	writel_relaxed(readl_relaxed(sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL)
> -		& ~((1 << cid) | 1 << (cid + 16)),
> +	if (!sdma->is_marco) {
> +		writel_relaxed(readl_relaxed(sdma->base + SIRFSOC_DMA_INT_EN) &
> +			~(1 << cid), sdma->base + SIRFSOC_DMA_INT_EN);
> +		writel_relaxed(readl_relaxed(sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL)
> +			& ~((1 << cid) | 1 << (cid + 16)),
>  			sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL);
> +	} else {
> +		writel_relaxed(1 << cid, sdma->base + SIRFSOC_DMA_INT_EN_CLR);
> +		writel_relaxed((1 << cid) | 1 << (cid + 16),
> +			sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL_CLR);
> +	}
> +
> +	writel_relaxed(1 << cid, sdma->base + SIRFSOC_DMA_CH_VALID);
>  
>  	spin_lock_irqsave(&schan->lock, flags);
>  	list_splice_tail_init(&schan->active, &schan->free);
> @@ -568,6 +577,9 @@ static int __devinit sirfsoc_dma_probe(struct platform_device *op)
>  		return -ENOMEM;
>  	}
>  
> +	if (of_device_is_compatible(dn, "sirf,marco-dmac"))
not a DT expert, but wouldn't there be a space after comma?
> +		sdma->is_marco = true;
> +
>  	if (of_property_read_u32(dn, "cell-index", &id)) {
>  		dev_err(dev, "Fail to get DMAC index\n");
>  		ret = -ENODEV;
> @@ -677,6 +689,7 @@ static int __devexit sirfsoc_dma_remove(struct platform_device *op)
>  
>  static struct of_device_id sirfsoc_dma_match[] = {
>  	{ .compatible = "sirf,prima2-dmac", },
> +	{ .compatible = "sirf,marco-dmac", },
>  	{},
>  };
>  


-- 
Vinod Koul
Intel Corp.




More information about the linux-arm-kernel mailing list