Re: [PATCH 11/20] usb: host: xhci: pass quirks via driver_data

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Aug 15, 2011 at 04:51:32PM +0200, Sebastian Andrzej Siewior wrote:
> From: Felipe Balbi <balbi@xxxxxx>
> 
> seems like a better use for the driver_data
> field. It also helps decoupling PCI from
> XHCI-specific ->setup function.

Awesome!  This is a much cleaner and easy-to-read setup than what the
driver had when the quirks were stored in the xhci_hcd structure.

Sarah

> 
> [bigeasy@linutronix: keep the quirks for now, they will vanish later]
> 
> Signed-off-by: Felipe Balbi <balbi@xxxxxx>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
> ---
>  drivers/usb/host/xhci-pci.c |   77 +++++++++++++++++++++++++++++++++++++++----
>  1 files changed, 70 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> index 724f09f..7006600 100644
> --- a/drivers/usb/host/xhci-pci.c
> +++ b/drivers/usb/host/xhci-pci.c
> @@ -183,20 +183,16 @@ error:
>  	return retval;
>  }
>  
> -static const struct hc_driver xhci_pci_hc_driver;
> -
> -/*
> - * We need to register our own PCI probe function (instead of the USB core's
> - * function) in order to create a second roothub under xHCI.
> - */
>  static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
>  {
>  	int retval;
>  	struct xhci_hcd *xhci;
>  	const struct hc_driver *driver;
>  	struct usb_hcd *hcd;
> +	struct xhci_platform_data *data;
>  
> -	driver = &xhci_pci_hc_driver;
> +	data = (struct xhci_platform_data *) id->driver_data;
> +	driver = data->driver;
>  
>  	/* Register the USB 2.0 roothub.
>  	 * FIXME: USB core must know to register the USB 2.0 roothub first.
> @@ -212,6 +208,17 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
>  	/* USB 2.0 roothub is stored in the PCI device now. */
>  	hcd = dev_get_drvdata(&dev->dev);
>  	xhci = hcd_to_xhci(hcd);
> +
> +	/* Quirk on revision 0 of Fresco Logic's PDK */
> +	if (dev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
> +			dev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) {
> +		if (dev->revision == 0x0) {
> +			data->quirks |= XHCI_RESET_EP_QUIRK;
> +			xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure"
> +					" endpoint cmd after reset endpoint\n");
> +		}
> +	}
> +
>  	xhci->shared_hcd = usb_create_shared_hcd(driver, &dev->dev,
>  				pci_name(dev), hcd);
>  	if (!xhci->shared_hcd) {
> @@ -351,8 +358,64 @@ static const struct hc_driver xhci_pci_hc_driver = {
>  
>  /*-------------------------------------------------------------------------*/
>  
> +static DEFINE_XHCI_DATA(fresco_logic) = {
> +	.quirks		= XHCI_BROKEN_MSI,
> +	.driver		= &xhci_pci_hc_driver,
> +};
> +
> +static DEFINE_XHCI_DATA(nec) = {
> +	.quirks		= XHCI_NEC_HOST,
> +	.driver		= &xhci_pci_hc_driver,
> +};
> +
> +static DEFINE_XHCI_DATA(amd) = {
> +	.quirks		= XHCI_AMD_PLL_FIX,
> +	.driver		= &xhci_pci_hc_driver,
> +};
> +
> +static DEFINE_XHCI_DATA(intel_pantherpoint) = {
> +	.quirks		= (XHCI_SPURIOUS_SUCCESS
> +			| XHCI_EP_LIMIT_QUIRK),
> +	.limit_active_eps = 64,
> +	.driver		= &xhci_pci_hc_driver,
> +};
> +
> +static DEFINE_XHCI_DATA(etron) = {
> +	.quirks		= XHCI_RESET_ON_RESUME,
> +	.driver		= &xhci_pci_hc_driver,
> +};
> +
>  /* PCI driver selection metadata; PCI hotplugging uses this */
>  static DEFINE_PCI_DEVICE_TABLE(pci_ids) = {
> +	/* handle quirky devices here */
> +	{
> +		PCI_DEVICE(PCI_VENDOR_ID_FRESCO_LOGIC,
> +				PCI_DEVICE_ID_FRESCO_LOGIC_PDK),
> +		.driver_data = (kernel_ulong_t) &fresco_logic_driver_data,
> +	},
> +	{
> +		PCI_DEVICE(PCI_VENDOR_ID_NEC, PCI_ANY_ID),
> +		.driver_data = (kernel_ulong_t) &nec_driver_data,
> +	},
> +	{
> +		PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x9600),
> +		.driver_data = (kernel_ulong_t) &amd_driver_data,
> +	},
> +	{
> +		PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x9601),
> +		.driver_data = (kernel_ulong_t) &amd_driver_data,
> +	},
> +	{
> +		PCI_DEVICE(PCI_VENDOR_ID_INTEL,
> +				PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI),
> +		.driver_data = (kernel_ulong_t) &intel_pantherpoint_driver_data,
> +	},
> +	{
> +		PCI_DEVICE(PCI_VENDOR_ID_ETRON,
> +				PCI_DEVICE_ID_ASROCK_P67),
> +		.driver_data = (kernel_ulong_t) &etron_driver_data,
> +	},
> +
>  	/* handle any USB 3.0 xHCI controller */
>  	{
>  		PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_XHCI, ~0),
> -- 
> 1.7.4.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux