diff options
Diffstat (limited to 'drivers/pnp')
| -rw-r--r-- | drivers/pnp/pnpacpi/core.c | 72 | ||||
| -rw-r--r-- | drivers/pnp/pnpbios/bioscalls.c | 2 | ||||
| -rw-r--r-- | drivers/pnp/quirks.c | 4 | ||||
| -rw-r--r-- | drivers/pnp/resource.c | 4 | 
4 files changed, 35 insertions, 47 deletions
| diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c index 9f611cbbc294..b81448b2c75d 100644 --- a/drivers/pnp/pnpacpi/core.c +++ b/drivers/pnp/pnpacpi/core.c @@ -30,26 +30,6 @@  static int num; -/* We need only to blacklist devices that have already an acpi driver that - * can't use pnp layer. We don't need to blacklist device that are directly - * used by the kernel (PCI root, ...), as it is harmless and there were - * already present in pnpbios. But there is an exception for devices that - * have irqs (PIC, Timer) because we call acpi_register_gsi. - * Finally, only devices that have a CRS method need to be in this list. - */ -static struct acpi_device_id excluded_id_list[] __initdata = { -	{"PNP0C09", 0},		/* EC */ -	{"PNP0C0F", 0},		/* Link device */ -	{"PNP0000", 0},		/* PIC */ -	{"PNP0100", 0},		/* Timer */ -	{"", 0}, -}; - -static inline int __init is_exclusive_device(struct acpi_device *dev) -{ -	return (!acpi_match_device_ids(dev, excluded_id_list)); -} -  /*   * Compatible Device IDs   */ @@ -83,8 +63,7 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)  {  	struct acpi_device *acpi_dev;  	acpi_handle handle; -	struct acpi_buffer buffer; -	int ret; +	int ret = 0;  	pnp_dbg(&dev->dev, "set resources\n"); @@ -97,19 +76,26 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)  	if (WARN_ON_ONCE(acpi_dev != dev->data))  		dev->data = acpi_dev; -	ret = pnpacpi_build_resource_template(dev, &buffer); -	if (ret) -		return ret; -	ret = pnpacpi_encode_resources(dev, &buffer); -	if (ret) { +	if (acpi_has_method(handle, METHOD_NAME__SRS)) { +		struct acpi_buffer buffer; + +		ret = pnpacpi_build_resource_template(dev, &buffer); +		if (ret) +			return ret; + +		ret = pnpacpi_encode_resources(dev, &buffer); +		if (!ret) { +			acpi_status status; + +			status = acpi_set_current_resources(handle, &buffer); +			if (ACPI_FAILURE(status)) +				ret = -EIO; +		}  		kfree(buffer.pointer); -		return ret;  	} -	if (ACPI_FAILURE(acpi_set_current_resources(handle, &buffer))) -		ret = -EINVAL; -	else if (acpi_bus_power_manageable(handle)) +	if (!ret && acpi_bus_power_manageable(handle))  		ret = acpi_bus_set_power(handle, ACPI_STATE_D0); -	kfree(buffer.pointer); +  	return ret;  } @@ -117,7 +103,7 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev)  {  	struct acpi_device *acpi_dev;  	acpi_handle handle; -	int ret; +	acpi_status status;  	dev_dbg(&dev->dev, "disable resources\n"); @@ -128,13 +114,15 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev)  	}  	/* acpi_unregister_gsi(pnp_irq(dev, 0)); */ -	ret = 0;  	if (acpi_bus_power_manageable(handle))  		acpi_bus_set_power(handle, ACPI_STATE_D3_COLD); -		/* continue even if acpi_bus_set_power() fails */ -	if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DIS", NULL, NULL))) -		ret = -ENODEV; -	return ret; + +	/* continue even if acpi_bus_set_power() fails */ +	status = acpi_evaluate_object(handle, "_DIS", NULL, NULL); +	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) +		return -ENODEV; + +	return 0;  }  #ifdef CONFIG_ACPI_SLEEP @@ -258,7 +246,7 @@ static int __init pnpacpi_add_device(struct acpi_device *device)  	if (!pnpid)  		return 0; -	if (is_exclusive_device(device) || !device->status.present) +	if (!device->status.present)  		return 0;  	dev = pnp_alloc_dev(&pnpacpi_protocol, num, pnpid); @@ -318,10 +306,10 @@ static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,  {  	struct acpi_device *device; -	if (!acpi_bus_get_device(handle, &device)) -		pnpacpi_add_device(device); -	else +	if (acpi_bus_get_device(handle, &device))  		return AE_CTRL_DEPTH; +	if (acpi_is_pnp_device(device)) +		pnpacpi_add_device(device);  	return AE_OK;  } diff --git a/drivers/pnp/pnpbios/bioscalls.c b/drivers/pnp/pnpbios/bioscalls.c index deb7f4bcdb7b..438d4c72c7b3 100644 --- a/drivers/pnp/pnpbios/bioscalls.c +++ b/drivers/pnp/pnpbios/bioscalls.c @@ -37,7 +37,7 @@ __visible struct {   * kernel begins at offset 3GB...   */ -asmlinkage void pnp_bios_callfunc(void); +asmlinkage __visible void pnp_bios_callfunc(void);  __asm__(".text			\n"  	__ALIGN_STR "\n" diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index 3736bc408adb..ebf0d6710b5a 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c @@ -335,7 +335,7 @@ static void quirk_amd_mmconfig_area(struct pnp_dev *dev)  }  #endif -#ifdef CONFIG_X86 +#ifdef CONFIG_PCI  /* Device IDs of parts that have 32KB MCH space */  static const unsigned int mch_quirk_devices[] = {  	0x0154,	/* Ivy Bridge */ @@ -440,7 +440,7 @@ static struct pnp_fixup pnp_fixups[] = {  #ifdef CONFIG_AMD_NB  	{"PNP0c01", quirk_amd_mmconfig_area},  #endif -#ifdef CONFIG_X86 +#ifdef CONFIG_PCI  	{"PNP0c02", quirk_intel_mch},  #endif  	{""} diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c index 01712cbfd92e..782e82289571 100644 --- a/drivers/pnp/resource.c +++ b/drivers/pnp/resource.c @@ -360,7 +360,7 @@ int pnp_check_irq(struct pnp_dev *dev, struct resource *res)  		return 1;  	/* check if the resource is valid */ -	if (*irq < 0 || *irq > 15) +	if (*irq > 15)  		return 0;  	/* check if the resource is reserved */ @@ -424,7 +424,7 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res)  		return 1;  	/* check if the resource is valid */ -	if (*dma < 0 || *dma == 4 || *dma > 7) +	if (*dma == 4 || *dma > 7)  		return 0;  	/* check if the resource is reserved */ | 
