diff options
-rw-r--r-- | drivers/usb/musb/musb_core.c | 36 | ||||
-rw-r--r-- | include/linux/usb/musb.h | 35 |
2 files changed, 51 insertions, 20 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index ced6d9ea9af3..3f4c158a9f5e 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; | |||
995 | module_param(fifo_mode, ushort, 0); | 995 | module_param(fifo_mode, ushort, 0); |
996 | MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration"); | 996 | MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration"); |
997 | 997 | ||
998 | |||
999 | enum fifo_style { FIFO_RXTX, FIFO_TX, FIFO_RX } __attribute__ ((packed)); | ||
1000 | enum buf_mode { BUF_SINGLE, BUF_DOUBLE } __attribute__ ((packed)); | ||
1001 | |||
1002 | struct fifo_cfg { | ||
1003 | u8 hw_ep_num; | ||
1004 | enum fifo_style style; | ||
1005 | enum buf_mode mode; | ||
1006 | u16 maxpacket; | ||
1007 | }; | ||
1008 | |||
1009 | /* | 998 | /* |
1010 | * tables defining fifo_mode values. define more if you like. | 999 | * tables defining fifo_mode values. define more if you like. |
1011 | * for host side, make sure both halves of ep1 are set up. | 1000 | * for host side, make sure both halves of ep1 are set up. |
1012 | */ | 1001 | */ |
1013 | 1002 | ||
1014 | /* mode 0 - fits in 2KB */ | 1003 | /* mode 0 - fits in 2KB */ |
1015 | static struct fifo_cfg __initdata mode_0_cfg[] = { | 1004 | static struct musb_fifo_cfg __initdata mode_0_cfg[] = { |
1016 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1005 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1017 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1006 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1018 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, }, | 1007 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, }, |
@@ -1021,7 +1010,7 @@ static struct fifo_cfg __initdata mode_0_cfg[] = { | |||
1021 | }; | 1010 | }; |
1022 | 1011 | ||
1023 | /* mode 1 - fits in 4KB */ | 1012 | /* mode 1 - fits in 4KB */ |
1024 | static struct fifo_cfg __initdata mode_1_cfg[] = { | 1013 | static struct musb_fifo_cfg __initdata mode_1_cfg[] = { |
1025 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1014 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1026 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1015 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1027 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1016 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
@@ -1030,7 +1019,7 @@ static struct fifo_cfg __initdata mode_1_cfg[] = { | |||
1030 | }; | 1019 | }; |
1031 | 1020 | ||
1032 | /* mode 2 - fits in 4KB */ | 1021 | /* mode 2 - fits in 4KB */ |
1033 | static struct fifo_cfg __initdata mode_2_cfg[] = { | 1022 | static struct musb_fifo_cfg __initdata mode_2_cfg[] = { |
1034 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1023 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1035 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1024 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1036 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1025 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1040,7 +1029,7 @@ static struct fifo_cfg __initdata mode_2_cfg[] = { | |||
1040 | }; | 1029 | }; |
1041 | 1030 | ||
1042 | /* mode 3 - fits in 4KB */ | 1031 | /* mode 3 - fits in 4KB */ |
1043 | static struct fifo_cfg __initdata mode_3_cfg[] = { | 1032 | static struct musb_fifo_cfg __initdata mode_3_cfg[] = { |
1044 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1033 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1045 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1034 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1046 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1035 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1050,7 +1039,7 @@ static struct fifo_cfg __initdata mode_3_cfg[] = { | |||
1050 | }; | 1039 | }; |
1051 | 1040 | ||
1052 | /* mode 4 - fits in 16KB */ | 1041 | /* mode 4 - fits in 16KB */ |
1053 | static struct fifo_cfg __initdata mode_4_cfg[] = { | 1042 | static struct musb_fifo_cfg __initdata mode_4_cfg[] = { |
1054 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1043 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1055 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1044 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1056 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1045 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1081,7 +1070,7 @@ static struct fifo_cfg __initdata mode_4_cfg[] = { | |||
1081 | }; | 1070 | }; |
1082 | 1071 | ||
1083 | /* mode 5 - fits in 8KB */ | 1072 | /* mode 5 - fits in 8KB */ |
1084 | static struct fifo_cfg __initdata mode_5_cfg[] = { | 1073 | static struct musb_fifo_cfg __initdata mode_5_cfg[] = { |
1085 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1074 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1086 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1075 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1087 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1076 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1119,7 +1108,7 @@ static struct fifo_cfg __initdata mode_5_cfg[] = { | |||
1119 | */ | 1108 | */ |
1120 | static int __init | 1109 | static int __init |
1121 | fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, | 1110 | fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, |
1122 | const struct fifo_cfg *cfg, u16 offset) | 1111 | const struct musb_fifo_cfg *cfg, u16 offset) |
1123 | { | 1112 | { |
1124 | void __iomem *mbase = musb->mregs; | 1113 | void __iomem *mbase = musb->mregs; |
1125 | int size = 0; | 1114 | int size = 0; |
@@ -1190,17 +1179,23 @@ fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, | |||
1190 | return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0)); | 1179 | return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0)); |
1191 | } | 1180 | } |
1192 | 1181 | ||
1193 | static struct fifo_cfg __initdata ep0_cfg = { | 1182 | static struct musb_fifo_cfg __initdata ep0_cfg = { |
1194 | .style = FIFO_RXTX, .maxpacket = 64, | 1183 | .style = FIFO_RXTX, .maxpacket = 64, |
1195 | }; | 1184 | }; |
1196 | 1185 | ||
1197 | static int __init ep_config_from_table(struct musb *musb) | 1186 | static int __init ep_config_from_table(struct musb *musb) |
1198 | { | 1187 | { |
1199 | const struct fifo_cfg *cfg; | 1188 | const struct musb_fifo_cfg *cfg; |
1200 | unsigned i, n; | 1189 | unsigned i, n; |
1201 | int offset; | 1190 | int offset; |
1202 | struct musb_hw_ep *hw_ep = musb->endpoints; | 1191 | struct musb_hw_ep *hw_ep = musb->endpoints; |
1203 | 1192 | ||
1193 | if (musb->config->fifo_cfg) { | ||
1194 | cfg = musb->config->fifo_cfg; | ||
1195 | n = musb->config->fifo_cfg_size; | ||
1196 | goto done; | ||
1197 | } | ||
1198 | |||
1204 | switch (fifo_mode) { | 1199 | switch (fifo_mode) { |
1205 | default: | 1200 | default: |
1206 | fifo_mode = 0; | 1201 | fifo_mode = 0; |
@@ -1235,6 +1230,7 @@ static int __init ep_config_from_table(struct musb *musb) | |||
1235 | musb_driver_name, fifo_mode); | 1230 | musb_driver_name, fifo_mode); |
1236 | 1231 | ||
1237 | 1232 | ||
1233 | done: | ||
1238 | offset = fifo_setup(musb, hw_ep, &ep0_cfg, 0); | 1234 | offset = fifo_setup(musb, hw_ep, &ep0_cfg, 0); |
1239 | /* assert(offset > 0) */ | 1235 | /* assert(offset > 0) */ |
1240 | 1236 | ||
diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h index 7acef0234c0e..f3d68f62dae8 100644 --- a/include/linux/usb/musb.h +++ b/include/linux/usb/musb.h | |||
@@ -22,12 +22,47 @@ enum musb_mode { | |||
22 | 22 | ||
23 | struct clk; | 23 | struct clk; |
24 | 24 | ||
25 | enum musb_fifo_style { | ||
26 | FIFO_RXTX, | ||
27 | FIFO_TX, | ||
28 | FIFO_RX | ||
29 | } __attribute__ ((packed)); | ||
30 | |||
31 | enum musb_buf_mode { | ||
32 | BUF_SINGLE, | ||
33 | BUF_DOUBLE | ||
34 | } __attribute__ ((packed)); | ||
35 | |||
36 | struct musb_fifo_cfg { | ||
37 | u8 hw_ep_num; | ||
38 | enum musb_fifo_style style; | ||
39 | enum musb_buf_mode mode; | ||
40 | u16 maxpacket; | ||
41 | }; | ||
42 | |||
43 | #define MUSB_EP_FIFO(ep, st, m, pkt) \ | ||
44 | { \ | ||
45 | .hw_ep_num = ep, \ | ||
46 | .style = st, \ | ||
47 | .mode = m, \ | ||
48 | .maxpacket = pkt, \ | ||
49 | } | ||
50 | |||
51 | #define MUSB_EP_FIFO_SINGLE(ep, st, pkt) \ | ||
52 | MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt) | ||
53 | |||
54 | #define MUSB_EP_FIFO_DOUBLE(ep, st, pkt) \ | ||
55 | MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt) | ||
56 | |||
25 | struct musb_hdrc_eps_bits { | 57 | struct musb_hdrc_eps_bits { |
26 | const char name[16]; | 58 | const char name[16]; |
27 | u8 bits; | 59 | u8 bits; |
28 | }; | 60 | }; |
29 | 61 | ||
30 | struct musb_hdrc_config { | 62 | struct musb_hdrc_config { |
63 | struct musb_fifo_cfg *fifo_cfg; /* board fifo configuration */ | ||
64 | unsigned fifo_cfg_size; /* size of the fifo configuration */ | ||
65 | |||
31 | /* MUSB configuration-specific details */ | 66 | /* MUSB configuration-specific details */ |
32 | unsigned multipoint:1; /* multipoint device */ | 67 | unsigned multipoint:1; /* multipoint device */ |
33 | unsigned dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */ | 68 | unsigned dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */ |