Hi Peter, > -----Original Message----- > From: Peter Chen <peter.chen@xxxxxxxxxx> > Sent: Friday, November 27, 2020 2:28 PM > To: heikki.krogerus@xxxxxxxxxxxxxxx > Cc: linux-usb@xxxxxxxxxxxxxxx; dl-linux-imx <linux-imx@xxxxxxx>; Peter > Chen <peter.chen@xxxxxxx>; Jun Li <jun.li@xxxxxxx> > Subject: [PATCH 1/1] usb: roles: reference controller's parent device if > existed > > From: Peter Chen <peter.chen@xxxxxxx> > > For some DRD IP drivers (eg, dwc3/cdns3/chipidea), the core device is created > and deleted by glue layer device. So, if role switch user (eg, tcpci), core > device, and glue layer device are all built as module, and glue layer device > is removed first, the core device's driver ->remove function will be called, > and its device's driver pointer will be NULL, and cause below oops. > > To fix it, if there is a parent for controller device (role switch device's > parent), it references to parent too. This may not enough, the trouble is role switch class isn't aware of the role switch is unregistered by its provider while typec class is using it, this can happen by different ways, if we do role switch provider driver unbind, we still suffer this problem: echo usb_controller_dev > unbind I am not sure if we should prevent this happening at USB controller drivers(provider side), or this is allowed and we should enhance role switch class to be aware of this situation and properly handle it. Thanks Li Jun