On Thu, Apr 04, 2013 at 09:50:09PM +0200, Daniel Mack wrote: > The musb struct is currently allocated along with the hcd, which makes > it difficult to build a driver that only acts as gadget device. > > Fix this by allocation musb directly, and keep the hcd around as pointer. Fix this by *allocating* > struct hc_driver musb_hc_driver can now also be static to musb_host.c, > and the macro musb_to_hcd() is just a pointer dereferencer for now, and > will be elminiated later. > > Signed-off-by: Daniel Mack <zonque@xxxxxxxxx> > --- > drivers/usb/musb/musb_core.c | 60 ++++++++++++++++++-------------------- > drivers/usb/musb/musb_core.h | 1 + > drivers/usb/musb/musb_gadget.c | 10 ------- > drivers/usb/musb/musb_host.c | 65 ++++++++++++++++++++++++++++++++++++++++-- > drivers/usb/musb/musb_host.h | 21 +++++++------- > 5 files changed, 102 insertions(+), 55 deletions(-) > > diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c > index 37a261a..d5e9794 100644 > --- a/drivers/usb/musb/musb_core.c > +++ b/drivers/usb/musb/musb_core.c > @@ -404,7 +404,8 @@ void musb_hnp_stop(struct musb *musb) > break; > case OTG_STATE_B_HOST: > dev_dbg(musb->controller, "HNP: Disabling HR\n"); > - hcd->self.is_b_host = 0; > + if (hcd) > + hcd->self.is_b_host = 0; > musb->xceiv->state = OTG_STATE_B_PERIPHERAL; > MUSB_DEV_MODE(musb); > reg = musb_readb(mbase, MUSB_POWER); > @@ -484,7 +485,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, > > musb->xceiv->state = OTG_STATE_A_HOST; > musb->is_active = 1; > - usb_hcd_resume_root_hub(musb_to_hcd(musb)); > + musb_host_resume_root_hub(musb); this small re-factoring should be done in a separate patch coming before $subject. > @@ -734,17 +736,13 @@ b_host: > if ((devctl & MUSB_DEVCTL_VBUS) > == (3 << MUSB_DEVCTL_VBUS_SHIFT)) { > musb->xceiv->state = OTG_STATE_A_HOST; > - hcd->self.is_b_host = 0; > + if (hcd) > + hcd->self.is_b_host = 0; > } > break; > } > > - /* poke the root hub */ > - MUSB_HST_MODE(musb); > - if (hcd->status_urb) > - usb_hcd_poll_rh_status(hcd); > - else > - usb_hcd_resume_root_hub(hcd); > + musb_host_poke_root_hub(musb); likewise for this one. > @@ -1763,24 +1762,18 @@ static struct musb *allocate_instance(struct device *dev, > struct musb *musb; > struct musb_hw_ep *ep; > int epnum; > - struct usb_hcd *hcd; > + int ret; > > - hcd = usb_create_hcd(&musb_hc_driver, dev, dev_name(dev)); > - if (!hcd) > + musb = kzalloc(sizeof(*musb), GFP_KERNEL); devm_* ? Or perhaps in a later patch. > +void musb_host_cleanup(struct musb *musb) > +{ > + usb_remove_hcd(musb->hcd); > + musb->hcd = NULL; > +} > + > +void musb_host_free(struct musb *musb) > +{ > + usb_put_hcd(musb->hcd); > +} > + > +void musb_host_resume_root_hub(struct musb *musb) > +{ > + usb_hcd_resume_root_hub(musb->hcd); > +} > + > +void musb_host_poll_rh_status(struct musb *musb) > +{ > + usb_hcd_poll_rh_status(musb->hcd); > +} > + > +void musb_host_poke_root_hub(struct musb *musb) > +{ > + MUSB_HST_MODE(musb); > + if (musb->hcd->status_urb) > + usb_hcd_poll_rh_status(musb->hcd); > + else > + usb_hcd_resume_root_hub(musb->hcd); > +} no need to check for NULL hcd in any of these ? I guess you're relying on those being stubbed out when Host isn't compiled in, am I right ? just being sure... > diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h > index 9670269..fb24422 100644 > --- a/drivers/usb/musb/musb_host.h > +++ b/drivers/usb/musb/musb_host.h > @@ -37,15 +37,9 @@ > > #include <linux/scatterlist.h> > > -static inline struct usb_hcd *musb_to_hcd(struct musb *musb) > -{ > - return container_of((void *) musb, struct usb_hcd, hcd_priv); > -} > +#define musb_to_hcd(MUSB) ((MUSB)->hcd) all lower cases, please. -- balbi
Attachment:
signature.asc
Description: Digital signature