Re: [PATCH 08/28] usb: musb: pass fifo_mode from hw glue driver

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Felipe Balbi
Date: Thursday, December 16, 2010 - 1:48 am

On Thu, Dec 16, 2010 at 02:14:35PM +0800, Ming Lei wrote:

Look at this patch:

$ git show e6c213b2968cbee4cfb8f89f2d685b9ad07eefbd

commit e6c213b2968cbee4cfb8f89f2d685b9ad07eefbd
Author: Felipe Balbi <felipe.balbi@nokia.com>
Date:   Fri Mar 12 10:29:06 2010 +0200

     usb: musb: allow board to pass down fifo mode
     
     boards might want to optimize their fifo configuration
     to the particular needs of that specific board. Allow
     that by moving all related data structures to
     <linux/usb/musb.h>
     
     Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
     Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index ced6d9e..3f4c158 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -995,24 +995,13 @@ static ushort __initdata fifo_mode = 2;
  module_param(fifo_mode, ushort, 0);
  MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration");
  
-
-enum fifo_style { FIFO_RXTX, FIFO_TX, FIFO_RX } __attribute__ ((packed));
-enum buf_mode { BUF_SINGLE, BUF_DOUBLE } __attribute__ ((packed));
-
-struct fifo_cfg {
-	u8		hw_ep_num;
-	enum fifo_style	style;
-	enum buf_mode	mode;
-	u16		maxpacket;
-};
-
  /*
   * tables defining fifo_mode values.  define more if you like.
   * for host side, make sure both halves of ep1 are set up.
   */
  
  /* mode 0 - fits in 2KB */
-static struct fifo_cfg __initdata mode_0_cfg[] = {
+static struct musb_fifo_cfg __initdata mode_0_cfg[] = {
  { .hw_ep_num = 1, .style = FIFO_TX,   .maxpacket = 512, },
  { .hw_ep_num = 1, .style = FIFO_RX,   .maxpacket = 512, },
  { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, },
@@ -1021,7 +1010,7 @@ static struct fifo_cfg __initdata mode_0_cfg[] = {
  };
  
  /* mode 1 - fits in 4KB */
-static struct fifo_cfg __initdata mode_1_cfg[] = {
+static struct musb_fifo_cfg __initdata mode_1_cfg[] = {
  { .hw_ep_num = 1, .style = FIFO_TX,   .maxpacket = 512, .mode = BUF_DOUBLE, },
  { .hw_ep_num = 1, .style = FIFO_RX,   .maxpacket = 512, .mode = BUF_DOUBLE, },
  { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, },
@@ -1030,7 +1019,7 @@ static struct fifo_cfg __initdata mode_1_cfg[] = {
  };
  
  /* mode 2 - fits in 4KB */
-static struct fifo_cfg __initdata mode_2_cfg[] = {
+static struct musb_fifo_cfg __initdata mode_2_cfg[] = {
  { .hw_ep_num = 1, .style = FIFO_TX,   .maxpacket = 512, },
  { .hw_ep_num = 1, .style = FIFO_RX,   .maxpacket = 512, },
  { .hw_ep_num = 2, .style = FIFO_TX,   .maxpacket = 512, },
@@ -1040,7 +1029,7 @@ static struct fifo_cfg __initdata mode_2_cfg[] = {
  };
  
  /* mode 3 - fits in 4KB */
-static struct fifo_cfg __initdata mode_3_cfg[] = {
+static struct musb_fifo_cfg __initdata mode_3_cfg[] = {
  { .hw_ep_num = 1, .style = FIFO_TX,   .maxpacket = 512, .mode = BUF_DOUBLE, },
  { .hw_ep_num = 1, .style = FIFO_RX,   .maxpacket = 512, .mode = BUF_DOUBLE, },
  { .hw_ep_num = 2, .style = FIFO_TX,   .maxpacket = 512, },
@@ -1050,7 +1039,7 @@ static struct fifo_cfg __initdata mode_3_cfg[] = {
  };
  
  /* mode 4 - fits in 16KB */
-static struct fifo_cfg __initdata mode_4_cfg[] = {
+static struct musb_fifo_cfg __initdata mode_4_cfg[] = {
  { .hw_ep_num =  1, .style = FIFO_TX,   .maxpacket = 512, },
  { .hw_ep_num =  1, .style = FIFO_RX,   .maxpacket = 512, },
  { .hw_ep_num =  2, .style = FIFO_TX,   .maxpacket = 512, },
@@ -1081,7 +1070,7 @@ static struct fifo_cfg __initdata mode_4_cfg[] = {
  };
  
  /* mode 5 - fits in 8KB */
-static struct fifo_cfg __initdata mode_5_cfg[] = {
+static struct musb_fifo_cfg __initdata mode_5_cfg[] = {
  { .hw_ep_num =  1, .style = FIFO_TX,   .maxpacket = 512, },
  { .hw_ep_num =  1, .style = FIFO_RX,   .maxpacket = 512, },
  { .hw_ep_num =  2, .style = FIFO_TX,   .maxpacket = 512, },
@@ -1119,7 +1108,7 @@ static struct fifo_cfg __initdata mode_5_cfg[] = {
   */
  static int __init
  fifo_setup(struct musb *musb, struct musb_hw_ep  *hw_ep,
-		const struct fifo_cfg *cfg, u16 offset)
+		const struct musb_fifo_cfg *cfg, u16 offset)
  {
  	void __iomem	*mbase = musb->mregs;
  	int	size = 0;
@@ -1190,17 +1179,23 @@ fifo_setup(struct musb *musb, struct musb_hw_ep  *hw_ep,
  	return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0));
  }
  
-static struct fifo_cfg __initdata ep0_cfg = {
+static struct musb_fifo_cfg __initdata ep0_cfg = {
  	.style = FIFO_RXTX, .maxpacket = 64,
  };
  
  static int __init ep_config_from_table(struct musb *musb)
  {
-	const struct fifo_cfg	*cfg;
+	const struct musb_fifo_cfg	*cfg;
  	unsigned		i, n;
  	int			offset;
  	struct musb_hw_ep	*hw_ep = musb->endpoints;
  
+	if (musb->config->fifo_cfg) {
+		cfg = musb->config->fifo_cfg;
+		n = musb->config->fifo_cfg_size;
+		goto done;
+	}
+
  	switch (fifo_mode) {
  	default:
  		fifo_mode = 0;
@@ -1235,6 +1230,7 @@ static int __init ep_config_from_table(struct musb *musb)
  			musb_driver_name, fifo_mode);
  
  
+done:
  	offset = fifo_setup(musb, hw_ep, &ep0_cfg, 0);
  	/* assert(offset > 0) */
  
diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h
index 7acef02..f3d68f6 100644
--- a/include/linux/usb/musb.h
+++ b/include/linux/usb/musb.h
@@ -22,12 +22,47 @@ enum musb_mode {
  
  struct clk;
  
+enum musb_fifo_style {
+	FIFO_RXTX,
+	FIFO_TX,
+	FIFO_RX
+} __attribute__ ((packed));
+
+enum musb_buf_mode {
+	BUF_SINGLE,
+	BUF_DOUBLE
+} __attribute__ ((packed));
+
+struct musb_fifo_cfg {
+	u8			hw_ep_num;
+	enum musb_fifo_style	style;
+	enum musb_buf_mode	mode;
+	u16			maxpacket;
+};
+
+#define MUSB_EP_FIFO(ep, st, m, pkt)		\
+{						\
+	.hw_ep_num	= ep,			\
+	.style		= st,			\
+	.mode		= m,			\
+	.maxpacket	= pkt,			\
+}
+
+#define MUSB_EP_FIFO_SINGLE(ep, st, pkt)	\
+	MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt)
+
+#define MUSB_EP_FIFO_DOUBLE(ep, st, pkt)	\
+	MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt)
+
  struct musb_hdrc_eps_bits {
  	const char	name[16];
  	u8		bits;
  };
  
  struct musb_hdrc_config {
+	struct musb_fifo_cfg	*fifo_cfg;	/* board fifo configuration */
+	unsigned		fifo_cfg_size;	/* size of the fifo configuration */
+
  	/* MUSB configuration-specific details */
  	unsigned	multipoint:1;	/* multipoint device */
  	unsigned	dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */

the thing is that we don't want to "bloat" musb_core.c with several
different fifo_modes and have each glue layer change that, instead we
can let board initialization data pass in an optmized version of the
fifo_mode the usecases the board will be used for.

-- 
balbi
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/28] usb: musb: musb cleanup, tom.leiming, (Sun Dec 12, 10:01 am)
[PATCH 11/28] usb: musb: remove musb_in_tusb, tom.leiming, (Sun Dec 12, 10:01 am)
[PATCH 12/27] usb: musb: remove musb_in_tusb, tom.leiming, (Sun Dec 12, 10:01 am)
[PATCH 21/28] usb: musb: print dma type in runtime way, tom.leiming, (Sun Dec 12, 10:02 am)
[PATCH 22/27] usb: musb: print dma type in runtime way, tom.leiming, (Sun Dec 12, 10:02 am)
RE: [PATCH 0/28] usb: musb: musb cleanup, Gupta, Ajay Kumar, (Mon Dec 13, 12:55 am)
Re: [PATCH 0/28] usb: musb: musb cleanup, Ming Lei, (Mon Dec 13, 3:17 am)
Re: [PATCH 0/28] usb: musb: musb cleanup, Ming Lei, (Mon Dec 13, 3:18 am)
Re: [PATCH 08/28] usb: musb: pass fifo_mode from hw glue d ..., Felipe Balbi, (Thu Dec 16, 1:48 am)