@ -479,7 +479,6 @@ static int radeon_atpx_power_state(enum vga_switcheroo_client_id id,
*/
*/
static bool radeon_atpx_pci_probe_handle ( struct pci_dev * pdev )
static bool radeon_atpx_pci_probe_handle ( struct pci_dev * pdev )
{
{
struct pci_dev * parent_pdev = pci_upstream_bridge ( pdev ) ;
acpi_handle dhandle , atpx_handle ;
acpi_handle dhandle , atpx_handle ;
acpi_status status ;
acpi_status status ;
@ -493,7 +492,6 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
radeon_atpx_priv . dhandle = dhandle ;
radeon_atpx_priv . dhandle = dhandle ;
radeon_atpx_priv . atpx . handle = atpx_handle ;
radeon_atpx_priv . atpx . handle = atpx_handle ;
radeon_atpx_priv . bridge_pm_usable = parent_pdev & & parent_pdev - > bridge_d3 ;
return true ;
return true ;
}
}
@ -555,11 +553,16 @@ static bool radeon_atpx_detect(void)
struct pci_dev * pdev = NULL ;
struct pci_dev * pdev = NULL ;
bool has_atpx = false ;
bool has_atpx = false ;
int vga_count = 0 ;
int vga_count = 0 ;
bool d3_supported = false ;
struct pci_dev * parent_pdev ;
while ( ( pdev = pci_get_class ( PCI_CLASS_DISPLAY_VGA < < 8 , pdev ) ) ! = NULL ) {
while ( ( pdev = pci_get_class ( PCI_CLASS_DISPLAY_VGA < < 8 , pdev ) ) ! = NULL ) {
vga_count + + ;
vga_count + + ;
has_atpx | = ( radeon_atpx_pci_probe_handle ( pdev ) = = true ) ;
has_atpx | = ( radeon_atpx_pci_probe_handle ( pdev ) = = true ) ;
parent_pdev = pci_upstream_bridge ( pdev ) ;
d3_supported | = parent_pdev & & parent_pdev - > bridge_d3 ;
}
}
/* some newer PX laptops mark the dGPU as a non-VGA display device */
/* some newer PX laptops mark the dGPU as a non-VGA display device */
@ -567,6 +570,9 @@ static bool radeon_atpx_detect(void)
vga_count + + ;
vga_count + + ;
has_atpx | = ( radeon_atpx_pci_probe_handle ( pdev ) = = true ) ;
has_atpx | = ( radeon_atpx_pci_probe_handle ( pdev ) = = true ) ;
parent_pdev = pci_upstream_bridge ( pdev ) ;
d3_supported | = parent_pdev & & parent_pdev - > bridge_d3 ;
}
}
if ( has_atpx & & vga_count = = 2 ) {
if ( has_atpx & & vga_count = = 2 ) {
@ -574,6 +580,7 @@ static bool radeon_atpx_detect(void)
printk ( KERN_INFO " vga_switcheroo: detected switching method %s handle \n " ,
printk ( KERN_INFO " vga_switcheroo: detected switching method %s handle \n " ,
acpi_method_name ) ;
acpi_method_name ) ;
radeon_atpx_priv . atpx_detected = true ;
radeon_atpx_priv . atpx_detected = true ;
radeon_atpx_priv . bridge_pm_usable = d3_supported ;
radeon_atpx_init ( ) ;
radeon_atpx_init ( ) ;
return true ;
return true ;
}
}