On Friday 10 January 2014, Andy Gross wrote: > +static bool bam_dma_filter(struct dma_chan *chan, void *data) > +{ > + struct bam_filter_args *args = data; > + struct bam_chan *bchan = to_bam_chan(chan); > + > + if (args->dev == chan->device && > + args->id == bchan->id) { > + > + /* we found the channel, so lets set the EE and dir */ > + bchan->ee = args->ee; > + bchan->slave.direction = args->dir ? > + DMA_DEV_TO_MEM : DMA_MEM_TO_DEV; > + return true; > + } > + > + return false; > +} A filter function should no longer be needed. > +static struct dma_chan *bam_dma_xlate(struct of_phandle_args *dma_spec, > + struct of_dma *of) > +{ > + struct bam_filter_args args; > + dma_cap_mask_t cap; > + > + if (dma_spec->args_count != 3) > + return NULL; > + > + args.dev = of->of_dma_data; > + args.id = dma_spec->args[0]; > + args.ee = dma_spec->args[1]; > + args.dir = dma_spec->args[2]; > + > + dma_cap_zero(cap); > + dma_cap_set(DMA_SLAVE, cap); > + > + return dma_request_channel(cap, bam_dma_filter, &args); > +} Instead, call dma_get_slave_channel() with the right channel that you already know here. > + if (pdev->dev.of_node) { > + ret = of_dma_controller_register(pdev->dev.of_node, > + bam_dma_xlate, &bdev->common); > + > + if (ret) { > + dev_err(bdev->dev, "failed to register of_dma\n"); > + goto err_unregister_dma; > + } > + } No need to check for pdev->dev.of_node when that is the only mode of probing. > + > +#ifdef CONFIG_OF > +static const struct of_device_id bam_of_match[] = { > + { .compatible = "qcom,bam-v1.4.0", }, > + { .compatible = "qcom,bam-v1.4.1", }, > + {} > +}; > +MODULE_DEVICE_TABLE(of, bam_of_match); > +#endif Also, you can remove the #ifdef here and the of_match_ptr() below. > + > +static struct platform_driver bam_dma_driver = { > + .probe = bam_dma_probe, > + .remove = bam_dma_remove, > + .driver = { > + .name = "bam-dma-engine", > + .owner = THIS_MODULE, > + .of_match_table = of_match_ptr(bam_of_match), > + }, > +}; > + > +static int __init bam_dma_init(void) > +{ > + return platform_driver_register(&bam_dma_driver); > +} > + > +static void __exit bam_dma_exit(void) > +{ > + return platform_driver_unregister(&bam_dma_driver); > +} > + module_platform_driver() > diff --git a/drivers/dma/qcom_bam_dma.h b/drivers/dma/qcom_bam_dma.h > new file mode 100644 > index 0000000..2cb3b5f > --- /dev/null > +++ b/drivers/dma/qcom_bam_dma.h > @@ -0,0 +1,268 @@ > +#ifndef __QCOM_BAM_DMA_H__ > +#define __QCOM_BAM_DMA_H__ > + > +#include <linux/dmaengine.h> > +#include "virt-dma.h" > + > +enum bam_channel_dir { > + BAM_PIPE_CONSUMER = 0, /* channel reads from data-fifo or memory */ > + BAM_PIPE_PRODUCER, /* channel writes to data-fifo or memory */ > +}; Since the header does not serve as an interface, just move all the contents into the driver directly. > +struct bam_desc_hw { > + u32 addr; /* Buffer physical address */ > + u16 size; /* Buffer size in bytes */ > + u16 flags; > +} __packed; Remove __packed here, it only makes the access less efficient but does not change the layout, which is already packed. Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html