aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/udc/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/udc/core.c')
-rw-r--r--drivers/usb/gadget/udc/core.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
index e6f04eee95c4..75c51ca4ee0f 100644
--- a/drivers/usb/gadget/udc/core.c
+++ b/drivers/usb/gadget/udc/core.c
@@ -812,6 +812,8 @@ int usb_gadget_map_request_by_dev(struct device *dev,
812 dev_err(dev, "failed to map buffer\n"); 812 dev_err(dev, "failed to map buffer\n");
813 return -EFAULT; 813 return -EFAULT;
814 } 814 }
815
816 req->dma_mapped = 1;
815 } 817 }
816 818
817 return 0; 819 return 0;
@@ -836,9 +838,10 @@ void usb_gadget_unmap_request_by_dev(struct device *dev,
836 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 838 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
837 839
838 req->num_mapped_sgs = 0; 840 req->num_mapped_sgs = 0;
839 } else { 841 } else if (req->dma_mapped) {
840 dma_unmap_single(dev, req->dma, req->length, 842 dma_unmap_single(dev, req->dma, req->length,
841 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 843 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
844 req->dma_mapped = 0;
842 } 845 }
843} 846}
844EXPORT_SYMBOL_GPL(usb_gadget_unmap_request_by_dev); 847EXPORT_SYMBOL_GPL(usb_gadget_unmap_request_by_dev);
@@ -1130,6 +1133,7 @@ static int check_pending_gadget_drivers(struct usb_udc *udc)
1130 * @release: a gadget release function. 1133 * @release: a gadget release function.
1131 * 1134 *
1132 * Returns zero on success, negative errno otherwise. 1135 * Returns zero on success, negative errno otherwise.
1136 * Calls the gadget release function in the latter case.
1133 */ 1137 */
1134int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget, 1138int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
1135 void (*release)(struct device *dev)) 1139 void (*release)(struct device *dev))
@@ -1137,10 +1141,6 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
1137 struct usb_udc *udc; 1141 struct usb_udc *udc;
1138 int ret = -ENOMEM; 1142 int ret = -ENOMEM;
1139 1143
1140 udc = kzalloc(sizeof(*udc), GFP_KERNEL);
1141 if (!udc)
1142 goto err1;
1143
1144 dev_set_name(&gadget->dev, "gadget"); 1144 dev_set_name(&gadget->dev, "gadget");
1145 INIT_WORK(&gadget->work, usb_gadget_state_work); 1145 INIT_WORK(&gadget->work, usb_gadget_state_work);
1146 gadget->dev.parent = parent; 1146 gadget->dev.parent = parent;
@@ -1150,7 +1150,13 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
1150 else 1150 else
1151 gadget->dev.release = usb_udc_nop_release; 1151 gadget->dev.release = usb_udc_nop_release;
1152 1152
1153 ret = device_register(&gadget->dev); 1153 device_initialize(&gadget->dev);
1154
1155 udc = kzalloc(sizeof(*udc), GFP_KERNEL);
1156 if (!udc)
1157 goto err1;
1158
1159 ret = device_add(&gadget->dev);
1154 if (ret) 1160 if (ret)
1155 goto err2; 1161 goto err2;
1156 1162
@@ -1197,10 +1203,10 @@ err3:
1197 device_del(&gadget->dev); 1203 device_del(&gadget->dev);
1198 1204
1199err2: 1205err2:
1200 put_device(&gadget->dev);
1201 kfree(udc); 1206 kfree(udc);
1202 1207
1203err1: 1208err1:
1209 put_device(&gadget->dev);
1204 return ret; 1210 return ret;
1205} 1211}
1206EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release); 1212EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release);