On Mon, Feb 06, 2017 at 07:03:41PM +0800, kbuild test robot wrote: > tree: https://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git pwrseq-lib > head: 06903db00af7968ff4960ab380c45a7788fee1d5 > commit: 778d7e6997538601e8ad364188bf007768922bd4 [2/10] power: add power sequence library > config: x86_64-lkp (attached as .config) > compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 > reproduce: > git checkout 778d7e6997538601e8ad364188bf007768922bd4 > # save the attached .config to linux build tree > make ARCH=x86_64 > The problem of this issue is I added IS_ENABLE(CONFIG_OF) at below patches at v12 wrongly, so if the platform does not define OF, it will has below redefinition error. I will fix it at v13. +#if IS_ENABLED(CONFIG_POWER_SEQUENCE) && IS_ENABLED(CONFIG_OF) +void pwrseq_register(struct pwrseq *pwrseq); +void pwrseq_unregister(struct pwrseq *pwrseq); +struct pwrseq *of_pwrseq_on(struct device_node *np); +void of_pwrseq_off(struct pwrseq *pwrseq); +int of_pwrseq_on_list(struct device_node *np, struct list_head *head); +void of_pwrseq_off_list(struct list_head *head); +int pwrseq_suspend(struct pwrseq *p); +int pwrseq_resume(struct pwrseq *p); +int pwrseq_suspend_list(struct list_head *head); +int pwrseq_resume_list(struct list_head *head); +#else +static inline void pwrseq_register(struct pwrseq *pwrseq) {} +static inline void pwrseq_unregister(struct pwrseq *pwrseq) {} +static inline struct pwrseq *of_pwrseq_on(struct device_node *np) +{ + return NULL; +} ... +#endif > All errors (new ones prefixed by >>): > > >> drivers/power/pwrseq/core.c:62:6: error: redefinition of 'pwrseq_register' > void pwrseq_register(struct pwrseq *pwrseq) > ^~~~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:51:20: note: previous definition of 'pwrseq_register' was here > static inline void pwrseq_register(struct pwrseq *pwrseq) {} > ^~~~~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:75:6: error: redefinition of 'pwrseq_unregister' > void pwrseq_unregister(struct pwrseq *pwrseq) > ^~~~~~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:52:20: note: previous definition of 'pwrseq_unregister' was here > static inline void pwrseq_unregister(struct pwrseq *pwrseq) {} > ^~~~~~~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:126:16: error: redefinition of 'of_pwrseq_on' > struct pwrseq *of_pwrseq_on(struct device_node *np) > ^~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:53:30: note: previous definition of 'of_pwrseq_on' was here > static inline struct pwrseq *of_pwrseq_on(struct device_node *np) > ^~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:162:6: error: redefinition of 'of_pwrseq_off' > void of_pwrseq_off(struct pwrseq *pwrseq) > ^~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:57:13: note: previous definition of 'of_pwrseq_off' was here > static void of_pwrseq_off(struct pwrseq *pwrseq) {} > ^~~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:183:5: error: redefinition of 'of_pwrseq_on_list' > int of_pwrseq_on_list(struct device_node *np, struct list_head *head) > ^~~~~~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:58:12: note: previous definition of 'of_pwrseq_on_list' was here > static int of_pwrseq_on_list(struct device_node *np, struct list_head *head) > ^~~~~~~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:214:6: error: redefinition of 'of_pwrseq_off_list' > void of_pwrseq_off_list(struct list_head *head) > ^~~~~~~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:62:13: note: previous definition of 'of_pwrseq_off_list' was here > static void of_pwrseq_off_list(struct list_head *head) {} > ^~~~~~~~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:237:5: error: redefinition of 'pwrseq_suspend' > int pwrseq_suspend(struct pwrseq *p) > ^~~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:63:12: note: previous definition of 'pwrseq_suspend' was here > static int pwrseq_suspend(struct pwrseq *p) > ^~~~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:264:5: error: redefinition of 'pwrseq_resume' > int pwrseq_resume(struct pwrseq *p) > ^~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:67:12: note: previous definition of 'pwrseq_resume' was here > static int pwrseq_resume(struct pwrseq *p) > ^~~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:290:5: error: redefinition of 'pwrseq_suspend_list' > int pwrseq_suspend_list(struct list_head *head) > ^~~~~~~~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:71:12: note: previous definition of 'pwrseq_suspend_list' was here > static int pwrseq_suspend_list(struct list_head *head) > ^~~~~~~~~~~~~~~~~~~ > >> drivers/power/pwrseq/core.c:322:5: error: redefinition of 'pwrseq_resume_list' > int pwrseq_resume_list(struct list_head *head) > ^~~~~~~~~~~~~~~~~~ > In file included from drivers/power/pwrseq/core.c:24:0: > include/linux/power/pwrseq.h:75:12: note: previous definition of 'pwrseq_resume_list' was here > static int pwrseq_resume_list(struct list_head *head) > ^~~~~~~~~~~~~~~~~~ > include/linux/power/pwrseq.h:75:12: warning: 'pwrseq_resume_list' defined but not used [-Wunused-function] > include/linux/power/pwrseq.h:71:12: warning: 'pwrseq_suspend_list' defined but not used [-Wunused-function] > static int pwrseq_suspend_list(struct list_head *head) > ^~~~~~~~~~~~~~~~~~~ > include/linux/power/pwrseq.h:67:12: warning: 'pwrseq_resume' defined but not used [-Wunused-function] > static int pwrseq_resume(struct pwrseq *p) > ^~~~~~~~~~~~~ > include/linux/power/pwrseq.h:63:12: warning: 'pwrseq_suspend' defined but not used [-Wunused-function] > static int pwrseq_suspend(struct pwrseq *p) > ^~~~~~~~~~~~~~ > include/linux/power/pwrseq.h:62:13: warning: 'of_pwrseq_off_list' defined but not used [-Wunused-function] > static void of_pwrseq_off_list(struct list_head *head) {} > ^~~~~~~~~~~~~~~~~~ > include/linux/power/pwrseq.h:58:12: warning: 'of_pwrseq_on_list' defined but not used [-Wunused-function] > static int of_pwrseq_on_list(struct device_node *np, struct list_head *head) > ^~~~~~~~~~~~~~~~~ > include/linux/power/pwrseq.h:57:13: warning: 'of_pwrseq_off' defined but not used [-Wunused-function] > static void of_pwrseq_off(struct pwrseq *pwrseq) {} > ^~~~~~~~~~~~~ > > vim +/pwrseq_register +62 drivers/power/pwrseq/core.c > > 56 > 57 /** > 58 * pwrseq_register - Add pwrseq instance to global pwrseq list > 59 * > 60 * @pwrseq: the pwrseq instance > 61 */ > > 62 void pwrseq_register(struct pwrseq *pwrseq) > 63 { > 64 mutex_lock(&pwrseq_list_mutex); > 65 list_add(&pwrseq->node, &pwrseq_list); > 66 mutex_unlock(&pwrseq_list_mutex); > 67 } > 68 EXPORT_SYMBOL_GPL(pwrseq_register); > 69 > 70 /** > 71 * pwrseq_unregister - Remove pwrseq instance from global pwrseq list > 72 * > 73 * @pwrseq: the pwrseq instance > 74 */ > > 75 void pwrseq_unregister(struct pwrseq *pwrseq) > 76 { > 77 mutex_lock(&pwrseq_list_mutex); > 78 list_del(&pwrseq->node); > 79 mutex_unlock(&pwrseq_list_mutex); > 80 } > 81 EXPORT_SYMBOL_GPL(pwrseq_unregister); > 82 > 83 static struct pwrseq *pwrseq_find_available_instance(struct device_node *np) > 84 { > 85 struct pwrseq *pwrseq; > 86 > 87 mutex_lock(&pwrseq_list_mutex); > 88 list_for_each_entry(pwrseq, &pwrseq_list, node) { > 89 if (pwrseq->used) > 90 continue; > 91 > 92 /* compare compatible string for pwrseq node */ > 93 if (of_match_node(pwrseq->pwrseq_of_match_table, np)) { > 94 pwrseq->used = true; > 95 mutex_unlock(&pwrseq_list_mutex); > 96 return pwrseq; > 97 } > 98 > 99 /* return generic pwrseq instance */ > 100 if (!strcmp(pwrseq->pwrseq_of_match_table->compatible, > 101 "generic")) { > 102 pr_debug("using generic pwrseq instance for %s\n", > 103 np->full_name); > 104 pwrseq->used = true; > 105 mutex_unlock(&pwrseq_list_mutex); > 106 return pwrseq; > 107 } > 108 } > 109 mutex_unlock(&pwrseq_list_mutex); > 110 pr_debug("Can't find any pwrseq instances for %s\n", np->full_name); > 111 > 112 return NULL; > 113 } > 114 > 115 /** > 116 * of_pwrseq_on - Carry out power sequence on for device node > 117 * > 118 * @np: the device node would like to power on > 119 * > 120 * Carry out a single device power on. If multiple devices > 121 * need to be handled, use of_pwrseq_on_list() instead. > 122 * > 123 * Return a pointer to the power sequence instance on success, > 124 * or an error code otherwise. > 125 */ > > 126 struct pwrseq *of_pwrseq_on(struct device_node *np) > 127 { > 128 struct pwrseq *pwrseq; > 129 int ret; > 130 > 131 pwrseq = pwrseq_find_available_instance(np); > 132 if (!pwrseq) > 133 return ERR_PTR(-ENOENT); > 134 > 135 ret = pwrseq_get(np, pwrseq); > 136 if (ret) { > 137 /* Mark current pwrseq as unused */ > 138 pwrseq->used = false; > 139 return ERR_PTR(ret); > 140 } > 141 > 142 ret = pwrseq_on(pwrseq); > 143 if (ret) > 144 goto pwr_put; > 145 > 146 return pwrseq; > 147 > 148 pwr_put: > 149 pwrseq_put(pwrseq); > 150 return ERR_PTR(ret); > 151 } > 152 EXPORT_SYMBOL_GPL(of_pwrseq_on); > 153 > 154 /** > 155 * of_pwrseq_off - Carry out power sequence off for this pwrseq instance > 156 * > 157 * @pwrseq: the pwrseq instance which related device would like to be off > 158 * > 159 * This API is used to power off single device, it is the opposite > 160 * operation for of_pwrseq_on. > 161 */ > > 162 void of_pwrseq_off(struct pwrseq *pwrseq) > 163 { > 164 pwrseq_off(pwrseq); > 165 pwrseq_put(pwrseq); > 166 } > 167 EXPORT_SYMBOL_GPL(of_pwrseq_off); > 168 > 169 /** > 170 * of_pwrseq_on_list - Carry out power sequence on for list > 171 * > 172 * @np: the device node would like to power on > 173 * @head: the list head for pwrseq list on this bus > 174 * > 175 * This API is used to power on multiple devices at single bus. > 176 * If there are several devices on bus (eg, USB bus), uses this > 177 * this API. Otherwise, use of_pwrseq_on instead. After the device > 178 * is powered on successfully, it will be added to pwrseq list for > 179 * this bus. The caller needs to use mutex_lock for concurrent. > 180 * > 181 * Return 0 on success, or an error value otherwise. > 182 */ > > 183 int of_pwrseq_on_list(struct device_node *np, struct list_head *head) > 184 { > 185 struct pwrseq *pwrseq; > 186 struct pwrseq_list_per_dev *pwrseq_list_node; > 187 > 188 pwrseq_list_node = kzalloc(sizeof(*pwrseq_list_node), GFP_KERNEL); > 189 if (!pwrseq_list_node) > 190 return -ENOMEM; > 191 > 192 pwrseq = of_pwrseq_on(np); > 193 if (IS_ERR(pwrseq)) { > 194 kfree(pwrseq_list_node); > 195 return PTR_ERR(pwrseq); > 196 } > 197 > 198 pwrseq_list_node->pwrseq = pwrseq; > 199 list_add(&pwrseq_list_node->list, head); > 200 > 201 return 0; > 202 } > 203 EXPORT_SYMBOL_GPL(of_pwrseq_on_list); > 204 > 205 /** > 206 * of_pwrseq_off_list - Carry out power sequence off for the list > 207 * > 208 * @head: the list head for pwrseq instance list on this bus > 209 * > 210 * This API is used to power off all devices on this bus, it is > 211 * the opposite operation for of_pwrseq_on_list. > 212 * The caller needs to use mutex_lock for concurrent. > 213 */ > > 214 void of_pwrseq_off_list(struct list_head *head) > 215 { > 216 struct pwrseq *pwrseq; > 217 struct pwrseq_list_per_dev *pwrseq_list_node, *tmp_node; > 218 > 219 list_for_each_entry_safe(pwrseq_list_node, tmp_node, head, list) { > 220 pwrseq = pwrseq_list_node->pwrseq; > 221 of_pwrseq_off(pwrseq); > 222 list_del(&pwrseq_list_node->list); > 223 kfree(pwrseq_list_node); > 224 } > 225 } > 226 EXPORT_SYMBOL_GPL(of_pwrseq_off_list); > 227 > 228 /** > 229 * pwrseq_suspend - Carry out power sequence suspend for this pwrseq instance > 230 * > 231 * @pwrseq: the pwrseq instance > 232 * > 233 * This API is used to do suspend operation on pwrseq instance. > 234 * > 235 * Return 0 on success, or an error value otherwise. > 236 */ > > 237 int pwrseq_suspend(struct pwrseq *p) > 238 { > 239 int ret = 0; > 240 > > --- > 0-DAY kernel test infrastructure Open Source Technology Center > https://lists.01.org/pipermail/kbuild-all Intel Corporation -- Best Regards, Peter Chen -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html