Commit 6068e818 authored by Aaro Koskinen's avatar Aaro Koskinen Committed by Greg Kroah-Hartman

staging: octeon-usb: assume union type for FIELD32 macros

Assume union type for FIELD32 macros to simplify usage.
Signed-off-by: default avatarAaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9a02e8d2
...@@ -394,12 +394,13 @@ struct octeon_hcd { ...@@ -394,12 +394,13 @@ struct octeon_hcd {
}; };
/* This macro spins on a field waiting for it to reach a value */ /* This macro spins on a field waiting for it to reach a value */
#define CVMX_WAIT_FOR_FIELD32(address, type, field, op, value, timeout_usec)\ #define CVMX_WAIT_FOR_FIELD32(address, _union, field, op, value, timeout_usec)\
({int result; \ ({int result; \
do { \ do { \
uint64_t done = cvmx_get_cycle() + (uint64_t)timeout_usec * \ uint64_t done = cvmx_get_cycle() + (uint64_t)timeout_usec * \
octeon_get_clock_rate() / 1000000; \ octeon_get_clock_rate() / 1000000; \
type c; \ union _union c; \
\
while (1) { \ while (1) { \
c.u32 = cvmx_usb_read_csr32(usb, address); \ c.u32 = cvmx_usb_read_csr32(usb, address); \
if (c.s.field op (value)) { \ if (c.s.field op (value)) { \
...@@ -418,9 +419,10 @@ struct octeon_hcd { ...@@ -418,9 +419,10 @@ struct octeon_hcd {
* This macro logically sets a single field in a CSR. It does the sequence * This macro logically sets a single field in a CSR. It does the sequence
* read, modify, and write * read, modify, and write
*/ */
#define USB_SET_FIELD32(address, type, field, value) \ #define USB_SET_FIELD32(address, _union, field, value) \
do { \ do { \
type c; \ union _union c; \
\
c.u32 = cvmx_usb_read_csr32(usb, address); \ c.u32 = cvmx_usb_read_csr32(usb, address); \
c.s.field = value; \ c.s.field = value; \
cvmx_usb_write_csr32(usb, address, c.u32); \ cvmx_usb_write_csr32(usb, address, c.u32); \
...@@ -621,9 +623,8 @@ static void cvmx_fifo_setup(struct cvmx_usb_state *usb) ...@@ -621,9 +623,8 @@ static void cvmx_fifo_setup(struct cvmx_usb_state *usb)
* Program the USBC_GRXFSIZ register to select the size of the receive * Program the USBC_GRXFSIZ register to select the size of the receive
* FIFO (25%). * FIFO (25%).
*/ */
USB_SET_FIELD32(CVMX_USBCX_GRXFSIZ(usb->index), USB_SET_FIELD32(CVMX_USBCX_GRXFSIZ(usb->index), cvmx_usbcx_grxfsiz,
union cvmx_usbcx_grxfsiz, rxfdep, rxfdep, usbcx_ghwcfg3.s.dfifodepth / 4);
usbcx_ghwcfg3.s.dfifodepth / 4);
/* /*
* Program the USBC_GNPTXFSIZ register to select the size and the start * Program the USBC_GNPTXFSIZ register to select the size and the start
...@@ -647,17 +648,15 @@ static void cvmx_fifo_setup(struct cvmx_usb_state *usb) ...@@ -647,17 +648,15 @@ static void cvmx_fifo_setup(struct cvmx_usb_state *usb)
/* Flush all FIFOs */ /* Flush all FIFOs */
USB_SET_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), USB_SET_FIELD32(CVMX_USBCX_GRSTCTL(usb->index),
union cvmx_usbcx_grstctl, txfnum, 0x10); cvmx_usbcx_grstctl, txfnum, 0x10);
USB_SET_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), USB_SET_FIELD32(CVMX_USBCX_GRSTCTL(usb->index),
union cvmx_usbcx_grstctl, txfflsh, 1); cvmx_usbcx_grstctl, txfflsh, 1);
CVMX_WAIT_FOR_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), CVMX_WAIT_FOR_FIELD32(CVMX_USBCX_GRSTCTL(usb->index),
union cvmx_usbcx_grstctl, cvmx_usbcx_grstctl, txfflsh, ==, 0, 100);
txfflsh, ==, 0, 100);
USB_SET_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), USB_SET_FIELD32(CVMX_USBCX_GRSTCTL(usb->index),
union cvmx_usbcx_grstctl, rxfflsh, 1); cvmx_usbcx_grstctl, rxfflsh, 1);
CVMX_WAIT_FOR_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), CVMX_WAIT_FOR_FIELD32(CVMX_USBCX_GRSTCTL(usb->index),
union cvmx_usbcx_grstctl, cvmx_usbcx_grstctl, rxfflsh, ==, 0, 100);
rxfflsh, ==, 0, 100);
} }
/** /**
...@@ -926,9 +925,9 @@ static int cvmx_usb_initialize(struct device *dev, ...@@ -926,9 +925,9 @@ static int cvmx_usb_initialize(struct device *dev,
* USBC_GINTMSK[PRTINT] = 1 * USBC_GINTMSK[PRTINT] = 1
*/ */
USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index), USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index),
union cvmx_usbcx_gintmsk, prtintmsk, 1); cvmx_usbcx_gintmsk, prtintmsk, 1);
USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index), USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index),
union cvmx_usbcx_gintmsk, disconnintmsk, 1); cvmx_usbcx_gintmsk, disconnintmsk, 1);
/* /*
* 2. Program the USBC_HCFG register to select full-speed host * 2. Program the USBC_HCFG register to select full-speed host
...@@ -975,7 +974,7 @@ static void cvmx_usb_reset_port(struct cvmx_usb_state *usb) ...@@ -975,7 +974,7 @@ static void cvmx_usb_reset_port(struct cvmx_usb_state *usb)
CVMX_USBCX_HPRT(usb->index)); CVMX_USBCX_HPRT(usb->index));
/* Program the port reset bit to start the reset process */ /* Program the port reset bit to start the reset process */
USB_SET_FIELD32(CVMX_USBCX_HPRT(usb->index), union cvmx_usbcx_hprt, USB_SET_FIELD32(CVMX_USBCX_HPRT(usb->index), cvmx_usbcx_hprt,
prtrst, 1); prtrst, 1);
/* /*
...@@ -985,7 +984,7 @@ static void cvmx_usb_reset_port(struct cvmx_usb_state *usb) ...@@ -985,7 +984,7 @@ static void cvmx_usb_reset_port(struct cvmx_usb_state *usb)
mdelay(50); mdelay(50);
/* Program the port reset bit to 0, USBC_HPRT[PRTRST] = 0 */ /* Program the port reset bit to 0, USBC_HPRT[PRTRST] = 0 */
USB_SET_FIELD32(CVMX_USBCX_HPRT(usb->index), union cvmx_usbcx_hprt, USB_SET_FIELD32(CVMX_USBCX_HPRT(usb->index), cvmx_usbcx_hprt,
prtrst, 0); prtrst, 0);
/* /*
...@@ -1010,7 +1009,7 @@ static void cvmx_usb_reset_port(struct cvmx_usb_state *usb) ...@@ -1010,7 +1009,7 @@ static void cvmx_usb_reset_port(struct cvmx_usb_state *usb)
static int cvmx_usb_disable(struct cvmx_usb_state *usb) static int cvmx_usb_disable(struct cvmx_usb_state *usb)
{ {
/* Disable the port */ /* Disable the port */
USB_SET_FIELD32(CVMX_USBCX_HPRT(usb->index), union cvmx_usbcx_hprt, USB_SET_FIELD32(CVMX_USBCX_HPRT(usb->index), cvmx_usbcx_hprt,
prtena, 1); prtena, 1);
return 0; return 0;
} }
...@@ -1285,12 +1284,10 @@ static void cvmx_usb_poll_tx_fifo(struct cvmx_usb_state *usb) ...@@ -1285,12 +1284,10 @@ static void cvmx_usb_poll_tx_fifo(struct cvmx_usb_state *usb)
if (cvmx_usb_fill_tx_hw(usb, &usb->periodic, if (cvmx_usb_fill_tx_hw(usb, &usb->periodic,
tx_status.s.ptxfspcavail)) tx_status.s.ptxfspcavail))
USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index), USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index),
union cvmx_usbcx_gintmsk, cvmx_usbcx_gintmsk, ptxfempmsk, 1);
ptxfempmsk, 1);
else else
USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index), USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index),
union cvmx_usbcx_gintmsk, cvmx_usbcx_gintmsk, ptxfempmsk, 0);
ptxfempmsk, 0);
} }
if (usb->nonperiodic.head != usb->nonperiodic.tail) { if (usb->nonperiodic.head != usb->nonperiodic.tail) {
...@@ -1301,12 +1298,10 @@ static void cvmx_usb_poll_tx_fifo(struct cvmx_usb_state *usb) ...@@ -1301,12 +1298,10 @@ static void cvmx_usb_poll_tx_fifo(struct cvmx_usb_state *usb)
if (cvmx_usb_fill_tx_hw(usb, &usb->nonperiodic, if (cvmx_usb_fill_tx_hw(usb, &usb->nonperiodic,
tx_status.s.nptxfspcavail)) tx_status.s.nptxfspcavail))
USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index), USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index),
union cvmx_usbcx_gintmsk, cvmx_usbcx_gintmsk, nptxfempmsk, 1);
nptxfempmsk, 1);
else else
USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index), USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index),
union cvmx_usbcx_gintmsk, cvmx_usbcx_gintmsk, nptxfempmsk, 0);
nptxfempmsk, 0);
} }
} }
...@@ -1401,7 +1396,7 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb, ...@@ -1401,7 +1396,7 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb,
bytes_to_transfer = sizeof(*header); bytes_to_transfer = sizeof(*header);
/* All Control operations start with a setup going OUT */ /* All Control operations start with a setup going OUT */
USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index),
union cvmx_usbcx_hccharx, epdir, cvmx_usbcx_hccharx, epdir,
CVMX_USB_DIRECTION_OUT); CVMX_USB_DIRECTION_OUT);
/* /*
* Setup send the control header instead of the buffer data. The * Setup send the control header instead of the buffer data. The
...@@ -1416,11 +1411,11 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb, ...@@ -1416,11 +1411,11 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb,
bytes_to_transfer = 0; bytes_to_transfer = 0;
/* All Control operations start with a setup going OUT */ /* All Control operations start with a setup going OUT */
USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index),
union cvmx_usbcx_hccharx, epdir, cvmx_usbcx_hccharx, epdir,
CVMX_USB_DIRECTION_OUT); CVMX_USB_DIRECTION_OUT);
USB_SET_FIELD32(CVMX_USBCX_HCSPLTX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCSPLTX(channel, usb->index),
union cvmx_usbcx_hcspltx, compsplt, 1); cvmx_usbcx_hcspltx, compsplt, 1);
break; break;
case CVMX_USB_STAGE_DATA: case CVMX_USB_STAGE_DATA:
usbc_hctsiz.s.pid = cvmx_usb_get_data_pid(pipe); usbc_hctsiz.s.pid = cvmx_usb_get_data_pid(pipe);
...@@ -1431,7 +1426,7 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb, ...@@ -1431,7 +1426,7 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb,
bytes_to_transfer = pipe->max_packet; bytes_to_transfer = pipe->max_packet;
} }
USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index),
union cvmx_usbcx_hccharx, epdir, cvmx_usbcx_hccharx, epdir,
((header->bRequestType & USB_DIR_IN) ? ((header->bRequestType & USB_DIR_IN) ?
CVMX_USB_DIRECTION_IN : CVMX_USB_DIRECTION_IN :
CVMX_USB_DIRECTION_OUT)); CVMX_USB_DIRECTION_OUT));
...@@ -1441,18 +1436,18 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb, ...@@ -1441,18 +1436,18 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb,
if (!(header->bRequestType & USB_DIR_IN)) if (!(header->bRequestType & USB_DIR_IN))
bytes_to_transfer = 0; bytes_to_transfer = 0;
USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index),
union cvmx_usbcx_hccharx, epdir, cvmx_usbcx_hccharx, epdir,
((header->bRequestType & USB_DIR_IN) ? ((header->bRequestType & USB_DIR_IN) ?
CVMX_USB_DIRECTION_IN : CVMX_USB_DIRECTION_IN :
CVMX_USB_DIRECTION_OUT)); CVMX_USB_DIRECTION_OUT));
USB_SET_FIELD32(CVMX_USBCX_HCSPLTX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCSPLTX(channel, usb->index),
union cvmx_usbcx_hcspltx, compsplt, 1); cvmx_usbcx_hcspltx, compsplt, 1);
break; break;
case CVMX_USB_STAGE_STATUS: case CVMX_USB_STAGE_STATUS:
usbc_hctsiz.s.pid = cvmx_usb_get_data_pid(pipe); usbc_hctsiz.s.pid = cvmx_usb_get_data_pid(pipe);
bytes_to_transfer = 0; bytes_to_transfer = 0;
USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index),
union cvmx_usbcx_hccharx, epdir, cvmx_usbcx_hccharx, epdir,
((header->bRequestType & USB_DIR_IN) ? ((header->bRequestType & USB_DIR_IN) ?
CVMX_USB_DIRECTION_OUT : CVMX_USB_DIRECTION_OUT :
CVMX_USB_DIRECTION_IN)); CVMX_USB_DIRECTION_IN));
...@@ -1461,12 +1456,12 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb, ...@@ -1461,12 +1456,12 @@ static void cvmx_usb_start_channel_control(struct cvmx_usb_state *usb,
usbc_hctsiz.s.pid = cvmx_usb_get_data_pid(pipe); usbc_hctsiz.s.pid = cvmx_usb_get_data_pid(pipe);
bytes_to_transfer = 0; bytes_to_transfer = 0;
USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index),
union cvmx_usbcx_hccharx, epdir, cvmx_usbcx_hccharx, epdir,
((header->bRequestType & USB_DIR_IN) ? ((header->bRequestType & USB_DIR_IN) ?
CVMX_USB_DIRECTION_OUT : CVMX_USB_DIRECTION_OUT :
CVMX_USB_DIRECTION_IN)); CVMX_USB_DIRECTION_IN));
USB_SET_FIELD32(CVMX_USBCX_HCSPLTX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCSPLTX(channel, usb->index),
union cvmx_usbcx_hcspltx, compsplt, 1); cvmx_usbcx_hcspltx, compsplt, 1);
break; break;
} }
...@@ -1830,14 +1825,12 @@ static void cvmx_usb_start_channel(struct cvmx_usb_state *usb, int channel, ...@@ -1830,14 +1825,12 @@ static void cvmx_usb_start_channel(struct cvmx_usb_state *usb, int channel,
USB_SET_FIELD32( USB_SET_FIELD32(
CVMX_USBCX_HCTSIZX(channel, CVMX_USBCX_HCTSIZX(channel,
usb->index), usb->index),
union cvmx_usbcx_hctsizx, cvmx_usbcx_hctsizx, pid, 0);
pid, 0);
else /* Need MDATA */ else /* Need MDATA */
USB_SET_FIELD32( USB_SET_FIELD32(
CVMX_USBCX_HCTSIZX(channel, CVMX_USBCX_HCTSIZX(channel,
usb->index), usb->index),
union cvmx_usbcx_hctsizx, cvmx_usbcx_hctsizx, pid, 3);
pid, 3);
} }
} }
break; break;
...@@ -1853,7 +1846,7 @@ static void cvmx_usb_start_channel(struct cvmx_usb_state *usb, int channel, ...@@ -1853,7 +1846,7 @@ static void cvmx_usb_start_channel(struct cvmx_usb_state *usb, int channel,
if (cvmx_usb_pipe_needs_split(usb, pipe)) if (cvmx_usb_pipe_needs_split(usb, pipe))
usb->active_split = transaction; usb->active_split = transaction;
USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index), USB_SET_FIELD32(CVMX_USBCX_HCCHARX(channel, usb->index),
union cvmx_usbcx_hccharx, chena, 1); cvmx_usbcx_hccharx, chena, 1);
if (usb->init_flags & CVMX_USB_INITIALIZE_FLAGS_NO_DMA) if (usb->init_flags & CVMX_USB_INITIALIZE_FLAGS_NO_DMA)
cvmx_usb_fill_tx_fifo(usb, channel); cvmx_usb_fill_tx_fifo(usb, channel);
} }
...@@ -1983,7 +1976,7 @@ static void cvmx_usb_schedule(struct cvmx_usb_state *usb, int is_sof) ...@@ -1983,7 +1976,7 @@ static void cvmx_usb_schedule(struct cvmx_usb_state *usb, int is_sof)
} }
} }
USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index), USB_SET_FIELD32(CVMX_USBCX_GINTMSK(usb->index),
union cvmx_usbcx_gintmsk, sofmsk, need_sof); cvmx_usbcx_gintmsk, sofmsk, need_sof);
} }
static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb, static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb,
...@@ -3527,7 +3520,7 @@ static int octeon_usb_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -3527,7 +3520,7 @@ static int octeon_usb_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
*/ */
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
USB_SET_FIELD32(CVMX_USBCX_HPRT(usb->index), USB_SET_FIELD32(CVMX_USBCX_HPRT(usb->index),
union cvmx_usbcx_hprt, prtpwr, 1); cvmx_usbcx_hprt, prtpwr, 1);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
return 0; return 0;
case USB_PORT_FEAT_RESET: case USB_PORT_FEAT_RESET:
......
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