Hi Frieder, [auto build test ERROR on robh/for-next] [also build test ERROR on v4.10-rc8] [cannot apply to input/next next-20170216] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Frieder-Schrempf/input-pwm-beeper-add-feature-to-set-volume-level/20170217-064600 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next config: x86_64-randconfig-it0-02170238 (attached as .config) compiler: gcc-4.9 (Debian 4.9.4-2) 4.9.4 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All error/warnings (new ones prefixed by >>): drivers/input/misc/pwm-beeper.c: In function 'pwm_beeper_probe': >> drivers/input/misc/pwm-beeper.c:189:9: error: 'struct pwm_beeper' has no member named 'max_volume_level' beeper->max_volume_level = 1; ^ drivers/input/misc/pwm-beeper.c:191:9: error: 'struct pwm_beeper' has no member named 'max_volume_level' beeper->max_volume_level = length; ^ In file included from include/uapi/linux/stddef.h:1:0, from include/linux/stddef.h:4, from include/uapi/linux/posix_types.h:4, from include/uapi/linux/types.h:13, from include/linux/types.h:5, from include/uapi/linux/sysinfo.h:4, from include/uapi/linux/kernel.h:4, from include/linux/cache.h:4, from include/linux/time.h:4, from include/linux/input.h:11, from drivers/input/misc/pwm-beeper.c:20: drivers/input/misc/pwm-beeper.c:194:12: error: 'struct pwm_beeper' has no member named 'max_volume_level' if (beeper->max_volume_level > 0) { ^ include/linux/compiler.h:149:30: note: in definition of macro '__trace_if' if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ ^ >> drivers/input/misc/pwm-beeper.c:194:2: note: in expansion of macro 'if' if (beeper->max_volume_level > 0) { ^ drivers/input/misc/pwm-beeper.c:194:12: error: 'struct pwm_beeper' has no member named 'max_volume_level' if (beeper->max_volume_level > 0) { ^ include/linux/compiler.h:149:42: note: in definition of macro '__trace_if' if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ ^ >> drivers/input/misc/pwm-beeper.c:194:2: note: in expansion of macro 'if' if (beeper->max_volume_level > 0) { ^ drivers/input/misc/pwm-beeper.c:194:12: error: 'struct pwm_beeper' has no member named 'max_volume_level' if (beeper->max_volume_level > 0) { ^ include/linux/compiler.h:160:16: note: in definition of macro '__trace_if' ______r = !!(cond); \ ^ >> drivers/input/misc/pwm-beeper.c:194:2: note: in expansion of macro 'if' if (beeper->max_volume_level > 0) { ^ drivers/input/misc/pwm-beeper.c:196:10: error: 'struct pwm_beeper' has no member named 'max_volume_level' beeper->max_volume_level; ^ drivers/input/misc/pwm-beeper.c:206:13: error: 'struct pwm_beeper' has no member named 'max_volume_level' beeper->max_volume_level); ^ drivers/input/misc/pwm-beeper.c:216:19: error: 'struct pwm_beeper' has no member named 'max_volume_level' value = beeper->max_volume_level - 1; ^ drivers/input/misc/pwm-beeper.c:224:9: error: 'struct pwm_beeper' has no member named 'max_volume_level' beeper->max_volume_level--; ^ drivers/input/misc/pwm-beeper.c:158:9: warning: unused variable 'size' [-Wunused-variable] size_t size; ^ vim +189 drivers/input/misc/pwm-beeper.c 14 * You should have received a copy of the GNU General Public License along 15 * with this program; if not, write to the Free Software Foundation, Inc., 16 * 675 Mass Ave, Cambridge, MA 02139, USA. 17 * 18 */ 19 > 20 #include 21 #include 22 #include 23 #include 24 #include 25 #include 26 #include 27 #include 28 29 struct pwm_beeper { 30 struct input_dev *input; 31 struct pwm_device *pwm; 32 struct work_struct work; 33 unsigned long period; 34 unsigned int volume; 35 unsigned int *volume_levels; 36 unsigned int max_volume; 37 }; 38 39 #define HZ_TO_NANOSECONDS(x) (1000000000UL/(x)) 40 41 static ssize_t beeper_show_volume(struct device *dev, 42 struct device_attribute *attr, char *buf) 43 { 44 struct pwm_beeper *beeper = dev_get_drvdata(dev); 45 46 return sprintf(buf, "%d\n", beeper->volume); 47 } 48 49 static ssize_t beeper_show_max_volume(struct device *dev, 50 struct device_attribute *attr, char *buf) 51 { 52 struct pwm_beeper *beeper = dev_get_drvdata(dev); 53 54 return sprintf(buf, "%d\n", beeper->max_volume); 55 } 56 57 static ssize_t beeper_store_volume(struct device *dev, 58 struct device_attribute *attr, const char *buf, size_t count) 59 { 60 int rc; 61 struct pwm_beeper *beeper = dev_get_drvdata(dev); 62 unsigned int volume; 63 64 rc = kstrtouint(buf, 0, &volume); 65 if (rc) 66 return rc; 67 68 if (volume > beeper->max_volume) 69 return -EINVAL; 70 pr_debug("set volume to %u\n", volume); 71 beeper->volume = volume; 72 73 return count; 74 } 75 76 static DEVICE_ATTR(volume, 0644, beeper_show_volume, beeper_store_volume); 77 static DEVICE_ATTR(max_volume, 0644, beeper_show_max_volume, NULL); 78 79 static struct attribute *pwm_beeper_attributes[] = { 80 &dev_attr_volume.attr, 81 &dev_attr_max_volume.attr, 82 NULL, 83 }; 84 85 static struct attribute_group pwm_beeper_attribute_group = { 86 .attrs = pwm_beeper_attributes, 87 }; 88 89 static void __pwm_beeper_set(struct pwm_beeper *beeper) 90 { 91 unsigned long period = beeper->period; 92 93 if (period) { 94 pwm_config(beeper->pwm, 95 period / 1000 * beeper->volume_levels[beeper->volume], 96 period); 97 pwm_enable(beeper->pwm); 98 } else 99 pwm_disable(beeper->pwm); 100 } 101 102 static void pwm_beeper_work(struct work_struct *work) 103 { 104 struct pwm_beeper *beeper = 105 container_of(work, struct pwm_beeper, work); 106 107 __pwm_beeper_set(beeper); 108 } 109 110 static int pwm_beeper_event(struct input_dev *input, 111 unsigned int type, unsigned int code, int value) 112 { 113 struct pwm_beeper *beeper = input_get_drvdata(input); 114 115 if (type != EV_SND || value < 0) 116 return -EINVAL; 117 118 switch (code) { 119 case SND_BELL: 120 value = value ? 1000 : 0; 121 break; 122 case SND_TONE: 123 break; 124 default: 125 return -EINVAL; 126 } 127 128 if (value == 0) 129 beeper->period = 0; 130 else 131 beeper->period = HZ_TO_NANOSECONDS(value); 132 133 schedule_work(&beeper->work); 134 135 return 0; 136 } 137 138 static void pwm_beeper_stop(struct pwm_beeper *beeper) 139 { 140 cancel_work_sync(&beeper->work); 141 142 if (beeper->period) 143 pwm_disable(beeper->pwm); 144 } 145 146 static void pwm_beeper_close(struct input_dev *input) 147 { 148 struct pwm_beeper *beeper = input_get_drvdata(input); 149 150 pwm_beeper_stop(beeper); 151 } 152 153 static int pwm_beeper_probe(struct platform_device *pdev) 154 { 155 unsigned long pwm_id = (unsigned long)dev_get_platdata(&pdev->dev); 156 struct pwm_beeper *beeper; 157 int error, length; 158 size_t size; 159 u32 value; 160 161 beeper = kzalloc(sizeof(*beeper), GFP_KERNEL); 162 if (!beeper) 163 return -ENOMEM; 164 165 beeper->pwm = pwm_get(&pdev->dev, NULL); 166 if (IS_ERR(beeper->pwm)) { 167 dev_dbg(&pdev->dev, "unable to request PWM, trying legacy API\n"); 168 beeper->pwm = pwm_request(pwm_id, "pwm beeper"); 169 } 170 171 if (IS_ERR(beeper->pwm)) { 172 error = PTR_ERR(beeper->pwm); 173 dev_err(&pdev->dev, "Failed to request pwm device: %d\n", error); 174 goto err_free; 175 } 176 177 /* 178 * FIXME: pwm_apply_args() should be removed when switching to 179 * the atomic PWM API. 180 */ 181 pwm_apply_args(beeper->pwm); 182 183 INIT_WORK(&beeper->work, pwm_beeper_work); 184 185 /* determine the number of volume levels */ 186 length = device_property_read_u32_array(&pdev->dev, "volume-levels", NULL, 0); 187 if (length <= 0) { 188 dev_dbg(&pdev->dev, "no volume levels specified, using max volume\n"); > 189 beeper->max_volume_level = 1; 190 } else 191 beeper->max_volume_level = length; 192 193 /* read volume levels from DT property */ > 194 if (beeper->max_volume_level > 0) { 195 size_t size = sizeof(*beeper->volume_levels) * 196 beeper->max_volume_level; 197 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation