提交 779d1263 编写于 作者: S Simon Glass

dm: usb: xhci: Factor out common init/uninit

Since driver model will want to use most of the same code for XHCI init
and uninit, put it in a separate function.
Signed-off-by: NSimon Glass <sjg@chromium.org>
Reviewed-by: NMarek Vasut <marex@denx.de>
上级 5dd75e3b
...@@ -936,33 +936,16 @@ static int _xhci_submit_control_msg(struct usb_device *udev, unsigned long pipe, ...@@ -936,33 +936,16 @@ static int _xhci_submit_control_msg(struct usb_device *udev, unsigned long pipe,
return xhci_ctrl_tx(udev, pipe, setup, length, buffer); return xhci_ctrl_tx(udev, pipe, setup, length, buffer);
} }
/** static int xhci_lowlevel_init(struct xhci_ctrl *ctrl)
* Intialises the XHCI host controller
* and allocates the necessary data structures
*
* @param index index to the host controller data structure
* @return pointer to the intialised controller
*/
int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
{ {
struct xhci_hccr *hccr;
struct xhci_hcor *hcor;
uint32_t val; uint32_t val;
uint32_t val2; uint32_t val2;
uint32_t reg; uint32_t reg;
struct xhci_hccr *hccr;
struct xhci_hcor *hcor;
struct xhci_ctrl *ctrl;
if (xhci_hcd_init(index, &hccr, (struct xhci_hcor **)&hcor) != 0)
return -ENODEV;
if (xhci_reset(hcor) != 0)
return -ENODEV;
ctrl = &xhcic[index];
ctrl->hccr = hccr;
ctrl->hcor = hcor;
hccr = ctrl->hccr;
hcor = ctrl->hcor;
/* /*
* Program the Number of Device Slots Enabled field in the CONFIG * Program the Number of Device Slots Enabled field in the CONFIG
* register with the max value of slots the HC can handle. * register with the max value of slots the HC can handle.
...@@ -1004,7 +987,20 @@ int usb_lowlevel_init(int index, enum usb_init_type init, void **controller) ...@@ -1004,7 +987,20 @@ int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
reg = HC_VERSION(xhci_readl(&hccr->cr_capbase)); reg = HC_VERSION(xhci_readl(&hccr->cr_capbase));
printf("USB XHCI %x.%02x\n", reg >> 8, reg & 0xff); printf("USB XHCI %x.%02x\n", reg >> 8, reg & 0xff);
*controller = &xhcic[index]; return 0;
}
static int xhci_lowlevel_stop(struct xhci_ctrl *ctrl)
{
u32 temp;
xhci_reset(ctrl->hcor);
debug("// Disabling event ring interrupts\n");
temp = xhci_readl(&ctrl->hcor->or_usbsts);
xhci_writel(&ctrl->hcor->or_usbsts, temp & ~STS_EINT);
temp = xhci_readl(&ctrl->ir_set->irq_pending);
xhci_writel(&ctrl->ir_set->irq_pending, ER_IRQ_DISABLE(temp));
return 0; return 0;
} }
...@@ -1022,6 +1018,38 @@ int submit_control_msg(struct usb_device *udev, unsigned long pipe, ...@@ -1022,6 +1018,38 @@ int submit_control_msg(struct usb_device *udev, unsigned long pipe,
hop->portnr); hop->portnr);
} }
/**
* Intialises the XHCI host controller
* and allocates the necessary data structures
*
* @param index index to the host controller data structure
* @return pointer to the intialised controller
*/
int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
{
struct xhci_hccr *hccr;
struct xhci_hcor *hcor;
struct xhci_ctrl *ctrl;
int ret;
if (xhci_hcd_init(index, &hccr, (struct xhci_hcor **)&hcor) != 0)
return -ENODEV;
if (xhci_reset(hcor) != 0)
return -ENODEV;
ctrl = &xhcic[index];
ctrl->hccr = hccr;
ctrl->hcor = hcor;
ret = xhci_lowlevel_init(ctrl);
*controller = &xhcic[index];
return ret;
}
/** /**
* Stops the XHCI host controller * Stops the XHCI host controller
* and cleans up all the related data structures * and cleans up all the related data structures
...@@ -1032,18 +1060,9 @@ int submit_control_msg(struct usb_device *udev, unsigned long pipe, ...@@ -1032,18 +1060,9 @@ int submit_control_msg(struct usb_device *udev, unsigned long pipe,
int usb_lowlevel_stop(int index) int usb_lowlevel_stop(int index)
{ {
struct xhci_ctrl *ctrl = (xhcic + index); struct xhci_ctrl *ctrl = (xhcic + index);
u32 temp;
xhci_reset(ctrl->hcor);
debug("// Disabling event ring interrupts\n");
temp = xhci_readl(&ctrl->hcor->or_usbsts);
xhci_writel(&ctrl->hcor->or_usbsts, temp & ~STS_EINT);
temp = xhci_readl(&ctrl->ir_set->irq_pending);
xhci_writel(&ctrl->ir_set->irq_pending, ER_IRQ_DISABLE(temp));
xhci_lowlevel_stop(ctrl);
xhci_hcd_stop(index); xhci_hcd_stop(index);
xhci_cleanup(ctrl); xhci_cleanup(ctrl);
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册