[alsa-devel] [asoc:for-4.20 519/523] sound/soc/stm/stm32_sai_sub.c:260:16: error: field 'hw' has incomplete type
kbuild test robot
lkp at intel.com
Fri Oct 19 16:44:24 CEST 2018
tree: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-4.20
head: 7ece50c9f790270e82b77589d34e54547c895a66
commit: 8307b2afd386ccce369821daa2196068c47fe8cd [519/523] ASoC: stm32: sai: set sai as mclk clock provider
config: powerpc-allyesconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
git checkout 8307b2afd386ccce369821daa2196068c47fe8cd
# save the attached .config to linux build tree
GCC_VERSION=7.2.0 make.cross ARCH=powerpc
All error/warnings (new ones prefixed by >>):
>> sound/soc/stm/stm32_sai_sub.c:260:16: error: field 'hw' has incomplete type
struct clk_hw hw;
^~
In file included from include/linux/err.h:5:0,
from include/linux/clk.h:15,
from sound/soc/stm/stm32_sai_sub.c:19:
sound/soc/stm/stm32_sai_sub.c: In function 'stm32_sai_mclk_round_rate':
include/linux/kernel.h:997:32: error: dereferencing pointer to incomplete type 'struct clk_hw'
BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
^~~~~~
include/linux/compiler.h:335:18: note: in definition of macro '__compiletime_assert'
int __cond = !(condition); \
^~~~~~~~~
include/linux/compiler.h:358:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:45:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
include/linux/kernel.h:997:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
^~~~~~~~~~~~~~~~
include/linux/kernel.h:997:20: note: in expansion of macro '__same_type'
BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
^~~~~~~~~~~
>> sound/soc/stm/stm32_sai_sub.c:265:27: note: in expansion of macro 'container_of'
#define to_mclk_data(_hw) container_of(_hw, struct stm32_sai_mclk_data, hw)
^~~~~~~~~~~~
>> sound/soc/stm/stm32_sai_sub.c:313:37: note: in expansion of macro 'to_mclk_data'
struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
^~~~~~~~~~~~
sound/soc/stm/stm32_sai_sub.c: At top level:
>> sound/soc/stm/stm32_sai_sub.c:376:21: error: variable 'mclk_ops' has initializer but incomplete type
static const struct clk_ops mclk_ops = {
^~~~~~~
>> sound/soc/stm/stm32_sai_sub.c:377:3: error: 'const struct clk_ops' has no member named 'enable'
.enable = stm32_sai_mclk_enable,
^~~~~~
>> sound/soc/stm/stm32_sai_sub.c:377:12: warning: excess elements in struct initializer
.enable = stm32_sai_mclk_enable,
^~~~~~~~~~~~~~~~~~~~~
sound/soc/stm/stm32_sai_sub.c:377:12: note: (near initialization for 'mclk_ops')
>> sound/soc/stm/stm32_sai_sub.c:378:3: error: 'const struct clk_ops' has no member named 'disable'
.disable = stm32_sai_mclk_disable,
^~~~~~~
sound/soc/stm/stm32_sai_sub.c:378:13: warning: excess elements in struct initializer
.disable = stm32_sai_mclk_disable,
^~~~~~~~~~~~~~~~~~~~~~
sound/soc/stm/stm32_sai_sub.c:378:13: note: (near initialization for 'mclk_ops')
>> sound/soc/stm/stm32_sai_sub.c:379:3: error: 'const struct clk_ops' has no member named 'recalc_rate'
.recalc_rate = stm32_sai_mclk_recalc_rate,
^~~~~~~~~~~
sound/soc/stm/stm32_sai_sub.c:379:17: warning: excess elements in struct initializer
.recalc_rate = stm32_sai_mclk_recalc_rate,
^~~~~~~~~~~~~~~~~~~~~~~~~~
sound/soc/stm/stm32_sai_sub.c:379:17: note: (near initialization for 'mclk_ops')
>> sound/soc/stm/stm32_sai_sub.c:380:3: error: 'const struct clk_ops' has no member named 'round_rate'
.round_rate = stm32_sai_mclk_round_rate,
^~~~~~~~~~
sound/soc/stm/stm32_sai_sub.c:380:16: warning: excess elements in struct initializer
.round_rate = stm32_sai_mclk_round_rate,
^~~~~~~~~~~~~~~~~~~~~~~~~
sound/soc/stm/stm32_sai_sub.c:380:16: note: (near initialization for 'mclk_ops')
>> sound/soc/stm/stm32_sai_sub.c:381:3: error: 'const struct clk_ops' has no member named 'set_rate'
.set_rate = stm32_sai_mclk_set_rate,
^~~~~~~~
sound/soc/stm/stm32_sai_sub.c:381:14: warning: excess elements in struct initializer
.set_rate = stm32_sai_mclk_set_rate,
^~~~~~~~~~~~~~~~~~~~~~~
sound/soc/stm/stm32_sai_sub.c:381:14: note: (near initialization for 'mclk_ops')
sound/soc/stm/stm32_sai_sub.c: In function 'stm32_sai_add_mclk_provider':
>> sound/soc/stm/stm32_sai_sub.c:389:22: error: implicit declaration of function '__clk_get_name'; did you mean 'clk_get_rate'? [-Werror=implicit-function-declaration]
const char *pname = __clk_get_name(sai->sai_ck);
^~~~~~~~~~~~~~
clk_get_rate
>> sound/soc/stm/stm32_sai_sub.c:389:22: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
>> sound/soc/stm/stm32_sai_sub.c:414:18: error: implicit declaration of function 'CLK_HW_INIT'; did you mean 'KLIST_INIT'? [-Werror=implicit-function-declaration]
mclk->hw.init = CLK_HW_INIT(mclk_name, pname, &mclk_ops, 0);
^~~~~~~~~~~
KLIST_INIT
>> sound/soc/stm/stm32_sai_sub.c:419:8: error: implicit declaration of function 'devm_clk_hw_register'; did you mean 'device_unregister'? [-Werror=implicit-function-declaration]
ret = devm_clk_hw_register(&sai->pdev->dev, hw);
^~~~~~~~~~~~~~~~~~~~
device_unregister
>> sound/soc/stm/stm32_sai_sub.c:427:9: error: implicit declaration of function 'devm_of_clk_add_hw_provider'; did you mean 'of_clk_get_from_provider'? [-Werror=implicit-function-declaration]
return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
of_clk_get_from_provider
>> sound/soc/stm/stm32_sai_sub.c:427:42: error: 'of_clk_hw_simple_get' undeclared (first use in this function); did you mean 'ida_simple_get'?
return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
^~~~~~~~~~~~~~~~~~~~
ida_simple_get
sound/soc/stm/stm32_sai_sub.c:427:42: note: each undeclared identifier is reported only once for each function it appears in
sound/soc/stm/stm32_sai_sub.c: At top level:
>> sound/soc/stm/stm32_sai_sub.c:376:29: error: storage size of 'mclk_ops' isn't known
static const struct clk_ops mclk_ops = {
^~~~~~~~
sound/soc/stm/stm32_sai_sub.c: In function 'stm32_sai_add_mclk_provider':
>> sound/soc/stm/stm32_sai_sub.c:428:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cc1: some warnings being treated as errors
vim +/hw +260 sound/soc/stm/stm32_sai_sub.c
258
259 struct stm32_sai_mclk_data {
> 260 struct clk_hw hw;
261 unsigned long freq;
262 struct stm32_sai_sub_data *sai_data;
263 };
264
> 265 #define to_mclk_data(_hw) container_of(_hw, struct stm32_sai_mclk_data, hw)
266 #define STM32_SAI_MAX_CLKS 1
267
268 static int stm32_sai_get_clk_div(struct stm32_sai_sub_data *sai,
269 unsigned long input_rate,
270 unsigned long output_rate)
271 {
272 int version = sai->pdata->conf->version;
273 int div;
274
275 div = DIV_ROUND_CLOSEST(input_rate, output_rate);
276 if (div > SAI_XCR1_MCKDIV_MAX(version)) {
277 dev_err(&sai->pdev->dev, "Divider %d out of range\n", div);
278 return -EINVAL;
279 }
280 dev_dbg(&sai->pdev->dev, "SAI divider %d\n", div);
281
282 if (input_rate % div)
283 dev_dbg(&sai->pdev->dev,
284 "Rate not accurate. requested (%ld), actual (%ld)\n",
285 output_rate, input_rate / div);
286
287 return div;
288 }
289
290 static int stm32_sai_set_clk_div(struct stm32_sai_sub_data *sai,
291 unsigned int div)
292 {
293 int version = sai->pdata->conf->version;
294 int ret, cr1, mask;
295
296 if (div > SAI_XCR1_MCKDIV_MAX(version)) {
297 dev_err(&sai->pdev->dev, "Divider %d out of range\n", div);
298 return -EINVAL;
299 }
300
301 mask = SAI_XCR1_MCKDIV_MASK(SAI_XCR1_MCKDIV_WIDTH(version));
302 cr1 = SAI_XCR1_MCKDIV_SET(div);
303 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, mask, cr1);
304 if (ret < 0)
305 dev_err(&sai->pdev->dev, "Failed to update CR1 register\n");
306
307 return ret;
308 }
309
310 static long stm32_sai_mclk_round_rate(struct clk_hw *hw, unsigned long rate,
311 unsigned long *prate)
312 {
> 313 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
314 struct stm32_sai_sub_data *sai = mclk->sai_data;
315 int div;
316
317 div = stm32_sai_get_clk_div(sai, *prate, rate);
318 if (div < 0)
319 return div;
320
321 mclk->freq = *prate / div;
322
323 return mclk->freq;
324 }
325
326 static unsigned long stm32_sai_mclk_recalc_rate(struct clk_hw *hw,
327 unsigned long parent_rate)
328 {
329 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
330
331 return mclk->freq;
332 }
333
334 static int stm32_sai_mclk_set_rate(struct clk_hw *hw, unsigned long rate,
335 unsigned long parent_rate)
336 {
337 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
338 struct stm32_sai_sub_data *sai = mclk->sai_data;
339 unsigned int div;
340 int ret;
341
342 div = stm32_sai_get_clk_div(sai, parent_rate, rate);
343 if (div < 0)
344 return div;
345
346 ret = stm32_sai_set_clk_div(sai, div);
347 if (ret)
348 return ret;
349
350 mclk->freq = rate;
351
352 return 0;
353 }
354
355 static int stm32_sai_mclk_enable(struct clk_hw *hw)
356 {
357 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
358 struct stm32_sai_sub_data *sai = mclk->sai_data;
359
360 dev_dbg(&sai->pdev->dev, "Enable master clock\n");
361
362 return regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX,
363 SAI_XCR1_MCKEN, SAI_XCR1_MCKEN);
364 }
365
366 static void stm32_sai_mclk_disable(struct clk_hw *hw)
367 {
368 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw);
369 struct stm32_sai_sub_data *sai = mclk->sai_data;
370
371 dev_dbg(&sai->pdev->dev, "Disable master clock\n");
372
373 regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, SAI_XCR1_MCKEN, 0);
374 }
375
> 376 static const struct clk_ops mclk_ops = {
> 377 .enable = stm32_sai_mclk_enable,
> 378 .disable = stm32_sai_mclk_disable,
> 379 .recalc_rate = stm32_sai_mclk_recalc_rate,
> 380 .round_rate = stm32_sai_mclk_round_rate,
> 381 .set_rate = stm32_sai_mclk_set_rate,
382 };
383
384 static int stm32_sai_add_mclk_provider(struct stm32_sai_sub_data *sai)
385 {
386 struct clk_hw *hw;
387 struct stm32_sai_mclk_data *mclk;
388 struct device *dev = &sai->pdev->dev;
> 389 const char *pname = __clk_get_name(sai->sai_ck);
390 char *mclk_name, *p, *s = (char *)pname;
391 int ret, i = 0;
392
393 mclk = devm_kzalloc(dev, sizeof(mclk), GFP_KERNEL);
394 if (!mclk)
395 return -ENOMEM;
396
397 mclk_name = devm_kcalloc(dev, sizeof(char),
398 SAI_MCLK_NAME_LEN, GFP_KERNEL);
399 if (!mclk_name)
400 return -ENOMEM;
401
402 /*
403 * Forge mclk clock name from parent clock name and suffix.
404 * String after "_" char is stripped in parent name.
405 */
406 p = mclk_name;
407 while (*s && *s != '_' && (i < (SAI_MCLK_NAME_LEN - 6))) {
408 *p++ = *s++;
409 i++;
410 }
411 STM_SAI_IS_SUB_A(sai) ?
412 strncat(p, "a_mclk", 6) : strncat(p, "b_mclk", 6);
413
> 414 mclk->hw.init = CLK_HW_INIT(mclk_name, pname, &mclk_ops, 0);
415 mclk->sai_data = sai;
416 hw = &mclk->hw;
417
418 dev_dbg(dev, "Register master clock %s\n", mclk_name);
> 419 ret = devm_clk_hw_register(&sai->pdev->dev, hw);
420 if (ret) {
421 dev_err(dev, "mclk register returned %d\n", ret);
422 return ret;
423 }
424 sai->sai_mclk = hw->clk;
425
426 /* register mclk provider */
> 427 return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
> 428 }
429
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 58703 bytes
Desc: not available
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20181019/17d5d6d2/attachment-0001.bin>
More information about the Alsa-devel
mailing list