diff options
Diffstat (limited to 'drivers/usb/gadget/udc/core.c')
-rw-r--r-- | drivers/usb/gadget/udc/core.c | 20 |
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 | } |
844 | EXPORT_SYMBOL_GPL(usb_gadget_unmap_request_by_dev); | 847 | EXPORT_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 | */ |
1134 | int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget, | 1138 | int 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 | ||
1199 | err2: | 1205 | err2: |
1200 | put_device(&gadget->dev); | ||
1201 | kfree(udc); | 1206 | kfree(udc); |
1202 | 1207 | ||
1203 | err1: | 1208 | err1: |
1209 | put_device(&gadget->dev); | ||
1204 | return ret; | 1210 | return ret; |
1205 | } | 1211 | } |
1206 | EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release); | 1212 | EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release); |