Skip to content

Commit 6d2d91b

Browse files
committed
Merge tag 'usb-4.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB fixes from Greg KH: "Here are a number of USB fixes and new device ids for 4.4-rc2. All have been in linux-next and the details are in the shortlog" * tag 'usb-4.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (28 commits) usblp: do not set TASK_INTERRUPTIBLE before lock USB: MAINTAINERS: cxacru usb: kconfig: fix warning of select USB_OTG USB: option: add XS Stick W100-2 from 4G Systems xhci: Fix a race in usb2 LPM resume, blocking U3 for usb2 devices usb: xhci: fix checking ep busy for CFC xhci: Workaround to get Intel xHCI reset working more reliably usb: chipidea: imx: fix a possible NULL dereference usb: chipidea: usbmisc_imx: fix a possible NULL dereference usb: chipidea: otg: gadget module load and unload support usb: chipidea: debug: disable usb irq while role switch ARM: dts: imx27.dtsi: change the clock information for usb usb: chipidea: imx: refine clock operations to adapt for all platforms usb: gadget: atmel_usba_udc: Expose correct device speed usb: musb: enable usb_dma parameter usb: phy: phy-mxs-usb: fix a possible NULL dereference usb: dwc3: gadget: let us set lower max_speed usb: musb: fix tx fifo flush handling usb: gadget: f_loopback: fix the warning during the enumeration usb: dwc2: host: Fix remote wakeup when not in DWC2_L2 ...
2 parents 0ec7dc8 + 19cd80a commit 6d2d91b

File tree

26 files changed

+342
-112
lines changed

26 files changed

+342
-112
lines changed

MAINTAINERS

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2931,10 +2931,9 @@ S: Maintained
29312931
F: drivers/platform/x86/compal-laptop.c
29322932

29332933
CONEXANT ACCESSRUNNER USB DRIVER
2934-
M: Simon Arlott <[email protected]>
29352934
29362935
W: http://accessrunner.sourceforge.net/
2937-
S: Maintained
2936+
S: Orphan
29382937
F: drivers/usb/atm/cxacru.c
29392938

29402939
CONFIGFS

arch/arm/boot/dts/imx27.dtsi

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,10 @@
486486
compatible = "fsl,imx27-usb";
487487
reg = <0x10024000 0x200>;
488488
interrupts = <56>;
489-
clocks = <&clks IMX27_CLK_USB_IPG_GATE>;
489+
clocks = <&clks IMX27_CLK_USB_IPG_GATE>,
490+
<&clks IMX27_CLK_USB_AHB_GATE>,
491+
<&clks IMX27_CLK_USB_DIV>;
492+
clock-names = "ipg", "ahb", "per";
490493
fsl,usbmisc = <&usbmisc 0>;
491494
status = "disabled";
492495
};
@@ -495,7 +498,10 @@
495498
compatible = "fsl,imx27-usb";
496499
reg = <0x10024200 0x200>;
497500
interrupts = <54>;
498-
clocks = <&clks IMX27_CLK_USB_IPG_GATE>;
501+
clocks = <&clks IMX27_CLK_USB_IPG_GATE>,
502+
<&clks IMX27_CLK_USB_AHB_GATE>,
503+
<&clks IMX27_CLK_USB_DIV>;
504+
clock-names = "ipg", "ahb", "per";
499505
fsl,usbmisc = <&usbmisc 1>;
500506
dr_mode = "host";
501507
status = "disabled";
@@ -505,7 +511,10 @@
505511
compatible = "fsl,imx27-usb";
506512
reg = <0x10024400 0x200>;
507513
interrupts = <55>;
508-
clocks = <&clks IMX27_CLK_USB_IPG_GATE>;
514+
clocks = <&clks IMX27_CLK_USB_IPG_GATE>,
515+
<&clks IMX27_CLK_USB_AHB_GATE>,
516+
<&clks IMX27_CLK_USB_DIV>;
517+
clock-names = "ipg", "ahb", "per";
509518
fsl,usbmisc = <&usbmisc 2>;
510519
dr_mode = "host";
511520
status = "disabled";
@@ -515,7 +524,6 @@
515524
#index-cells = <1>;
516525
compatible = "fsl,imx27-usbmisc";
517526
reg = <0x10024600 0x200>;
518-
clocks = <&clks IMX27_CLK_USB_AHB_GATE>;
519527
};
520528

521529
sahara2: sahara@10025000 {

drivers/usb/chipidea/ci_hdrc_imx.c

Lines changed: 121 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ struct ci_hdrc_imx_data {
8484
struct imx_usbmisc_data *usbmisc_data;
8585
bool supports_runtime_pm;
8686
bool in_lpm;
87+
/* SoC before i.mx6 (except imx23/imx28) needs three clks */
88+
bool need_three_clks;
89+
struct clk *clk_ipg;
90+
struct clk *clk_ahb;
91+
struct clk *clk_per;
92+
/* --------------------------------- */
8793
};
8894

8995
/* Common functions shared by usbmisc drivers */
@@ -135,6 +141,102 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev)
135141
}
136142

137143
/* End of common functions shared by usbmisc drivers*/
144+
static int imx_get_clks(struct device *dev)
145+
{
146+
struct ci_hdrc_imx_data *data = dev_get_drvdata(dev);
147+
int ret = 0;
148+
149+
data->clk_ipg = devm_clk_get(dev, "ipg");
150+
if (IS_ERR(data->clk_ipg)) {
151+
/* If the platform only needs one clocks */
152+
data->clk = devm_clk_get(dev, NULL);
153+
if (IS_ERR(data->clk)) {
154+
ret = PTR_ERR(data->clk);
155+
dev_err(dev,
156+
"Failed to get clks, err=%ld,%ld\n",
157+
PTR_ERR(data->clk), PTR_ERR(data->clk_ipg));
158+
return ret;
159+
}
160+
return ret;
161+
}
162+
163+
data->clk_ahb = devm_clk_get(dev, "ahb");
164+
if (IS_ERR(data->clk_ahb)) {
165+
ret = PTR_ERR(data->clk_ahb);
166+
dev_err(dev,
167+
"Failed to get ahb clock, err=%d\n", ret);
168+
return ret;
169+
}
170+
171+
data->clk_per = devm_clk_get(dev, "per");
172+
if (IS_ERR(data->clk_per)) {
173+
ret = PTR_ERR(data->clk_per);
174+
dev_err(dev,
175+
"Failed to get per clock, err=%d\n", ret);
176+
return ret;
177+
}
178+
179+
data->need_three_clks = true;
180+
return ret;
181+
}
182+
183+
static int imx_prepare_enable_clks(struct device *dev)
184+
{
185+
struct ci_hdrc_imx_data *data = dev_get_drvdata(dev);
186+
int ret = 0;
187+
188+
if (data->need_three_clks) {
189+
ret = clk_prepare_enable(data->clk_ipg);
190+
if (ret) {
191+
dev_err(dev,
192+
"Failed to prepare/enable ipg clk, err=%d\n",
193+
ret);
194+
return ret;
195+
}
196+
197+
ret = clk_prepare_enable(data->clk_ahb);
198+
if (ret) {
199+
dev_err(dev,
200+
"Failed to prepare/enable ahb clk, err=%d\n",
201+
ret);
202+
clk_disable_unprepare(data->clk_ipg);
203+
return ret;
204+
}
205+
206+
ret = clk_prepare_enable(data->clk_per);
207+
if (ret) {
208+
dev_err(dev,
209+
"Failed to prepare/enable per clk, err=%d\n",
210+
ret);
211+
clk_disable_unprepare(data->clk_ahb);
212+
clk_disable_unprepare(data->clk_ipg);
213+
return ret;
214+
}
215+
} else {
216+
ret = clk_prepare_enable(data->clk);
217+
if (ret) {
218+
dev_err(dev,
219+
"Failed to prepare/enable clk, err=%d\n",
220+
ret);
221+
return ret;
222+
}
223+
}
224+
225+
return ret;
226+
}
227+
228+
static void imx_disable_unprepare_clks(struct device *dev)
229+
{
230+
struct ci_hdrc_imx_data *data = dev_get_drvdata(dev);
231+
232+
if (data->need_three_clks) {
233+
clk_disable_unprepare(data->clk_per);
234+
clk_disable_unprepare(data->clk_ahb);
235+
clk_disable_unprepare(data->clk_ipg);
236+
} else {
237+
clk_disable_unprepare(data->clk);
238+
}
239+
}
138240

139241
static int ci_hdrc_imx_probe(struct platform_device *pdev)
140242
{
@@ -145,31 +247,31 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
145247
.flags = CI_HDRC_SET_NON_ZERO_TTHA,
146248
};
147249
int ret;
148-
const struct of_device_id *of_id =
149-
of_match_device(ci_hdrc_imx_dt_ids, &pdev->dev);
150-
const struct ci_hdrc_imx_platform_flag *imx_platform_flag = of_id->data;
250+
const struct of_device_id *of_id;
251+
const struct ci_hdrc_imx_platform_flag *imx_platform_flag;
252+
253+
of_id = of_match_device(ci_hdrc_imx_dt_ids, &pdev->dev);
254+
if (!of_id)
255+
return -ENODEV;
256+
257+
imx_platform_flag = of_id->data;
151258

152259
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
153260
if (!data)
154261
return -ENOMEM;
155262

263+
platform_set_drvdata(pdev, data);
156264
data->usbmisc_data = usbmisc_get_init_data(&pdev->dev);
157265
if (IS_ERR(data->usbmisc_data))
158266
return PTR_ERR(data->usbmisc_data);
159267

160-
data->clk = devm_clk_get(&pdev->dev, NULL);
161-
if (IS_ERR(data->clk)) {
162-
dev_err(&pdev->dev,
163-
"Failed to get clock, err=%ld\n", PTR_ERR(data->clk));
164-
return PTR_ERR(data->clk);
165-
}
268+
ret = imx_get_clks(&pdev->dev);
269+
if (ret)
270+
return ret;
166271

167-
ret = clk_prepare_enable(data->clk);
168-
if (ret) {
169-
dev_err(&pdev->dev,
170-
"Failed to prepare or enable clock, err=%d\n", ret);
272+
ret = imx_prepare_enable_clks(&pdev->dev);
273+
if (ret)
171274
return ret;
172-
}
173275

174276
data->phy = devm_usb_get_phy_by_phandle(&pdev->dev, "fsl,usbphy", 0);
175277
if (IS_ERR(data->phy)) {
@@ -212,8 +314,6 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
212314
goto disable_device;
213315
}
214316

215-
platform_set_drvdata(pdev, data);
216-
217317
if (data->supports_runtime_pm) {
218318
pm_runtime_set_active(&pdev->dev);
219319
pm_runtime_enable(&pdev->dev);
@@ -226,7 +326,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
226326
disable_device:
227327
ci_hdrc_remove_device(data->ci_pdev);
228328
err_clk:
229-
clk_disable_unprepare(data->clk);
329+
imx_disable_unprepare_clks(&pdev->dev);
230330
return ret;
231331
}
232332

@@ -240,7 +340,7 @@ static int ci_hdrc_imx_remove(struct platform_device *pdev)
240340
pm_runtime_put_noidle(&pdev->dev);
241341
}
242342
ci_hdrc_remove_device(data->ci_pdev);
243-
clk_disable_unprepare(data->clk);
343+
imx_disable_unprepare_clks(&pdev->dev);
244344

245345
return 0;
246346
}
@@ -252,7 +352,7 @@ static int imx_controller_suspend(struct device *dev)
252352

253353
dev_dbg(dev, "at %s\n", __func__);
254354

255-
clk_disable_unprepare(data->clk);
355+
imx_disable_unprepare_clks(dev);
256356
data->in_lpm = true;
257357

258358
return 0;
@@ -270,7 +370,7 @@ static int imx_controller_resume(struct device *dev)
270370
return 0;
271371
}
272372

273-
ret = clk_prepare_enable(data->clk);
373+
ret = imx_prepare_enable_clks(dev);
274374
if (ret)
275375
return ret;
276376

@@ -285,7 +385,7 @@ static int imx_controller_resume(struct device *dev)
285385
return 0;
286386

287387
clk_disable:
288-
clk_disable_unprepare(data->clk);
388+
imx_disable_unprepare_clks(dev);
289389
return ret;
290390
}
291391

drivers/usb/chipidea/debug.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,10 @@ static ssize_t ci_role_write(struct file *file, const char __user *ubuf,
322322
return -EINVAL;
323323

324324
pm_runtime_get_sync(ci->dev);
325+
disable_irq(ci->irq);
325326
ci_role_stop(ci);
326327
ret = ci_role_start(ci, role);
328+
enable_irq(ci->irq);
327329
pm_runtime_put_sync(ci->dev);
328330

329331
return ret ? ret : count;

drivers/usb/chipidea/udc.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,6 +1751,22 @@ static int ci_udc_start(struct usb_gadget *gadget,
17511751
return retval;
17521752
}
17531753

1754+
static void ci_udc_stop_for_otg_fsm(struct ci_hdrc *ci)
1755+
{
1756+
if (!ci_otg_is_fsm_mode(ci))
1757+
return;
1758+
1759+
mutex_lock(&ci->fsm.lock);
1760+
if (ci->fsm.otg->state == OTG_STATE_A_PERIPHERAL) {
1761+
ci->fsm.a_bidl_adis_tmout = 1;
1762+
ci_hdrc_otg_fsm_start(ci);
1763+
} else if (ci->fsm.otg->state == OTG_STATE_B_PERIPHERAL) {
1764+
ci->fsm.protocol = PROTO_UNDEF;
1765+
ci->fsm.otg->state = OTG_STATE_UNDEFINED;
1766+
}
1767+
mutex_unlock(&ci->fsm.lock);
1768+
}
1769+
17541770
/**
17551771
* ci_udc_stop: unregister a gadget driver
17561772
*/
@@ -1775,6 +1791,7 @@ static int ci_udc_stop(struct usb_gadget *gadget)
17751791
ci->driver = NULL;
17761792
spin_unlock_irqrestore(&ci->lock, flags);
17771793

1794+
ci_udc_stop_for_otg_fsm(ci);
17781795
return 0;
17791796
}
17801797

drivers/usb/chipidea/usbmisc_imx.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,11 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
500500
{
501501
struct resource *res;
502502
struct imx_usbmisc *data;
503-
struct of_device_id *tmp_dev;
503+
const struct of_device_id *of_id;
504+
505+
of_id = of_match_device(usbmisc_imx_dt_ids, &pdev->dev);
506+
if (!of_id)
507+
return -ENODEV;
504508

505509
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
506510
if (!data)
@@ -513,9 +517,7 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
513517
if (IS_ERR(data->base))
514518
return PTR_ERR(data->base);
515519

516-
tmp_dev = (struct of_device_id *)
517-
of_match_device(usbmisc_imx_dt_ids, &pdev->dev);
518-
data->ops = (const struct usbmisc_ops *)tmp_dev->data;
520+
data->ops = (const struct usbmisc_ops *)of_id->data;
519521
platform_set_drvdata(pdev, data);
520522

521523
return 0;

drivers/usb/class/usblp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,11 +884,11 @@ static int usblp_wwait(struct usblp *usblp, int nonblock)
884884

885885
add_wait_queue(&usblp->wwait, &waita);
886886
for (;;) {
887-
set_current_state(TASK_INTERRUPTIBLE);
888887
if (mutex_lock_interruptible(&usblp->mut)) {
889888
rc = -EINTR;
890889
break;
891890
}
891+
set_current_state(TASK_INTERRUPTIBLE);
892892
rc = usblp_wtest(usblp, nonblock);
893893
mutex_unlock(&usblp->mut);
894894
if (rc <= 0)

drivers/usb/core/Kconfig

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ config USB_OTG_BLACKLIST_HUB
7777

7878
config USB_OTG_FSM
7979
tristate "USB 2.0 OTG FSM implementation"
80-
depends on USB
81-
select USB_OTG
80+
depends on USB && USB_OTG
8281
select USB_PHY
8382
help
8483
Implements OTG Finite State Machine as specified in On-The-Go

drivers/usb/dwc2/hcd.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -324,12 +324,13 @@ void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg)
324324
*/
325325
static void dwc2_hcd_rem_wakeup(struct dwc2_hsotg *hsotg)
326326
{
327-
if (hsotg->lx_state == DWC2_L2) {
327+
if (hsotg->bus_suspended) {
328328
hsotg->flags.b.port_suspend_change = 1;
329329
usb_hcd_resume_root_hub(hsotg->priv);
330-
} else {
331-
hsotg->flags.b.port_l1_change = 1;
332330
}
331+
332+
if (hsotg->lx_state == DWC2_L1)
333+
hsotg->flags.b.port_l1_change = 1;
333334
}
334335

335336
/**
@@ -1428,8 +1429,8 @@ static void dwc2_wakeup_detected(unsigned long data)
14281429
dev_dbg(hsotg->dev, "Clear Resume: HPRT0=%0x\n",
14291430
dwc2_readl(hsotg->regs + HPRT0));
14301431

1431-
hsotg->bus_suspended = 0;
14321432
dwc2_hcd_rem_wakeup(hsotg);
1433+
hsotg->bus_suspended = 0;
14331434

14341435
/* Change to L0 state */
14351436
hsotg->lx_state = DWC2_L0;

drivers/usb/dwc2/platform.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ static const struct dwc2_core_params params_rk3066 = {
108108
.host_ls_low_power_phy_clk = -1,
109109
.ts_dline = -1,
110110
.reload_ctl = -1,
111-
.ahbcfg = 0x7, /* INCR16 */
111+
.ahbcfg = GAHBCFG_HBSTLEN_INCR16 <<
112+
GAHBCFG_HBSTLEN_SHIFT,
112113
.uframe_sched = -1,
113114
.external_id_pin_ctl = -1,
114115
.hibernation = -1,

0 commit comments

Comments
 (0)