Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers: usb: fsl: Define usb control register mask for w1c bits

Define and use CONTROL_REGISTER_W1C_MASK to make sure that
w1c bits of usb control register do not get reset while
writing any other bit

Signed-off-by: Nikhil Badola <nikhil.badola@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Nikhil Badola and committed by
Greg Kroah-Hartman
4e02bea8 f4fdfaa2

+17 -9
+16 -9
drivers/usb/host/ehci-fsl.c
··· 127 127 128 128 /* Enable USB controller, 83xx or 8536 */ 129 129 if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6) 130 - setbits32(hcd->regs + FSL_SOC_USB_CTRL, 0x4); 130 + clrsetbits_be32(hcd->regs + FSL_SOC_USB_CTRL, 131 + CONTROL_REGISTER_W1C_MASK, 0x4); 131 132 132 133 /* 133 134 * Enable UTMI phy and program PTS field in UTMI mode before asserting 134 135 * controller reset for USB Controller version 2.5 135 136 */ 136 137 if (pdata->has_fsl_erratum_a007792) { 137 - writel_be(CTRL_UTMI_PHY_EN, hcd->regs + FSL_SOC_USB_CTRL); 138 + clrsetbits_be32(hcd->regs + FSL_SOC_USB_CTRL, 139 + CONTROL_REGISTER_W1C_MASK, CTRL_UTMI_PHY_EN); 138 140 writel(PORT_PTS_UTMI, hcd->regs + FSL_SOC_USB_PORTSC1); 139 141 } 140 142 ··· 202 200 case FSL_USB2_PHY_ULPI: 203 201 if (pdata->have_sysif_regs && pdata->controller_ver) { 204 202 /* controller version 1.6 or above */ 205 - clrbits32(non_ehci + FSL_SOC_USB_CTRL, UTMI_PHY_EN); 206 - setbits32(non_ehci + FSL_SOC_USB_CTRL, 207 - ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN); 203 + clrbits32(non_ehci + FSL_SOC_USB_CTRL, 204 + CONTROL_REGISTER_W1C_MASK | UTMI_PHY_EN); 205 + clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL, 206 + CONTROL_REGISTER_W1C_MASK, 207 + ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN); 208 208 } 209 209 portsc |= PORT_PTS_ULPI; 210 210 break; ··· 220 216 case FSL_USB2_PHY_UTMI_DUAL: 221 217 if (pdata->have_sysif_regs && pdata->controller_ver) { 222 218 /* controller version 1.6 or above */ 223 - setbits32(non_ehci + FSL_SOC_USB_CTRL, UTMI_PHY_EN); 219 + clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL, 220 + CONTROL_REGISTER_W1C_MASK, UTMI_PHY_EN); 224 221 mdelay(FSL_UTMI_PHY_DLY); /* Delay for UTMI PHY CLK to 225 222 become stable - 10ms*/ 226 223 } 227 224 /* enable UTMI PHY */ 228 225 if (pdata->have_sysif_regs) 229 - setbits32(non_ehci + FSL_SOC_USB_CTRL, 230 - CTRL_UTMI_PHY_EN); 226 + clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL, 227 + CONTROL_REGISTER_W1C_MASK, 228 + CTRL_UTMI_PHY_EN); 231 229 portsc |= PORT_PTS_UTMI; 232 230 break; 233 231 case FSL_USB2_PHY_NONE: ··· 251 245 ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]); 252 246 253 247 if (phy_mode != FSL_USB2_PHY_ULPI && pdata->have_sysif_regs) 254 - setbits32(non_ehci + FSL_SOC_USB_CTRL, USB_CTRL_USB_EN); 248 + clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL, 249 + CONTROL_REGISTER_W1C_MASK, USB_CTRL_USB_EN); 255 250 256 251 return 0; 257 252 }
+1
drivers/usb/host/ehci-fsl.h
··· 52 52 #define SNOOP_SIZE_2GB 0x1e 53 53 54 54 /* control Register Bit Masks */ 55 + #define CONTROL_REGISTER_W1C_MASK 0x00020000 /* W1C: PHY_CLK_VALID */ 55 56 #define ULPI_INT_EN (1<<0) 56 57 #define WU_INT_EN (1<<1) 57 58 #define USB_CTRL_USB_EN (1<<2)