]> Pileus Git - ~andy/linux/commitdiff
usb: gadget: ci13xxx: rename register layouts
authorAlexander Shishkin <alexander.shishkin@linux.intel.com>
Fri, 4 May 2012 13:47:16 +0000 (16:47 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 May 2012 16:27:57 +0000 (09:27 -0700)
Currently, the register prefixes in the driver seem to be mixed: the
capability registers are the ones that contain capability information,
such as number of hardware endpoints, while the registers that are
used to program the controller are called operational registers.

Normally, capability registers start at 0x100 offset of the register
window and are followed by operational registers. In some versions,
however, capability registers start at 0x0 offset.

This patch renames the register and adjusts their offsets appropriately,
leaving the possibility of having a non-standard capability offset.

I couldn't find any mentions of the TESTMODE register anywhere, so I
suspect it might only be enabled in chipidea internal versions of the
controller and I'm really inclined to remove it from the driver or at
least hiding it behind a config option.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/ci13xxx_msm.c
drivers/usb/gadget/ci13xxx_pci.c
drivers/usb/gadget/ci13xxx_udc.c
drivers/usb/gadget/ci13xxx_udc.h

index d07e44c05e9b3c035ca6a254c13bcdc2a51aa24f..6e77446ef52a4ac6377a4849e386b9fb12569eb1 100644 (file)
@@ -79,7 +79,8 @@ static int ci13xxx_msm_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
-       ret = udc_probe(&ci13xxx_msm_udc_driver, &pdev->dev, regs);
+       ret = udc_probe(&ci13xxx_msm_udc_driver, &pdev->dev, regs,
+                       DEF_CAPOFFSET);
        if (ret < 0) {
                dev_err(&pdev->dev, "udc_probe failed\n");
                goto iounmap;
index 63ef96c04bb7d77ea278707dfd56a229cb1cf1b9..c890e1c5effcb0df1a8f6ee44a54bc3abb718f6e 100644 (file)
@@ -55,6 +55,7 @@ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev,
                                       const struct pci_device_id *id)
 {
        void __iomem *regs = NULL;
+       uintptr_t capoffset = DEF_CAPOFFSET;
        int retval = 0;
 
        if (id == NULL)
@@ -86,7 +87,11 @@ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev,
        pci_set_master(pdev);
        pci_try_set_mwi(pdev);
 
-       retval = udc_probe(&ci13xxx_pci_udc_driver, &pdev->dev, regs);
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL)
+               capoffset = 0;
+
+       retval = udc_probe(&ci13xxx_pci_udc_driver, &pdev->dev, regs,
+                          capoffset);
        if (retval)
                goto iounmap;
 
index b44c83d90c0e60ca75801ee3208b07e61fdc46b3..3a453393735c0e9f16594e0cb322a24b2a77f52a 100644 (file)
@@ -138,7 +138,8 @@ static int ffs_nr(u32 x)
 static struct {
        unsigned      lpm;    /* is LPM? */
        void __iomem *abs;    /* bus map offset */
-       void __iomem *cap;    /* bus map offset + CAP offset + CAP data */
+       void __iomem *cap;    /* bus map offset + CAP offset */
+       void __iomem *op;     /* bus map offset + OP offset */
        size_t        size;   /* bank size */
 } hw_bank;
 
@@ -146,26 +147,26 @@ static struct {
 #define ABS_AHBBURST        (0x0090UL)
 #define ABS_AHBMODE         (0x0098UL)
 /* UDC register map */
-#define ABS_CAPLENGTH       (0x100UL)
-#define ABS_HCCPARAMS       (0x108UL)
-#define ABS_DCCPARAMS       (0x124UL)
+#define CAP_CAPLENGTH      (0x000UL)
+#define CAP_HCCPARAMS      (0x008UL)
+#define CAP_DCCPARAMS      (0x024UL)
 #define ABS_TESTMODE        (hw_bank.lpm ? 0x0FCUL : 0x138UL)
 /* offset to CAPLENTGH (addr + data) */
-#define CAP_USBCMD          (0x000UL)
-#define CAP_USBSTS          (0x004UL)
-#define CAP_USBINTR         (0x008UL)
-#define CAP_DEVICEADDR      (0x014UL)
-#define CAP_ENDPTLISTADDR   (0x018UL)
-#define CAP_PORTSC          (0x044UL)
-#define CAP_DEVLC           (0x084UL)
-#define CAP_USBMODE         (hw_bank.lpm ? 0x0C8UL : 0x068UL)
-#define CAP_ENDPTSETUPSTAT  (hw_bank.lpm ? 0x0D8UL : 0x06CUL)
-#define CAP_ENDPTPRIME      (hw_bank.lpm ? 0x0DCUL : 0x070UL)
-#define CAP_ENDPTFLUSH      (hw_bank.lpm ? 0x0E0UL : 0x074UL)
-#define CAP_ENDPTSTAT       (hw_bank.lpm ? 0x0E4UL : 0x078UL)
-#define CAP_ENDPTCOMPLETE   (hw_bank.lpm ? 0x0E8UL : 0x07CUL)
-#define CAP_ENDPTCTRL       (hw_bank.lpm ? 0x0ECUL : 0x080UL)
-#define CAP_LAST            (hw_bank.lpm ? 0x12CUL : 0x0C0UL)
+#define OP_USBCMD          (0x000UL)
+#define OP_USBSTS          (0x004UL)
+#define OP_USBINTR         (0x008UL)
+#define OP_DEVICEADDR      (0x014UL)
+#define OP_ENDPTLISTADDR    (0x018UL)
+#define OP_PORTSC          (0x044UL)
+#define OP_DEVLC           (0x084UL)
+#define OP_USBMODE         (hw_bank.lpm ? 0x0C8UL : 0x068UL)
+#define OP_ENDPTSETUPSTAT   (hw_bank.lpm ? 0x0D8UL : 0x06CUL)
+#define OP_ENDPTPRIME      (hw_bank.lpm ? 0x0DCUL : 0x070UL)
+#define OP_ENDPTFLUSH      (hw_bank.lpm ? 0x0E0UL : 0x074UL)
+#define OP_ENDPTSTAT       (hw_bank.lpm ? 0x0E4UL : 0x078UL)
+#define OP_ENDPTCOMPLETE    (hw_bank.lpm ? 0x0E8UL : 0x07CUL)
+#define OP_ENDPTCTRL       (hw_bank.lpm ? 0x0ECUL : 0x080UL)
+#define OP_LAST                    (hw_bank.lpm ? 0x12CUL : 0x0C0UL)
 
 /* maximum number of enpoints: valid only after hw_device_reset() */
 static unsigned hw_ep_max;
@@ -193,85 +194,65 @@ static int ep_to_bit(int n)
 }
 
 /**
- * hw_aread: reads from register bitfield
- * @addr: address relative to bus map
+ * hw_read: reads from a register bitfield
+ * @base: register block address
+ * @addr: address relative to operational  register base
  * @mask: bitfield mask
  *
  * This function returns register bitfield data
  */
-static u32 hw_aread(u32 addr, u32 mask)
+static u32 hw_read(void __iomem *base, u32 addr, u32 mask)
 {
-       return ioread32(addr + hw_bank.abs) & mask;
+       return ioread32(addr + base) & mask;
 }
 
 /**
- * hw_awrite: writes to register bitfield
- * @addr: address relative to bus map
+ * hw_write: writes to a register bitfield
+ * @base: register block address
+ * @addr: address relative to operational register base
  * @mask: bitfield mask
  * @data: new data
  */
-static void hw_awrite(u32 addr, u32 mask, u32 data)
+static void hw_write(void __iomem *base, u32 addr, u32 mask, u32 data)
 {
-       iowrite32(hw_aread(addr, ~mask) | (data & mask),
-                 addr + hw_bank.abs);
+       iowrite32(hw_read(base, addr, ~mask) | (data & mask),
+                 addr + base);
 }
 
 /**
- * hw_cread: reads from register bitfield
- * @addr: address relative to CAP offset plus content
+ * hw_test_and_clear: tests & clears operational register bitfield
+ * @base: register block address
+ * @addr: address relative to operational register base
  * @mask: bitfield mask
  *
  * This function returns register bitfield data
  */
-static u32 hw_cread(u32 addr, u32 mask)
+static u32 hw_test_and_clear(void __iomem *base, u32 addr, u32 mask)
 {
-       return ioread32(addr + hw_bank.cap) & mask;
-}
-
-/**
- * hw_cwrite: writes to register bitfield
- * @addr: address relative to CAP offset plus content
- * @mask: bitfield mask
- * @data: new data
- */
-static void hw_cwrite(u32 addr, u32 mask, u32 data)
-{
-       iowrite32(hw_cread(addr, ~mask) | (data & mask),
-                 addr + hw_bank.cap);
-}
-
-/**
- * hw_ctest_and_clear: tests & clears register bitfield
- * @addr: address relative to CAP offset plus content
- * @mask: bitfield mask
- *
- * This function returns register bitfield data
- */
-static u32 hw_ctest_and_clear(u32 addr, u32 mask)
-{
-       u32 reg = hw_cread(addr, mask);
+       u32 reg = hw_read(base, addr, mask);
 
-       iowrite32(reg, addr + hw_bank.cap);
+       iowrite32(reg, addr + base);
        return reg;
 }
 
 /**
- * hw_ctest_and_write: tests & writes register bitfield
- * @addr: address relative to CAP offset plus content
+ * hw_test_and_write: tests & writes operational register bitfield
+ * @base: register block address
+ * @addr: address relative to operational register base
  * @mask: bitfield mask
  * @data: new data
  *
  * This function returns register bitfield data
  */
-static u32 hw_ctest_and_write(u32 addr, u32 mask, u32 data)
+static u32 hw_test_and_write(void __iomem *base, u32 addr, u32 mask, u32 data)
 {
-       u32 reg = hw_cread(addr, ~0);
+       u32 reg = hw_read(base, addr, ~0);
 
-       iowrite32((reg & ~mask) | (data & mask), addr + hw_bank.cap);
+       iowrite32((reg & ~mask) | (data & mask), addr + base);
        return (reg & mask) >> ffs_nr(mask);
 }
 
-static int hw_device_init(void __iomem *base)
+static int hw_device_init(void __iomem *base, uintptr_t cap_offset)
 {
        u32 reg;
 
@@ -279,16 +260,18 @@ static int hw_device_init(void __iomem *base)
        hw_bank.abs = base;
 
        hw_bank.cap = hw_bank.abs;
-       hw_bank.cap += ABS_CAPLENGTH;
-       hw_bank.cap += ioread8(hw_bank.cap);
+       hw_bank.cap += cap_offset;
+       hw_bank.op = hw_bank.cap + ioread8(hw_bank.cap);
 
-       reg = hw_aread(ABS_HCCPARAMS, HCCPARAMS_LEN) >> ffs_nr(HCCPARAMS_LEN);
+       reg = hw_read(hw_bank.cap, CAP_HCCPARAMS, HCCPARAMS_LEN) >>
+               ffs_nr(HCCPARAMS_LEN);
        hw_bank.lpm  = reg;
-       hw_bank.size = hw_bank.cap - hw_bank.abs;
-       hw_bank.size += CAP_LAST;
+       hw_bank.size = hw_bank.op - hw_bank.abs;
+       hw_bank.size += OP_LAST;
        hw_bank.size /= sizeof(u32);
 
-       reg = hw_aread(ABS_DCCPARAMS, DCCPARAMS_DEN) >> ffs_nr(DCCPARAMS_DEN);
+       reg = hw_read(hw_bank.cap, CAP_DCCPARAMS, DCCPARAMS_DEN) >>
+               ffs_nr(DCCPARAMS_DEN);
        hw_ep_max = reg * 2;   /* cache hw ENDPT_MAX */
 
        if (hw_ep_max == 0 || hw_ep_max > ENDPT_MAX)
@@ -311,11 +294,11 @@ static int hw_device_init(void __iomem *base)
 static int hw_device_reset(struct ci13xxx *udc)
 {
        /* should flush & stop before reset */
-       hw_cwrite(CAP_ENDPTFLUSH, ~0, ~0);
-       hw_cwrite(CAP_USBCMD, USBCMD_RS, 0);
+       hw_write(hw_bank.op, OP_ENDPTFLUSH, ~0, ~0);
+       hw_write(hw_bank.op, OP_USBCMD, USBCMD_RS, 0);
 
-       hw_cwrite(CAP_USBCMD, USBCMD_RST, USBCMD_RST);
-       while (hw_cread(CAP_USBCMD, USBCMD_RST))
+       hw_write(hw_bank.op, OP_USBCMD, USBCMD_RST, USBCMD_RST);
+       while (hw_read(hw_bank.op, OP_USBCMD, USBCMD_RST))
                udelay(10);             /* not RTOS friendly */
 
 
@@ -324,14 +307,15 @@ static int hw_device_reset(struct ci13xxx *udc)
                        CI13XXX_CONTROLLER_RESET_EVENT);
 
        if (udc->udc_driver->flags & CI13XXX_DISABLE_STREAMING)
-               hw_cwrite(CAP_USBMODE, USBMODE_SDIS, USBMODE_SDIS);
+               hw_write(hw_bank.op, OP_USBMODE, USBMODE_SDIS, USBMODE_SDIS);
 
        /* USBMODE should be configured step by step */
-       hw_cwrite(CAP_USBMODE, USBMODE_CM, USBMODE_CM_IDLE);
-       hw_cwrite(CAP_USBMODE, USBMODE_CM, USBMODE_CM_DEVICE);
-       hw_cwrite(CAP_USBMODE, USBMODE_SLOM, USBMODE_SLOM);  /* HW >= 2.3 */
+       hw_write(hw_bank.op, OP_USBMODE, USBMODE_CM, USBMODE_CM_IDLE);
+       hw_write(hw_bank.op, OP_USBMODE, USBMODE_CM, USBMODE_CM_DEVICE);
+       /* HW >= 2.3 */
+       hw_write(hw_bank.op, OP_USBMODE, USBMODE_SLOM, USBMODE_SLOM);
 
-       if (hw_cread(CAP_USBMODE, USBMODE_CM) != USBMODE_CM_DEVICE) {
+       if (hw_read(hw_bank.op, OP_USBMODE, USBMODE_CM) != USBMODE_CM_DEVICE) {
                pr_err("cannot enter in device mode");
                pr_err("lpm = %i", hw_bank.lpm);
                return -ENODEV;
@@ -350,14 +334,14 @@ static int hw_device_reset(struct ci13xxx *udc)
 static int hw_device_state(u32 dma)
 {
        if (dma) {
-               hw_cwrite(CAP_ENDPTLISTADDR, ~0, dma);
+               hw_write(hw_bank.op, OP_ENDPTLISTADDR, ~0, dma);
                /* interrupt, error, port change, reset, sleep/suspend */
-               hw_cwrite(CAP_USBINTR, ~0,
+               hw_write(hw_bank.op, OP_USBINTR, ~0,
                             USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI);
-               hw_cwrite(CAP_USBCMD, USBCMD_RS, USBCMD_RS);
+               hw_write(hw_bank.op, OP_USBCMD, USBCMD_RS, USBCMD_RS);
        } else {
-               hw_cwrite(CAP_USBCMD, USBCMD_RS, 0);
-               hw_cwrite(CAP_USBINTR, ~0, 0);
+               hw_write(hw_bank.op, OP_USBCMD, USBCMD_RS, 0);
+               hw_write(hw_bank.op, OP_USBINTR, ~0, 0);
        }
        return 0;
 }
@@ -375,10 +359,10 @@ static int hw_ep_flush(int num, int dir)
 
        do {
                /* flush any pending transfer */
-               hw_cwrite(CAP_ENDPTFLUSH, BIT(n), BIT(n));
-               while (hw_cread(CAP_ENDPTFLUSH, BIT(n)))
+               hw_write(hw_bank.op, OP_ENDPTFLUSH, BIT(n), BIT(n));
+               while (hw_read(hw_bank.op, OP_ENDPTFLUSH, BIT(n)))
                        cpu_relax();
-       } while (hw_cread(CAP_ENDPTSTAT, BIT(n)));
+       } while (hw_read(hw_bank.op, OP_ENDPTSTAT, BIT(n)));
 
        return 0;
 }
@@ -393,7 +377,7 @@ static int hw_ep_flush(int num, int dir)
 static int hw_ep_disable(int num, int dir)
 {
        hw_ep_flush(num, dir);
-       hw_cwrite(CAP_ENDPTCTRL + num * sizeof(u32),
+       hw_write(hw_bank.op, OP_ENDPTCTRL + num * sizeof(u32),
                  dir ? ENDPTCTRL_TXE : ENDPTCTRL_RXE, 0);
        return 0;
 }
@@ -429,7 +413,7 @@ static int hw_ep_enable(int num, int dir, int type)
                mask |= ENDPTCTRL_RXE;  /* enable  */
                data |= ENDPTCTRL_RXE;
        }
-       hw_cwrite(CAP_ENDPTCTRL + num * sizeof(u32), mask, data);
+       hw_write(hw_bank.op, OP_ENDPTCTRL + num * sizeof(u32), mask, data);
        return 0;
 }
 
@@ -444,7 +428,7 @@ static int hw_ep_get_halt(int num, int dir)
 {
        u32 mask = dir ? ENDPTCTRL_TXS : ENDPTCTRL_RXS;
 
-       return hw_cread(CAP_ENDPTCTRL + num * sizeof(u32), mask) ? 1 : 0;
+       return !!hw_read(hw_bank.op, OP_ENDPTCTRL + num * sizeof(u32), mask);
 }
 
 /**
@@ -457,7 +441,7 @@ static int hw_ep_get_halt(int num, int dir)
 static int hw_test_and_clear_setup_status(int n)
 {
        n = ep_to_bit(n);
-       return hw_ctest_and_clear(CAP_ENDPTSETUPSTAT, BIT(n));
+       return hw_test_and_clear(hw_bank.op, OP_ENDPTSETUPSTAT, BIT(n));
 }
 
 /**
@@ -472,14 +456,16 @@ static int hw_ep_prime(int num, int dir, int is_ctrl)
 {
        int n = hw_ep_bit(num, dir);
 
-       if (is_ctrl && dir == RX && hw_cread(CAP_ENDPTSETUPSTAT, BIT(num)))
+       if (is_ctrl && dir == RX &&
+           hw_read(hw_bank.op, OP_ENDPTSETUPSTAT, BIT(num)))
                return -EAGAIN;
 
-       hw_cwrite(CAP_ENDPTPRIME, BIT(n), BIT(n));
+       hw_write(hw_bank.op, OP_ENDPTPRIME, BIT(n), BIT(n));
 
-       while (hw_cread(CAP_ENDPTPRIME, BIT(n)))
+       while (hw_read(hw_bank.op, OP_ENDPTPRIME, BIT(n)))
                cpu_relax();
-       if (is_ctrl && dir == RX  && hw_cread(CAP_ENDPTSETUPSTAT, BIT(num)))
+       if (is_ctrl && dir == RX &&
+           hw_read(hw_bank.op, OP_ENDPTSETUPSTAT, BIT(num)))
                return -EAGAIN;
 
        /* status shoult be tested according with manual but it doesn't work */
@@ -501,12 +487,13 @@ static int hw_ep_set_halt(int num, int dir, int value)
                return -EINVAL;
 
        do {
-               u32 addr = CAP_ENDPTCTRL + num * sizeof(u32);
+               u32 addr = OP_ENDPTCTRL + num * sizeof(u32);
                u32 mask_xs = dir ? ENDPTCTRL_TXS : ENDPTCTRL_RXS;
                u32 mask_xr = dir ? ENDPTCTRL_TXR : ENDPTCTRL_RXR;
 
                /* data toggle - reserved for EP0 but it's in ESS */
-               hw_cwrite(addr, mask_xs|mask_xr, value ? mask_xs : mask_xr);
+               hw_write(hw_bank.op, addr, mask_xs|mask_xr,
+                        value ? mask_xs : mask_xr);
 
        } while (value != hw_ep_get_halt(num, dir));
 
@@ -525,8 +512,8 @@ static int hw_intr_clear(int n)
        if (n >= REG_BITS)
                return -EINVAL;
 
-       hw_cwrite(CAP_USBINTR, BIT(n), 0);
-       hw_cwrite(CAP_USBSTS,  BIT(n), BIT(n));
+       hw_write(hw_bank.op, OP_USBINTR, BIT(n), 0);
+       hw_write(hw_bank.op, OP_USBSTS,  BIT(n), BIT(n));
        return 0;
 }
 
@@ -542,10 +529,10 @@ static int hw_intr_force(int n)
        if (n >= REG_BITS)
                return -EINVAL;
 
-       hw_awrite(ABS_TESTMODE, TESTMODE_FORCE, TESTMODE_FORCE);
-       hw_cwrite(CAP_USBINTR,  BIT(n), BIT(n));
-       hw_cwrite(CAP_USBSTS,   BIT(n), BIT(n));
-       hw_awrite(ABS_TESTMODE, TESTMODE_FORCE, 0);
+       hw_write(hw_bank.cap, ABS_TESTMODE, TESTMODE_FORCE, TESTMODE_FORCE);
+       hw_write(hw_bank.op, OP_USBINTR,  BIT(n), BIT(n));
+       hw_write(hw_bank.op, OP_USBSTS,   BIT(n), BIT(n));
+       hw_write(hw_bank.cap, ABS_TESTMODE, TESTMODE_FORCE, 0);
        return 0;
 }
 
@@ -556,8 +543,8 @@ static int hw_intr_force(int n)
  */
 static int hw_port_is_high_speed(void)
 {
-       return hw_bank.lpm ? hw_cread(CAP_DEVLC, DEVLC_PSPD) :
-               hw_cread(CAP_PORTSC, PORTSC_HSP);
+       return hw_bank.lpm ? hw_read(hw_bank.op, OP_DEVLC, DEVLC_PSPD) :
+               hw_read(hw_bank.op, OP_PORTSC, PORTSC_HSP);
 }
 
 /**
@@ -567,7 +554,7 @@ static int hw_port_is_high_speed(void)
  */
 static u8 hw_port_test_get(void)
 {
-       return hw_cread(CAP_PORTSC, PORTSC_PTC) >> ffs_nr(PORTSC_PTC);
+       return hw_read(hw_bank.op, OP_PORTSC, PORTSC_PTC) >> ffs_nr(PORTSC_PTC);
 }
 
 /**
@@ -583,7 +570,7 @@ static int hw_port_test_set(u8 mode)
        if (mode > TEST_MODE_MAX)
                return -EINVAL;
 
-       hw_cwrite(CAP_PORTSC, PORTSC_PTC, mode << ffs_nr(PORTSC_PTC));
+       hw_write(hw_bank.op, OP_PORTSC, PORTSC_PTC, mode << ffs_nr(PORTSC_PTC));
        return 0;
 }
 
@@ -594,7 +581,7 @@ static int hw_port_test_set(u8 mode)
  */
 static u32 hw_read_intr_enable(void)
 {
-       return hw_cread(CAP_USBINTR, ~0);
+       return hw_read(hw_bank.op, OP_USBINTR, ~0);
 }
 
 /**
@@ -604,7 +591,7 @@ static u32 hw_read_intr_enable(void)
  */
 static u32 hw_read_intr_status(void)
 {
-       return hw_cread(CAP_USBSTS, ~0);
+       return hw_read(hw_bank.op, OP_USBSTS, ~0);
 }
 
 /**
@@ -622,7 +609,7 @@ static size_t hw_register_read(u32 *buf, size_t size)
                size = hw_bank.size;
 
        for (i = 0; i < size; i++)
-               buf[i] = hw_aread(i * sizeof(u32), ~0);
+               buf[i] = hw_read(hw_bank.cap, i * sizeof(u32), ~0);
 
        return size;
 }
@@ -645,7 +632,7 @@ static int hw_register_write(u16 addr, u32 data)
        /* align */
        addr *= sizeof(u32);
 
-       hw_awrite(addr, ~0, data);
+       hw_write(hw_bank.cap, addr, ~0, data);
        return 0;
 }
 
@@ -659,7 +646,7 @@ static int hw_register_write(u16 addr, u32 data)
 static int hw_test_and_clear_complete(int n)
 {
        n = ep_to_bit(n);
-       return hw_ctest_and_clear(CAP_ENDPTCOMPLETE, BIT(n));
+       return hw_test_and_clear(hw_bank.op, OP_ENDPTCOMPLETE, BIT(n));
 }
 
 /**
@@ -672,7 +659,7 @@ static u32 hw_test_and_clear_intr_active(void)
 {
        u32 reg = hw_read_intr_status() & hw_read_intr_enable();
 
-       hw_cwrite(CAP_USBSTS, ~0, reg);
+       hw_write(hw_bank.op, OP_USBSTS, ~0, reg);
        return reg;
 }
 
@@ -684,7 +671,7 @@ static u32 hw_test_and_clear_intr_active(void)
  */
 static int hw_test_and_clear_setup_guard(void)
 {
-       return hw_ctest_and_write(CAP_USBCMD, USBCMD_SUTW, 0);
+       return hw_test_and_write(hw_bank.op, OP_USBCMD, USBCMD_SUTW, 0);
 }
 
 /**
@@ -695,7 +682,8 @@ static int hw_test_and_clear_setup_guard(void)
  */
 static int hw_test_and_set_setup_guard(void)
 {
-       return hw_ctest_and_write(CAP_USBCMD, USBCMD_SUTW, USBCMD_SUTW);
+       return hw_test_and_write(hw_bank.op, OP_USBCMD, USBCMD_SUTW,
+                                USBCMD_SUTW);
 }
 
 /**
@@ -707,8 +695,9 @@ static int hw_test_and_set_setup_guard(void)
 static int hw_usb_set_address(u8 value)
 {
        /* advance */
-       hw_cwrite(CAP_DEVICEADDR, DEVICEADDR_USBADR | DEVICEADDR_USBADRA,
-                 value << ffs_nr(DEVICEADDR_USBADR) | DEVICEADDR_USBADRA);
+       hw_write(hw_bank.op, OP_DEVICEADDR,
+                DEVICEADDR_USBADR | DEVICEADDR_USBADRA,
+                value << ffs_nr(DEVICEADDR_USBADR) | DEVICEADDR_USBADRA);
        return 0;
 }
 
@@ -723,16 +712,16 @@ static int hw_usb_reset(void)
        hw_usb_set_address(0);
 
        /* ESS flushes only at end?!? */
-       hw_cwrite(CAP_ENDPTFLUSH,    ~0, ~0);   /* flush all EPs */
+       hw_write(hw_bank.op, OP_ENDPTFLUSH,    ~0, ~0);
 
        /* clear setup token semaphores */
-       hw_cwrite(CAP_ENDPTSETUPSTAT, 0,  0);   /* writes its content */
+       hw_write(hw_bank.op, OP_ENDPTSETUPSTAT, 0,  0);
 
        /* clear complete status */
-       hw_cwrite(CAP_ENDPTCOMPLETE,  0,  0);   /* writes its content */
+       hw_write(hw_bank.op, OP_ENDPTCOMPLETE,  0,  0);
 
        /* wait until all bits cleared */
-       while (hw_cread(CAP_ENDPTPRIME, ~0))
+       while (hw_read(hw_bank.op, OP_ENDPTPRIME, ~0))
                udelay(10);             /* not RTOS friendly */
 
        /* reset all endpoints ? */
@@ -1514,13 +1503,14 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
                else
                        mReqPrev->ptr->next = mReq->dma & TD_ADDR_MASK;
                wmb();
-               if (hw_cread(CAP_ENDPTPRIME, BIT(n)))
+               if (hw_read(hw_bank.op, OP_ENDPTPRIME, BIT(n)))
                        goto done;
                do {
-                       hw_cwrite(CAP_USBCMD, USBCMD_ATDTW, USBCMD_ATDTW);
-                       tmp_stat = hw_cread(CAP_ENDPTSTAT, BIT(n));
-               } while (!hw_cread(CAP_USBCMD, USBCMD_ATDTW));
-               hw_cwrite(CAP_USBCMD, USBCMD_ATDTW, 0);
+                       hw_write(hw_bank.op, OP_USBCMD, USBCMD_ATDTW,
+                                USBCMD_ATDTW);
+                       tmp_stat = hw_read(hw_bank.op, OP_ENDPTSTAT, BIT(n));
+               } while (!hw_read(hw_bank.op, OP_USBCMD, USBCMD_ATDTW));
+               hw_write(hw_bank.op, OP_USBCMD, USBCMD_ATDTW, 0);
                if (tmp_stat)
                        goto done;
        }
@@ -2524,12 +2514,12 @@ static int ci13xxx_wakeup(struct usb_gadget *_gadget)
                trace("remote wakeup feature is not enabled\n");
                goto out;
        }
-       if (!hw_cread(CAP_PORTSC, PORTSC_SUSP)) {
+       if (!hw_read(hw_bank.op, OP_PORTSC, PORTSC_SUSP)) {
                ret = -EINVAL;
                trace("port is not suspended\n");
                goto out;
        }
-       hw_cwrite(CAP_PORTSC, PORTSC_FPR, PORTSC_FPR);
+       hw_write(hw_bank.op, OP_PORTSC, PORTSC_FPR, PORTSC_FPR);
 out:
        spin_unlock_irqrestore(udc->lock, flags);
        return ret;
@@ -2796,8 +2786,8 @@ static irqreturn_t udc_irq(void)
        spin_lock(udc->lock);
 
        if (udc->udc_driver->flags & CI13XXX_REGS_SHARED) {
-               if (hw_cread(CAP_USBMODE, USBMODE_CM) !=
-                               USBMODE_CM_DEVICE) {
+               if (hw_read(hw_bank.op, OP_USBMODE, USBMODE_CM) !=
+                   USBMODE_CM_DEVICE) {
                        spin_unlock(udc->lock);
                        return IRQ_NONE;
                }
@@ -2875,7 +2865,7 @@ static void udc_release(struct device *dev)
  * Kernel assumes 32-bit DMA operations by default, no need to dma_set_mask
  */
 static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev,
-               void __iomem *regs)
+                    void __iomem *regs, uintptr_t capoffset)
 {
        struct ci13xxx *udc;
        int retval = 0;
@@ -2909,7 +2899,7 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev,
        udc->gadget.dev.parent   = dev;
        udc->gadget.dev.release  = udc_release;
 
-       retval = hw_device_init(regs);
+       retval = hw_device_init(regs, capoffset);
        if (retval < 0)
                goto free_udc;
 
index d6dbaad9c90676f1ba9dbe1e53f90b7826f2681b..66f41a34c76591b1f2a0aaef613b3bdaac324e6c 100644 (file)
@@ -140,6 +140,9 @@ struct ci13xxx {
 /******************************************************************************
  * REGISTERS
  *****************************************************************************/
+/* Default offset of capability registers */
+#define DEF_CAPOFFSET          0x100
+
 /* register size */
 #define REG_BITS   (32)