All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bin Liu <b-liu@ti.com>
To: Peter Ujfalusi <peter.ujfalusi@ti.com>
Cc: tony@atomide.com, gregkh@linuxfoundation.org,
	vinod.koul@intel.com, linux-usb@vger.kernel.org,
	linux-omap@vger.kernel.org, balbi@kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 5/9] usb: musb: tusb6010_omap: Create new struct for DMA data/parameters
Date: Wed, 17 May 2017 15:17:13 -0500	[thread overview]
Message-ID: <20170517201713.GF651@uda0271908> (raw)
In-Reply-To: <20170512135752.1800-6-peter.ujfalusi@ti.com>

On Fri, May 12, 2017 at 04:57:48PM +0300, Peter Ujfalusi wrote:
> For the DMA we have ch (channel), dmareq and sync_dev parameters both
> within the tusb_omap_dma_ch and tusb_omap_dma_ch struct.
> By creating a common struct the code can be simplified when selecting
> between the shared or multichannel DMA parameters.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Tested-by: Tony Lindgren <tony@atomide.com>
> ---
>  drivers/usb/musb/tusb6010_omap.c | 163 ++++++++++++++++++++-------------------
>  1 file changed, 84 insertions(+), 79 deletions(-)
> 
> diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c
> index 025b52e0b34d..938ded0c407b 100644
> --- a/drivers/usb/musb/tusb6010_omap.c
> +++ b/drivers/usb/musb/tusb6010_omap.c
> @@ -31,6 +31,12 @@
>  #define OMAP242X_DMA_EXT_DMAREQ4	16
>  #define OMAP242X_DMA_EXT_DMAREQ5	64
>  
> +struct tusb_dma_data {
> +	int			ch;
> +	s8			dmareq;
> +	s8			sync_dev;
> +};
> +
>  struct tusb_omap_dma_ch {
>  	struct musb		*musb;
>  	void __iomem		*tbase;
> @@ -39,9 +45,7 @@ struct tusb_omap_dma_ch {
>  	u8			tx;
>  	struct musb_hw_ep	*hw_ep;
>  
> -	int			ch;
> -	s8			dmareq;
> -	s8			sync_dev;
> +	struct tusb_dma_data	dma_data;
>  
>  	struct tusb_omap_dma	*tusb_dma;
>  
> @@ -58,9 +62,7 @@ struct tusb_omap_dma {
>  	struct dma_controller		controller;
>  	void __iomem			*tbase;
>  
> -	int				ch;
> -	s8				dmareq;
> -	s8				sync_dev;
> +	struct tusb_dma_data		dma_data;
>  	unsigned			multichannel:1;
>  };
>  
> @@ -119,9 +121,9 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data)
>  	spin_lock_irqsave(&musb->lock, flags);
>  
>  	if (tusb_dma->multichannel)
> -		ch = chdat->ch;
> +		ch = chdat->dma_data.ch;
>  	else
> -		ch = tusb_dma->ch;
> +		ch = tusb_dma->dma_data.ch;
>  
>  	if (ch_status != OMAP_DMA_BLOCK_IRQ)
>  		printk(KERN_ERR "TUSB DMA error status: %i\n", ch_status);
> @@ -140,8 +142,7 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data)
>  	/* HW issue #10: XFR_SIZE may get corrupt on DMA (both async & sync) */
>  	if (unlikely(remaining > chdat->transfer_len)) {
>  		dev_dbg(musb->controller, "Corrupt %s dma ch%i XFR_SIZE: 0x%08lx\n",
> -			chdat->tx ? "tx" : "rx", chdat->ch,
> -			remaining);
> +			chdat->tx ? "tx" : "rx", ch, remaining);
>  		remaining = 0;
>  	}
>  
> @@ -220,9 +221,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  	int				src_burst, dst_burst;
>  	u16				csr;
>  	u32				psize;
> -	int				ch;
> -	s8				dmareq;
> -	s8				sync_dev;
> +	struct tusb_dma_data		*dma_data;
>  
>  	if (unlikely(dma_addr & 0x1) || (len < 32) || (len > packet_sz))
>  		return false;
> @@ -249,7 +248,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  	dma_remaining = TUSB_EP_CONFIG_XFR_SIZE(dma_remaining);
>  	if (dma_remaining) {
>  		dev_dbg(musb->controller, "Busy %s dma ch%i, not using: %08x\n",
> -			chdat->tx ? "tx" : "rx", chdat->ch,
> +			chdat->tx ? "tx" : "rx", chdat->dma_data.ch,
>  			dma_remaining);
>  		return false;
>  	}
> @@ -262,15 +261,15 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  		chdat->transfer_packet_sz = packet_sz;
>  
>  	if (tusb_dma->multichannel) {
> -		ch = chdat->ch;
> -		dmareq = chdat->dmareq;
> -		sync_dev = chdat->sync_dev;
> +		dma_data = &chdat->dma_data;
>  	} else {
> +		dma_data = &tusb_dma->dma_data;
> +
>  		if (tusb_omap_use_shared_dmareq(chdat) != 0) {
>  			dev_dbg(musb->controller, "could not get dma for ep%i\n", chdat->epnum);
>  			return false;
>  		}
> -		if (tusb_dma->ch < 0) {
> +		if (dma_data->ch < 0) {
>  			/* REVISIT: This should get blocked earlier, happens
>  			 * with MSC ErrorRecoveryTest
>  			 */
> @@ -278,10 +277,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  			return false;
>  		}
>  
> -		ch = tusb_dma->ch;
> -		dmareq = tusb_dma->dmareq;
> -		sync_dev = tusb_dma->sync_dev;
> -		omap_set_dma_callback(ch, tusb_omap_dma_cb, channel);
> +		omap_set_dma_callback(dma_data->ch, tusb_omap_dma_cb, channel);
>  	}
>  
>  	chdat->packet_sz = packet_sz;
> @@ -312,7 +308,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  
>  	dev_dbg(musb->controller, "ep%i %s dma ch%i dma: %pad len: %u(%u) packet_sz: %i(%i)\n",
>  		chdat->epnum, chdat->tx ? "tx" : "rx",
> -		ch, &dma_addr, chdat->transfer_len, len,
> +		dma_data->ch, &dma_addr, chdat->transfer_len, len,
>  		chdat->transfer_packet_sz, packet_sz);
>  
>  	/*
> @@ -329,7 +325,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  		dma_params.dst_ei	= 1;
>  		dma_params.dst_fi	= -31;	/* Loop 32 byte window */
>  
> -		dma_params.trigger	= sync_dev;
> +		dma_params.trigger	= dma_data->sync_dev;
>  		dma_params.sync_mode	= OMAP_DMA_SYNC_FRAME;
>  		dma_params.src_or_dst_synch	= 0;	/* Dest sync */
>  
> @@ -346,7 +342,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  		dma_params.dst_ei	= 0;
>  		dma_params.dst_fi	= 0;
>  
> -		dma_params.trigger	= sync_dev;
> +		dma_params.trigger	= dma_data->sync_dev;
>  		dma_params.sync_mode	= OMAP_DMA_SYNC_FRAME;
>  		dma_params.src_or_dst_synch	= 1;	/* Source sync */
>  
> @@ -360,10 +356,10 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  		((dma_addr & 0x3) == 0) ? "sync" : "async",
>  		dma_params.src_start, dma_params.dst_start);
>  
> -	omap_set_dma_params(ch, &dma_params);
> -	omap_set_dma_src_burst_mode(ch, src_burst);
> -	omap_set_dma_dest_burst_mode(ch, dst_burst);
> -	omap_set_dma_write_mode(ch, OMAP_DMA_WRITE_LAST_NON_POSTED);
> +	omap_set_dma_params(dma_data->ch, &dma_params);
> +	omap_set_dma_src_burst_mode(dma_data->ch, src_burst);
> +	omap_set_dma_dest_burst_mode(dma_data->ch, dst_burst);
> +	omap_set_dma_write_mode(dma_data->ch, OMAP_DMA_WRITE_LAST_NON_POSTED);
>  
>  	/*
>  	 * Prepare MUSB for DMA transfer
> @@ -386,7 +382,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  	/*
>  	 * Start DMA transfer
>  	 */
> -	omap_start_dma(ch);
> +	omap_start_dma(dma_data->ch);
>  
>  	if (chdat->tx) {
>  		/* Send transfer_packet_sz packets at a time */
> @@ -415,16 +411,17 @@ static int tusb_omap_dma_abort(struct dma_channel *channel)
>  {
>  	struct tusb_omap_dma_ch	*chdat = to_chdat(channel);
>  	struct tusb_omap_dma	*tusb_dma = chdat->tusb_dma;
> +	struct tusb_dma_data	*dma_data = &tusb_dma->dma_data;
>  
>  	if (!tusb_dma->multichannel) {
> -		if (tusb_dma->ch >= 0) {
> -			omap_stop_dma(tusb_dma->ch);
> -			omap_free_dma(tusb_dma->ch);
> -			tusb_dma->ch = -1;
> +		if (dma_data->ch >= 0) {
> +			omap_stop_dma(dma_data->ch);
> +			omap_free_dma(dma_data->ch);
> +			dma_data->ch = -1;
>  		}
>  
> -		tusb_dma->dmareq = -1;
> -		tusb_dma->sync_dev = -1;
> +		dma_data->dmareq = -1;
> +		dma_data->sync_dev = -1;
>  	}
>  
>  	channel->status = MUSB_DMA_STATUS_FREE;
> @@ -462,8 +459,8 @@ static inline int tusb_omap_dma_allocate_dmareq(struct tusb_omap_dma_ch *chdat)
>  		reg |= ((1 << 4) << (dmareq_nr * 5));
>  	musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
>  
> -	chdat->dmareq = dmareq_nr;
> -	chdat->sync_dev = sync_dev[chdat->dmareq];
> +	chdat->dma_data.dmareq = dmareq_nr;
> +	chdat->dma_data.sync_dev = sync_dev[chdat->dma_data.dmareq];
>  
>  	return 0;
>  }
> @@ -472,15 +469,15 @@ static inline void tusb_omap_dma_free_dmareq(struct tusb_omap_dma_ch *chdat)
>  {
>  	u32 reg;
>  
> -	if (!chdat || chdat->dmareq < 0)
> +	if (!chdat || chdat->dma_data.dmareq < 0)
>  		return;
>  
>  	reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP);
> -	reg &= ~(0x1f << (chdat->dmareq * 5));
> +	reg &= ~(0x1f << (chdat->dma_data.dmareq * 5));
>  	musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
>  
> -	chdat->dmareq = -1;
> -	chdat->sync_dev = -1;
> +	chdat->dma_data.dmareq = -1;
> +	chdat->dma_data.sync_dev = -1;
>  }
>  
>  static struct dma_channel *dma_channel_pool[MAX_DMAREQ];
> @@ -492,11 +489,13 @@ tusb_omap_dma_allocate(struct dma_controller *c,
>  {
>  	int ret, i;
>  	const char		*dev_name;
> +	void			*cb_data;
>  	struct tusb_omap_dma	*tusb_dma;
>  	struct musb		*musb;
>  	void __iomem		*tbase;
>  	struct dma_channel	*channel = NULL;
>  	struct tusb_omap_dma_ch	*chdat = NULL;
> +	struct tusb_dma_data	*dma_data = NULL;
>  	u32			reg;
>  
>  	tusb_dma = container_of(c, struct tusb_omap_dma, controller);
> @@ -529,56 +528,61 @@ tusb_omap_dma_allocate(struct dma_controller *c,
>  	if (!channel)
>  		return NULL;
>  
> -	if (tx) {
> -		chdat->tx = 1;
> -		dev_name = "TUSB transmit";
> -	} else {
> -		chdat->tx = 0;
> -		dev_name = "TUSB receive";
> -	}
> -
>  	chdat->musb = tusb_dma->controller.musb;
>  	chdat->tbase = tusb_dma->tbase;
>  	chdat->hw_ep = hw_ep;
>  	chdat->epnum = hw_ep->epnum;
> -	chdat->dmareq = -1;
>  	chdat->completed_len = 0;
>  	chdat->tusb_dma = tusb_dma;
> +	if (tx)
> +		chdat->tx = 1;
> +	else
> +		chdat->tx = 0;
>  
>  	channel->max_len = 0x7fffffff;
>  	channel->desired_mode = 0;
>  	channel->actual_len = 0;
>  
>  	if (tusb_dma->multichannel) {
> +		dma_data = &chdat->dma_data;
>  		ret = tusb_omap_dma_allocate_dmareq(chdat);
>  		if (ret != 0)
>  			goto free_dmareq;
>  
> -		ret = omap_request_dma(chdat->sync_dev, dev_name,
> -				tusb_omap_dma_cb, channel, &chdat->ch);
> -		if (ret != 0)
> -			goto free_dmareq;
> -	} else if (tusb_dma->ch == -1) {
> -		tusb_dma->dmareq = 0;
> -		tusb_dma->sync_dev = OMAP24XX_DMA_EXT_DMAREQ0;
> -
> +		if (chdat->tx)
> +			dev_name = "TUSB transmit";
> +		else
> +			dev_name = "TUSB receive";
> +		cb_data = channel;
> +	} else if (tusb_dma->dma_data.ch == -1) {
> +		dma_data = &tusb_dma->dma_data;
> +		dma_data->dmareq = 0;
> +		dma_data->sync_dev = OMAP24XX_DMA_EXT_DMAREQ0;
> +
> +		dev_name = "TUSB shared";
>  		/* Callback data gets set later in the shared dmareq case */
> -		ret = omap_request_dma(tusb_dma->sync_dev, "TUSB shared",
> -				tusb_omap_dma_cb, NULL, &tusb_dma->ch);
> +		cb_data = NULL;
> +
> +		chdat->dma_data.dmareq = -1;
> +		chdat->dma_data.ch = -1;
> +		chdat->dma_data.sync_dev = -1;
> +	}
> +
> +	if (dma_data) {
> +		ret = omap_request_dma(dma_data->sync_dev, dev_name,
> +				       tusb_omap_dma_cb, cb_data, &dma_data->ch);

line over 80 characters.

Regards,
-Bin.

WARNING: multiple messages have this Message-ID (diff)
From: Bin Liu <b-liu@ti.com>
To: Peter Ujfalusi <peter.ujfalusi@ti.com>
Cc: <tony@atomide.com>, <gregkh@linuxfoundation.org>,
	<vinod.koul@intel.com>, <linux-usb@vger.kernel.org>,
	<linux-omap@vger.kernel.org>, <balbi@kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v3 5/9] usb: musb: tusb6010_omap: Create new struct for DMA data/parameters
Date: Wed, 17 May 2017 15:17:13 -0500	[thread overview]
Message-ID: <20170517201713.GF651@uda0271908> (raw)
In-Reply-To: <20170512135752.1800-6-peter.ujfalusi@ti.com>

On Fri, May 12, 2017 at 04:57:48PM +0300, Peter Ujfalusi wrote:
> For the DMA we have ch (channel), dmareq and sync_dev parameters both
> within the tusb_omap_dma_ch and tusb_omap_dma_ch struct.
> By creating a common struct the code can be simplified when selecting
> between the shared or multichannel DMA parameters.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Tested-by: Tony Lindgren <tony@atomide.com>
> ---
>  drivers/usb/musb/tusb6010_omap.c | 163 ++++++++++++++++++++-------------------
>  1 file changed, 84 insertions(+), 79 deletions(-)
> 
> diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c
> index 025b52e0b34d..938ded0c407b 100644
> --- a/drivers/usb/musb/tusb6010_omap.c
> +++ b/drivers/usb/musb/tusb6010_omap.c
> @@ -31,6 +31,12 @@
>  #define OMAP242X_DMA_EXT_DMAREQ4	16
>  #define OMAP242X_DMA_EXT_DMAREQ5	64
>  
> +struct tusb_dma_data {
> +	int			ch;
> +	s8			dmareq;
> +	s8			sync_dev;
> +};
> +
>  struct tusb_omap_dma_ch {
>  	struct musb		*musb;
>  	void __iomem		*tbase;
> @@ -39,9 +45,7 @@ struct tusb_omap_dma_ch {
>  	u8			tx;
>  	struct musb_hw_ep	*hw_ep;
>  
> -	int			ch;
> -	s8			dmareq;
> -	s8			sync_dev;
> +	struct tusb_dma_data	dma_data;
>  
>  	struct tusb_omap_dma	*tusb_dma;
>  
> @@ -58,9 +62,7 @@ struct tusb_omap_dma {
>  	struct dma_controller		controller;
>  	void __iomem			*tbase;
>  
> -	int				ch;
> -	s8				dmareq;
> -	s8				sync_dev;
> +	struct tusb_dma_data		dma_data;
>  	unsigned			multichannel:1;
>  };
>  
> @@ -119,9 +121,9 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data)
>  	spin_lock_irqsave(&musb->lock, flags);
>  
>  	if (tusb_dma->multichannel)
> -		ch = chdat->ch;
> +		ch = chdat->dma_data.ch;
>  	else
> -		ch = tusb_dma->ch;
> +		ch = tusb_dma->dma_data.ch;
>  
>  	if (ch_status != OMAP_DMA_BLOCK_IRQ)
>  		printk(KERN_ERR "TUSB DMA error status: %i\n", ch_status);
> @@ -140,8 +142,7 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data)
>  	/* HW issue #10: XFR_SIZE may get corrupt on DMA (both async & sync) */
>  	if (unlikely(remaining > chdat->transfer_len)) {
>  		dev_dbg(musb->controller, "Corrupt %s dma ch%i XFR_SIZE: 0x%08lx\n",
> -			chdat->tx ? "tx" : "rx", chdat->ch,
> -			remaining);
> +			chdat->tx ? "tx" : "rx", ch, remaining);
>  		remaining = 0;
>  	}
>  
> @@ -220,9 +221,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  	int				src_burst, dst_burst;
>  	u16				csr;
>  	u32				psize;
> -	int				ch;
> -	s8				dmareq;
> -	s8				sync_dev;
> +	struct tusb_dma_data		*dma_data;
>  
>  	if (unlikely(dma_addr & 0x1) || (len < 32) || (len > packet_sz))
>  		return false;
> @@ -249,7 +248,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  	dma_remaining = TUSB_EP_CONFIG_XFR_SIZE(dma_remaining);
>  	if (dma_remaining) {
>  		dev_dbg(musb->controller, "Busy %s dma ch%i, not using: %08x\n",
> -			chdat->tx ? "tx" : "rx", chdat->ch,
> +			chdat->tx ? "tx" : "rx", chdat->dma_data.ch,
>  			dma_remaining);
>  		return false;
>  	}
> @@ -262,15 +261,15 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  		chdat->transfer_packet_sz = packet_sz;
>  
>  	if (tusb_dma->multichannel) {
> -		ch = chdat->ch;
> -		dmareq = chdat->dmareq;
> -		sync_dev = chdat->sync_dev;
> +		dma_data = &chdat->dma_data;
>  	} else {
> +		dma_data = &tusb_dma->dma_data;
> +
>  		if (tusb_omap_use_shared_dmareq(chdat) != 0) {
>  			dev_dbg(musb->controller, "could not get dma for ep%i\n", chdat->epnum);
>  			return false;
>  		}
> -		if (tusb_dma->ch < 0) {
> +		if (dma_data->ch < 0) {
>  			/* REVISIT: This should get blocked earlier, happens
>  			 * with MSC ErrorRecoveryTest
>  			 */
> @@ -278,10 +277,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  			return false;
>  		}
>  
> -		ch = tusb_dma->ch;
> -		dmareq = tusb_dma->dmareq;
> -		sync_dev = tusb_dma->sync_dev;
> -		omap_set_dma_callback(ch, tusb_omap_dma_cb, channel);
> +		omap_set_dma_callback(dma_data->ch, tusb_omap_dma_cb, channel);
>  	}
>  
>  	chdat->packet_sz = packet_sz;
> @@ -312,7 +308,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  
>  	dev_dbg(musb->controller, "ep%i %s dma ch%i dma: %pad len: %u(%u) packet_sz: %i(%i)\n",
>  		chdat->epnum, chdat->tx ? "tx" : "rx",
> -		ch, &dma_addr, chdat->transfer_len, len,
> +		dma_data->ch, &dma_addr, chdat->transfer_len, len,
>  		chdat->transfer_packet_sz, packet_sz);
>  
>  	/*
> @@ -329,7 +325,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  		dma_params.dst_ei	= 1;
>  		dma_params.dst_fi	= -31;	/* Loop 32 byte window */
>  
> -		dma_params.trigger	= sync_dev;
> +		dma_params.trigger	= dma_data->sync_dev;
>  		dma_params.sync_mode	= OMAP_DMA_SYNC_FRAME;
>  		dma_params.src_or_dst_synch	= 0;	/* Dest sync */
>  
> @@ -346,7 +342,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  		dma_params.dst_ei	= 0;
>  		dma_params.dst_fi	= 0;
>  
> -		dma_params.trigger	= sync_dev;
> +		dma_params.trigger	= dma_data->sync_dev;
>  		dma_params.sync_mode	= OMAP_DMA_SYNC_FRAME;
>  		dma_params.src_or_dst_synch	= 1;	/* Source sync */
>  
> @@ -360,10 +356,10 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  		((dma_addr & 0x3) == 0) ? "sync" : "async",
>  		dma_params.src_start, dma_params.dst_start);
>  
> -	omap_set_dma_params(ch, &dma_params);
> -	omap_set_dma_src_burst_mode(ch, src_burst);
> -	omap_set_dma_dest_burst_mode(ch, dst_burst);
> -	omap_set_dma_write_mode(ch, OMAP_DMA_WRITE_LAST_NON_POSTED);
> +	omap_set_dma_params(dma_data->ch, &dma_params);
> +	omap_set_dma_src_burst_mode(dma_data->ch, src_burst);
> +	omap_set_dma_dest_burst_mode(dma_data->ch, dst_burst);
> +	omap_set_dma_write_mode(dma_data->ch, OMAP_DMA_WRITE_LAST_NON_POSTED);
>  
>  	/*
>  	 * Prepare MUSB for DMA transfer
> @@ -386,7 +382,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
>  	/*
>  	 * Start DMA transfer
>  	 */
> -	omap_start_dma(ch);
> +	omap_start_dma(dma_data->ch);
>  
>  	if (chdat->tx) {
>  		/* Send transfer_packet_sz packets at a time */
> @@ -415,16 +411,17 @@ static int tusb_omap_dma_abort(struct dma_channel *channel)
>  {
>  	struct tusb_omap_dma_ch	*chdat = to_chdat(channel);
>  	struct tusb_omap_dma	*tusb_dma = chdat->tusb_dma;
> +	struct tusb_dma_data	*dma_data = &tusb_dma->dma_data;
>  
>  	if (!tusb_dma->multichannel) {
> -		if (tusb_dma->ch >= 0) {
> -			omap_stop_dma(tusb_dma->ch);
> -			omap_free_dma(tusb_dma->ch);
> -			tusb_dma->ch = -1;
> +		if (dma_data->ch >= 0) {
> +			omap_stop_dma(dma_data->ch);
> +			omap_free_dma(dma_data->ch);
> +			dma_data->ch = -1;
>  		}
>  
> -		tusb_dma->dmareq = -1;
> -		tusb_dma->sync_dev = -1;
> +		dma_data->dmareq = -1;
> +		dma_data->sync_dev = -1;
>  	}
>  
>  	channel->status = MUSB_DMA_STATUS_FREE;
> @@ -462,8 +459,8 @@ static inline int tusb_omap_dma_allocate_dmareq(struct tusb_omap_dma_ch *chdat)
>  		reg |= ((1 << 4) << (dmareq_nr * 5));
>  	musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
>  
> -	chdat->dmareq = dmareq_nr;
> -	chdat->sync_dev = sync_dev[chdat->dmareq];
> +	chdat->dma_data.dmareq = dmareq_nr;
> +	chdat->dma_data.sync_dev = sync_dev[chdat->dma_data.dmareq];
>  
>  	return 0;
>  }
> @@ -472,15 +469,15 @@ static inline void tusb_omap_dma_free_dmareq(struct tusb_omap_dma_ch *chdat)
>  {
>  	u32 reg;
>  
> -	if (!chdat || chdat->dmareq < 0)
> +	if (!chdat || chdat->dma_data.dmareq < 0)
>  		return;
>  
>  	reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP);
> -	reg &= ~(0x1f << (chdat->dmareq * 5));
> +	reg &= ~(0x1f << (chdat->dma_data.dmareq * 5));
>  	musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
>  
> -	chdat->dmareq = -1;
> -	chdat->sync_dev = -1;
> +	chdat->dma_data.dmareq = -1;
> +	chdat->dma_data.sync_dev = -1;
>  }
>  
>  static struct dma_channel *dma_channel_pool[MAX_DMAREQ];
> @@ -492,11 +489,13 @@ tusb_omap_dma_allocate(struct dma_controller *c,
>  {
>  	int ret, i;
>  	const char		*dev_name;
> +	void			*cb_data;
>  	struct tusb_omap_dma	*tusb_dma;
>  	struct musb		*musb;
>  	void __iomem		*tbase;
>  	struct dma_channel	*channel = NULL;
>  	struct tusb_omap_dma_ch	*chdat = NULL;
> +	struct tusb_dma_data	*dma_data = NULL;
>  	u32			reg;
>  
>  	tusb_dma = container_of(c, struct tusb_omap_dma, controller);
> @@ -529,56 +528,61 @@ tusb_omap_dma_allocate(struct dma_controller *c,
>  	if (!channel)
>  		return NULL;
>  
> -	if (tx) {
> -		chdat->tx = 1;
> -		dev_name = "TUSB transmit";
> -	} else {
> -		chdat->tx = 0;
> -		dev_name = "TUSB receive";
> -	}
> -
>  	chdat->musb = tusb_dma->controller.musb;
>  	chdat->tbase = tusb_dma->tbase;
>  	chdat->hw_ep = hw_ep;
>  	chdat->epnum = hw_ep->epnum;
> -	chdat->dmareq = -1;
>  	chdat->completed_len = 0;
>  	chdat->tusb_dma = tusb_dma;
> +	if (tx)
> +		chdat->tx = 1;
> +	else
> +		chdat->tx = 0;
>  
>  	channel->max_len = 0x7fffffff;
>  	channel->desired_mode = 0;
>  	channel->actual_len = 0;
>  
>  	if (tusb_dma->multichannel) {
> +		dma_data = &chdat->dma_data;
>  		ret = tusb_omap_dma_allocate_dmareq(chdat);
>  		if (ret != 0)
>  			goto free_dmareq;
>  
> -		ret = omap_request_dma(chdat->sync_dev, dev_name,
> -				tusb_omap_dma_cb, channel, &chdat->ch);
> -		if (ret != 0)
> -			goto free_dmareq;
> -	} else if (tusb_dma->ch == -1) {
> -		tusb_dma->dmareq = 0;
> -		tusb_dma->sync_dev = OMAP24XX_DMA_EXT_DMAREQ0;
> -
> +		if (chdat->tx)
> +			dev_name = "TUSB transmit";
> +		else
> +			dev_name = "TUSB receive";
> +		cb_data = channel;
> +	} else if (tusb_dma->dma_data.ch == -1) {
> +		dma_data = &tusb_dma->dma_data;
> +		dma_data->dmareq = 0;
> +		dma_data->sync_dev = OMAP24XX_DMA_EXT_DMAREQ0;
> +
> +		dev_name = "TUSB shared";
>  		/* Callback data gets set later in the shared dmareq case */
> -		ret = omap_request_dma(tusb_dma->sync_dev, "TUSB shared",
> -				tusb_omap_dma_cb, NULL, &tusb_dma->ch);
> +		cb_data = NULL;
> +
> +		chdat->dma_data.dmareq = -1;
> +		chdat->dma_data.ch = -1;
> +		chdat->dma_data.sync_dev = -1;
> +	}
> +
> +	if (dma_data) {
> +		ret = omap_request_dma(dma_data->sync_dev, dev_name,
> +				       tusb_omap_dma_cb, cb_data, &dma_data->ch);

line over 80 characters.

Regards,
-Bin.

  reply	other threads:[~2017-05-17 20:17 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-12 13:57 [PATCH v3 0/9] usb: musb: tusb6010_omap: Convert to DMAengine Peter Ujfalusi
2017-05-12 13:57 ` Peter Ujfalusi
2017-05-12 13:57 ` [PATCH v3 1/9] dmaengine: omap-dma: port_window support correction for both direction Peter Ujfalusi
2017-05-12 13:57   ` Peter Ujfalusi
2017-05-14 13:10   ` Vinod Koul
     [not found] ` <20170512135752.1800-1-peter.ujfalusi-l0cyMroinI0@public.gmane.org>
2017-05-12 13:57   ` [PATCH v3 2/9] usb: musb: Add quirk to avoid skb reserve in gadget mode Peter Ujfalusi
2017-05-12 13:57     ` Peter Ujfalusi
2017-05-12 13:57 ` [PATCH v3 3/9] usb: musb: tusb6010: Add MUSB_G_NO_SKB_RESERVE to quirks Peter Ujfalusi
2017-05-12 13:57   ` Peter Ujfalusi
2017-05-17 20:08   ` Bin Liu
2017-05-17 20:08     ` Bin Liu
2017-05-12 13:57 ` [PATCH v3 4/9] usb: musb: tusb6010_omap: Use one musb_ep_select call in tusb_omap_dma_program Peter Ujfalusi
2017-05-12 13:57   ` Peter Ujfalusi
2017-05-12 13:57 ` [PATCH v3 5/9] usb: musb: tusb6010_omap: Create new struct for DMA data/parameters Peter Ujfalusi
2017-05-12 13:57   ` Peter Ujfalusi
2017-05-17 20:17   ` Bin Liu [this message]
2017-05-17 20:17     ` Bin Liu
     [not found]   ` <20170512135752.1800-6-peter.ujfalusi-l0cyMroinI0@public.gmane.org>
2017-05-17 20:35     ` Bin Liu
2017-05-17 20:35       ` Bin Liu
2017-05-12 13:57 ` [PATCH v3 6/9] usb: musb: tusb6010_omap: Allocate DMA channels upfront Peter Ujfalusi
2017-05-12 13:57   ` Peter Ujfalusi
2017-05-12 13:57 ` [PATCH v3 7/9] usb: musb: tusb6010: Handle DMA TX completion in DMA callback as well Peter Ujfalusi
2017-05-12 13:57   ` Peter Ujfalusi
2017-05-12 13:57 ` [PATCH v3 8/9] ARM: OMAP2+: DMA: Add slave map entries for 24xx external request lines Peter Ujfalusi
2017-05-12 13:57   ` Peter Ujfalusi
2017-05-12 13:57 ` [PATCH v3 9/9] usb: musb: tusb6010_omap: Convert to DMAengine API Peter Ujfalusi
2017-05-12 13:57   ` Peter Ujfalusi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170517201713.GF651@uda0271908 \
    --to=b-liu@ti.com \
    --cc=balbi@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=peter.ujfalusi@ti.com \
    --cc=tony@atomide.com \
    --cc=vinod.koul@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.