static inline extern等概念

写驱动时碰到如下函数调用,涉及知识点 static inline extern

include/of.h中有如下定义:

extern struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);

static inline struct device_node *of_find_node_by_name(struct device_node *from,
const char *name)
{
return NULL;
}

drivers/of/base.c中定义如下:

/**
* of_find_node_by_name - Find a node by its "name" property
* @from: The node to start searching from or NULL, the node
* you pass will not be searched, only the next one
* will; typically, you pass what the previous call
* returned. of_node_put() will be called on it
* @name: The name string to match against
*
* Returns a node pointer with refcount incremented, use
* of_node_put() on it when done.
*/
struct device_node *of_find_node_by_name(struct device_node *from,
const char *name)
{
struct device_node *np;
unsigned long flags;

raw_spin_lock_irqsave(&devtree_lock, flags);
for_each_of_allnodes_from(from, np)
if (np->name && (of_node_cmp(np->name, name) == 0)
&& of_node_get(np))
break;
of_node_put(from);
raw_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
EXPORT_SYMBOL(of_find_node_by_name);

后来发觉是一场误会:

#ifdef CONFIG_OF

extern struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);

#else /* CONFIG_OF */

static inline struct device_node *of_find_node_by_name(struct device_node *from,
const char *name)
{
return NULL;
}

#endif /* CONFIG_OF */

原文地址:https://www.cnblogs.com/idyllcheung/p/13186884.html