We have a better idea why the Yoga patches are affecting one touchpad. Bring them back so everyone can benefit from Yoga.
		
			
				
	
	
		
			124 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 66586baba56679baa2da1a10a96ccf15b1e96b95 Mon Sep 17 00:00:00 2001
 | |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
 | |
| Date: Mon, 30 Nov 2015 17:11:32 +0200
 | |
| Subject: [PATCH 04/16] device property: keep single value inplace
 | |
| 
 | |
| We may save a lot of lines of code and space by keeping single values inside
 | |
| the struct property_entry. Refactor the implementation to do so.
 | |
| 
 | |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
 | |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 | |
| ---
 | |
|  drivers/base/property.c  | 33 ++++++++++++++++++++++++++++++---
 | |
|  include/linux/property.h | 31 +++++++++++++++++++++++--------
 | |
|  2 files changed, 53 insertions(+), 11 deletions(-)
 | |
| 
 | |
| diff --git a/drivers/base/property.c b/drivers/base/property.c
 | |
| index 86834bd..ad3cb09 100644
 | |
| --- a/drivers/base/property.c
 | |
| +++ b/drivers/base/property.c
 | |
| @@ -72,7 +72,10 @@ static void *pset_prop_find(struct property_set *pset, const char *propname,
 | |
|  	prop = pset_prop_get(pset, propname);
 | |
|  	if (!prop)
 | |
|  		return ERR_PTR(-EINVAL);
 | |
| -	pointer = prop->value.raw_data;
 | |
| +	if (prop->is_array)
 | |
| +		pointer = prop->pointer.raw_data;
 | |
| +	else
 | |
| +		pointer = &prop->value.raw_data;
 | |
|  	if (!pointer)
 | |
|  		return ERR_PTR(-ENODATA);
 | |
|  	if (length > prop->length)
 | |
| @@ -167,6 +170,31 @@ static int pset_prop_read_string_array(struct property_set *pset,
 | |
|  	return 0;
 | |
|  }
 | |
|  
 | |
| +static int pset_prop_read_string(struct property_set *pset,
 | |
| +				 const char *propname, const char **strings)
 | |
| +{
 | |
| +	struct property_entry *prop;
 | |
| +	const char **pointer;
 | |
| +
 | |
| +	prop = pset_prop_get(pset, propname);
 | |
| +	if (!prop)
 | |
| +		return -EINVAL;
 | |
| +	if (!prop->is_string)
 | |
| +		return -EILSEQ;
 | |
| +	if (prop->is_array) {
 | |
| +		pointer = prop->pointer.str;
 | |
| +		if (!pointer)
 | |
| +			return -ENODATA;
 | |
| +	} else {
 | |
| +		pointer = &prop->value.str;
 | |
| +		if (*pointer && strnlen(*pointer, prop->length) >= prop->length)
 | |
| +			return -EILSEQ;
 | |
| +	}
 | |
| +
 | |
| +	*strings = *pointer;
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
|  static inline struct fwnode_handle *dev_fwnode(struct device *dev)
 | |
|  {
 | |
|  	return IS_ENABLED(CONFIG_OF) && dev->of_node ?
 | |
| @@ -566,8 +594,7 @@ int fwnode_property_read_string(struct fwnode_handle *fwnode,
 | |
|  		return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
 | |
|  					   val, 1);
 | |
|  	else if (is_pset_node(fwnode))
 | |
| -		return pset_prop_read_string_array(to_pset_node(fwnode),
 | |
| -						   propname, val, 1);
 | |
| +		return pset_prop_read_string(to_pset_node(fwnode), propname, val);
 | |
|  	return -ENXIO;
 | |
|  }
 | |
|  EXPORT_SYMBOL_GPL(fwnode_property_read_string);
 | |
| diff --git a/include/linux/property.h b/include/linux/property.h
 | |
| index c29460a..69a8a08 100644
 | |
| --- a/include/linux/property.h
 | |
| +++ b/include/linux/property.h
 | |
| @@ -145,19 +145,34 @@ static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode,
 | |
|   * struct property_entry - "Built-in" device property representation.
 | |
|   * @name: Name of the property.
 | |
|   * @length: Length of data making up the value.
 | |
| - * @value: Value of the property (an array of items of the given type).
 | |
| + * @is_array: True when the property is an array.
 | |
| + * @is_string: True when property is a string.
 | |
| + * @pointer: Pointer to the property (an array of items of the given type).
 | |
| + * @value: Value of the property (when it is a single item of the given type).
 | |
|   */
 | |
|  struct property_entry {
 | |
|  	const char *name;
 | |
|  	size_t length;
 | |
| +	bool is_array;
 | |
| +	bool is_string;
 | |
|  	union {
 | |
| -		void *raw_data;
 | |
| -		u8 *u8_data;
 | |
| -		u16 *u16_data;
 | |
| -		u32 *u32_data;
 | |
| -		u64 *u64_data;
 | |
| -		const char **str;
 | |
| -	} value;
 | |
| +		union {
 | |
| +			void *raw_data;
 | |
| +			u8 *u8_data;
 | |
| +			u16 *u16_data;
 | |
| +			u32 *u32_data;
 | |
| +			u64 *u64_data;
 | |
| +			const char **str;
 | |
| +		} pointer;
 | |
| +		union {
 | |
| +			unsigned long long raw_data;
 | |
| +			u8 u8_data;
 | |
| +			u16 u16_data;
 | |
| +			u32 u32_data;
 | |
| +			u64 u64_data;
 | |
| +			const char *str;
 | |
| +		} value;
 | |
| +	};
 | |
|  };
 | |
|  
 | |
|  /**
 | |
| -- 
 | |
| 2.5.0
 | |
| 
 |