diff options
author | Arvid Brodin <arvid.brodin@enea.com> | 2011-04-26 15:48:02 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-02 20:02:55 -0400 |
commit | eb1a796868effbf33ec2cfa3d15567d7e31f2ee2 (patch) | |
tree | 48cdc9ec84c6aee5f0fe43c148949abc0ba35287 /drivers/usb/host/isp1760-hcd.c | |
parent | 34537731d7f64d20116fbef4a665ec6a37195573 (diff) |
usb/isp1760: Remove unneeded OR map and HcBufferStatus code
Since we always set the OR flag for each transfer, we can just as well set all
these bits to 1 at init and be done with it. Also, HcBufferStatus can be set
at init as per the ISP1761 datasheet page 47 with no loss of performance.
Signed-off-by: Arvid Brodin <arvid.brodin@enea.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/isp1760-hcd.c')
-rw-r--r-- | drivers/usb/host/isp1760-hcd.c | 63 |
1 files changed, 8 insertions, 55 deletions
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index 6b2bf4684f45..a5f03cdf9ba5 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -336,10 +336,6 @@ static void isp1760_init_regs(struct usb_hcd *hcd) | |||
336 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | 336 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); |
337 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | 337 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); |
338 | reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | 338 | reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); |
339 | |||
340 | reg_write32(hcd->regs, HC_ATL_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE); | ||
341 | reg_write32(hcd->regs, HC_INT_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE); | ||
342 | reg_write32(hcd->regs, HC_ISO_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE); | ||
343 | } | 339 | } |
344 | 340 | ||
345 | static int handshake(struct usb_hcd *hcd, u32 reg, | 341 | static int handshake(struct usb_hcd *hcd, u32 reg, |
@@ -516,14 +512,17 @@ static void isp1760_init_maps(struct usb_hcd *hcd) | |||
516 | reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000); | 512 | reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000); |
517 | reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000); | 513 | reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000); |
518 | reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001); | 514 | reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001); |
515 | |||
516 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, | ||
517 | ATL_BUF_FILL | INT_BUF_FILL); | ||
519 | } | 518 | } |
520 | 519 | ||
521 | static void isp1760_enable_interrupts(struct usb_hcd *hcd) | 520 | static void isp1760_enable_interrupts(struct usb_hcd *hcd) |
522 | { | 521 | { |
523 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0); | 522 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0); |
524 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0); | 523 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0xffffffff); |
525 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0); | 524 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0); |
526 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0); | 525 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0xffffffff); |
527 | reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0); | 526 | reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0); |
528 | reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff); | 527 | reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff); |
529 | /* step 23 passed */ | 528 | /* step 23 passed */ |
@@ -835,9 +834,8 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | |||
835 | struct isp1760_qtd *qtd) | 834 | struct isp1760_qtd *qtd) |
836 | { | 835 | { |
837 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | 836 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
838 | u32 skip_map, or_map; | 837 | u32 skip_map; |
839 | u32 slot; | 838 | u32 slot; |
840 | u32 buffstatus; | ||
841 | 839 | ||
842 | /* | 840 | /* |
843 | * When this function is called from the interrupt handler to enqueue | 841 | * When this function is called from the interrupt handler to enqueue |
@@ -854,10 +852,6 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | |||
854 | 852 | ||
855 | enqueue_one_atl_qtd(hcd, qh, slot, qtd); | 853 | enqueue_one_atl_qtd(hcd, qh, slot, qtd); |
856 | 854 | ||
857 | or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG); | ||
858 | or_map |= (1 << slot); | ||
859 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map); | ||
860 | |||
861 | skip_map &= ~(1 << slot); | 855 | skip_map &= ~(1 << slot); |
862 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); | 856 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); |
863 | 857 | ||
@@ -865,18 +859,13 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | |||
865 | if (priv->atl_queued == 2) | 859 | if (priv->atl_queued == 2) |
866 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, | 860 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, |
867 | INTERRUPT_ENABLE_SOT_MASK); | 861 | INTERRUPT_ENABLE_SOT_MASK); |
868 | |||
869 | buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG); | ||
870 | buffstatus |= ATL_BUFFER; | ||
871 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus); | ||
872 | } | 862 | } |
873 | 863 | ||
874 | static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | 864 | static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, |
875 | struct isp1760_qtd *qtd) | 865 | struct isp1760_qtd *qtd) |
876 | { | 866 | { |
877 | u32 skip_map, or_map; | 867 | u32 skip_map; |
878 | u32 slot; | 868 | u32 slot; |
879 | u32 buffstatus; | ||
880 | 869 | ||
881 | /* | 870 | /* |
882 | * When this function is called from the interrupt handler to enqueue | 871 | * When this function is called from the interrupt handler to enqueue |
@@ -893,16 +882,8 @@ static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | |||
893 | 882 | ||
894 | enqueue_one_int_qtd(hcd, qh, slot, qtd); | 883 | enqueue_one_int_qtd(hcd, qh, slot, qtd); |
895 | 884 | ||
896 | or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG); | ||
897 | or_map |= (1 << slot); | ||
898 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map); | ||
899 | |||
900 | skip_map &= ~(1 << slot); | 885 | skip_map &= ~(1 << slot); |
901 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); | 886 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); |
902 | |||
903 | buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG); | ||
904 | buffstatus |= INT_BUFFER; | ||
905 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus); | ||
906 | } | 887 | } |
907 | 888 | ||
908 | static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb) | 889 | static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb) |
@@ -994,7 +975,6 @@ static void do_atl_int(struct usb_hcd *hcd) | |||
994 | struct urb *urb; | 975 | struct urb *urb; |
995 | u32 slot; | 976 | u32 slot; |
996 | u32 length; | 977 | u32 length; |
997 | u32 or_map; | ||
998 | u32 status = -EINVAL; | 978 | u32 status = -EINVAL; |
999 | int error; | 979 | int error; |
1000 | struct isp1760_qtd *qtd; | 980 | struct isp1760_qtd *qtd; |
@@ -1005,10 +985,6 @@ static void do_atl_int(struct usb_hcd *hcd) | |||
1005 | done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG); | 985 | done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG); |
1006 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); | 986 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); |
1007 | 987 | ||
1008 | or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG); | ||
1009 | or_map &= ~done_map; | ||
1010 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map); | ||
1011 | |||
1012 | while (done_map) { | 988 | while (done_map) { |
1013 | status = 0; | 989 | status = 0; |
1014 | priv->atl_queued--; | 990 | priv->atl_queued--; |
@@ -1048,8 +1024,6 @@ static void do_atl_int(struct usb_hcd *hcd) | |||
1048 | } | 1024 | } |
1049 | 1025 | ||
1050 | if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) { | 1026 | if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) { |
1051 | u32 buffstatus; | ||
1052 | |||
1053 | /* | 1027 | /* |
1054 | * NAKs are handled in HW by the chip. Usually if the | 1028 | * NAKs are handled in HW by the chip. Usually if the |
1055 | * device is not able to send data fast enough. | 1029 | * device is not able to send data fast enough. |
@@ -1068,9 +1042,6 @@ static void do_atl_int(struct usb_hcd *hcd) | |||
1068 | * unskipped once it gets written to the HW. | 1042 | * unskipped once it gets written to the HW. |
1069 | */ | 1043 | */ |
1070 | skip_map &= ~(1 << slot); | 1044 | skip_map &= ~(1 << slot); |
1071 | or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG); | ||
1072 | or_map |= 1 << slot; | ||
1073 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map); | ||
1074 | 1045 | ||
1075 | ptd.dw0 |= PTD_VALID; | 1046 | ptd.dw0 |= PTD_VALID; |
1076 | ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); | 1047 | ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); |
@@ -1079,12 +1050,6 @@ static void do_atl_int(struct usb_hcd *hcd) | |||
1079 | if (priv->atl_queued == 2) | 1050 | if (priv->atl_queued == 2) |
1080 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, | 1051 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, |
1081 | INTERRUPT_ENABLE_SOT_MASK); | 1052 | INTERRUPT_ENABLE_SOT_MASK); |
1082 | |||
1083 | buffstatus = reg_read32(hcd->regs, | ||
1084 | HC_BUFFER_STATUS_REG); | ||
1085 | buffstatus |= ATL_BUFFER; | ||
1086 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, | ||
1087 | buffstatus); | ||
1088 | continue; | 1053 | continue; |
1089 | } | 1054 | } |
1090 | 1055 | ||
@@ -1191,7 +1156,6 @@ static void do_intl_int(struct usb_hcd *hcd) | |||
1191 | struct ptd ptd; | 1156 | struct ptd ptd; |
1192 | struct urb *urb; | 1157 | struct urb *urb; |
1193 | u32 length; | 1158 | u32 length; |
1194 | u32 or_map; | ||
1195 | int error; | 1159 | int error; |
1196 | u32 slot; | 1160 | u32 slot; |
1197 | struct isp1760_qtd *qtd; | 1161 | struct isp1760_qtd *qtd; |
@@ -1200,10 +1164,6 @@ static void do_intl_int(struct usb_hcd *hcd) | |||
1200 | done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG); | 1164 | done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG); |
1201 | skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); | 1165 | skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); |
1202 | 1166 | ||
1203 | or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG); | ||
1204 | or_map &= ~done_map; | ||
1205 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map); | ||
1206 | |||
1207 | while (done_map) { | 1167 | while (done_map) { |
1208 | slot = __ffs(done_map); | 1168 | slot = __ffs(done_map); |
1209 | done_map &= ~(1 << slot); | 1169 | done_map &= ~(1 << slot); |
@@ -1503,7 +1463,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1503 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | 1463 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
1504 | struct inter_packet_info *ints; | 1464 | struct inter_packet_info *ints; |
1505 | u32 i; | 1465 | u32 i; |
1506 | u32 reg_base, or_reg, skip_reg; | 1466 | u32 reg_base, skip_reg; |
1507 | unsigned long flags; | 1467 | unsigned long flags; |
1508 | struct ptd ptd; | 1468 | struct ptd ptd; |
1509 | packet_enqueue *pe; | 1469 | packet_enqueue *pe; |
@@ -1516,7 +1476,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1516 | case PIPE_INTERRUPT: | 1476 | case PIPE_INTERRUPT: |
1517 | ints = priv->int_ints; | 1477 | ints = priv->int_ints; |
1518 | reg_base = INT_PTD_OFFSET; | 1478 | reg_base = INT_PTD_OFFSET; |
1519 | or_reg = HC_INT_IRQ_MASK_OR_REG; | ||
1520 | skip_reg = HC_INT_PTD_SKIPMAP_REG; | 1479 | skip_reg = HC_INT_PTD_SKIPMAP_REG; |
1521 | pe = enqueue_an_INT_packet; | 1480 | pe = enqueue_an_INT_packet; |
1522 | break; | 1481 | break; |
@@ -1524,7 +1483,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1524 | default: | 1483 | default: |
1525 | ints = priv->atl_ints; | 1484 | ints = priv->atl_ints; |
1526 | reg_base = ATL_PTD_OFFSET; | 1485 | reg_base = ATL_PTD_OFFSET; |
1527 | or_reg = HC_ATL_IRQ_MASK_OR_REG; | ||
1528 | skip_reg = HC_ATL_PTD_SKIPMAP_REG; | 1486 | skip_reg = HC_ATL_PTD_SKIPMAP_REG; |
1529 | pe = enqueue_an_ATL_packet; | 1487 | pe = enqueue_an_ATL_packet; |
1530 | break; | 1488 | break; |
@@ -1540,7 +1498,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1540 | 1498 | ||
1541 | if (ints[i].qtd->urb == urb) { | 1499 | if (ints[i].qtd->urb == urb) { |
1542 | u32 skip_map; | 1500 | u32 skip_map; |
1543 | u32 or_map; | ||
1544 | struct isp1760_qtd *qtd; | 1501 | struct isp1760_qtd *qtd; |
1545 | struct isp1760_qh *qh; | 1502 | struct isp1760_qh *qh; |
1546 | 1503 | ||
@@ -1548,10 +1505,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1548 | skip_map |= 1 << i; | 1505 | skip_map |= 1 << i; |
1549 | reg_write32(hcd->regs, skip_reg, skip_map); | 1506 | reg_write32(hcd->regs, skip_reg, skip_map); |
1550 | 1507 | ||
1551 | or_map = reg_read32(hcd->regs, or_reg); | ||
1552 | or_map &= ~(1 << i); | ||
1553 | reg_write32(hcd->regs, or_reg, or_map); | ||
1554 | |||
1555 | ptd_write(hcd->regs, reg_base, i, &ptd); | 1508 | ptd_write(hcd->regs, reg_base, i, &ptd); |
1556 | 1509 | ||
1557 | qtd = ints[i].qtd; | 1510 | qtd = ints[i].qtd; |