> From: [email protected]
> [mailto:[email protected]] On Behalf Of Paul Zimmerman
> Sent: Friday, August 01, 2014 11:49 AM
>
> > From: [email protected] [mailto:[email protected]]
> > 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 <[email protected]>
> > ---
> > 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html