Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4981c4dc authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Vinod Koul
Browse files

DMA: shdma: switch DT mode to use configuration data from a match table



This facilitates DMAC DT support by eliminating the need in AUXDATA and
avoiding creating complex DT data. This also fits well with DMAC devices,
of which SoCs often have multiple identical copies and it is perfectly
valid to use a single configuration data set for all of them.

Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski+renesas@gmail.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
parent 2833c47e
Loading
Loading
Loading
Loading
+35 −26
Original line number Diff line number Diff line
@@ -22,42 +22,51 @@ Optional properties (currently unused):
* DMA controller

Required properties:
- compatible:	should be "renesas,shdma"
- compatible:	should be of the form "renesas,shdma-<soc>", where <soc> should
		be replaced with the desired SoC model, e.g.
		"renesas,shdma-r8a73a4" for the system DMAC on r8a73a4 SoC

Example:
	dmac: dma-mux0 {
	dmac: dma-multiplexer@0 {
		compatible = "renesas,shdma-mux";
		#dma-cells = <1>;
		dma-channels = <6>;
		dma-channels = <20>;
		dma-requests = <256>;
		reg = <0 0>;	/* Needed for AUXDATA */
		#address-cells = <1>;
		#size-cells = <1>;
		#address-cells = <2>;
		#size-cells = <2>;
		ranges;

		dma0: shdma@fe008020 {
			compatible = "renesas,shdma";
			reg = <0xfe008020 0x270>,
				<0xfe009000 0xc>;
		dma0: dma-controller@e6700020 {
			compatible = "renesas,shdma-r8a73a4";
			reg = <0 0xe6700020 0 0x89e0>;
			interrupt-parent = <&gic>;
			interrupts = <0 34 4
					0 28 4
					0 29 4
					0 30 4
					0 31 4
					0 32 4
					0 33 4>;
			interrupts = <0 220 4
					0 200 4
					0 201 4
					0 202 4
					0 203 4
					0 204 4
					0 205 4
					0 206 4
					0 207 4
					0 208 4
					0 209 4
					0 210 4
					0 211 4
					0 212 4
					0 213 4
					0 214 4
					0 215 4
					0 216 4
					0 217 4
					0 218 4
					0 219 4>;
			interrupt-names = "error",
					"ch0", "ch1", "ch2", "ch3",
					"ch4", "ch5";
		};

		dma1: shdma@fe018020 {
			...
		};

		dma2: shdma@fe028020 {
			...
					"ch4", "ch5", "ch6", "ch7",
					"ch8", "ch9", "ch10", "ch11",
					"ch12", "ch13", "ch14", "ch15",
					"ch16", "ch17", "ch18", "ch19";
		};
	};

+2 −0
Original line number Diff line number Diff line
obj-$(CONFIG_SH_DMAE_BASE) += shdma-base.o shdma-of.o
obj-$(CONFIG_SH_DMAE) += shdma.o
shdma-y := shdmac.o
shdma-objs := $(shdma-y)
obj-$(CONFIG_SUDMAC) += sudmac.o
+9 −6
Original line number Diff line number Diff line
@@ -171,7 +171,8 @@ static struct shdma_desc *shdma_get_desc(struct shdma_chan *schan)
	return NULL;
}

static int shdma_setup_slave(struct shdma_chan *schan, int slave_id)
static int shdma_setup_slave(struct shdma_chan *schan, int slave_id,
			     dma_addr_t slave_addr)
{
	struct shdma_dev *sdev = to_shdma_dev(schan->dma_chan.device);
	const struct shdma_ops *ops = sdev->ops;
@@ -179,7 +180,7 @@ static int shdma_setup_slave(struct shdma_chan *schan, int slave_id)

	if (schan->dev->of_node) {
		match = schan->hw_req;
		ret = ops->set_slave(schan, match, true);
		ret = ops->set_slave(schan, match, slave_addr, true);
		if (ret < 0)
			return ret;

@@ -194,7 +195,7 @@ static int shdma_setup_slave(struct shdma_chan *schan, int slave_id)
	if (test_and_set_bit(slave_id, shdma_slave_used))
		return -EBUSY;

	ret = ops->set_slave(schan, match, false);
	ret = ops->set_slave(schan, match, slave_addr, false);
	if (ret < 0) {
		clear_bit(slave_id, shdma_slave_used);
		return ret;
@@ -236,7 +237,7 @@ bool shdma_chan_filter(struct dma_chan *chan, void *arg)
	if (!schan->dev->of_node && match >= slave_num)
		return false;

	ret = ops->set_slave(schan, match, true);
	ret = ops->set_slave(schan, match, 0, true);
	if (ret < 0)
		return false;

@@ -259,7 +260,7 @@ static int shdma_alloc_chan_resources(struct dma_chan *chan)
	 */
	if (slave) {
		/* Legacy mode: .private is set in filter */
		ret = shdma_setup_slave(schan, slave->slave_id);
		ret = shdma_setup_slave(schan, slave->slave_id, 0);
		if (ret < 0)
			goto esetslave;
	} else {
@@ -680,7 +681,9 @@ static int shdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
		 * channel, while using it...
		 */
		config = (struct dma_slave_config *)arg;
		ret = shdma_setup_slave(schan, config->slave_id);
		ret = shdma_setup_slave(schan, config->slave_id,
					config->direction == DMA_DEV_TO_MEM ?
					config->src_addr : config->dst_addr);
		if (ret < 0)
			return ret;
		break;
+0 −3
Original line number Diff line number Diff line
@@ -45,9 +45,6 @@ static int shdma_of_probe(struct platform_device *pdev)
	const struct of_dev_auxdata *lookup = pdev->dev.platform_data;
	int ret;

	if (!lookup)
		return -EINVAL;

	ret = of_dma_controller_register(pdev->dev.of_node,
					 shdma_of_xlate, pdev);
	if (ret < 0)
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ struct sh_dmae_chan {
	void __iomem *base;
	char dev_id[16];		/* unique name per DMAC of channel */
	int pm_error;
	dma_addr_t slave_addr;
};

struct sh_dmae_device {
Loading