> From: linux-usb-ow...@vger.kernel.org 
> [mailto:linux-usb-ow...@vger.kernel.org] On Behalf Of Paul Zimmerman
> Sent: Friday, August 01, 2014 11:49 AM
> 
> > From: dingu...@altera.com [mailto:dingu...@altera.com]
> > Sent: Wednesday, July 30, 2014 8:21 AM
> >
> > Adds the gadget data structure and appropriate data structure pointers
> > to the common dwc2_hsotg data structure. This is needed so that the
> > dwc2_hsotg data structure can be used by the hcd and gadget drivers.
> >
> > Signed-off-by: Dinh Nguyen <dingu...@altera.com>
> > ---
> >  drivers/usb/dwc2/core.h |    6 ++++++
> >  1 file changed, 6 insertions(+)
> >
> > diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
> > index 3b4bd4c..ee34ee1 100644
> > --- a/drivers/usb/dwc2/core.h
> > +++ b/drivers/usb/dwc2/core.h
> > @@ -604,6 +604,12 @@ struct dwc2_hsotg {
> >     struct timer_list wkp_timer;
> >     enum dwc2_lx_state lx_state;
> >
> > +   /* Gadget structures */
> > +   struct s3c_hsotg *s3c_hsotg;
> > +   struct usb_gadget       gadget;
> > +   struct usb_gadget_driver *driver;
> > +   struct s3c_hsotg_ep     *eps;
> > +
> 
> Hi Dinh,
> 
> After looking at this some more, I'm not really happy with including
> a pointer to the s3c_hsotg struct inside the dwc2_hsotg struct. It
> makes the peripheral mode kind of a second class citizen, and requires
> a bunch of double pointer indirections in gadget.c
> (hsotg->s3c_hsotg->foo). Plus, when building for peripheral-only mode,
> there are a lot of unused fields in the dwc2_hsotg struct.
> 
> So how about something like the below instead? This moves all of the
> s3c_hsotg struct fields into the dwc2_hsotg struct, and adds ifdefs
> around the host-only and peripheral-only fields. Doing this should
> make the diff to gadget.c even smaller, since it eliminates the double
> indirections.
> 
> This patch is on top of your series. And I'm only showing the changes
> to core.h.

And here is a patch which actually compiles in all three modes. I am
including the full patch, including the changes to gadget.c, this time.

These changes should really be folded into your series, instead of
being tacked onto the end like this.

I have no way to test this, since I don't have non-PCI hardware that
works in peripheral mode. (After this series goes in, I plan to add
support for that on PCI.)

-- 
Paul

diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index ed8d81d..4d551e9 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -155,67 +155,6 @@ struct s3c_hsotg_ep {
 };
 
 /**
- * struct s3c_hsotg - driver state.
- * @dev: The parent device supplied to the probe function
- * @driver: USB gadget driver
- * @phy: The otg phy transceiver structure for phy control.
- * @uphy: The otg phy transceiver structure for old USB phy control.
- * @plat: The platform specific configuration data. This can be removed once
- * all SoCs support usb transceiver.
- * @regs: The memory area mapped for accessing registers.
- * @irq: The IRQ number we are using
- * @supplies: Definition of USB power supplies
- * @phyif: PHY interface width
- * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos.
- * @num_of_eps: Number of available EPs (excluding EP0)
- * @debug_root: root directrory for debugfs.
- * @debug_file: main status file for debugfs.
- * @debug_fifo: FIFO status file for debugfs.
- * @ep0_reply: Request used for ep0 reply.
- * @ep0_buff: Buffer for EP0 reply data, if needed.
- * @ctrl_buff: Buffer for EP0 control requests.
- * @ctrl_req: Request for EP0 control packets.
- * @setup: NAK management for EP0 SETUP
- * @last_rst: Time of last reset
- * @eps: The endpoints being supplied to the gadget framework
- */
-struct s3c_hsotg {
-       struct device            *dev;
-       struct usb_gadget_driver *driver;
-       struct phy               *phy;
-       struct usb_phy           *uphy;
-       struct s3c_hsotg_plat    *plat;
-
-       spinlock_t              lock;
-
-       void __iomem            *regs;
-       int                     irq;
-       struct clk              *clk;
-
-       struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];
-
-       u32                     phyif;
-       int                     fifo_mem;
-       unsigned int            dedicated_fifos:1;
-       unsigned char           num_of_eps;
-       u32                     fifo_map;
-
-       struct dentry           *debug_root;
-       struct dentry           *debug_file;
-       struct dentry           *debug_fifo;
-
-       struct usb_request      *ep0_reply;
-       struct usb_request      *ctrl_req;
-       u8                      ep0_buff[8];
-       u8                      ctrl_buff[8];
-
-       struct usb_gadget       gadget;
-       unsigned int            setup;
-       unsigned long           last_rst;
-       struct s3c_hsotg_ep     *eps;
-};
-
-/**
  * struct s3c_hsotg_req - data transfer request
  * @req: The USB gadget request
  * @queue: The list of requests for the endpoint this is queued for.
@@ -229,6 +168,7 @@ struct s3c_hsotg_req {
        unsigned char           mapped;
 };
 
+#if defined(CONFIG_USB_DWC2_PERIPHERAL) || defined(CONFIG_USB_DWC2_DUAL_ROLE)
 #define call_gadget(_hs, _entry) \
 do { \
        if ((_hs)->gadget.speed != USB_SPEED_UNKNOWN && \
@@ -238,6 +178,9 @@ do { \
                spin_lock(&_hs->lock); \
        } \
 } while (0)
+#else
+#define call_gadget(_hs, _entry)       do {} while (0)
+#endif
 
 struct dwc2_hsotg;
 struct dwc2_host_chan;
@@ -495,15 +438,19 @@ struct dwc2_hw_params {
  * struct dwc2_hsotg - Holds the state of the driver, including the 
non-periodic
  * and periodic schedules
  *
+ * These are common for both host and peripheral modes:
+ *
  * @dev:                The struct device pointer
- * @regs:              Pointer to controller regs
- * @core_params:        Parameters that define how the core should be 
configured
+ * @regs:               Pointer to controller regs
  * @hw_params:          Parameters that were autodetected from the
  *                      hardware registers
+ * @core_params:        Parameters that define how the core should be 
configured
  * @op_state:           The operational State, during transitions (a_host=>
  *                      a_peripheral and b_device=>b_host) this may not match
  *                      the core, but allows the software to determine
  *                      transitions
+ * @lock:               Spinlock that protects all the driver data structures
+ * @priv:               Stores a pointer to the struct usb_hcd
  * @queuing_high_bandwidth: True if multiple packets of a high-bandwidth
  *                      transfer are in process of being queued
  * @srp_success:        Stores status of SRP request in the case of a FS PHY
@@ -513,6 +460,9 @@ struct dwc2_hw_params {
  *                      interrupt
  * @wkp_timer:          Timer object for handling Wakeup Detected interrupt
  * @lx_state:           Lx state of connected device
+ *
+ * These are for host mode:
+ *
  * @flags:              Flags for handling root port state changes
  * @non_periodic_sched_inactive: Inactive QHs in the non-periodic schedule.
  *                      Transfers associated with these QHs are not currently
@@ -581,11 +531,31 @@ struct dwc2_hw_params {
  * @status_buf_dma:     DMA address for status_buf
  * @start_work:         Delayed work for handling host A-cable connection
  * @reset_work:         Delayed work for handling a port reset
- * @lock:               Spinlock that protects all the driver data structures
- * @priv:               Stores a pointer to the struct usb_hcd
  * @otg_port:           OTG port number
  * @frame_list:         Frame list
  * @frame_list_dma:     Frame list DMA address
+ *
+ * These are for peripheral mode:
+ *
+ * @driver:             USB gadget driver
+ * @phy:                The otg phy transceiver structure for phy control.
+ * @uphy:               The otg phy transceiver structure for old USB phy 
control.
+ * @plat:               The platform specific configuration data. This can be 
removed once
+ *                      all SoCs support usb transceiver.
+ * @supplies:           Definition of USB power supplies
+ * @phyif:              PHY interface width
+ * @dedicated_fifos:    Set if the hardware has dedicated IN-EP fifos.
+ * @num_of_eps:         Number of available EPs (excluding EP0)
+ * @debug_root:         Root directrory for debugfs.
+ * @debug_file:         Main status file for debugfs.
+ * @debug_fifo:         FIFO status file for debugfs.
+ * @ep0_reply:          Request used for ep0 reply.
+ * @ep0_buff:           Buffer for EP0 reply data, if needed.
+ * @ctrl_buff:          Buffer for EP0 control requests.
+ * @ctrl_req:           Request for EP0 control packets.
+ * @setup:              NAK management for EP0 SETUP
+ * @last_rst:           Time of last reset
+ * @eps:                The endpoints being supplied to the gadget framework
  */
 struct dwc2_hsotg {
        struct device *dev;
@@ -596,6 +566,9 @@ struct dwc2_hsotg {
        struct dwc2_core_params *core_params;
        enum usb_otg_state op_state;
 
+       spinlock_t lock;
+       void *priv;
+
        unsigned int queuing_high_bandwidth:1;
        unsigned int srp_success:1;
 
@@ -604,12 +577,14 @@ struct dwc2_hsotg {
        struct timer_list wkp_timer;
        enum dwc2_lx_state lx_state;
 
-       /* Gadget structures */
-       struct s3c_hsotg *s3c_hsotg;
-       struct usb_gadget gadget;
-       struct usb_gadget_driver *driver;
-       struct s3c_hsotg_ep *eps;
+       /* DWC OTG HW Release versions */
+#define DWC2_CORE_REV_2_71a    0x4f54271a
+#define DWC2_CORE_REV_2_90a    0x4f54290a
+#define DWC2_CORE_REV_2_92a    0x4f54292a
+#define DWC2_CORE_REV_2_94a    0x4f54294a
+#define DWC2_CORE_REV_3_00a    0x4f54300a
 
+#if defined(CONFIG_USB_DWC2_HOST) || defined(CONFIG_USB_DWC2_DUAL_ROLE)
        union dwc2_hcd_internal_flags {
                u32 d32;
                struct {
@@ -656,19 +631,10 @@ struct dwc2_hsotg {
 
        struct delayed_work start_work;
        struct delayed_work reset_work;
-       spinlock_t lock;
-       void *priv;
        u8 otg_port;
        u32 *frame_list;
        dma_addr_t frame_list_dma;
 
-       /* DWC OTG HW Release versions */
-#define DWC2_CORE_REV_2_71a    0x4f54271a
-#define DWC2_CORE_REV_2_90a    0x4f54290a
-#define DWC2_CORE_REV_2_92a    0x4f54292a
-#define DWC2_CORE_REV_2_94a    0x4f54294a
-#define DWC2_CORE_REV_3_00a    0x4f54300a
-
 #ifdef DEBUG
        u32 frrem_samples;
        u64 frrem_accum;
@@ -687,6 +653,39 @@ struct dwc2_hsotg {
        u32 hfnum_other_samples_b;
        u64 hfnum_other_frrem_accum_b;
 #endif
+#endif
+
+#if defined(CONFIG_USB_DWC2_PERIPHERAL) || defined(CONFIG_USB_DWC2_DUAL_ROLE)
+       /* Gadget structures */
+       struct usb_gadget_driver *driver;
+       struct phy *phy;
+       struct usb_phy *uphy;
+       struct s3c_hsotg_plat *plat;
+
+       struct clk *clk;
+
+       struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];
+
+       u32 phyif;
+       int fifo_mem;
+       unsigned int dedicated_fifos:1;
+       unsigned char num_of_eps;
+       u32 fifo_map;
+
+       struct dentry *debug_root;
+       struct dentry *debug_file;
+       struct dentry *debug_fifo;
+
+       struct usb_request *ep0_reply;
+       struct usb_request *ctrl_req;
+       u8 ep0_buff[8];
+       u8 ctrl_buff[8];
+
+       struct usb_gadget gadget;
+       unsigned int setup;
+       unsigned long last_rst;
+       struct s3c_hsotg_ep *eps;
+#endif
 };
 
 /* Reasons for halting a host channel */
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 281b33a..36db7b6 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -88,7 +88,7 @@ static void s3c_hsotg_dump(struct dwc2_hsotg *hsotg);
  *
  * Until this issue is sorted out, we always return 'false'.
  */
-static inline bool using_dma(struct s3c_hsotg *hsotg)
+static inline bool using_dma(struct dwc2_hsotg *hsotg)
 {
        return false;   /* support is not complete */
 }
@@ -199,7 +199,7 @@ static void s3c_hsotg_init_fifo(struct dwc2_hsotg *hsotg)
        for (ep = 1; ep <= 4; ep++) {
                val = addr;
                val |= size << FIFOSIZE_DEPTH_SHIFT;
-               WARN_ONCE(addr + size > hsotg->s3c_hsotg->fifo_mem,
+               WARN_ONCE(addr + size > hsotg->fifo_mem,
                          "insufficient fifo memory");
                addr += size;
 
@@ -210,7 +210,7 @@ static void s3c_hsotg_init_fifo(struct dwc2_hsotg *hsotg)
        for (ep = 5; ep <= 8; ep++) {
                val = addr;
                val |= size << FIFOSIZE_DEPTH_SHIFT;
-               WARN_ONCE(addr + size > hsotg->s3c_hsotg->fifo_mem,
+               WARN_ONCE(addr + size > hsotg->fifo_mem,
                          "insufficient fifo memory");
                addr += size;
 
@@ -334,7 +334,7 @@ static int s3c_hsotg_write_fifo(struct dwc2_hsotg *hsotg,
        if (to_write == 0)
                return 0;
 
-       if (periodic && !hsotg->s3c_hsotg->dedicated_fifos) {
+       if (periodic && !hsotg->dedicated_fifos) {
                u32 epsize = readl(hsotg->regs + DIEPTSIZ(hs_ep->index));
                int size_left;
                int size_done;
@@ -375,7 +375,7 @@ static int s3c_hsotg_write_fifo(struct dwc2_hsotg *hsotg,
                        s3c_hsotg_en_gsint(hsotg, GINTSTS_PTXFEMP);
                        return -ENOSPC;
                }
-       } else if (hsotg->s3c_hsotg->dedicated_fifos && hs_ep->index != 0) {
+       } else if (hsotg->dedicated_fifos && hs_ep->index != 0) {
                can_write = readl(hsotg->regs + DTXFSTS(hs_ep->index));
 
                can_write &= 0xffff;
@@ -416,7 +416,7 @@ static int s3c_hsotg_write_fifo(struct dwc2_hsotg *hsotg,
                to_write = max_transfer;
 
                /* it's needed only when we do not use dedicated fifos */
-               if (!hsotg->s3c_hsotg->dedicated_fifos)
+               if (!hsotg->dedicated_fifos)
                        s3c_hsotg_en_gsint(hsotg,
                                           periodic ? GINTSTS_PTXFEMP :
                                           GINTSTS_NPTXFEMP);
@@ -445,7 +445,7 @@ static int s3c_hsotg_write_fifo(struct dwc2_hsotg *hsotg,
                 */
 
                /* it's needed only when we do not use dedicated fifos */
-               if (!hsotg->s3c_hsotg->dedicated_fifos)
+               if (!hsotg->dedicated_fifos)
                        s3c_hsotg_en_gsint(hsotg,
                                           periodic ? GINTSTS_PTXFEMP :
                                           GINTSTS_NPTXFEMP);
@@ -627,7 +627,7 @@ static void s3c_hsotg_start_req(struct dwc2_hsotg *hsotg,
        /* write size / packets */
        writel(epsize, hsotg->regs + epsize_reg);
 
-       if (using_dma(hsotg->s3c_hsotg) && !continuing) {
+       if (using_dma(hsotg) && !continuing) {
                unsigned int dma_reg;
 
                /*
@@ -645,11 +645,11 @@ static void s3c_hsotg_start_req(struct dwc2_hsotg *hsotg,
        ctrl |= DXEPCTL_EPENA;  /* ensure ep enabled */
        ctrl |= DXEPCTL_USBACTEP;
 
-       dev_dbg(hsotg->dev, "setup req:%d\n", hsotg->s3c_hsotg->setup);
+       dev_dbg(hsotg->dev, "setup req:%d\n", hsotg->setup);
 
        /* For Setup request do not clear NAK */
-       if (hsotg->s3c_hsotg->setup && index == 0)
-               hsotg->s3c_hsotg->setup = 0;
+       if (hsotg->setup && index == 0)
+               hsotg->setup = 0;
        else
                ctrl |= DXEPCTL_CNAK;   /* clear NAK set by core */
 
@@ -665,7 +665,7 @@ static void s3c_hsotg_start_req(struct dwc2_hsotg *hsotg,
        hs_ep->size_loaded = length;
        hs_ep->last_load = ureq->actual;
 
-       if (dir_in && !using_dma(hsotg->s3c_hsotg)) {
+       if (dir_in && !using_dma(hsotg)) {
                /* set these anyway, we may need them for non-periodic in */
                hs_ep->fifo_load = 0;
 
@@ -752,7 +752,7 @@ static int s3c_hsotg_ep_queue(struct usb_ep *ep, struct 
usb_request *req,
        req->status = -EINPROGRESS;
 
        /* if we're using DMA, sync the buffers as necessary */
-       if (using_dma(hs->s3c_hsotg)) {
+       if (using_dma(hs)) {
                int ret = s3c_hsotg_map_dma(hs, hs_ep, req);
                if (ret)
                        return ret;
@@ -827,7 +827,7 @@ static struct s3c_hsotg_ep *ep_from_windex(struct 
dwc2_hsotg *hsotg,
        if (windex >= 0x100)
                return NULL;
 
-       if (idx > hsotg->s3c_hsotg->num_of_eps)
+       if (idx > hsotg->num_of_eps)
                return NULL;
 
        if (idx && ep->dir_in != dir)
@@ -857,13 +857,13 @@ static int s3c_hsotg_send_reply(struct dwc2_hsotg *hsotg,
        dev_dbg(hsotg->dev, "%s: buff %p, len %d\n", __func__, buff, length);
 
        req = s3c_hsotg_ep_alloc_request(&ep->ep, GFP_ATOMIC);
-       hsotg->s3c_hsotg->ep0_reply = req;
+       hsotg->ep0_reply = req;
        if (!req) {
                dev_warn(hsotg->dev, "%s: cannot alloc req\n", __func__);
                return -ENOMEM;
        }
 
-       req->buf = hsotg->s3c_hsotg->ep0_buff;
+       req->buf = hsotg->ep0_buff;
        req->length = length;
        req->zero = 1; /* always do zero-length final transfer */
        req->complete = s3c_hsotg_complete_oursetup;
@@ -1188,7 +1188,7 @@ static void s3c_hsotg_complete_setup(struct usb_ep *ep,
  */
 static void s3c_hsotg_enqueue_setup(struct dwc2_hsotg *hsotg)
 {
-       struct usb_request *req = hsotg->s3c_hsotg->ctrl_req;
+       struct usb_request *req = hsotg->ctrl_req;
        struct s3c_hsotg_req *hs_req = our_req(req);
        int ret;
 
@@ -1196,7 +1196,7 @@ static void s3c_hsotg_enqueue_setup(struct dwc2_hsotg 
*hsotg)
 
        req->zero = 0;
        req->length = 8;
-       req->buf = hsotg->s3c_hsotg->ctrl_buff;
+       req->buf = hsotg->ctrl_buff;
        req->complete = s3c_hsotg_complete_setup;
 
        if (!list_empty(&hs_req->queue)) {
@@ -1255,7 +1255,7 @@ static void s3c_hsotg_complete_request(struct dwc2_hsotg 
*hsotg,
        hs_ep->req = NULL;
        list_del_init(&hs_req->queue);
 
-       if (using_dma(hsotg->s3c_hsotg))
+       if (using_dma(hsotg))
                s3c_hsotg_unmap_dma(hsotg, hs_ep, hs_req);
 
        /*
@@ -1416,7 +1416,7 @@ static void s3c_hsotg_handle_outdone(struct dwc2_hsotg 
*hsotg,
                return;
        }
 
-       if (using_dma(hsotg->s3c_hsotg)) {
+       if (using_dma(hsotg)) {
                unsigned size_done;
 
                /*
@@ -1443,7 +1443,7 @@ static void s3c_hsotg_handle_outdone(struct dwc2_hsotg 
*hsotg,
                 * After was_setup = 1 =>
                 * set CNAK for non Setup requests
                 */
-               hsotg->s3c_hsotg->setup = was_setup ? 0 : 1;
+               hsotg->setup = was_setup ? 0 : 1;
        }
 
        if (req->actual < req->length && req->short_not_ok) {
@@ -1506,7 +1506,7 @@ static void s3c_hsotg_handle_rx(struct dwc2_hsotg *hsotg)
        u32 grxstsr = readl(hsotg->regs + GRXSTSP);
        u32 epnum, status, size;
 
-       WARN_ON(using_dma(hsotg->s3c_hsotg));
+       WARN_ON(using_dma(hsotg));
 
        epnum = grxstsr & GRXSTS_EPNUM_MASK;
        status = grxstsr & GRXSTS_PKTSTS_MASK;
@@ -1527,7 +1527,7 @@ static void s3c_hsotg_handle_rx(struct dwc2_hsotg *hsotg)
                dev_dbg(hsotg->dev, "OutDone (Frame=0x%08x)\n",
                        s3c_hsotg_read_frameno(hsotg));
 
-               if (!using_dma(hsotg->s3c_hsotg))
+               if (!using_dma(hsotg))
                        s3c_hsotg_handle_outdone(hsotg, epnum, false);
                break;
 
@@ -1836,7 +1836,7 @@ static void s3c_hsotg_epint(struct dwc2_hsotg *hsotg, 
unsigned int idx,
 
                        if (idx == 0 && !hs_ep->req)
                                s3c_hsotg_enqueue_setup(hsotg);
-               } else if (using_dma(hsotg->s3c_hsotg)) {
+               } else if (using_dma(hsotg)) {
                        /*
                         * We're using DMA, we need to fire an OutDone here
                         * as we ignore the RXFIFO.
@@ -1870,7 +1870,7 @@ static void s3c_hsotg_epint(struct dwc2_hsotg *hsotg, 
unsigned int idx,
        if (ints & DXEPINT_SETUP) {  /* Setup or Timeout */
                dev_dbg(hsotg->dev, "%s: Setup/Timeout\n",  __func__);
 
-               if (using_dma(hsotg->s3c_hsotg) && idx == 0) {
+               if (using_dma(hsotg) && idx == 0) {
                        /*
                         * this is the notification we've received a
                         * setup packet. In non-DMA mode we'd get this
@@ -1902,11 +1902,11 @@ static void s3c_hsotg_epint(struct dwc2_hsotg *hsotg, 
unsigned int idx,
                }
 
                /* FIFO has space or is empty (see GAHBCFG) */
-               if (hsotg->s3c_hsotg->dedicated_fifos &&
+               if (hsotg->dedicated_fifos &&
                    ints & DIEPMSK_TXFIFOEMPTY) {
                        dev_dbg(hsotg->dev, "%s: ep%d: TxFIFOEmpty\n",
                                __func__, idx);
-                       if (!using_dma(hsotg->s3c_hsotg))
+                       if (!using_dma(hsotg))
                                s3c_hsotg_trytx(hsotg, hs_ep);
                }
        }
@@ -1973,7 +1973,7 @@ static void s3c_hsotg_irq_enumdone(struct dwc2_hsotg 
*hsotg)
        if (ep0_mps) {
                int i;
                s3c_hsotg_set_ep_maxpacket(hsotg, 0, ep0_mps);
-               for (i = 1; i < hsotg->s3c_hsotg->num_of_eps; i++)
+               for (i = 1; i < hsotg->num_of_eps; i++)
                        s3c_hsotg_set_ep_maxpacket(hsotg, i, ep_mps);
        }
 
@@ -2015,7 +2015,7 @@ static void kill_all_requests(struct dwc2_hsotg *hsotg,
                s3c_hsotg_complete_request(hsotg, ep, req,
                                           result);
        }
-       if (!hsotg->s3c_hsotg->dedicated_fifos)
+       if (!hsotg->dedicated_fifos)
                return;
        size = (readl(hsotg->regs + DTXFSTS(ep->index)) & 0xffff) * 4;
        if (size < ep->fifo_size)
@@ -2034,7 +2034,7 @@ static void s3c_hsotg_disconnect(struct dwc2_hsotg *hsotg)
 {
        unsigned ep;
 
-       for (ep = 0; ep < hsotg->s3c_hsotg->num_of_eps; ep++)
+       for (ep = 0; ep < hsotg->num_of_eps; ep++)
                kill_all_requests(hsotg, &hsotg->eps[ep], -ESHUTDOWN, true);
 
        call_gadget(hsotg, disconnect);
@@ -2052,7 +2052,7 @@ static void s3c_hsotg_irq_fifoempty(struct dwc2_hsotg 
*hsotg, bool periodic)
 
        /* look through for any more data to transmit */
 
-       for (epno = 0; epno < hsotg->s3c_hsotg->num_of_eps; epno++) {
+       for (epno = 0; epno < hsotg->num_of_eps; epno++) {
                ep = &hsotg->eps[epno];
 
                if (!ep->dir_in)
@@ -2137,7 +2137,7 @@ void s3c_hsotg_core_init(struct dwc2_hsotg *hsotg)
         */
 
        /* set the PLL on, remove the HNP/SRP and set the PHY */
-       writel(hsotg->s3c_hsotg->phyif | GUSBCFG_TOUTCAL(7) |
+       writel(hsotg->phyif | GUSBCFG_TOUTCAL(7) |
               (0x5 << 10), hsotg->regs + GUSBCFG);
 
        s3c_hsotg_init_fifo(hsotg);
@@ -2159,12 +2159,12 @@ void s3c_hsotg_core_init(struct dwc2_hsotg *hsotg)
                GINTSTS_USBSUSP | GINTSTS_WKUPINT,
                hsotg->regs + GINTMSK);
 
-       if (using_dma(hsotg->s3c_hsotg))
+       if (using_dma(hsotg))
                writel(GAHBCFG_GLBL_INTR_EN | GAHBCFG_DMA_EN |
                       GAHBCFG_HBSTLEN_INCR4,
                       hsotg->regs + GAHBCFG);
        else
-               writel(((hsotg->s3c_hsotg->dedicated_fifos) ? 
(GAHBCFG_NP_TXF_EMP_LVL |
+               writel(((hsotg->dedicated_fifos) ? (GAHBCFG_NP_TXF_EMP_LVL |
                                                    GAHBCFG_P_TXF_EMP_LVL) : 0) 
|
                       GAHBCFG_GLBL_INTR_EN,
                       hsotg->regs + GAHBCFG);
@@ -2175,7 +2175,7 @@ void s3c_hsotg_core_init(struct dwc2_hsotg *hsotg)
         * interrupts.
         */
 
-       writel(((hsotg->s3c_hsotg->dedicated_fifos) ? DIEPMSK_TXFIFOEMPTY |
+       writel(((hsotg->dedicated_fifos) ? DIEPMSK_TXFIFOEMPTY |
                DIEPMSK_INTKNTXFEMPMSK : 0) |
                DIEPMSK_EPDISBLDMSK | DIEPMSK_XFERCOMPLMSK |
                DIEPMSK_TIMEOUTMSK | DIEPMSK_AHBERRMSK |
@@ -2186,7 +2186,7 @@ void s3c_hsotg_core_init(struct dwc2_hsotg *hsotg)
         * don't need XferCompl, we get that from RXFIFO in slave mode. In
         * DMA mode we may need this.
         */
-       writel((using_dma(hsotg->s3c_hsotg) ? (DIEPMSK_XFERCOMPLMSK |
+       writel((using_dma(hsotg) ? (DIEPMSK_XFERCOMPLMSK |
                                    DIEPMSK_TIMEOUTMSK) : 0) |
                DOEPMSK_EPDISBLDMSK | DOEPMSK_AHBERRMSK |
                DOEPMSK_SETUPMSK,
@@ -2206,7 +2206,7 @@ void s3c_hsotg_core_init(struct dwc2_hsotg *hsotg)
         * the data. In DMA mode, we get events from the FIFO but also
         * things we cannot process, so do not use it.
         */
-       if (!using_dma(hsotg->s3c_hsotg))
+       if (!using_dma(hsotg))
                s3c_hsotg_en_gsint(hsotg, GINTSTS_RXFLVL);
 
        /* Enable interrupts for EP0 in and out */
@@ -2315,14 +2315,14 @@ irq_retry:
                writel(GINTSTS_USBRST, hsotg->regs + GINTSTS);
 
                if (usb_status & GOTGCTL_BSESVLD) {
-                       if (time_after(jiffies, hsotg->s3c_hsotg->last_rst +
+                       if (time_after(jiffies, hsotg->last_rst +
                                       msecs_to_jiffies(200))) {
 
                                kill_all_requests(hsotg, &hsotg->eps[0],
                                                          -ECONNRESET, true);
 
                                s3c_hsotg_core_init(hsotg);
-                               hsotg->s3c_hsotg->last_rst = jiffies;
+                               hsotg->last_rst = jiffies;
                        }
                }
        }
@@ -2506,16 +2506,16 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
         * if the hardware has dedicated fifos, we must give each IN EP
         * a unique tx-fifo even if it is non-periodic.
         */
-       if (dir_in && hsotg->s3c_hsotg->dedicated_fifos) {
+       if (dir_in && hsotg->dedicated_fifos) {
                size = hs_ep->ep.maxpacket*hs_ep->mc;
                for (i = 1; i <= 8; ++i) {
-                       if (hsotg->s3c_hsotg->fifo_map & (1<<i))
+                       if (hsotg->fifo_map & (1<<i))
                                continue;
                        val = readl(hsotg->regs + DPTXFSIZN(i));
                        val = (val >> FIFOSIZE_DEPTH_SHIFT)*4;
                        if (val < size)
                                continue;
-                       hsotg->s3c_hsotg->fifo_map |= 1<<i;
+                       hsotg->fifo_map |= 1<<i;
 
                        epctrl |= DXEPCTL_TXFNUM(i);
                        hs_ep->fifo_index = i;
@@ -2571,7 +2571,7 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
        /* terminate all requests with shutdown */
        kill_all_requests(hsotg, hs_ep, -ESHUTDOWN, false);
 
-       hsotg->s3c_hsotg->fifo_map &= ~(1<<hs_ep->fifo_index);
+       hsotg->fifo_map &= ~(1<<hs_ep->fifo_index);
        hs_ep->fifo_index = 0;
        hs_ep->fifo_size = 0;
 
@@ -2741,13 +2741,13 @@ static void s3c_hsotg_phy_enable(struct dwc2_hsotg 
*hsotg)
 
        dev_dbg(hsotg->dev, "pdev 0x%p\n", pdev);
 
-       if (hsotg->s3c_hsotg->uphy)
-               usb_phy_init(hsotg->s3c_hsotg->uphy);
-       else if (hsotg->s3c_hsotg->plat && hsotg->s3c_hsotg->plat->phy_init)
-               hsotg->s3c_hsotg->plat->phy_init(pdev, 
hsotg->s3c_hsotg->plat->phy_type);
+       if (hsotg->uphy)
+               usb_phy_init(hsotg->uphy);
+       else if (hsotg->plat && hsotg->plat->phy_init)
+               hsotg->plat->phy_init(pdev, hsotg->plat->phy_type);
        else {
-               phy_init(hsotg->s3c_hsotg->phy);
-               phy_power_on(hsotg->s3c_hsotg->phy);
+               phy_init(hsotg->phy);
+               phy_power_on(hsotg->phy);
        }
 }
 
@@ -2762,13 +2762,13 @@ static void s3c_hsotg_phy_disable(struct dwc2_hsotg 
*hsotg)
 {
        struct platform_device *pdev = to_platform_device(hsotg->dev);
 
-       if (hsotg->s3c_hsotg->uphy)
-               usb_phy_shutdown(hsotg->s3c_hsotg->uphy);
-       else if (hsotg->s3c_hsotg->plat && hsotg->s3c_hsotg->plat->phy_exit)
-               hsotg->s3c_hsotg->plat->phy_exit(pdev, 
hsotg->s3c_hsotg->plat->phy_type);
+       if (hsotg->uphy)
+               usb_phy_shutdown(hsotg->uphy);
+       else if (hsotg->plat && hsotg->plat->phy_exit)
+               hsotg->plat->phy_exit(pdev, hsotg->plat->phy_type);
        else {
-               phy_power_off(hsotg->s3c_hsotg->phy);
-               phy_exit(hsotg->s3c_hsotg->phy);
+               phy_power_off(hsotg->phy);
+               phy_exit(hsotg->phy);
        }
 }
 
@@ -2811,7 +2811,7 @@ static void s3c_hsotg_init(struct dwc2_hsotg *hsotg)
        writel(GUSBCFG_PHYIF16 | GUSBCFG_TOUTCAL(7) | (0x5 << 10),
               hsotg->regs + GUSBCFG);
 
-       writel(using_dma(hsotg->s3c_hsotg) ? GAHBCFG_DMA_EN : 0x0,
+       writel(using_dma(hsotg) ? GAHBCFG_DMA_EN : 0x0,
               hsotg->regs + GAHBCFG);
 }
 
@@ -2854,17 +2854,17 @@ static int s3c_hsotg_udc_start(struct usb_gadget 
*gadget,
        hsotg->gadget.dev.of_node = hsotg->dev->of_node;
        hsotg->gadget.speed = USB_SPEED_UNKNOWN;
 
-       if (!IS_ERR(hsotg->s3c_hsotg->clk))
-               clk_enable(hsotg->s3c_hsotg->clk);
+       if (!IS_ERR(hsotg->clk))
+               clk_enable(hsotg->clk);
 
-       ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->s3c_hsotg->supplies),
-                                   hsotg->s3c_hsotg->supplies);
+       ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
+                                   hsotg->supplies);
        if (ret) {
                dev_err(hsotg->dev, "failed to enable supplies: %d\n", ret);
                goto err;
        }
 
-       hsotg->s3c_hsotg->last_rst = jiffies;
+       hsotg->last_rst = jiffies;
        dev_info(hsotg->dev, "bound driver %s\n", driver->driver.name);
        return 0;
 
@@ -2891,7 +2891,7 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget,
                return -ENODEV;
 
        /* all endpoints should be shutdown */
-       for (ep = 1; ep < hsotg->s3c_hsotg->num_of_eps; ep++)
+       for (ep = 1; ep < hsotg->num_of_eps; ep++)
                s3c_hsotg_ep_disable(&hsotg->eps[ep].ep);
 
        spin_lock_irqsave(&hsotg->lock, flags);
@@ -2903,11 +2903,11 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget,
 
        spin_unlock_irqrestore(&hsotg->lock, flags);
 
-       regulator_bulk_disable(ARRAY_SIZE(hsotg->s3c_hsotg->supplies),
-                               hsotg->s3c_hsotg->supplies);
+       regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
+                               hsotg->supplies);
 
-       if (!IS_ERR(hsotg->s3c_hsotg->clk))
-               clk_disable(hsotg->s3c_hsotg->clk);
+       if (!IS_ERR(hsotg->clk))
+               clk_disable(hsotg->clk);
 
        return 0;
 }
@@ -2940,12 +2940,12 @@ static int s3c_hsotg_pullup(struct usb_gadget *gadget, 
int is_on)
        spin_lock_irqsave(&hsotg->lock, flags);
        if (is_on) {
                s3c_hsotg_phy_enable(hsotg);
-               if (!IS_ERR(hsotg->s3c_hsotg->clk))
-                       clk_enable(hsotg->s3c_hsotg->clk);
+               if (!IS_ERR(hsotg->clk))
+                       clk_enable(hsotg->clk);
                s3c_hsotg_core_init(hsotg);
        } else {
-               if (!IS_ERR(hsotg->s3c_hsotg->clk))
-                       clk_disable(hsotg->s3c_hsotg->clk);
+               if (!IS_ERR(hsotg->clk))
+                       clk_disable(hsotg->clk);
                s3c_hsotg_phy_disable(hsotg);
        }
 
@@ -3008,7 +3008,7 @@ static void s3c_hsotg_initep(struct dwc2_hsotg *hsotg,
         * to be something valid.
         */
 
-       if (using_dma(hsotg->s3c_hsotg)) {
+       if (using_dma(hsotg)) {
                u32 next = DXEPCTL_NEXTEP((epnum + 1) % 15);
                writel(next, hsotg->regs + DIEPCTL(epnum));
                writel(next, hsotg->regs + DOEPCTL(epnum));
@@ -3027,18 +3027,18 @@ static void s3c_hsotg_hw_cfg(struct dwc2_hsotg *hsotg)
        /* check hardware configuration */
 
        cfg2 = readl(hsotg->regs + 0x48);
-       hsotg->s3c_hsotg->num_of_eps = (cfg2 >> 10) & 0xF;
+       hsotg->num_of_eps = (cfg2 >> 10) & 0xF;
 
        cfg3 = readl(hsotg->regs + 0x4C);
-       hsotg->s3c_hsotg->fifo_mem = (cfg3 >> 16);
+       hsotg->fifo_mem = (cfg3 >> 16);
 
        cfg4 = readl(hsotg->regs + 0x50);
-       hsotg->s3c_hsotg->dedicated_fifos = (cfg4 >> 25) & 1;
+       hsotg->dedicated_fifos = (cfg4 >> 25) & 1;
 
        dev_info(hsotg->dev, "EPs: %d, %s fifos, %d entries in SPRAM\n",
-                hsotg->s3c_hsotg->num_of_eps,
-                hsotg->s3c_hsotg->dedicated_fifos ? "dedicated" : "shared",
-                hsotg->s3c_hsotg->fifo_mem);
+                hsotg->num_of_eps,
+                hsotg->dedicated_fifos ? "dedicated" : "shared",
+                hsotg->fifo_mem);
 }
 
 /**
@@ -3313,7 +3313,7 @@ static void s3c_hsotg_create_debug(struct dwc2_hsotg 
*hsotg)
        unsigned epidx;
 
        root = debugfs_create_dir(dev_name(hsotg->dev), NULL);
-       hsotg->s3c_hsotg->debug_root = root;
+       hsotg->debug_root = root;
        if (IS_ERR(root)) {
                dev_err(hsotg->dev, "cannot create debug root\n");
                return;
@@ -3321,21 +3321,21 @@ static void s3c_hsotg_create_debug(struct dwc2_hsotg 
*hsotg)
 
        /* create general state file */
 
-       hsotg->s3c_hsotg->debug_file = debugfs_create_file("state", 0444, root,
+       hsotg->debug_file = debugfs_create_file("state", 0444, root,
                                                hsotg, &state_fops);
 
-       if (IS_ERR(hsotg->s3c_hsotg->debug_file))
+       if (IS_ERR(hsotg->debug_file))
                dev_err(hsotg->dev, "%s: failed to create state\n", __func__);
 
-       hsotg->s3c_hsotg->debug_fifo = debugfs_create_file("fifo", 0444, root,
+       hsotg->debug_fifo = debugfs_create_file("fifo", 0444, root,
                                                hsotg, &fifo_fops);
 
-       if (IS_ERR(hsotg->s3c_hsotg->debug_fifo))
+       if (IS_ERR(hsotg->debug_fifo))
                dev_err(hsotg->dev, "%s: failed to create fifo\n", __func__);
 
        /* create one file for each endpoint */
 
-       for (epidx = 0; epidx < hsotg->s3c_hsotg->num_of_eps; epidx++) {
+       for (epidx = 0; epidx < hsotg->num_of_eps; epidx++) {
                struct s3c_hsotg_ep *ep = &hsotg->eps[epidx];
 
                ep->debugfs = debugfs_create_file(ep->name, 0444,
@@ -3357,14 +3357,14 @@ static void s3c_hsotg_delete_debug(struct dwc2_hsotg 
*hsotg)
 {
        unsigned epidx;
 
-       for (epidx = 0; epidx < hsotg->s3c_hsotg->num_of_eps; epidx++) {
+       for (epidx = 0; epidx < hsotg->num_of_eps; epidx++) {
                struct s3c_hsotg_ep *ep = &hsotg->eps[epidx];
                debugfs_remove(ep->debugfs);
        }
 
-       debugfs_remove(hsotg->s3c_hsotg->debug_file);
-       debugfs_remove(hsotg->s3c_hsotg->debug_fifo);
-       debugfs_remove(hsotg->s3c_hsotg->debug_root);
+       debugfs_remove(hsotg->debug_file);
+       debugfs_remove(hsotg->debug_fifo);
+       debugfs_remove(hsotg->debug_root);
 }
 
 /**
@@ -3375,23 +3375,17 @@ static void s3c_hsotg_delete_debug(struct dwc2_hsotg 
*hsotg)
 
 int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
 {
-       struct s3c_hsotg_plat *plat = hsotg->dev->platform_data;
+       struct device *dev = hsotg->dev;
+       struct s3c_hsotg_plat *plat = dev->platform_data;
        struct phy *phy;
        struct usb_phy *uphy;
-       struct device *dev = hsotg->dev;
        struct s3c_hsotg_ep *eps;
        int epnum;
        int ret;
        int i;
 
-       hsotg->s3c_hsotg = devm_kzalloc(dev, sizeof(struct s3c_hsotg), 
GFP_KERNEL);
-       if (!hsotg->s3c_hsotg) {
-               dev_err(dev, "cannot get memory\n");
-               return -ENOMEM;
-       }
-
        /* Set default UTMI width */
-       hsotg->s3c_hsotg->phyif = GUSBCFG_PHYIF16;
+       hsotg->phyif = GUSBCFG_PHYIF16;
 
        /*
         * Attempt to find a generic PHY, then look for an old style
@@ -3408,44 +3402,44 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
                                "no platform data or transceiver defined\n");
                                return -EPROBE_DEFER;
                        }
-                       hsotg->s3c_hsotg->plat = plat;
+                       hsotg->plat = plat;
                } else
-                       hsotg->s3c_hsotg->uphy = uphy;
+                       hsotg->uphy = uphy;
        } else {
-               hsotg->s3c_hsotg->phy = phy;
+               hsotg->phy = phy;
                /*
                 * If using the generic PHY framework, check if the PHY bus
                 * width is 8-bit and set the phyif appropriately.
                 */
                if (phy_get_bus_width(phy) == 8)
-                       hsotg->s3c_hsotg->phyif = GUSBCFG_PHYIF8;
+                       hsotg->phyif = GUSBCFG_PHYIF8;
        }
 
-       hsotg->s3c_hsotg->clk = devm_clk_get(dev, "otg");
-       if (IS_ERR(hsotg->s3c_hsotg->clk))
+       hsotg->clk = devm_clk_get(dev, "otg");
+       if (IS_ERR(hsotg->clk))
                dev_warn(dev, "cannot get otg clock\n");
 
        hsotg->gadget.max_speed = USB_SPEED_HIGH;
        hsotg->gadget.ops = &s3c_hsotg_gadget_ops;
        hsotg->gadget.name = dev_name(dev);
 
-       if (!IS_ERR(hsotg->s3c_hsotg->clk))
-               clk_prepare_enable(hsotg->s3c_hsotg->clk);
+       if (!IS_ERR(hsotg->clk))
+               clk_prepare_enable(hsotg->clk);
 
        /* regulators */
 
-       for (i = 0; i < ARRAY_SIZE(hsotg->s3c_hsotg->supplies); i++)
-               hsotg->s3c_hsotg->supplies[i].supply = 
s3c_hsotg_supply_names[i];
+       for (i = 0; i < ARRAY_SIZE(hsotg->supplies); i++)
+               hsotg->supplies[i].supply = s3c_hsotg_supply_names[i];
 
-       ret = devm_regulator_bulk_get(dev, 
ARRAY_SIZE(hsotg->s3c_hsotg->supplies),
-                                hsotg->s3c_hsotg->supplies);
+       ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(hsotg->supplies),
+                                hsotg->supplies);
        if (ret) {
                dev_err(dev, "failed to request supplies: %d\n", ret);
                goto err_clk;
        }
 
-       ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->s3c_hsotg->supplies),
-                                   hsotg->s3c_hsotg->supplies);
+       ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
+                                   hsotg->supplies);
 
        if (ret) {
                dev_err(dev, "failed to enable supplies: %d\n", ret);
@@ -3463,23 +3457,23 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
                        dev_name(dev), hsotg);
        if (ret < 0) {
                s3c_hsotg_phy_disable(hsotg);
-               if (!IS_ERR(hsotg->s3c_hsotg->clk))
-                       clk_disable_unprepare(hsotg->s3c_hsotg->clk);
-               regulator_bulk_disable(ARRAY_SIZE(hsotg->s3c_hsotg->supplies),
-                                      hsotg->s3c_hsotg->supplies);
+               if (!IS_ERR(hsotg->clk))
+                       clk_disable_unprepare(hsotg->clk);
+               regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
+                                      hsotg->supplies);
                dev_err(dev, "cannot claim IRQ\n");
                goto err_clk;
        }
 
        /* hsotg->num_of_eps holds number of EPs other than ep0 */
 
-       if (hsotg->s3c_hsotg->num_of_eps == 0) {
+       if (hsotg->num_of_eps == 0) {
                dev_err(dev, "wrong number of EPs (zero)\n");
                ret = -EINVAL;
                goto err_supplies;
        }
 
-       eps = kcalloc(hsotg->s3c_hsotg->num_of_eps + 1, sizeof(struct 
s3c_hsotg_ep),
+       eps = kcalloc(hsotg->num_of_eps + 1, sizeof(struct s3c_hsotg_ep),
                      GFP_KERNEL);
        if (!eps) {
                dev_err(dev, "cannot get memory\n");
@@ -3496,22 +3490,22 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
 
        /* allocate EP0 request */
 
-       hsotg->s3c_hsotg->ctrl_req = 
s3c_hsotg_ep_alloc_request(&hsotg->eps[0].ep,
+       hsotg->ctrl_req = s3c_hsotg_ep_alloc_request(&hsotg->eps[0].ep,
                                                     GFP_KERNEL);
-       if (!hsotg->s3c_hsotg->ctrl_req) {
+       if (!hsotg->ctrl_req) {
                dev_err(dev, "failed to allocate ctrl req\n");
                ret = -ENOMEM;
                goto err_ep_mem;
        }
 
        /* initialise the endpoints now the core has been initialised */
-       for (epnum = 0; epnum < hsotg->s3c_hsotg->num_of_eps; epnum++)
+       for (epnum = 0; epnum < hsotg->num_of_eps; epnum++)
                s3c_hsotg_initep(hsotg, &hsotg->eps[epnum], epnum);
 
        /* disable power and clock */
 
-       ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->s3c_hsotg->supplies),
-                                   hsotg->s3c_hsotg->supplies);
+       ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
+                                    hsotg->supplies);
        if (ret) {
                dev_err(dev, "failed to disable supplies: %d\n", ret);
                goto err_ep_mem;
@@ -3534,8 +3528,8 @@ err_ep_mem:
 err_supplies:
        s3c_hsotg_phy_disable(hsotg);
 err_clk:
-       if (!IS_ERR(hsotg->s3c_hsotg->clk))
-               clk_disable_unprepare(hsotg->s3c_hsotg->clk);
+       if (!IS_ERR(hsotg->clk))
+               clk_disable_unprepare(hsotg->clk);
 
        return ret;
 }
@@ -3555,8 +3549,8 @@ int s3c_hsotg_remove(struct dwc2_hsotg *hsotg)
                usb_gadget_unregister_driver(hsotg->driver);
        }
 
-       if (!IS_ERR(hsotg->s3c_hsotg->clk))
-               clk_disable_unprepare(hsotg->s3c_hsotg->clk);
+       if (!IS_ERR(hsotg->clk))
+               clk_disable_unprepare(hsotg->clk);
 
        return 0;
 }
@@ -3578,14 +3572,14 @@ int s3c_hsotg_suspend(struct dwc2_hsotg *hsotg)
 
        if (hsotg->driver) {
                int ep;
-               for (ep = 0; ep < hsotg->s3c_hsotg->num_of_eps; ep++)
+               for (ep = 0; ep < hsotg->num_of_eps; ep++)
                        s3c_hsotg_ep_disable(&hsotg->eps[ep].ep);
 
-               ret = 
regulator_bulk_disable(ARRAY_SIZE(hsotg->s3c_hsotg->supplies),
-                                            hsotg->s3c_hsotg->supplies);
+               ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
+                                            hsotg->supplies);
 
-               if (!IS_ERR(hsotg->s3c_hsotg->clk))
-                       clk_disable(hsotg->s3c_hsotg->clk);
+               if (!IS_ERR(hsotg->clk))
+                       clk_disable(hsotg->clk);
        }
 
        return ret;
@@ -3600,14 +3594,14 @@ int s3c_hsotg_resume(struct dwc2_hsotg *hsotg)
                dev_info(hsotg->dev, "resuming usb gadget %s\n",
                         hsotg->driver->driver.name);
 
-               if (!IS_ERR(hsotg->s3c_hsotg->clk))
-                       clk_enable(hsotg->s3c_hsotg->clk);
-               ret = 
regulator_bulk_enable(ARRAY_SIZE(hsotg->s3c_hsotg->supplies),
-                                     hsotg->s3c_hsotg->supplies);
+               if (!IS_ERR(hsotg->clk))
+                       clk_enable(hsotg->clk);
+               ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
+                                           hsotg->supplies);
        }
 
        spin_lock_irqsave(&hsotg->lock, flags);
-       hsotg->s3c_hsotg->last_rst = jiffies;
+       hsotg->last_rst = jiffies;
        s3c_hsotg_phy_enable(hsotg);
        s3c_hsotg_core_init(hsotg);
        spin_unlock_irqrestore(&hsotg->lock, flags);

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to