usb: cdns2: Fix controller reset issue

Patch fixes the procedure of resetting controller.
The CPUCTRL register is write only and reading returns 0.
Waiting for reset to complite is incorrect.

Fixes: 3eb1f1efe204 ("usb: cdns2: Add main part of Cadence USBHS driver")
cc: stable@vger.kernel.org
Signed-off-by: Pawel Laszczak <pawell@cadence.com>
Link: https://lore.kernel.org/r/PH7PR07MB9538D56D75F1F399D0BB96F0DD922@PH7PR07MB9538.namprd07.prod.outlook.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Pawel Laszczak and committed by
Greg Kroah-Hartman
e2940928 9149c9b0

+12 -9
+3 -9
drivers/usb/gadget/udc/cdns2/cdns2-gadget.c
··· 2251 { 2252 u32 max_speed; 2253 void *buf; 2254 - int val; 2255 int ret; 2256 2257 pdev->usb_regs = pdev->regs; ··· 2260 pdev->adma_regs = pdev->regs + CDNS2_ADMA_REGS_OFFSET; 2261 2262 /* Reset controller. */ 2263 - set_reg_bit_8(&pdev->usb_regs->cpuctrl, CPUCTRL_SW_RST); 2264 - 2265 - ret = readl_poll_timeout_atomic(&pdev->usb_regs->cpuctrl, val, 2266 - !(val & CPUCTRL_SW_RST), 1, 10000); 2267 - if (ret) { 2268 - dev_err(pdev->dev, "Error: reset controller timeout\n"); 2269 - return -EINVAL; 2270 - } 2271 2272 usb_initialize_gadget(pdev->dev, &pdev->gadget, NULL); 2273
··· 2251 { 2252 u32 max_speed; 2253 void *buf; 2254 int ret; 2255 2256 pdev->usb_regs = pdev->regs; ··· 2261 pdev->adma_regs = pdev->regs + CDNS2_ADMA_REGS_OFFSET; 2262 2263 /* Reset controller. */ 2264 + writeb(CPUCTRL_SW_RST | CPUCTRL_UPCLK | CPUCTRL_WUEN, 2265 + &pdev->usb_regs->cpuctrl); 2266 + usleep_range(5, 10); 2267 2268 usb_initialize_gadget(pdev->dev, &pdev->gadget, NULL); 2269
+9
drivers/usb/gadget/udc/cdns2/cdns2-gadget.h
··· 292 #define SPEEDCTRL_HSDISABLE BIT(7) 293 294 /* CPUCTRL- bitmasks. */ 295 /* Controller reset bit. */ 296 #define CPUCTRL_SW_RST BIT(1) 297 298 /** 299 * struct cdns2_adma_regs - ADMA controller registers.
··· 292 #define SPEEDCTRL_HSDISABLE BIT(7) 293 294 /* CPUCTRL- bitmasks. */ 295 + /* UP clock enable */ 296 + #define CPUCTRL_UPCLK BIT(0) 297 /* Controller reset bit. */ 298 #define CPUCTRL_SW_RST BIT(1) 299 + /** 300 + * If the wuen bit is ‘1’, the upclken is automatically set to ‘1’ after 301 + * detecting rising edge of wuintereq interrupt. If the wuen bit is ‘0’, 302 + * the wuintereq interrupt is ignored. 303 + */ 304 + #define CPUCTRL_WUEN BIT(7) 305 + 306 307 /** 308 * struct cdns2_adma_regs - ADMA controller registers.