This is much better than last time but I still have questions...
2010/11/18 Alan Cox <[email protected]>:
> + /* 1. Init rx channel */
> + rxs = &dw_dma->dmas_rx;
> + ds = &rxs->dma_slave;
> + ds->direction = DMA_FROM_DEVICE;
> + rxs->hs_mode = LNW_DMA_HW_HS;
> + rxs->cfg_mode = LNW_DMA_PER_TO_MEM;
> + ds->src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
> + ds->dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
> + ds->src_maxburst = 16;
> + ds->dst_maxburst = 16;
This is great stuff! That is exactly how ds is to be set up.
I would prefer that you don't dereference the this rxs thing here
but whatever.
> + dma_cap_zero(mask);
> + dma_cap_set(DMA_MEMCPY, mask);
> + dma_cap_set(DMA_SLAVE, mask);
This is not elegant. Are you going to do memcpy() or slave
transfers? What you want to do is fix your DMA engine so that
just asking for DMA_SLAVE works.
> + dma_cap_set(DMA_SLAVE, mask);
> + dma_cap_set(DMA_MEMCPY, mask);
Here again...
> +static int mid_spi_dma_transfer(struct dw_spi *dws, int cs_change)
> +{
(...)
> + flag = DMA_PREP_INTERRUPT | DMA_CTRL_ACK;
> + if (dws->tx_dma) {
> + txdesc = txchan->device->device_prep_dma_memcpy(txchan,
> + dws->dma_addr, dws->tx_dma,
> + dws->len, flag);
> + txdesc->callback = dw_spi_dma_done;
> + txdesc->callback_param = &dws->tx_param;
> + }
> +
> + /* 3. start the RX dma transfer */
> + if (dws->rx_dma) {
> + rxdesc = rxchan->device->device_prep_dma_memcpy(rxchan,
> + dws->rx_dma, dws->dma_addr,
> + dws->len, flag);
> + rxdesc->callback = dw_spi_dma_done;
> + rxdesc->callback_param = &dws->rx_param;
> + }
Using device_prep_dma_memcpy() for this is still nonsense, it should be
device_prep_slave_sg().
I know the DMA driver needs fixing in order for this to work properly,
so why not fix it?
These are the most important concerns I raised last iteration, so
I challenge you to fix drivers/dma/dw_dmac.c or wherever the real
problem sits.
Can you describe where the problem with fixing this to use real
slave sglists is?
Yours,
Linus Walleij
------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
spi-devel-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spi-devel-general