USB: gadget: f_uac2: Fix broken prm to uac2 mapping
authorJassi Brar <jaswinder.singh@linaro.org>
Thu, 30 May 2013 12:53:33 +0000 (18:23 +0530)
committerFelipe Balbi <balbi@ti.com>
Mon, 10 Jun 2013 14:10:23 +0000 (17:10 +0300)
prm_to_uac2() is broken because it tests against pointer it itself
mapped onto, which will never be different.
Fix the mapping by adding pointer to parent chip in each rtd param
and removing the prm_to_uac2().

Reported-by: Julien Rouviere <jrouviere@qualistream.com>
Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/f_uac2.c

index 03c1fb686644e02d34b5b0f4a9c8e847d6a6de27..2f23566e53d88bf7fd618efcc100b49447c0cf27 100644 (file)
@@ -90,6 +90,7 @@ struct uac2_req {
 };
 
 struct uac2_rtd_params {
+       struct snd_uac2_chip *uac2; /* parent chip */
        bool ep_enabled; /* if the ep is enabled */
        /* Size of the ring buffer */
        size_t dma_bytes;
@@ -168,18 +169,6 @@ struct snd_uac2_chip *pdev_to_uac2(struct platform_device *p)
        return container_of(p, struct snd_uac2_chip, pdev);
 }
 
-static inline
-struct snd_uac2_chip *prm_to_uac2(struct uac2_rtd_params *r)
-{
-       struct snd_uac2_chip *uac2 = container_of(r,
-                                       struct snd_uac2_chip, c_prm);
-
-       if (&uac2->c_prm != r)
-               uac2 = container_of(r, struct snd_uac2_chip, p_prm);
-
-       return uac2;
-}
-
 static inline
 uint num_channels(uint chanmask)
 {
@@ -204,7 +193,7 @@ agdev_iso_complete(struct usb_ep *ep, struct usb_request *req)
        struct uac2_req *ur = req->context;
        struct snd_pcm_substream *substream;
        struct uac2_rtd_params *prm = ur->pp;
-       struct snd_uac2_chip *uac2 = prm_to_uac2(prm);
+       struct snd_uac2_chip *uac2 = prm->uac2;
 
        /* i/f shutting down */
        if (!prm->ep_enabled)
@@ -894,7 +883,7 @@ struct cntrl_range_lay3 {
 static inline void
 free_ep(struct uac2_rtd_params *prm, struct usb_ep *ep)
 {
-       struct snd_uac2_chip *uac2 = prm_to_uac2(prm);
+       struct snd_uac2_chip *uac2 = prm->uac2;
        int i;
 
        prm->ep_enabled = false;
@@ -970,6 +959,9 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
        }
        agdev->in_ep->driver_data = agdev;
 
+       uac2->p_prm.uac2 = uac2;
+       uac2->c_prm.uac2 = uac2;
+
        hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
        hs_epout_desc.wMaxPacketSize = fs_epout_desc.wMaxPacketSize;
        hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;