Skip to content

Commit

Permalink
usb/isp1760: Remove unneeded OR map and HcBufferStatus code
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Arvid Brodin authored and Greg Kroah-Hartman committed May 3, 2011
1 parent 3453773 commit eb1a796
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 62 deletions.
63 changes: 8 additions & 55 deletions drivers/usb/host/isp1760-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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_INT_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,
Expand Down Expand Up @@ -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_INT_PTD_LASTPTD_REG, 0x80000000);
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)
{
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_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_OR_REG, 0xffffffff);
/* step 23 passed */
Expand Down Expand Up @@ -835,9 +834,8 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
struct isp1760_qtd *qtd)
{
struct isp1760_hcd *priv = hcd_to_priv(hcd);
u32 skip_map, or_map;
u32 skip_map;
u32 slot;
u32 buffstatus;

/*
* When this function is called from the interrupt handler to enqueue
Expand All @@ -854,29 +852,20 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,

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);
reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);

priv->atl_queued++;
if (priv->atl_queued == 2)
reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
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,
struct isp1760_qtd *qtd)
{
u32 skip_map, or_map;
u32 skip_map;
u32 slot;
u32 buffstatus;

/*
* When this function is called from the interrupt handler to enqueue
Expand All @@ -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);

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);
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)
Expand Down Expand Up @@ -994,7 +975,6 @@ static void do_atl_int(struct usb_hcd *hcd)
struct urb *urb;
u32 slot;
u32 length;
u32 or_map;
u32 status = -EINVAL;
int error;
struct isp1760_qtd *qtd;
Expand All @@ -1005,10 +985,6 @@ static void do_atl_int(struct usb_hcd *hcd)
done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_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) {
status = 0;
priv->atl_queued--;
Expand Down Expand Up @@ -1048,8 +1024,6 @@ static void do_atl_int(struct usb_hcd *hcd)
}

if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) {
u32 buffstatus;

/*
* NAKs are handled in HW by the chip. Usually if the
* device is not able to send data fast enough.
Expand All @@ -1068,9 +1042,6 @@ static void do_atl_int(struct usb_hcd *hcd)
* unskipped once it gets written to the HW.
*/
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_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
Expand All @@ -1079,12 +1050,6 @@ static void do_atl_int(struct usb_hcd *hcd)
if (priv->atl_queued == 2)
reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
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;
}

Expand Down Expand Up @@ -1191,7 +1156,6 @@ static void do_intl_int(struct usb_hcd *hcd)
struct ptd ptd;
struct urb *urb;
u32 length;
u32 or_map;
int error;
u32 slot;
struct isp1760_qtd *qtd;
Expand All @@ -1200,10 +1164,6 @@ static void do_intl_int(struct usb_hcd *hcd)
done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_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) {
slot = __ffs(done_map);
done_map &= ~(1 << slot);
Expand Down Expand Up @@ -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 inter_packet_info *ints;
u32 i;
u32 reg_base, or_reg, skip_reg;
u32 reg_base, skip_reg;
unsigned long flags;
struct ptd ptd;
packet_enqueue *pe;
Expand All @@ -1516,15 +1476,13 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
case PIPE_INTERRUPT:
ints = priv->int_ints;
reg_base = INT_PTD_OFFSET;
or_reg = HC_INT_IRQ_MASK_OR_REG;
skip_reg = HC_INT_PTD_SKIPMAP_REG;
pe = enqueue_an_INT_packet;
break;

default:
ints = priv->atl_ints;
reg_base = ATL_PTD_OFFSET;
or_reg = HC_ATL_IRQ_MASK_OR_REG;
skip_reg = HC_ATL_PTD_SKIPMAP_REG;
pe = enqueue_an_ATL_packet;
break;
Expand All @@ -1540,18 +1498,13 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)

if (ints[i].qtd->urb == urb) {
u32 skip_map;
u32 or_map;
struct isp1760_qtd *qtd;
struct isp1760_qh *qh;

skip_map = reg_read32(hcd->regs, skip_reg);
skip_map |= 1 << i;
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);

qtd = ints[i].qtd;
Expand Down
12 changes: 5 additions & 7 deletions drivers/usb/host/isp1760-hcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,9 @@ void deinit_kmem_cache(void);
#define SW_RESET_RESET_ALL (1 << 0)

#define HC_BUFFER_STATUS_REG 0x334
#define ATL_BUFFER 0x1
#define INT_BUFFER 0x2
#define ISO_BUFFER 0x4
#define BUFFER_MAP 0x7
#define ISO_BUF_FILL (1 << 2)
#define INT_BUF_FILL (1 << 1)
#define ATL_BUF_FILL (1 << 0)

#define HC_MEMORY_REG 0x33c
#define ISP_BANK(x) ((x) << 16)
Expand All @@ -68,14 +67,13 @@ void deinit_kmem_cache(void);
#define HC_INTERRUPT_REG 0x310

#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_ATL_INT (1 << 8)
#define HC_INTL_INT (1 << 7)
#define HC_EOT_INT (1 << 3)
#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_INT_IRQ_MASK_OR_REG 0x31C
Expand Down

0 comments on commit eb1a796

Please sign in to comment.