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 */ | ||
