usb: gadget: pch_udc: switch over to usb_gadget_map/unmap_request()
PATCH 1/4 usb: gadget: pch_udc: switch over to usb_gadget_map/unmap_request()
We have generic implementations for a reason, let's use them.
Signed-off-by Andy Shevchenko <[email protected]>
--- drivers/usb/gadget/udc/pch_udc.c | 78 +++----------------------------- 1 file changed, 6 insertions(+), 72 deletions(-)
drivers/usb/gadget/udc/pch_udc.c +6 -72
@@ -383,11 +383,8 @@ MODULE_PARM_DESC(speed_fs, "true for Full speed operation");* @td_data_last: last dma desc. of chain * @queue: associated queue * @dma_going: DMA in progress for request -* @dma_mapped: DMA memory mapped for request * @dma_done: DMA completed for request * @chain_len: chain length -* @buf: Buffer memory for align adjustment -* @dma: DMA memory for align adjustment */ struct pch_udc_request {struct usb_request req;
@@ -396,11 +393,8 @@ struct pch_udc_request {struct pch_udc_data_dma_desc *td_data_last;struct list_head queue; unsigned dma_going:1, - dma_mapped:1, dma_done:1;unsigned chain_len; -void *buf; -dma_addr_t dma; };static inline u32 pch_udc_readl (struct pch_udc_dev *dev,unsigned long reg)
@@ -1482,33 +1476,7 @@ static void complete_req(struct pch_udc_ep *ep, struct pch_udc_request *req, status = req->req.status; dev = ep->dev; -if (req->dma_mapped) { -if (req->dma ==DMA_ADDR_INVALID ) { -if (ep->in) -dma_unmap_single (&dev->pdev->dev, req->req.dma, - req->req.length, -DMA_TO_DEVICE ); -else -dma_unmap_single (&dev->pdev->dev, req->req.dma, - req->req.length, -DMA_FROM_DEVICE ); - req->req.dma =DMA_ADDR_INVALID ; - }else { -if (ep->in) -dma_unmap_single (&dev->pdev->dev, req->dma, - req->req.length, -DMA_TO_DEVICE ); -else { -dma_unmap_single (&dev->pdev->dev, req->dma, - req->req.length, -DMA_FROM_DEVICE ); -memcpy (req->req.buf, req->buf, req->req.length); - } -kfree (req->buf); - req->dma =DMA_ADDR_INVALID ; - } - req->dma_mapped =0 ; - } +usb_gadget_unmap_request (&dev->gadget, &req->req, ep->in); ep->halted =1 ;spin_unlock (&dev->lock);if (!ep->in)
@@ -1586,12 +1554,9 @@ static int pch_udc_create_dma_chain(struct pch_udc_ep *ep,if (req->chain_len >1 )pch_udc_free_dma_chain (ep->dev, req); -if (req->dma ==DMA_ADDR_INVALID ) - td->dataptr = req->req.dma; -else - td->dataptr = req->dma; - + td->dataptr = req->req.dma; td->status =PCH_UDC_BS_HST_BSY ; +for (; ; bytes -= buf_len, ++len) { td->status =PCH_UDC_BS_HST_BSY |min (buf_len, bytes);if (bytes <= buf_len)
@@ -1797,7 +1762,6 @@ static struct usb_request *pch_udc_alloc_request(struct usb_ep *usbep,if (!req)return NULL ; req->req.dma =DMA_ADDR_INVALID ; - req->dma =DMA_ADDR_INVALID ;INIT_LIST_HEAD (&req->queue);if (!ep->dev->dma_addr)return &req->req;
@@ -1880,39 +1844,9 @@ static int pch_udc_pcd_queue(struct usb_ep *usbep, struct usb_request *usbreq,return -ESHUTDOWN ;spin_lock_irqsave (&dev->lock, iflags);/* map the buffer for dma */ -if (usbreq->length && - ((usbreq->dma ==DMA_ADDR_INVALID ) || !usbreq->dma)) { -if (!((unsigned long )(usbreq->buf) &0x03 )) { -if (ep->in) - usbreq->dma =dma_map_single (&dev->pdev->dev, - usbreq->buf, - usbreq->length, -DMA_TO_DEVICE ); -else - usbreq->dma =dma_map_single (&dev->pdev->dev, - usbreq->buf, - usbreq->length, -DMA_FROM_DEVICE ); - }else { - req->buf =kzalloc (usbreq->length,GFP_ATOMIC ); -if (!req->buf) { - retval = -ENOMEM ; - goto probe_end; - } -if (ep->in) { -memcpy (req->buf, usbreq->buf, usbreq->length); - req->dma =dma_map_single (&dev->pdev->dev, - req->buf, - usbreq->length, -DMA_TO_DEVICE ); - }else - req->dma =dma_map_single (&dev->pdev->dev, - req->buf, - usbreq->length, -DMA_FROM_DEVICE ); - } - req->dma_mapped =1 ; - } + retval =usb_gadget_map_request (&dev->gadget, usbreq, ep->in); +if (retval) + goto probe_end;if (usbreq->length >0 ) { retval =prepare_dma (ep, req,GFP_ATOMIC );if (retval)
Signature · 1 line
2.30.2
PATCH 2/4 usb: gadget: pch_udc: Remove CONFIG_PM_SLEEP ifdefery
Use __maybe_unused for the suspend()/resume() hooks and get rid of the CONFIG_PM_SLEEP ifdefery to improve the code.
Signed-off-by Andy Shevchenko <[email protected]>
--- drivers/usb/gadget/udc/pch_udc.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/usb/gadget/udc/pch_udc.c +3 -8
@@ -3026,8 +3026,7 @@ static void pch_udc_remove(struct pci_dev *pdev)pch_udc_exit (dev); } -#ifdef CONFIG_PM_SLEEP -static int pch_udc_suspend (struct device *d) +static int __maybe_unused pch_udc_suspend (struct device *d) {struct pch_udc_dev *dev =dev_get_drvdata (d);
@@ -3037,16 +3036,12 @@ static int pch_udc_suspend(struct device *d)return 0 ; } -static int pch_udc_resume (struct device *d) +static int __maybe_unused pch_udc_resume (struct device *d) {return 0 ; } static SIMPLE_DEV_PM_OPS(pch_udc_pm, pch_udc_suspend, pch_udc_resume); -#define PCH_UDC_PM_OPS (&pch_udc_pm) -#else -#define PCH_UDC_PM_OPS NULL -#endif /* CONFIG_PM_SLEEP */ static int pch_udc_probe (struct pci_dev *pdev,const struct pci_device_id *id)
@@ -3156,7 +3151,7 @@ static struct pci_driver pch_udc_driver = { .remove = pch_udc_remove, .shutdown = pch_udc_shutdown, .driver = { - .pm = PCH_UDC_PM_OPS, + .pm = &pch_udc_pm, }, };
Signature · 1 line
2.30.2
PATCH 3/4 usb: gadget: pch_udc: Use PCI sub IDs instead of DMI
In reply to Andy ShevchenkoWe don't need DMI to identify Intel Minnowboard (v1) since it has properly set PCI sub IDs. So, drop unneeded DMI level of identification.
Signed-off-by Andy Shevchenko <[email protected]>
--- drivers/usb/gadget/udc/pch_udc.c | 91 +++++++++++++++----------------- 1 file changed, 44 insertions(+), 47 deletions(-)
drivers/usb/gadget/udc/pch_udc.c +44 -47
@@ -7,7 +7,6 @@#include <linux/module.h> #include <linux/pci.h> #include <linux/delay.h> -#include <linux/dmi.h> #include <linux/errno.h> #include <linux/gpio/consumer.h> #include <linux/gpio/machine.h>
@@ -1356,43 +1355,6 @@ static irqreturn_t pch_vbus_gpio_irq(int irq, void *data)return IRQ_HANDLED ; } -static struct gpiod_lookup_table minnowboard_udc_gpios = { - .dev_id ="0000:02:02.4" , - .table = { -GPIO_LOOKUP ("sch_gpio.33158" ,12 ,NULL ,GPIO_ACTIVE_HIGH ), - {} - }, -}; - -static const struct dmi_system_id pch_udc_gpio_dmi_table[] = { - { - .ident ="MinnowBoard" , - .matches = { -DMI_MATCH (DMI_BOARD_NAME ,"MinnowBoard" ), - }, - .driver_data = &minnowboard_udc_gpios, - }, - { } -}; - -static void pch_vbus_gpio_remove_table (void *table) -{ -gpiod_remove_lookup_table (table); -} - -static int pch_vbus_gpio_add_table (struct pch_udc_dev *dev) -{ -struct device *d = &dev->pdev->dev; -const struct dmi_system_id *dmi; - - dmi =dmi_first_match (pch_udc_gpio_dmi_table); -if (!dmi) -return 0 ; - -gpiod_add_lookup_table (dmi->driver_data); -return devm_add_action_or_reset (d, pch_vbus_gpio_remove_table, dmi->driver_data); -} -/** * pch_vbus_gpio_init() - This API initializes GPIO port detecting VBUS. * @dev: Reference to the driver structure
@@ -1411,10 +1373,6 @@ static int pch_vbus_gpio_init(struct pch_udc_dev *dev) dev->vbus_gpio.port =NULL ; dev->vbus_gpio.intr =0 ; - err =pch_vbus_gpio_add_table (dev); -if (err) -return err; -/* Retrieve the GPIO line from the USB gadget device */ gpiod =devm_gpiod_get_optional (d,NULL ,GPIOD_IN );if (IS_ERR (gpiod))
@@ -2867,7 +2825,7 @@ static void pch_udc_pcd_reinit(struct pch_udc_dev *dev)* * Return codes: * 0: Success -* -%ERRNO: All kind of errors when retrieving VBUS GPIO +* -ERRNO: All kind of errors when retrieving VBUS GPIO */ static int pch_udc_pcd_init (struct pch_udc_dev *dev) {
@@ -2978,6 +2936,30 @@ static int pch_udc_stop(struct usb_gadget *g)return 0 ; } +static void pch_vbus_gpio_remove_table (void *table) +{ +gpiod_remove_lookup_table (table); +} + +static int pch_vbus_gpio_add_table (struct device *d,void *table) +{ +gpiod_add_lookup_table (table); +return devm_add_action_or_reset (d, pch_vbus_gpio_remove_table, table); +} + +static struct gpiod_lookup_table pch_udc_minnow_vbus_gpio_table = { + .dev_id ="0000:02:02.4" , + .table = { +GPIO_LOOKUP ("sch_gpio.33158" ,12 ,NULL ,GPIO_ACTIVE_HIGH ), + {} + }, +}; + +static int pch_udc_minnow_platform_init (struct device *d) +{ +return pch_vbus_gpio_add_table (d, &pch_udc_minnow_vbus_gpio_table); +} +static void pch_udc_shutdown (struct pci_dev *pdev) {struct pch_udc_dev *dev =pci_get_drvdata (pdev);
@@ -3043,9 +3025,11 @@ static int __maybe_unused pch_udc_resume(struct device *d) static SIMPLE_DEV_PM_OPS(pch_udc_pm, pch_udc_suspend, pch_udc_resume); -static int pch_udc_probe (struct pci_dev *pdev, -const struct pci_device_id *id) +typedef int (*platform_init_fn )(struct device *); + +static int pch_udc_probe (struct pci_dev *pdev,const struct pci_device_id *id) { +platform_init_fn platform_init = (platform_init_fn )id->driver_data;int bar;int retval;struct pch_udc_dev *dev;
@@ -3063,6 +3047,13 @@ static int pch_udc_probe(struct pci_dev *pdev, dev->pdev = pdev;pci_set_drvdata (pdev, dev); +/* Platform specific hook */ +if (platform_init) { + retval =platform_init (&pdev->dev); +if (retval) +return retval; + } +/* Determine BAR based on PCI ID */ if (id->device ==PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC ) bar =PCH_UDC_PCI_BAR_QUARK_X1000 ;
@@ -3119,10 +3110,16 @@ static int pch_udc_probe(struct pci_dev *pdev,static const struct pci_device_id pch_udc_pcidev_id[] = { { -PCI_DEVICE (PCI_VENDOR_ID_INTEL , -PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC ), +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC ), + .class =PCI_CLASS_SERIAL_USB_DEVICE , + .class_mask =0xffffffff , + }, + { +PCI_DEVICE_SUB (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_EG20T_UDC , +PCI_VENDOR_ID_CIRCUITCO ,PCI_SUBSYSTEM_ID_CIRCUITCO_MINNOWBOARD ), .class =PCI_CLASS_SERIAL_USB_DEVICE , .class_mask =0xffffffff , + .driver_data = (kernel_ulong_t)&pch_udc_minnow_platform_init, }, {PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_EG20T_UDC ),
Signature · 1 line
2.30.2
PATCH 4/4 usb: gadget: pch_udc: Convert Intel Quark quirk to use driver data
In reply to Andy ShevchenkoUnify quirks, in particular one for Intel Quark, to use driver data and accompanying infrastructure.
Signed-off-by Andy Shevchenko <[email protected]>
--- drivers/usb/gadget/udc/pch_udc.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
drivers/usb/gadget/udc/pch_udc.c +14 -9
@@ -332,6 +332,7 @@ struct pch_vbus_gpio_data {* @dma_addr: DMA pool for received * @setup_data: Received setup data * @base_addr: for mapped device memory +* @bar: PCI BAR used for mapped device memory * @cfg_data: current cfg, intf, and alt in use * @vbus_gpio: GPIO informaton for detecting VBUS */
@@ -354,6 +355,7 @@ struct pch_udc_dev {dma_addr_t dma_addr;struct usb_ctrlrequest setup_data;void __iomem *base_addr; +unsigned short bar;struct pch_udc_cfg_data cfg_data;struct pch_vbus_gpio_data vbus_gpio; };
@@ -2960,6 +2962,14 @@ static int pch_udc_minnow_platform_init(struct device *d)return pch_vbus_gpio_add_table (d, &pch_udc_minnow_vbus_gpio_table); } +static int pch_udc_quark_platform_init (struct device *d) +{ +struct pch_udc_dev *dev =dev_get_drvdata (d); + + dev->bar =PCH_UDC_PCI_BAR_QUARK_X1000 ; +return 0 ; +} +static void pch_udc_shutdown (struct pci_dev *pdev) {struct pch_udc_dev *dev =pci_get_drvdata (pdev);
@@ -3030,7 +3040,6 @@ typedef int (*platform_init_fn)(struct device *);static int pch_udc_probe (struct pci_dev *pdev,const struct pci_device_id *id) {platform_init_fn platform_init = (platform_init_fn )id->driver_data; -int bar;int retval;struct pch_udc_dev *dev;
@@ -3044,6 +3053,7 @@ static int pch_udc_probe(struct pci_dev *pdev, const struct pci_device_id *id)if (retval)return retval; + dev->bar =PCH_UDC_PCI_BAR ; dev->pdev = pdev;pci_set_drvdata (pdev, dev);
@@ -3054,18 +3064,12 @@ static int pch_udc_probe(struct pci_dev *pdev, const struct pci_device_id *id)return retval; } -/* Determine BAR based on PCI ID */ -if (id->device ==PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC ) - bar =PCH_UDC_PCI_BAR_QUARK_X1000 ; -else - bar =PCH_UDC_PCI_BAR ; -/* PCI resource allocation */ - retval =pcim_iomap_regions (pdev,1 << bar,pci_name (pdev)); + retval =pcim_iomap_regions (pdev,BIT (dev->bar),pci_name (pdev));if (retval)return retval; - dev->base_addr =pcim_iomap_table (pdev)[bar]; + dev->base_addr =pcim_iomap_table (pdev)[dev->bar];/* initialize the hardware */ retval =pch_udc_pcd_init (dev);
@@ -3113,6 +3117,7 @@ static const struct pci_device_id pch_udc_pcidev_id[] = { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC), .class = PCI_CLASS_SERIAL_USB_DEVICE, .class_mask = 0xffffffff, + .driver_data = (kernel_ulong_t)&pch_udc_quark_platform_init, }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC,
Signature · 1 line
2.30.2