of/device: use of_property_for_each_string to parse compatible strings
Rob Herring
maintainerPATCH 1/1 of/device: use of_property_for_each_string to parse compatible strings
Instead of directly parsing the compatible property, use the of_property_for_each_string() helper to iterate over each compatible string. This reduces the LoC and makes the functions easier to understand.
Signed-off-by Rob Herring <[email protected]>
--- drivers/of/device.c | 66 +++++++++++++++++++---------------------------------- 1 file changed, 23 insertions(+), 43 deletions(-)
drivers/of/device.c +23 -43
@@ -195,9 +195,10 @@ EXPORT_SYMBOL(of_device_get_match_data);static ssize_t of_device_get_modalias (struct device *dev,char *str,ssize_t len) { -const char *compat; -int cplen, i; -ssize_t tsize, csize, repend; +const char *compat, *start = str; +char *c; +struct property *p; +ssize_t csize;if ((!dev) || (!dev->of_node))return -ENODEV ;
@@ -205,42 +206,24 @@ static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len/* Name & Type */ csize =snprintf (str, len,"of:N%sT%s" , dev->of_node->name, dev->of_node->type); - -/* Get compatible property if any */ - compat =of_get_property (dev->of_node,"compatible" , &cplen); -if (!compat) -return csize; - -/* Find true end (we tolerate multiple \0 at the end */ -for (i = (cplen -1 ); i >=0 && !compat[i]; i--) - cplen--; -if (!cplen) -return csize; - cplen++; - -/* Check space (need cplen+1 chars including final \0) */ - tsize = csize + cplen; - repend = tsize; - -if (csize >= len)/* @ the limit, all is already filled */ -return tsize; - -if (tsize >= len) {/* limit compat list */ - cplen = len - csize -1 ; - repend = len; - } - -/* Copy and do char replacement */ -memcpy (&str[csize +1 ], compat, cplen); -for (i = csize; i < repend; i++) { -char c = str[i]; -if (c =='\0' ) - str[i] ='C' ; -else if (c ==' ' ) - str[i] ='_' ; + len -= csize; + str += csize; + +of_property_for_each_string (dev->of_node,"compatible" , p, compat) { +if (strlen (compat) +2 > len) +break ; + + csize =snprintf (str, len,"C%s" , compat); +for (c = str; c; ) { + c =strchr (c,' ' ); +if (c) + *c++ ='_' ; + } + len -= csize; + str += csize; } -return repend; +return str - start; }int of_device_request_module (struct device *dev)
@@ -288,7 +271,8 @@ void of_device_uevent(struct device *dev, struct kobj_uevent_env *env) {const char *compat;struct alias_prop *app; -int seen =0 , cplen, sl; +struct property *p; +int seen =0 ;if ((!dev) || (!dev->of_node))return ;
@@ -301,12 +285,8 @@ void of_device_uevent(struct device *dev, struct kobj_uevent_env *env)/* Since the compatible field can contain pretty much anything * it's not really legal to split it out with commas. We split it * up using a number of environment variables instead. */ - compat =of_get_property (dev->of_node,"compatible" , &cplen); -while (compat && *compat && cplen >0 ) { +of_property_for_each_string (dev->of_node,"compatible" , p, compat) {add_uevent_var (env,"OF_COMPATIBLE_%d=%s" , seen, compat); - sl =strlen (compat) +1 ; - compat += sl; - cplen -= sl; seen++; }add_uevent_var (env,"OF_COMPATIBLE_N=%d" , seen);
Signature · 6 lines
2.11.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Rob Herring
maintainerPATCH 1/1 of/irq: use of_property_read_u32_index to parse interrupts property
Convert the interrupts property parsing to use the OF property API instead of open coding the parsing of the raw property value. This saves a number of LoC, and the result is easier to read.
Signed-off-by Rob Herring <[email protected]>
--- drivers/of/irq.c | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-)
drivers/of/irq.c +13 -21
@@ -292,8 +292,8 @@ EXPORT_SYMBOL_GPL(of_irq_parse_raw);int of_irq_parse_one (struct device_node *device,int index,struct of_phandle_args *out_irq) {struct device_node *p; -const __be32 *intspec, *addr; -u32 intsize, intlen; +const __be32 *addr; +u32 intsize;int i, res;pr_debug ("of_irq_parse_one: dev=%pOF, index=%d\n" , device, index);
@@ -311,15 +311,6 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_arif (!res)return of_irq_parse_raw (addr, out_irq); -/* Get the interrupts property */ - intspec =of_get_property (device,"interrupts" , &intlen); -if (intspec ==NULL ) -return -EINVAL ; - - intlen /=sizeof (*intspec); - -pr_debug (" intspec=%d intlen=%d\n" ,be32_to_cpup (intspec), intlen); -/* Look for the interrupt parent. */ p =of_irq_find_parent (device);if (p ==NULL )
@@ -331,20 +322,21 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar goto out; } -pr_debug (" intsize=%d intlen=%d\n" , intsize, intlen); - -/* Check index */ -if ((index +1 ) * intsize > intlen) { - res = -EINVAL ; - goto out; - } +pr_debug (" parent=%pOF, intsize=%d\n" , p, intsize);/* Copy intspec into irq structure */ - intspec += index * intsize; out_irq->np = p; out_irq->args_count = intsize; -for (i =0 ; i < intsize; i++) - out_irq->args[i] =be32_to_cpup (intspec++); +for (i =0 ; i < intsize; i++) { + res =of_property_read_u32_index (device,"interrupts" , + (index * intsize) + i, + out_irq->args + i); +if (res) + goto out; + } + +pr_debug (" intspec=%d\n" , *out_irq->args); +/* Check if there are any interrupt-map translations to process */ res =of_irq_parse_raw (addr, out_irq);
Signature · 6 lines
2.11.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html