Re: [PATCH] PNPACPI: do ACPI binding directly

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

 



On Mon, 2014-07-07 at 14:53 +0200, Rafael J. Wysocki wrote:
> On Wednesday, July 02, 2014 08:54:49 PM Zhang Rui wrote:
> > From 7daac7fc7cd7b605ccd84f10fc206cedf6170e89 Mon Sep 17 00:00:00 2001
> > From: Zhang Rui <rui.zhang@xxxxxxxxx>
> > Date: Fri, 20 Jun 2014 10:14:07 +0800
> > Subject: [PATCH] PNPACPI: do ACPI binding directly
> > 
> > PNPACPI uses acpi_bus_type to do ACPI binding for the PNPACPI devices.
> > 
> > This is overkill because PNPACPI code already knows which ACPI
> > device object to bind during PNPACPI device enumeration.
> > 
> > This patch removes acpi_pnp_bus and does the binding by invoking
> > acpi_bind_one() directly after device enumerated.
> > 
> > This also fixes a bug in the previous code that some PNPACPI devices failed
> > to be bound because
> > 1. the ACPI device _HID is not pnpid, e.g. "MSFT0001", but its _CID is,
> >    e.g. "PNP0303", thus ACPI _CID is used as the pnp device device id.
> > 2. device is bound only if the pnp device id matches the ACPI device _HID.
> > 
> > Tested-by: Prigent Christophe <christophe.prigent@xxxxxxxxx>
> > Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx>
> 
> Does this fix a regression?

Hmmm, no, the problem exists in all previous kernel versions IMO.

>   If so, do we need it in 3.16?
> 
Not necessarily, but as this is a bug fix, so I think it is reasonable
to be shipped in 3.16, right?

thanks,
rui
> Rafael
> 
> 
> > ---
> >  drivers/acpi/internal.h    |  2 --
> >  drivers/pnp/pnpacpi/core.c | 41 +++--------------------------------------
> >  include/acpi/acpi_bus.h    |  2 ++
> >  3 files changed, 5 insertions(+), 40 deletions(-)
> > 
> > diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
> > index 7de5b60..151f3e7 100644
> > --- a/drivers/acpi/internal.h
> > +++ b/drivers/acpi/internal.h
> > @@ -84,8 +84,6 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
> >  			     int type, unsigned long long sta);
> >  void acpi_device_add_finalize(struct acpi_device *device);
> >  void acpi_free_pnp_ids(struct acpi_device_pnp *pnp);
> > -int acpi_bind_one(struct device *dev, struct acpi_device *adev);
> > -int acpi_unbind_one(struct device *dev);
> >  bool acpi_device_is_present(struct acpi_device *adev);
> >  bool acpi_device_is_battery(struct acpi_device *adev);
> >  
> > diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
> > index b81448b..3bebeda 100644
> > --- a/drivers/pnp/pnpacpi/core.c
> > +++ b/drivers/pnp/pnpacpi/core.c
> > @@ -295,9 +295,11 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
> >  		return error;
> >  	}
> >  
> > +	error = acpi_bind_one(&dev->dev, device);
> > +
> >  	num++;
> >  
> > -	return 0;
> > +	return error;
> >  }
> >  
> >  static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,
> > @@ -313,41 +315,6 @@ static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,
> >  	return AE_OK;
> >  }
> >  
> > -static int __init acpi_pnp_match(struct device *dev, void *_pnp)
> > -{
> > -	struct acpi_device *acpi = to_acpi_device(dev);
> > -	struct pnp_dev *pnp = _pnp;
> > -
> > -	/* true means it matched */
> > -	return !acpi->physical_node_count
> > -	    && compare_pnp_id(pnp->id, acpi_device_hid(acpi));
> > -}
> > -
> > -static struct acpi_device * __init acpi_pnp_find_companion(struct device *dev)
> > -{
> > -	dev = bus_find_device(&acpi_bus_type, NULL, to_pnp_dev(dev),
> > -			      acpi_pnp_match);
> > -	if (!dev)
> > -		return NULL;
> > -
> > -	put_device(dev);
> > -	return to_acpi_device(dev);
> > -}
> > -
> > -/* complete initialization of a PNPACPI device includes having
> > - * pnpdev->dev.archdata.acpi_handle point to its ACPI sibling.
> > - */
> > -static bool acpi_pnp_bus_match(struct device *dev)
> > -{
> > -	return dev->bus == &pnp_bus_type;
> > -}
> > -
> > -static struct acpi_bus_type __initdata acpi_pnp_bus = {
> > -	.name	     = "PNP",
> > -	.match	     = acpi_pnp_bus_match,
> > -	.find_companion = acpi_pnp_find_companion,
> > -};
> > -
> >  int pnpacpi_disabled __initdata;
> >  static int __init pnpacpi_init(void)
> >  {
> > @@ -357,10 +324,8 @@ static int __init pnpacpi_init(void)
> >  	}
> >  	printk(KERN_INFO "pnp: PnP ACPI init\n");
> >  	pnp_register_protocol(&pnpacpi_protocol);
> > -	register_acpi_bus_type(&acpi_pnp_bus);
> >  	acpi_get_devices(NULL, pnpacpi_add_device_handler, NULL, NULL);
> >  	printk(KERN_INFO "pnp: PnP ACPI: found %d devices\n", num);
> > -	unregister_acpi_bus_type(&acpi_pnp_bus);
> >  	pnp_platform_devices = 1;
> >  	return 0;
> >  }
> > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
> > index b571458..4bcbb94 100644
> > --- a/include/acpi/acpi_bus.h
> > +++ b/include/acpi/acpi_bus.h
> > @@ -487,6 +487,8 @@ struct acpi_bus_type {
> >  };
> >  int register_acpi_bus_type(struct acpi_bus_type *);
> >  int unregister_acpi_bus_type(struct acpi_bus_type *);
> > +int acpi_bind_one(struct device *dev, struct acpi_device *adev);
> > +int acpi_unbind_one(struct device *dev);
> >  
> >  struct acpi_pci_root {
> >  	struct acpi_device * device;
> > 
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux