usb: pci-quirks: Minor cleanup for AMD PLL quirk
usb_amd_find_chipset_info() is used for chipset detection for several quirks. It is strange that its return value indicates the need for the PLL quirk, which means it is often ignored. This patch adds a function specifically for checking the PLL quirk like the other ones. Additionally, rename probe_result to something more appropriate. Signed-off-by: Ryan Kennedy <ryan5544@gmail.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Link: https://lore.kernel.org/r/20190704153529.9429-3-ryan5544@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f3dccdaade
commit
4fbb8aa758
|
@ -149,7 +149,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
||||||
break;
|
break;
|
||||||
case PCI_VENDOR_ID_AMD:
|
case PCI_VENDOR_ID_AMD:
|
||||||
/* AMD PLL quirk */
|
/* AMD PLL quirk */
|
||||||
if (usb_amd_find_chipset_info())
|
if (usb_amd_quirk_pll_check())
|
||||||
ehci->amd_pll_fix = 1;
|
ehci->amd_pll_fix = 1;
|
||||||
/* AMD8111 EHCI doesn't work, according to AMD errata */
|
/* AMD8111 EHCI doesn't work, according to AMD errata */
|
||||||
if (pdev->device == 0x7463) {
|
if (pdev->device == 0x7463) {
|
||||||
|
@ -186,7 +186,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
||||||
break;
|
break;
|
||||||
case PCI_VENDOR_ID_ATI:
|
case PCI_VENDOR_ID_ATI:
|
||||||
/* AMD PLL quirk */
|
/* AMD PLL quirk */
|
||||||
if (usb_amd_find_chipset_info())
|
if (usb_amd_quirk_pll_check())
|
||||||
ehci->amd_pll_fix = 1;
|
ehci->amd_pll_fix = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -152,7 +152,7 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd)
|
||||||
{
|
{
|
||||||
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
|
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
|
||||||
|
|
||||||
if (usb_amd_find_chipset_info())
|
if (usb_amd_quirk_pll_check())
|
||||||
ohci->flags |= OHCI_QUIRK_AMD_PLL;
|
ohci->flags |= OHCI_QUIRK_AMD_PLL;
|
||||||
|
|
||||||
/* SB800 needs pre-fetch fix */
|
/* SB800 needs pre-fetch fix */
|
||||||
|
|
|
@ -132,7 +132,7 @@ static struct amd_chipset_info {
|
||||||
struct amd_chipset_type sb_type;
|
struct amd_chipset_type sb_type;
|
||||||
int isoc_reqs;
|
int isoc_reqs;
|
||||||
int probe_count;
|
int probe_count;
|
||||||
int probe_result;
|
bool need_pll_quirk;
|
||||||
} amd_chipset;
|
} amd_chipset;
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(amd_lock);
|
static DEFINE_SPINLOCK(amd_lock);
|
||||||
|
@ -201,11 +201,11 @@ void sb800_prefetch(struct device *dev, int on)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(sb800_prefetch);
|
EXPORT_SYMBOL_GPL(sb800_prefetch);
|
||||||
|
|
||||||
int usb_amd_find_chipset_info(void)
|
static void usb_amd_find_chipset_info(void)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct amd_chipset_info info;
|
struct amd_chipset_info info;
|
||||||
int need_pll_quirk = 0;
|
info.need_pll_quirk = 0;
|
||||||
|
|
||||||
spin_lock_irqsave(&amd_lock, flags);
|
spin_lock_irqsave(&amd_lock, flags);
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ int usb_amd_find_chipset_info(void)
|
||||||
if (amd_chipset.probe_count > 0) {
|
if (amd_chipset.probe_count > 0) {
|
||||||
amd_chipset.probe_count++;
|
amd_chipset.probe_count++;
|
||||||
spin_unlock_irqrestore(&amd_lock, flags);
|
spin_unlock_irqrestore(&amd_lock, flags);
|
||||||
return amd_chipset.probe_result;
|
return;
|
||||||
}
|
}
|
||||||
memset(&info, 0, sizeof(info));
|
memset(&info, 0, sizeof(info));
|
||||||
spin_unlock_irqrestore(&amd_lock, flags);
|
spin_unlock_irqrestore(&amd_lock, flags);
|
||||||
|
@ -224,19 +224,19 @@ int usb_amd_find_chipset_info(void)
|
||||||
|
|
||||||
switch (info.sb_type.gen) {
|
switch (info.sb_type.gen) {
|
||||||
case AMD_CHIPSET_SB700:
|
case AMD_CHIPSET_SB700:
|
||||||
need_pll_quirk = info.sb_type.rev <= 0x3B;
|
info.need_pll_quirk = info.sb_type.rev <= 0x3B;
|
||||||
break;
|
break;
|
||||||
case AMD_CHIPSET_SB800:
|
case AMD_CHIPSET_SB800:
|
||||||
case AMD_CHIPSET_HUDSON2:
|
case AMD_CHIPSET_HUDSON2:
|
||||||
case AMD_CHIPSET_BOLTON:
|
case AMD_CHIPSET_BOLTON:
|
||||||
need_pll_quirk = 1;
|
info.need_pll_quirk = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
need_pll_quirk = 0;
|
info.need_pll_quirk = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!need_pll_quirk) {
|
if (!info.need_pll_quirk) {
|
||||||
if (info.smbus_dev) {
|
if (info.smbus_dev) {
|
||||||
pci_dev_put(info.smbus_dev);
|
pci_dev_put(info.smbus_dev);
|
||||||
info.smbus_dev = NULL;
|
info.smbus_dev = NULL;
|
||||||
|
@ -259,7 +259,6 @@ int usb_amd_find_chipset_info(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
need_pll_quirk = info.probe_result = 1;
|
|
||||||
printk(KERN_DEBUG "QUIRK: Enable AMD PLL fix\n");
|
printk(KERN_DEBUG "QUIRK: Enable AMD PLL fix\n");
|
||||||
|
|
||||||
commit:
|
commit:
|
||||||
|
@ -270,7 +269,6 @@ int usb_amd_find_chipset_info(void)
|
||||||
|
|
||||||
/* Mark that we where here */
|
/* Mark that we where here */
|
||||||
amd_chipset.probe_count++;
|
amd_chipset.probe_count++;
|
||||||
need_pll_quirk = amd_chipset.probe_result;
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&amd_lock, flags);
|
spin_unlock_irqrestore(&amd_lock, flags);
|
||||||
|
|
||||||
|
@ -283,10 +281,7 @@ int usb_amd_find_chipset_info(void)
|
||||||
amd_chipset = info;
|
amd_chipset = info;
|
||||||
spin_unlock_irqrestore(&amd_lock, flags);
|
spin_unlock_irqrestore(&amd_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return need_pll_quirk;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(usb_amd_find_chipset_info);
|
|
||||||
|
|
||||||
int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev)
|
int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
|
@ -322,6 +317,13 @@ bool usb_amd_prefetch_quirk(void)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(usb_amd_prefetch_quirk);
|
EXPORT_SYMBOL_GPL(usb_amd_prefetch_quirk);
|
||||||
|
|
||||||
|
bool usb_amd_quirk_pll_check(void)
|
||||||
|
{
|
||||||
|
usb_amd_find_chipset_info();
|
||||||
|
return amd_chipset.need_pll_quirk;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(usb_amd_quirk_pll_check);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The hardware normally enables the A-link power management feature, which
|
* The hardware normally enables the A-link power management feature, which
|
||||||
* lets the system lower the power consumption in idle states.
|
* lets the system lower the power consumption in idle states.
|
||||||
|
@ -527,7 +529,7 @@ void usb_amd_dev_put(void)
|
||||||
amd_chipset.nb_type = 0;
|
amd_chipset.nb_type = 0;
|
||||||
memset(&amd_chipset.sb_type, 0, sizeof(amd_chipset.sb_type));
|
memset(&amd_chipset.sb_type, 0, sizeof(amd_chipset.sb_type));
|
||||||
amd_chipset.isoc_reqs = 0;
|
amd_chipset.isoc_reqs = 0;
|
||||||
amd_chipset.probe_result = 0;
|
amd_chipset.need_pll_quirk = 0;
|
||||||
|
|
||||||
spin_unlock_irqrestore(&amd_lock, flags);
|
spin_unlock_irqrestore(&amd_lock, flags);
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
#ifdef CONFIG_USB_PCI
|
#ifdef CONFIG_USB_PCI
|
||||||
void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
|
void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
|
||||||
int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);
|
int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);
|
||||||
int usb_amd_find_chipset_info(void);
|
|
||||||
int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);
|
int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);
|
||||||
bool usb_amd_hang_symptom_quirk(void);
|
bool usb_amd_hang_symptom_quirk(void);
|
||||||
bool usb_amd_prefetch_quirk(void);
|
bool usb_amd_prefetch_quirk(void);
|
||||||
void usb_amd_dev_put(void);
|
void usb_amd_dev_put(void);
|
||||||
|
bool usb_amd_quirk_pll_check(void);
|
||||||
void usb_amd_quirk_pll_disable(void);
|
void usb_amd_quirk_pll_disable(void);
|
||||||
void usb_amd_quirk_pll_enable(void);
|
void usb_amd_quirk_pll_enable(void);
|
||||||
void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev);
|
void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev);
|
||||||
|
|
|
@ -130,7 +130,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||||
xhci->quirks |= XHCI_AMD_0x96_HOST;
|
xhci->quirks |= XHCI_AMD_0x96_HOST;
|
||||||
|
|
||||||
/* AMD PLL quirk */
|
/* AMD PLL quirk */
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_find_chipset_info())
|
if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_quirk_pll_check())
|
||||||
xhci->quirks |= XHCI_AMD_PLL_FIX;
|
xhci->quirks |= XHCI_AMD_PLL_FIX;
|
||||||
|
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_AMD &&
|
if (pdev->vendor == PCI_VENDOR_ID_AMD &&
|
||||||
|
|
Loading…
Reference in New Issue