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;
|
||||
case PCI_VENDOR_ID_AMD:
|
||||
/* AMD PLL quirk */
|
||||
if (usb_amd_find_chipset_info())
|
||||
if (usb_amd_quirk_pll_check())
|
||||
ehci->amd_pll_fix = 1;
|
||||
/* AMD8111 EHCI doesn't work, according to AMD errata */
|
||||
if (pdev->device == 0x7463) {
|
||||
@ -186,7 +186,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
||||
break;
|
||||
case PCI_VENDOR_ID_ATI:
|
||||
/* AMD PLL quirk */
|
||||
if (usb_amd_find_chipset_info())
|
||||
if (usb_amd_quirk_pll_check())
|
||||
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);
|
||||
|
||||
if (usb_amd_find_chipset_info())
|
||||
if (usb_amd_quirk_pll_check())
|
||||
ohci->flags |= OHCI_QUIRK_AMD_PLL;
|
||||
|
||||
/* SB800 needs pre-fetch fix */
|
||||
|
@ -132,7 +132,7 @@ static struct amd_chipset_info {
|
||||
struct amd_chipset_type sb_type;
|
||||
int isoc_reqs;
|
||||
int probe_count;
|
||||
int probe_result;
|
||||
bool need_pll_quirk;
|
||||
} amd_chipset;
|
||||
|
||||
static DEFINE_SPINLOCK(amd_lock);
|
||||
@ -201,11 +201,11 @@ void sb800_prefetch(struct device *dev, int on)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sb800_prefetch);
|
||||
|
||||
int usb_amd_find_chipset_info(void)
|
||||
static void usb_amd_find_chipset_info(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct amd_chipset_info info;
|
||||
int need_pll_quirk = 0;
|
||||
info.need_pll_quirk = 0;
|
||||
|
||||
spin_lock_irqsave(&amd_lock, flags);
|
||||
|
||||
@ -213,7 +213,7 @@ int usb_amd_find_chipset_info(void)
|
||||
if (amd_chipset.probe_count > 0) {
|
||||
amd_chipset.probe_count++;
|
||||
spin_unlock_irqrestore(&amd_lock, flags);
|
||||
return amd_chipset.probe_result;
|
||||
return;
|
||||
}
|
||||
memset(&info, 0, sizeof(info));
|
||||
spin_unlock_irqrestore(&amd_lock, flags);
|
||||
@ -224,19 +224,19 @@ int usb_amd_find_chipset_info(void)
|
||||
|
||||
switch (info.sb_type.gen) {
|
||||
case AMD_CHIPSET_SB700:
|
||||
need_pll_quirk = info.sb_type.rev <= 0x3B;
|
||||
info.need_pll_quirk = info.sb_type.rev <= 0x3B;
|
||||
break;
|
||||
case AMD_CHIPSET_SB800:
|
||||
case AMD_CHIPSET_HUDSON2:
|
||||
case AMD_CHIPSET_BOLTON:
|
||||
need_pll_quirk = 1;
|
||||
info.need_pll_quirk = 1;
|
||||
break;
|
||||
default:
|
||||
need_pll_quirk = 0;
|
||||
info.need_pll_quirk = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!need_pll_quirk) {
|
||||
if (!info.need_pll_quirk) {
|
||||
if (info.smbus_dev) {
|
||||
pci_dev_put(info.smbus_dev);
|
||||
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");
|
||||
|
||||
commit:
|
||||
@ -270,7 +269,6 @@ commit:
|
||||
|
||||
/* Mark that we where here */
|
||||
amd_chipset.probe_count++;
|
||||
need_pll_quirk = amd_chipset.probe_result;
|
||||
|
||||
spin_unlock_irqrestore(&amd_lock, flags);
|
||||
|
||||
@ -283,10 +281,7 @@ commit:
|
||||
amd_chipset = info;
|
||||
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)
|
||||
{
|
||||
@ -322,6 +317,13 @@ bool usb_amd_prefetch_quirk(void)
|
||||
}
|
||||
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
|
||||
* 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;
|
||||
memset(&amd_chipset.sb_type, 0, sizeof(amd_chipset.sb_type));
|
||||
amd_chipset.isoc_reqs = 0;
|
||||
amd_chipset.probe_result = 0;
|
||||
amd_chipset.need_pll_quirk = 0;
|
||||
|
||||
spin_unlock_irqrestore(&amd_lock, flags);
|
||||
|
||||
|
@ -5,11 +5,11 @@
|
||||
#ifdef CONFIG_USB_PCI
|
||||
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 usb_amd_find_chipset_info(void);
|
||||
int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);
|
||||
bool usb_amd_hang_symptom_quirk(void);
|
||||
bool usb_amd_prefetch_quirk(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_enable(void);
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_AMD &&
|
||||
|
Loading…
Reference in New Issue
Block a user