Commit eb1a7968 authored by Arvid Brodin's avatar Arvid Brodin Committed by Greg Kroah-Hartman

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: default avatarArvid Brodin <arvid.brodin@enea.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 34537731
...@@ -336,10 +336,6 @@ static void isp1760_init_regs(struct usb_hcd *hcd) ...@@ -336,10 +336,6 @@ static void isp1760_init_regs(struct usb_hcd *hcd)
reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
reg_write32(hcd->regs, HC_ATL_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
reg_write32(hcd->regs, HC_INT_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
reg_write32(hcd->regs, HC_ISO_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
} }
static int handshake(struct usb_hcd *hcd, u32 reg, static int handshake(struct usb_hcd *hcd, u32 reg,
...@@ -516,14 +512,17 @@ static void isp1760_init_maps(struct usb_hcd *hcd) ...@@ -516,14 +512,17 @@ static void isp1760_init_maps(struct usb_hcd *hcd)
reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000); reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000);
reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000); reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000);
reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001); reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001);
reg_write32(hcd->regs, HC_BUFFER_STATUS_REG,
ATL_BUF_FILL | INT_BUF_FILL);
} }
static void isp1760_enable_interrupts(struct usb_hcd *hcd) static void isp1760_enable_interrupts(struct usb_hcd *hcd)
{ {
reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0); reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0);
reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0); reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0xffffffff);
reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0); reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0);
reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0); reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0xffffffff);
reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0); reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0);
reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff); reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff);
/* step 23 passed */ /* step 23 passed */
...@@ -835,9 +834,8 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, ...@@ -835,9 +834,8 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
struct isp1760_qtd *qtd) struct isp1760_qtd *qtd)
{ {
struct isp1760_hcd *priv = hcd_to_priv(hcd); struct isp1760_hcd *priv = hcd_to_priv(hcd);
u32 skip_map, or_map; u32 skip_map;
u32 slot; u32 slot;
u32 buffstatus;
/* /*
* When this function is called from the interrupt handler to enqueue * 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,10 +852,6 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
enqueue_one_atl_qtd(hcd, qh, slot, qtd); enqueue_one_atl_qtd(hcd, qh, slot, qtd);
or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
or_map |= (1 << slot);
reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
skip_map &= ~(1 << slot); skip_map &= ~(1 << slot);
reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
...@@ -865,18 +859,13 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, ...@@ -865,18 +859,13 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
if (priv->atl_queued == 2) if (priv->atl_queued == 2)
reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
INTERRUPT_ENABLE_SOT_MASK); INTERRUPT_ENABLE_SOT_MASK);
buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG);
buffstatus |= ATL_BUFFER;
reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus);
} }
static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
struct isp1760_qtd *qtd) struct isp1760_qtd *qtd)
{ {
u32 skip_map, or_map; u32 skip_map;
u32 slot; u32 slot;
u32 buffstatus;
/* /*
* When this function is called from the interrupt handler to enqueue * 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,16 +882,8 @@ static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
enqueue_one_int_qtd(hcd, qh, slot, qtd); enqueue_one_int_qtd(hcd, qh, slot, qtd);
or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG);
or_map |= (1 << slot);
reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map);
skip_map &= ~(1 << slot); skip_map &= ~(1 << slot);
reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG);
buffstatus |= INT_BUFFER;
reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus);
} }
static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb) 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,7 +975,6 @@ static void do_atl_int(struct usb_hcd *hcd)
struct urb *urb; struct urb *urb;
u32 slot; u32 slot;
u32 length; u32 length;
u32 or_map;
u32 status = -EINVAL; u32 status = -EINVAL;
int error; int error;
struct isp1760_qtd *qtd; struct isp1760_qtd *qtd;
...@@ -1005,10 +985,6 @@ static void do_atl_int(struct usb_hcd *hcd) ...@@ -1005,10 +985,6 @@ static void do_atl_int(struct usb_hcd *hcd)
done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG); done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG);
skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
or_map &= ~done_map;
reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
while (done_map) { while (done_map) {
status = 0; status = 0;
priv->atl_queued--; priv->atl_queued--;
...@@ -1048,8 +1024,6 @@ static void do_atl_int(struct usb_hcd *hcd) ...@@ -1048,8 +1024,6 @@ static void do_atl_int(struct usb_hcd *hcd)
} }
if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) { if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) {
u32 buffstatus;
/* /*
* NAKs are handled in HW by the chip. Usually if the * NAKs are handled in HW by the chip. Usually if the
* device is not able to send data fast enough. * device is not able to send data fast enough.
...@@ -1068,9 +1042,6 @@ static void do_atl_int(struct usb_hcd *hcd) ...@@ -1068,9 +1042,6 @@ static void do_atl_int(struct usb_hcd *hcd)
* unskipped once it gets written to the HW. * unskipped once it gets written to the HW.
*/ */
skip_map &= ~(1 << slot); skip_map &= ~(1 << slot);
or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
or_map |= 1 << slot;
reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
ptd.dw0 |= PTD_VALID; ptd.dw0 |= PTD_VALID;
ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
...@@ -1079,12 +1050,6 @@ static void do_atl_int(struct usb_hcd *hcd) ...@@ -1079,12 +1050,6 @@ static void do_atl_int(struct usb_hcd *hcd)
if (priv->atl_queued == 2) if (priv->atl_queued == 2)
reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
INTERRUPT_ENABLE_SOT_MASK); INTERRUPT_ENABLE_SOT_MASK);
buffstatus = reg_read32(hcd->regs,
HC_BUFFER_STATUS_REG);
buffstatus |= ATL_BUFFER;
reg_write32(hcd->regs, HC_BUFFER_STATUS_REG,
buffstatus);
continue; continue;
} }
...@@ -1191,7 +1156,6 @@ static void do_intl_int(struct usb_hcd *hcd) ...@@ -1191,7 +1156,6 @@ static void do_intl_int(struct usb_hcd *hcd)
struct ptd ptd; struct ptd ptd;
struct urb *urb; struct urb *urb;
u32 length; u32 length;
u32 or_map;
int error; int error;
u32 slot; u32 slot;
struct isp1760_qtd *qtd; struct isp1760_qtd *qtd;
...@@ -1200,10 +1164,6 @@ static void do_intl_int(struct usb_hcd *hcd) ...@@ -1200,10 +1164,6 @@ static void do_intl_int(struct usb_hcd *hcd)
done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG); done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG);
skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG);
or_map &= ~done_map;
reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map);
while (done_map) { while (done_map) {
slot = __ffs(done_map); slot = __ffs(done_map);
done_map &= ~(1 << slot); done_map &= ~(1 << slot);
...@@ -1503,7 +1463,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ...@@ -1503,7 +1463,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
struct isp1760_hcd *priv = hcd_to_priv(hcd); struct isp1760_hcd *priv = hcd_to_priv(hcd);
struct inter_packet_info *ints; struct inter_packet_info *ints;
u32 i; u32 i;
u32 reg_base, or_reg, skip_reg; u32 reg_base, skip_reg;
unsigned long flags; unsigned long flags;
struct ptd ptd; struct ptd ptd;
packet_enqueue *pe; packet_enqueue *pe;
...@@ -1516,7 +1476,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ...@@ -1516,7 +1476,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
case PIPE_INTERRUPT: case PIPE_INTERRUPT:
ints = priv->int_ints; ints = priv->int_ints;
reg_base = INT_PTD_OFFSET; reg_base = INT_PTD_OFFSET;
or_reg = HC_INT_IRQ_MASK_OR_REG;
skip_reg = HC_INT_PTD_SKIPMAP_REG; skip_reg = HC_INT_PTD_SKIPMAP_REG;
pe = enqueue_an_INT_packet; pe = enqueue_an_INT_packet;
break; break;
...@@ -1524,7 +1483,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ...@@ -1524,7 +1483,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
default: default:
ints = priv->atl_ints; ints = priv->atl_ints;
reg_base = ATL_PTD_OFFSET; reg_base = ATL_PTD_OFFSET;
or_reg = HC_ATL_IRQ_MASK_OR_REG;
skip_reg = HC_ATL_PTD_SKIPMAP_REG; skip_reg = HC_ATL_PTD_SKIPMAP_REG;
pe = enqueue_an_ATL_packet; pe = enqueue_an_ATL_packet;
break; break;
...@@ -1540,7 +1498,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ...@@ -1540,7 +1498,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
if (ints[i].qtd->urb == urb) { if (ints[i].qtd->urb == urb) {
u32 skip_map; u32 skip_map;
u32 or_map;
struct isp1760_qtd *qtd; struct isp1760_qtd *qtd;
struct isp1760_qh *qh; struct isp1760_qh *qh;
...@@ -1548,10 +1505,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ...@@ -1548,10 +1505,6 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
skip_map |= 1 << i; skip_map |= 1 << i;
reg_write32(hcd->regs, skip_reg, skip_map); reg_write32(hcd->regs, skip_reg, skip_map);
or_map = reg_read32(hcd->regs, or_reg);
or_map &= ~(1 << i);
reg_write32(hcd->regs, or_reg, or_map);
ptd_write(hcd->regs, reg_base, i, &ptd); ptd_write(hcd->regs, reg_base, i, &ptd);
qtd = ints[i].qtd; qtd = ints[i].qtd;
......
...@@ -49,10 +49,9 @@ void deinit_kmem_cache(void); ...@@ -49,10 +49,9 @@ void deinit_kmem_cache(void);
#define SW_RESET_RESET_ALL (1 << 0) #define SW_RESET_RESET_ALL (1 << 0)
#define HC_BUFFER_STATUS_REG 0x334 #define HC_BUFFER_STATUS_REG 0x334
#define ATL_BUFFER 0x1 #define ISO_BUF_FILL (1 << 2)
#define INT_BUFFER 0x2 #define INT_BUF_FILL (1 << 1)
#define ISO_BUFFER 0x4 #define ATL_BUF_FILL (1 << 0)
#define BUFFER_MAP 0x7
#define HC_MEMORY_REG 0x33c #define HC_MEMORY_REG 0x33c
#define ISP_BANK(x) ((x) << 16) #define ISP_BANK(x) ((x) << 16)
...@@ -68,14 +67,13 @@ void deinit_kmem_cache(void); ...@@ -68,14 +67,13 @@ void deinit_kmem_cache(void);
#define HC_INTERRUPT_REG 0x310 #define HC_INTERRUPT_REG 0x310
#define HC_INTERRUPT_ENABLE 0x314 #define HC_INTERRUPT_ENABLE 0x314
#define INTERRUPT_ENABLE_MASK (HC_INTL_INT | HC_ATL_INT | HC_EOT_INT)
#define INTERRUPT_ENABLE_SOT_MASK (HC_INTL_INT | HC_SOT_INT | HC_EOT_INT)
#define HC_ISO_INT (1 << 9) #define HC_ISO_INT (1 << 9)
#define HC_ATL_INT (1 << 8) #define HC_ATL_INT (1 << 8)
#define HC_INTL_INT (1 << 7) #define HC_INTL_INT (1 << 7)
#define HC_EOT_INT (1 << 3) #define HC_EOT_INT (1 << 3)
#define HC_SOT_INT (1 << 1) #define HC_SOT_INT (1 << 1)
#define INTERRUPT_ENABLE_MASK (HC_INTL_INT | HC_ATL_INT)
#define INTERRUPT_ENABLE_SOT_MASK (HC_SOT_INT)
#define HC_ISO_IRQ_MASK_OR_REG 0x318 #define HC_ISO_IRQ_MASK_OR_REG 0x318
#define HC_INT_IRQ_MASK_OR_REG 0x31C #define HC_INT_IRQ_MASK_OR_REG 0x31C
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment