ASoC: rsnd: move rsnd_gen_dma_addr() from gen.c to dma.c
Now, we have dma.c for Audio DMAC / Audio DMAC peri peri. rsnd_gen_dma_addr() should go there. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
		
							parent
							
								
									bfe834be95
								
							
						
					
					
						commit
						747c71b12e
					
				| @ -32,7 +32,6 @@ static void rsnd_dma_complete(void *data) | ||||
| } | ||||
| 
 | ||||
| #define DMA_NAME_SIZE 16 | ||||
| #define MOD_MAX 4 /* MEM/SSI/SRC/DVC */ | ||||
| static int _rsnd_dma_of_name(char *dma_name, struct rsnd_mod *mod) | ||||
| { | ||||
| 	if (mod) | ||||
| @ -97,6 +96,10 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma, | ||||
| 			     struct rsnd_mod **mod_from, | ||||
| 			     struct rsnd_mod **mod_to); | ||||
| 
 | ||||
| static dma_addr_t rsnd_dma_addr(struct rsnd_priv *priv, | ||||
| 				struct rsnd_mod *mod, | ||||
| 				int is_play, int is_from); | ||||
| 
 | ||||
| int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id) | ||||
| { | ||||
| 	struct device *dev = rsnd_priv_to_dev(priv); | ||||
| @ -122,8 +125,8 @@ int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id) | ||||
| 	rsnd_dma_of_name(mod_from, mod_to, dma_name); | ||||
| 
 | ||||
| 	cfg.direction	= is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; | ||||
| 	cfg.src_addr	= rsnd_gen_dma_addr(priv, mod_from, is_play, 1); | ||||
| 	cfg.dst_addr	= rsnd_gen_dma_addr(priv, mod_to,   is_play, 0); | ||||
| 	cfg.src_addr	= rsnd_dma_addr(priv, mod_from, is_play, 1); | ||||
| 	cfg.dst_addr	= rsnd_dma_addr(priv, mod_to,   is_play, 0); | ||||
| 	cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | ||||
| 	cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | ||||
| 
 | ||||
| @ -168,6 +171,117 @@ void rsnd_dma_quit(struct rsnd_dma *dma) | ||||
| 	dma->chan = NULL; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  *	DMA read/write register offset | ||||
|  * | ||||
|  *	RSND_xxx_I_N	for Audio DMAC input | ||||
|  *	RSND_xxx_O_N	for Audio DMAC output | ||||
|  *	RSND_xxx_I_P	for Audio DMAC peri peri input | ||||
|  *	RSND_xxx_O_P	for Audio DMAC peri peri output | ||||
|  * | ||||
|  *	ex) R-Car H2 case | ||||
|  *	      mod        / DMAC in    / DMAC out   / DMAC PP in / DMAC pp out | ||||
|  *	SSI : 0xec541000 / 0xec241008 / 0xec24100c | ||||
|  *	SSIU: 0xec541000 / 0xec100000 / 0xec100000 / 0xec400000 / 0xec400000 | ||||
|  *	SCU : 0xec500000 / 0xec000000 / 0xec004000 / 0xec300000 / 0xec304000 | ||||
|  *	CMD : 0xec500000 /            / 0xec008000                0xec308000 | ||||
|  */ | ||||
| #define RDMA_SSI_I_N(addr, i)	(addr ##_reg - 0x00300000 + (0x40 * i) + 0x8) | ||||
| #define RDMA_SSI_O_N(addr, i)	(addr ##_reg - 0x00300000 + (0x40 * i) + 0xc) | ||||
| 
 | ||||
| #define RDMA_SSIU_I_N(addr, i)	(addr ##_reg - 0x00441000 + (0x1000 * i)) | ||||
| #define RDMA_SSIU_O_N(addr, i)	(addr ##_reg - 0x00441000 + (0x1000 * i)) | ||||
| 
 | ||||
| #define RDMA_SSIU_I_P(addr, i)	(addr ##_reg - 0x00141000 + (0x1000 * i)) | ||||
| #define RDMA_SSIU_O_P(addr, i)	(addr ##_reg - 0x00141000 + (0x1000 * i)) | ||||
| 
 | ||||
| #define RDMA_SRC_I_N(addr, i)	(addr ##_reg - 0x00500000 + (0x400 * i)) | ||||
| #define RDMA_SRC_O_N(addr, i)	(addr ##_reg - 0x004fc000 + (0x400 * i)) | ||||
| 
 | ||||
| #define RDMA_SRC_I_P(addr, i)	(addr ##_reg - 0x00200000 + (0x400 * i)) | ||||
| #define RDMA_SRC_O_P(addr, i)	(addr ##_reg - 0x001fc000 + (0x400 * i)) | ||||
| 
 | ||||
| #define RDMA_CMD_O_N(addr, i)	(addr ##_reg - 0x004f8000 + (0x400 * i)) | ||||
| #define RDMA_CMD_O_P(addr, i)	(addr ##_reg - 0x001f8000 + (0x400 * i)) | ||||
| 
 | ||||
| static dma_addr_t | ||||
| rsnd_gen2_dma_addr(struct rsnd_priv *priv, | ||||
| 		   struct rsnd_mod *mod, | ||||
| 		   int is_play, int is_from) | ||||
| { | ||||
| 	struct device *dev = rsnd_priv_to_dev(priv); | ||||
| 	struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||||
| 	phys_addr_t ssi_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SSI); | ||||
| 	phys_addr_t src_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SCU); | ||||
| 	int is_ssi = !!(rsnd_io_to_mod_ssi(io) == mod); | ||||
| 	int use_src = !!rsnd_io_to_mod_src(io); | ||||
| 	int use_dvc = !!rsnd_io_to_mod_dvc(io); | ||||
| 	int id = rsnd_mod_id(mod); | ||||
| 	struct dma_addr { | ||||
| 		dma_addr_t out_addr; | ||||
| 		dma_addr_t in_addr; | ||||
| 	} dma_addrs[3][2][3] = { | ||||
| 		/* SRC */ | ||||
| 		{{{ 0,				0 }, | ||||
| 		  /* Capture */ | ||||
| 		  { RDMA_SRC_O_N(src, id),	RDMA_SRC_I_P(src, id) }, | ||||
| 		  { RDMA_CMD_O_N(src, id),	RDMA_SRC_I_P(src, id) } }, | ||||
| 		 /* Playback */ | ||||
| 		 {{ 0,				0, }, | ||||
| 		  { RDMA_SRC_O_P(src, id),	RDMA_SRC_I_N(src, id) }, | ||||
| 		  { RDMA_CMD_O_P(src, id),	RDMA_SRC_I_N(src, id) } } | ||||
| 		}, | ||||
| 		/* SSI */ | ||||
| 		/* Capture */ | ||||
| 		{{{ RDMA_SSI_O_N(ssi, id),	0 }, | ||||
| 		  { RDMA_SSIU_O_P(ssi, id),	0 }, | ||||
| 		  { RDMA_SSIU_O_P(ssi, id),	0 } }, | ||||
| 		 /* Playback */ | ||||
| 		 {{ 0,				RDMA_SSI_I_N(ssi, id) }, | ||||
| 		  { 0,				RDMA_SSIU_I_P(ssi, id) }, | ||||
| 		  { 0,				RDMA_SSIU_I_P(ssi, id) } } | ||||
| 		}, | ||||
| 		/* SSIU */ | ||||
| 		/* Capture */ | ||||
| 		{{{ RDMA_SSIU_O_N(ssi, id),	0 }, | ||||
| 		  { RDMA_SSIU_O_P(ssi, id),	0 }, | ||||
| 		  { RDMA_SSIU_O_P(ssi, id),	0 } }, | ||||
| 		 /* Playback */ | ||||
| 		 {{ 0,				RDMA_SSIU_I_N(ssi, id) }, | ||||
| 		  { 0,				RDMA_SSIU_I_P(ssi, id) }, | ||||
| 		  { 0,				RDMA_SSIU_I_P(ssi, id) } } }, | ||||
| 	}; | ||||
| 
 | ||||
| 	/* it shouldn't happen */ | ||||
| 	if (use_dvc && !use_src) | ||||
| 		dev_err(dev, "DVC is selected without SRC\n"); | ||||
| 
 | ||||
| 	/* use SSIU or SSI ? */ | ||||
| 	if (is_ssi && (0 == strcmp(rsnd_mod_dma_name(mod), "ssiu"))) | ||||
| 		is_ssi++; | ||||
| 
 | ||||
| 	return (is_from) ? | ||||
| 		dma_addrs[is_ssi][is_play][use_src + use_dvc].out_addr : | ||||
| 		dma_addrs[is_ssi][is_play][use_src + use_dvc].in_addr; | ||||
| } | ||||
| 
 | ||||
| static dma_addr_t rsnd_dma_addr(struct rsnd_priv *priv, | ||||
| 				struct rsnd_mod *mod, | ||||
| 				int is_play, int is_from) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * gen1 uses default DMA addr | ||||
| 	 */ | ||||
| 	if (rsnd_is_gen1(priv)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (!mod) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	return rsnd_gen2_dma_addr(priv, mod, is_play, is_from); | ||||
| } | ||||
| 
 | ||||
| #define MOD_MAX 4 /* MEM/SSI/SRC/DVC */ | ||||
| static void rsnd_dma_of_path(struct rsnd_dma *dma, | ||||
| 			     int is_play, | ||||
| 			     struct rsnd_mod **mod_from, | ||||
|  | ||||
| @ -187,116 +187,6 @@ static int _rsnd_gen_regmap_init(struct rsnd_priv *priv, | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  *	DMA read/write register offset | ||||
|  * | ||||
|  *	RSND_xxx_I_N	for Audio DMAC input | ||||
|  *	RSND_xxx_O_N	for Audio DMAC output | ||||
|  *	RSND_xxx_I_P	for Audio DMAC peri peri input | ||||
|  *	RSND_xxx_O_P	for Audio DMAC peri peri output | ||||
|  * | ||||
|  *	ex) R-Car H2 case | ||||
|  *	      mod        / DMAC in    / DMAC out   / DMAC PP in / DMAC pp out | ||||
|  *	SSI : 0xec541000 / 0xec241008 / 0xec24100c | ||||
|  *	SSIU: 0xec541000 / 0xec100000 / 0xec100000 / 0xec400000 / 0xec400000 | ||||
|  *	SCU : 0xec500000 / 0xec000000 / 0xec004000 / 0xec300000 / 0xec304000 | ||||
|  *	CMD : 0xec500000 /            / 0xec008000                0xec308000 | ||||
|  */ | ||||
| #define RDMA_SSI_I_N(addr, i)	(addr ##_reg - 0x00300000 + (0x40 * i) + 0x8) | ||||
| #define RDMA_SSI_O_N(addr, i)	(addr ##_reg - 0x00300000 + (0x40 * i) + 0xc) | ||||
| 
 | ||||
| #define RDMA_SSIU_I_N(addr, i)	(addr ##_reg - 0x00441000 + (0x1000 * i)) | ||||
| #define RDMA_SSIU_O_N(addr, i)	(addr ##_reg - 0x00441000 + (0x1000 * i)) | ||||
| 
 | ||||
| #define RDMA_SSIU_I_P(addr, i)	(addr ##_reg - 0x00141000 + (0x1000 * i)) | ||||
| #define RDMA_SSIU_O_P(addr, i)	(addr ##_reg - 0x00141000 + (0x1000 * i)) | ||||
| 
 | ||||
| #define RDMA_SRC_I_N(addr, i)	(addr ##_reg - 0x00500000 + (0x400 * i)) | ||||
| #define RDMA_SRC_O_N(addr, i)	(addr ##_reg - 0x004fc000 + (0x400 * i)) | ||||
| 
 | ||||
| #define RDMA_SRC_I_P(addr, i)	(addr ##_reg - 0x00200000 + (0x400 * i)) | ||||
| #define RDMA_SRC_O_P(addr, i)	(addr ##_reg - 0x001fc000 + (0x400 * i)) | ||||
| 
 | ||||
| #define RDMA_CMD_O_N(addr, i)	(addr ##_reg - 0x004f8000 + (0x400 * i)) | ||||
| #define RDMA_CMD_O_P(addr, i)	(addr ##_reg - 0x001f8000 + (0x400 * i)) | ||||
| 
 | ||||
| static dma_addr_t | ||||
| rsnd_gen2_dma_addr(struct rsnd_priv *priv, | ||||
| 		   struct rsnd_mod *mod, | ||||
| 		   int is_play, int is_from) | ||||
| { | ||||
| 	struct device *dev = rsnd_priv_to_dev(priv); | ||||
| 	struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||||
| 	phys_addr_t ssi_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SSI); | ||||
| 	phys_addr_t src_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SCU); | ||||
| 	int is_ssi = !!(rsnd_io_to_mod_ssi(io) == mod); | ||||
| 	int use_src = !!rsnd_io_to_mod_src(io); | ||||
| 	int use_dvc = !!rsnd_io_to_mod_dvc(io); | ||||
| 	int id = rsnd_mod_id(mod); | ||||
| 	struct dma_addr { | ||||
| 		dma_addr_t out_addr; | ||||
| 		dma_addr_t in_addr; | ||||
| 	} dma_addrs[3][2][3] = { | ||||
| 		/* SRC */ | ||||
| 		{{{ 0,				0 }, | ||||
| 		/* Capture */ | ||||
| 		  { RDMA_SRC_O_N(src, id),	RDMA_SRC_I_P(src, id) }, | ||||
| 		  { RDMA_CMD_O_N(src, id),	RDMA_SRC_I_P(src, id) } }, | ||||
| 		 /* Playback */ | ||||
| 		 {{ 0,				0, }, | ||||
| 		  { RDMA_SRC_O_P(src, id),	RDMA_SRC_I_N(src, id) }, | ||||
| 		  { RDMA_CMD_O_P(src, id),	RDMA_SRC_I_N(src, id) } } | ||||
| 		}, | ||||
| 		/* SSI */ | ||||
| 		/* Capture */ | ||||
| 		{{{ RDMA_SSI_O_N(ssi, id),	0 }, | ||||
| 		  { RDMA_SSIU_O_P(ssi, id),	0 }, | ||||
| 		  { RDMA_SSIU_O_P(ssi, id),	0 } }, | ||||
| 		 /* Playback */ | ||||
| 		 {{ 0,				RDMA_SSI_I_N(ssi, id) }, | ||||
| 		  { 0,				RDMA_SSIU_I_P(ssi, id) }, | ||||
| 		  { 0,				RDMA_SSIU_I_P(ssi, id) } } | ||||
| 		}, | ||||
| 		/* SSIU */ | ||||
| 		/* Capture */ | ||||
| 		{{{ RDMA_SSIU_O_N(ssi, id),	0 }, | ||||
| 		  { RDMA_SSIU_O_P(ssi, id),	0 }, | ||||
| 		  { RDMA_SSIU_O_P(ssi, id),	0 } }, | ||||
| 		 /* Playback */ | ||||
| 		 {{ 0,				RDMA_SSIU_I_N(ssi, id) }, | ||||
| 		  { 0,				RDMA_SSIU_I_P(ssi, id) }, | ||||
| 		  { 0,				RDMA_SSIU_I_P(ssi, id) } } }, | ||||
| 	}; | ||||
| 
 | ||||
| 	/* it shouldn't happen */ | ||||
| 	if (use_dvc && !use_src) | ||||
| 		dev_err(dev, "DVC is selected without SRC\n"); | ||||
| 
 | ||||
| 	/* use SSIU or SSI ? */ | ||||
| 	if (is_ssi && (0 == strcmp(rsnd_mod_dma_name(mod), "ssiu"))) | ||||
| 		is_ssi++; | ||||
| 
 | ||||
| 	return (is_from) ? | ||||
| 		dma_addrs[is_ssi][is_play][use_src + use_dvc].out_addr : | ||||
| 		dma_addrs[is_ssi][is_play][use_src + use_dvc].in_addr; | ||||
| } | ||||
| 
 | ||||
| dma_addr_t rsnd_gen_dma_addr(struct rsnd_priv *priv, | ||||
| 			     struct rsnd_mod *mod, | ||||
| 			     int is_play, int is_from) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * gen1 uses default DMA addr | ||||
| 	 */ | ||||
| 	if (rsnd_is_gen1(priv)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (!mod) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	return rsnd_gen2_dma_addr(priv, mod, is_play, is_from); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  *		Gen2 | ||||
|  */ | ||||
|  | ||||
| @ -328,9 +328,6 @@ int rsnd_gen_probe(struct platform_device *pdev, | ||||
| void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv, | ||||
| 			       struct rsnd_mod *mod, | ||||
| 			       enum rsnd_reg reg); | ||||
| dma_addr_t rsnd_gen_dma_addr(struct rsnd_priv *priv, | ||||
| 		       struct rsnd_mod *mod, | ||||
| 		       int is_play,  int is_from); | ||||
| phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id); | ||||
| 
 | ||||
| #define rsnd_is_gen1(s)		(((s)->info->flags & RSND_GEN_MASK) == RSND_GEN1) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user