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 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
Attachment:
.config.gz
Description: application/gzip