All of lore.kernel.org
 help / color / mirror / Atom feed
From: kbuild test robot <lkp@intel.com>
To: Neil Armstrong <narmstrong@baylibre.com>
Cc: kbuild-all@01.org, hverkuil@xs4all.nl, mchehab@kernel.org,
	Neil Armstrong <narmstrong@baylibre.com>,
	linux-amlogic@lists.infradead.org, linux-media@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 2/3] media: platform: meson: Add Amlogic Meson G12A AO CEC Controller driver
Date: Tue, 9 Apr 2019 02:08:04 +0800	[thread overview]
Message-ID: <201904090252.BPKOeIGV%lkp@intel.com> (raw)
In-Reply-To: <20190408092358.25894-3-narmstrong@baylibre.com>

[-- Attachment #1: Type: text/plain, Size: 13398 bytes --]

Hi Neil,

I love your patch! Yet something to improve:

[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v5.1-rc4 next-20190408]
[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/Neil-Armstrong/media-dt-bindings-media-meson-ao-cec-Add-G12A-AO-CEC-B-Compatible/20190408-233912
base:   git://linuxtv.org/media_tree.git master
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=ia64 

All error/warnings (new ones prefixed by >>):

>> drivers/media/platform/meson/ao-cec-g12a.c:206:16: error: field 'hw' has incomplete type
     struct clk_hw hw;
                   ^~
   In file included from include/linux/build_bug.h:5,
                    from include/linux/bitfield.h:18,
                    from drivers/media/platform/meson/ao-cec-g12a.c:10:
   drivers/media/platform/meson/ao-cec-g12a.c: In function 'meson_ao_cec_g12a_dualdiv_clk_recalc_rate':
   include/linux/kernel.h:979:32: error: dereferencing pointer to incomplete type 'struct clk_hw'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                                   ^~~~~~
   include/linux/compiler.h:324:9: note: in definition of macro '__compiletime_assert'
      if (!(condition))     \
            ^~~~~~~~~
   include/linux/compiler.h:344:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:979:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:979:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:211:2: note: in expansion of macro 'container_of'
     container_of(_hw, struct meson_ao_cec_g12a_dualdiv_clk, hw) \
     ^~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:218:3: note: in expansion of macro 'hw_to_meson_ao_cec_g12a_dualdiv_clk'
      hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c: At top level:
>> drivers/media/platform/meson/ao-cec-g12a.c:317:21: error: variable 'meson_ao_cec_g12a_dualdiv_clk_ops' has initializer but incomplete type
    static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
                        ^~~~~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:318:3: error: 'const struct clk_ops' has no member named 'recalc_rate'
     .recalc_rate = meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
      ^~~~~~~~~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:318:17: warning: excess elements in struct initializer
     .recalc_rate = meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:318:17: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:319:3: error: 'const struct clk_ops' has no member named 'is_enabled'
     .is_enabled = meson_ao_cec_g12a_dualdiv_clk_is_enabled,
      ^~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:319:16: warning: excess elements in struct initializer
     .is_enabled = meson_ao_cec_g12a_dualdiv_clk_is_enabled,
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:319:16: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:320:3: error: 'const struct clk_ops' has no member named 'enable'
     .enable  = meson_ao_cec_g12a_dualdiv_clk_enable,
      ^~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:320:13: warning: excess elements in struct initializer
     .enable  = meson_ao_cec_g12a_dualdiv_clk_enable,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:320:13: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:321:3: error: 'const struct clk_ops' has no member named 'disable'
     .disable = meson_ao_cec_g12a_dualdiv_clk_disable,
      ^~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:321:13: warning: excess elements in struct initializer
     .disable = meson_ao_cec_g12a_dualdiv_clk_disable,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:321:13: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
   drivers/media/platform/meson/ao-cec-g12a.c: In function 'meson_ao_cec_g12a_setup_clk':
>> drivers/media/platform/meson/ao-cec-g12a.c:328:23: error: storage size of 'init' isn't known
     struct clk_init_data init;
                          ^~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:341:16: error: implicit declaration of function '__clk_get_name'; did you mean 'clk_get_rate'? [-Werror=implicit-function-declaration]
     parent_name = __clk_get_name(ao_cec->oscin);
                   ^~~~~~~~~~~~~~
                   clk_get_rate
>> drivers/media/platform/meson/ao-cec-g12a.c:341:14: warning: assignment to 'const char *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
     parent_name = __clk_get_name(ao_cec->oscin);
                 ^
>> drivers/media/platform/meson/ao-cec-g12a.c:351:8: error: implicit declaration of function 'devm_clk_register'; did you mean 'device_register'? [-Werror=implicit-function-declaration]
     clk = devm_clk_register(dev, &dualdiv_clk->hw);
           ^~~~~~~~~~~~~~~~~
           device_register
   drivers/media/platform/meson/ao-cec-g12a.c:328:23: warning: unused variable 'init' [-Wunused-variable]
     struct clk_init_data init;
                          ^~~~
   drivers/media/platform/meson/ao-cec-g12a.c: At top level:
>> drivers/media/platform/meson/ao-cec-g12a.c:317:29: error: storage size of 'meson_ao_cec_g12a_dualdiv_clk_ops' isn't known
    static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

vim +/hw +206 drivers/media/platform/meson/ao-cec-g12a.c

   186	
   187	/*
   188	 * The AO-CECB embeds a dual/divider to generate a more precise
   189	 * 32,768KHz clock for CEC core clock.
   190	 *                      ______   ______
   191	 *                     |      | |      |
   192	 *         ______      | Div1 |-| Cnt1 |       ______
   193	 *        |      |    /|______| |______|\     |      |
   194	 * Xtal-->| Gate |---|  ______   ______  X-X--| Gate |-->
   195	 *        |______| |  \|      | |      |/  |  |______|
   196	 *                 |   | Div2 |-| Cnt2 |   |
   197	 *                 |   |______| |______|   |
   198	 *                 |_______________________|
   199	 *
   200	 * The dividing can be switched to single or dual, with a counter
   201	 * for each divider to set when the switching is done.
   202	 * The entire dividing mechanism can be also bypassed.
   203	 */
   204	
   205	struct meson_ao_cec_g12a_dualdiv_clk {
 > 206		struct clk_hw hw;
   207		struct regmap *regmap;
   208	};
   209	
   210	#define hw_to_meson_ao_cec_g12a_dualdiv_clk(_hw)			\
 > 211		container_of(_hw, struct meson_ao_cec_g12a_dualdiv_clk, hw)	\
   212	
   213	static unsigned long
   214	meson_ao_cec_g12a_dualdiv_clk_recalc_rate(struct clk_hw *hw,
   215						  unsigned long parent_rate)
   216	{
   217		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
 > 218			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   219		unsigned long n1;
   220		u32 reg0, reg1;
   221	
   222		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &reg0);
   223		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &reg1);
   224	
   225		if (reg1 & CECB_CLK_CNTL_BYPASS_EN)
   226			return parent_rate;
   227	
   228		if (reg0 & CECB_CLK_CNTL_DUAL_EN) {
   229			unsigned long n2, m1, m2, f1, f2, p1, p2;
   230	
   231			n1 = FIELD_GET(CECB_CLK_CNTL_N1, reg0) + 1;
   232			n2 = FIELD_GET(CECB_CLK_CNTL_N2, reg0) + 1;
   233	
   234			m1 = FIELD_GET(CECB_CLK_CNTL_M1, reg1) + 1;
   235			m2 = FIELD_GET(CECB_CLK_CNTL_M1, reg1) + 1;
   236	
   237			f1 = DIV_ROUND_CLOSEST(parent_rate, n1);
   238			f2 = DIV_ROUND_CLOSEST(parent_rate, n2);
   239	
   240			p1 = DIV_ROUND_CLOSEST(100000000 * m1, f1 * (m1 + m2));
   241			p2 = DIV_ROUND_CLOSEST(100000000 * m2, f2 * (m1 + m2));
   242	
   243			return DIV_ROUND_UP(100000000, p1 + p2);
   244		}
   245	
   246		n1 = FIELD_GET(CECB_CLK_CNTL_N1, reg0) + 1;
   247	
   248		return DIV_ROUND_CLOSEST(parent_rate, n1);
   249	}
   250	
   251	static int meson_ao_cec_g12a_dualdiv_clk_enable(struct clk_hw *hw)
   252	{
   253		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   254			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   255	
   256	
   257		/* Disable Input & Output */
   258		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   259				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   260				   0);
   261	
   262		/* Set N1 & N2 */
   263		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   264				   CECB_CLK_CNTL_N1,
   265				   FIELD_PREP(CECB_CLK_CNTL_N1, 733 - 1));
   266	
   267		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   268				   CECB_CLK_CNTL_N2,
   269				   FIELD_PREP(CECB_CLK_CNTL_N2, 732 - 1));
   270	
   271		/* Set M1 & M2 */
   272		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   273				   CECB_CLK_CNTL_M1,
   274				   FIELD_PREP(CECB_CLK_CNTL_M1, 8 - 1));
   275	
   276		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   277				   CECB_CLK_CNTL_M2,
   278				   FIELD_PREP(CECB_CLK_CNTL_M2, 11 - 1));
   279	
   280		/* Enable Dual divisor */
   281		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   282				   CECB_CLK_CNTL_DUAL_EN, CECB_CLK_CNTL_DUAL_EN);
   283	
   284		/* Disable divisor bypass */
   285		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   286				   CECB_CLK_CNTL_BYPASS_EN, 0);
   287	
   288		/* Enable Input & Output */
   289		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   290				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   291				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN);
   292	
   293		return 0;
   294	}
   295	
   296	static void meson_ao_cec_g12a_dualdiv_clk_disable(struct clk_hw *hw)
   297	{
   298		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   299			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   300	
   301		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   302				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   303				   0);
   304	}
   305	
   306	static int meson_ao_cec_g12a_dualdiv_clk_is_enabled(struct clk_hw *hw)
   307	{
   308		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   309			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   310		int val;
   311	
   312		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &val);
   313	
   314		return !!(val & (CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN));
   315	}
   316	
 > 317	static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
 > 318		.recalc_rate	= meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
 > 319		.is_enabled	= meson_ao_cec_g12a_dualdiv_clk_is_enabled,
 > 320		.enable		= meson_ao_cec_g12a_dualdiv_clk_enable,
 > 321		.disable	= meson_ao_cec_g12a_dualdiv_clk_disable,
   322	};
   323	
   324	static int meson_ao_cec_g12a_setup_clk(struct meson_ao_cec_g12a_device *ao_cec)
   325	{
   326		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk;
   327		struct device *dev = &ao_cec->pdev->dev;
 > 328		struct clk_init_data init;
   329		const char *parent_name;
   330		struct clk *clk;
   331		char *name;
   332	
   333		dualdiv_clk = devm_kzalloc(dev, sizeof(*dualdiv_clk), GFP_KERNEL);
   334		if (!dualdiv_clk)
   335			return -ENOMEM;
   336	
   337		name = kasprintf(GFP_KERNEL, "%s#dualdiv_clk", dev_name(dev));
   338		if (!name)
   339			return -ENOMEM;
   340	
 > 341		parent_name = __clk_get_name(ao_cec->oscin);
   342	
   343		init.name = name;
   344		init.ops = &meson_ao_cec_g12a_dualdiv_clk_ops;
   345		init.flags = 0;
   346		init.parent_names = &parent_name;
   347		init.num_parents = 1;
   348		dualdiv_clk->regmap = ao_cec->regmap;
   349		dualdiv_clk->hw.init = &init;
   350	
 > 351		clk = devm_clk_register(dev, &dualdiv_clk->hw);
   352		kfree(name);
   353		if (IS_ERR(clk)) {
   354			dev_err(dev, "failed to register clock\n");
   355			return PTR_ERR(clk);
   356		}
   357	
   358		ao_cec->core = clk;
   359	
   360		return 0;
   361	}
   362	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 52455 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: kbuild test robot <lkp@intel.com>
To: Neil Armstrong <narmstrong@baylibre.com>
Cc: Neil Armstrong <narmstrong@baylibre.com>,
	linux-kernel@vger.kernel.org, hverkuil@xs4all.nl,
	kbuild-all@01.org, linux-amlogic@lists.infradead.org,
	mchehab@kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-media@vger.kernel.org
Subject: Re: [PATCH v3 2/3] media: platform: meson: Add Amlogic Meson G12A AO CEC Controller driver
Date: Tue, 9 Apr 2019 02:08:04 +0800	[thread overview]
Message-ID: <201904090252.BPKOeIGV%lkp@intel.com> (raw)
In-Reply-To: <20190408092358.25894-3-narmstrong@baylibre.com>

[-- Attachment #1: Type: text/plain, Size: 13398 bytes --]

Hi Neil,

I love your patch! Yet something to improve:

[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v5.1-rc4 next-20190408]
[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/Neil-Armstrong/media-dt-bindings-media-meson-ao-cec-Add-G12A-AO-CEC-B-Compatible/20190408-233912
base:   git://linuxtv.org/media_tree.git master
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=ia64 

All error/warnings (new ones prefixed by >>):

>> drivers/media/platform/meson/ao-cec-g12a.c:206:16: error: field 'hw' has incomplete type
     struct clk_hw hw;
                   ^~
   In file included from include/linux/build_bug.h:5,
                    from include/linux/bitfield.h:18,
                    from drivers/media/platform/meson/ao-cec-g12a.c:10:
   drivers/media/platform/meson/ao-cec-g12a.c: In function 'meson_ao_cec_g12a_dualdiv_clk_recalc_rate':
   include/linux/kernel.h:979:32: error: dereferencing pointer to incomplete type 'struct clk_hw'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                                   ^~~~~~
   include/linux/compiler.h:324:9: note: in definition of macro '__compiletime_assert'
      if (!(condition))     \
            ^~~~~~~~~
   include/linux/compiler.h:344:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:979:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:979:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:211:2: note: in expansion of macro 'container_of'
     container_of(_hw, struct meson_ao_cec_g12a_dualdiv_clk, hw) \
     ^~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:218:3: note: in expansion of macro 'hw_to_meson_ao_cec_g12a_dualdiv_clk'
      hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c: At top level:
>> drivers/media/platform/meson/ao-cec-g12a.c:317:21: error: variable 'meson_ao_cec_g12a_dualdiv_clk_ops' has initializer but incomplete type
    static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
                        ^~~~~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:318:3: error: 'const struct clk_ops' has no member named 'recalc_rate'
     .recalc_rate = meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
      ^~~~~~~~~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:318:17: warning: excess elements in struct initializer
     .recalc_rate = meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:318:17: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:319:3: error: 'const struct clk_ops' has no member named 'is_enabled'
     .is_enabled = meson_ao_cec_g12a_dualdiv_clk_is_enabled,
      ^~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:319:16: warning: excess elements in struct initializer
     .is_enabled = meson_ao_cec_g12a_dualdiv_clk_is_enabled,
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:319:16: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:320:3: error: 'const struct clk_ops' has no member named 'enable'
     .enable  = meson_ao_cec_g12a_dualdiv_clk_enable,
      ^~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:320:13: warning: excess elements in struct initializer
     .enable  = meson_ao_cec_g12a_dualdiv_clk_enable,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:320:13: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:321:3: error: 'const struct clk_ops' has no member named 'disable'
     .disable = meson_ao_cec_g12a_dualdiv_clk_disable,
      ^~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:321:13: warning: excess elements in struct initializer
     .disable = meson_ao_cec_g12a_dualdiv_clk_disable,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:321:13: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
   drivers/media/platform/meson/ao-cec-g12a.c: In function 'meson_ao_cec_g12a_setup_clk':
>> drivers/media/platform/meson/ao-cec-g12a.c:328:23: error: storage size of 'init' isn't known
     struct clk_init_data init;
                          ^~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:341:16: error: implicit declaration of function '__clk_get_name'; did you mean 'clk_get_rate'? [-Werror=implicit-function-declaration]
     parent_name = __clk_get_name(ao_cec->oscin);
                   ^~~~~~~~~~~~~~
                   clk_get_rate
>> drivers/media/platform/meson/ao-cec-g12a.c:341:14: warning: assignment to 'const char *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
     parent_name = __clk_get_name(ao_cec->oscin);
                 ^
>> drivers/media/platform/meson/ao-cec-g12a.c:351:8: error: implicit declaration of function 'devm_clk_register'; did you mean 'device_register'? [-Werror=implicit-function-declaration]
     clk = devm_clk_register(dev, &dualdiv_clk->hw);
           ^~~~~~~~~~~~~~~~~
           device_register
   drivers/media/platform/meson/ao-cec-g12a.c:328:23: warning: unused variable 'init' [-Wunused-variable]
     struct clk_init_data init;
                          ^~~~
   drivers/media/platform/meson/ao-cec-g12a.c: At top level:
>> drivers/media/platform/meson/ao-cec-g12a.c:317:29: error: storage size of 'meson_ao_cec_g12a_dualdiv_clk_ops' isn't known
    static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

vim +/hw +206 drivers/media/platform/meson/ao-cec-g12a.c

   186	
   187	/*
   188	 * The AO-CECB embeds a dual/divider to generate a more precise
   189	 * 32,768KHz clock for CEC core clock.
   190	 *                      ______   ______
   191	 *                     |      | |      |
   192	 *         ______      | Div1 |-| Cnt1 |       ______
   193	 *        |      |    /|______| |______|\     |      |
   194	 * Xtal-->| Gate |---|  ______   ______  X-X--| Gate |-->
   195	 *        |______| |  \|      | |      |/  |  |______|
   196	 *                 |   | Div2 |-| Cnt2 |   |
   197	 *                 |   |______| |______|   |
   198	 *                 |_______________________|
   199	 *
   200	 * The dividing can be switched to single or dual, with a counter
   201	 * for each divider to set when the switching is done.
   202	 * The entire dividing mechanism can be also bypassed.
   203	 */
   204	
   205	struct meson_ao_cec_g12a_dualdiv_clk {
 > 206		struct clk_hw hw;
   207		struct regmap *regmap;
   208	};
   209	
   210	#define hw_to_meson_ao_cec_g12a_dualdiv_clk(_hw)			\
 > 211		container_of(_hw, struct meson_ao_cec_g12a_dualdiv_clk, hw)	\
   212	
   213	static unsigned long
   214	meson_ao_cec_g12a_dualdiv_clk_recalc_rate(struct clk_hw *hw,
   215						  unsigned long parent_rate)
   216	{
   217		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
 > 218			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   219		unsigned long n1;
   220		u32 reg0, reg1;
   221	
   222		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &reg0);
   223		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &reg1);
   224	
   225		if (reg1 & CECB_CLK_CNTL_BYPASS_EN)
   226			return parent_rate;
   227	
   228		if (reg0 & CECB_CLK_CNTL_DUAL_EN) {
   229			unsigned long n2, m1, m2, f1, f2, p1, p2;
   230	
   231			n1 = FIELD_GET(CECB_CLK_CNTL_N1, reg0) + 1;
   232			n2 = FIELD_GET(CECB_CLK_CNTL_N2, reg0) + 1;
   233	
   234			m1 = FIELD_GET(CECB_CLK_CNTL_M1, reg1) + 1;
   235			m2 = FIELD_GET(CECB_CLK_CNTL_M1, reg1) + 1;
   236	
   237			f1 = DIV_ROUND_CLOSEST(parent_rate, n1);
   238			f2 = DIV_ROUND_CLOSEST(parent_rate, n2);
   239	
   240			p1 = DIV_ROUND_CLOSEST(100000000 * m1, f1 * (m1 + m2));
   241			p2 = DIV_ROUND_CLOSEST(100000000 * m2, f2 * (m1 + m2));
   242	
   243			return DIV_ROUND_UP(100000000, p1 + p2);
   244		}
   245	
   246		n1 = FIELD_GET(CECB_CLK_CNTL_N1, reg0) + 1;
   247	
   248		return DIV_ROUND_CLOSEST(parent_rate, n1);
   249	}
   250	
   251	static int meson_ao_cec_g12a_dualdiv_clk_enable(struct clk_hw *hw)
   252	{
   253		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   254			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   255	
   256	
   257		/* Disable Input & Output */
   258		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   259				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   260				   0);
   261	
   262		/* Set N1 & N2 */
   263		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   264				   CECB_CLK_CNTL_N1,
   265				   FIELD_PREP(CECB_CLK_CNTL_N1, 733 - 1));
   266	
   267		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   268				   CECB_CLK_CNTL_N2,
   269				   FIELD_PREP(CECB_CLK_CNTL_N2, 732 - 1));
   270	
   271		/* Set M1 & M2 */
   272		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   273				   CECB_CLK_CNTL_M1,
   274				   FIELD_PREP(CECB_CLK_CNTL_M1, 8 - 1));
   275	
   276		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   277				   CECB_CLK_CNTL_M2,
   278				   FIELD_PREP(CECB_CLK_CNTL_M2, 11 - 1));
   279	
   280		/* Enable Dual divisor */
   281		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   282				   CECB_CLK_CNTL_DUAL_EN, CECB_CLK_CNTL_DUAL_EN);
   283	
   284		/* Disable divisor bypass */
   285		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   286				   CECB_CLK_CNTL_BYPASS_EN, 0);
   287	
   288		/* Enable Input & Output */
   289		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   290				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   291				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN);
   292	
   293		return 0;
   294	}
   295	
   296	static void meson_ao_cec_g12a_dualdiv_clk_disable(struct clk_hw *hw)
   297	{
   298		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   299			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   300	
   301		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   302				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   303				   0);
   304	}
   305	
   306	static int meson_ao_cec_g12a_dualdiv_clk_is_enabled(struct clk_hw *hw)
   307	{
   308		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   309			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   310		int val;
   311	
   312		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &val);
   313	
   314		return !!(val & (CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN));
   315	}
   316	
 > 317	static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
 > 318		.recalc_rate	= meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
 > 319		.is_enabled	= meson_ao_cec_g12a_dualdiv_clk_is_enabled,
 > 320		.enable		= meson_ao_cec_g12a_dualdiv_clk_enable,
 > 321		.disable	= meson_ao_cec_g12a_dualdiv_clk_disable,
   322	};
   323	
   324	static int meson_ao_cec_g12a_setup_clk(struct meson_ao_cec_g12a_device *ao_cec)
   325	{
   326		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk;
   327		struct device *dev = &ao_cec->pdev->dev;
 > 328		struct clk_init_data init;
   329		const char *parent_name;
   330		struct clk *clk;
   331		char *name;
   332	
   333		dualdiv_clk = devm_kzalloc(dev, sizeof(*dualdiv_clk), GFP_KERNEL);
   334		if (!dualdiv_clk)
   335			return -ENOMEM;
   336	
   337		name = kasprintf(GFP_KERNEL, "%s#dualdiv_clk", dev_name(dev));
   338		if (!name)
   339			return -ENOMEM;
   340	
 > 341		parent_name = __clk_get_name(ao_cec->oscin);
   342	
   343		init.name = name;
   344		init.ops = &meson_ao_cec_g12a_dualdiv_clk_ops;
   345		init.flags = 0;
   346		init.parent_names = &parent_name;
   347		init.num_parents = 1;
   348		dualdiv_clk->regmap = ao_cec->regmap;
   349		dualdiv_clk->hw.init = &init;
   350	
 > 351		clk = devm_clk_register(dev, &dualdiv_clk->hw);
   352		kfree(name);
   353		if (IS_ERR(clk)) {
   354			dev_err(dev, "failed to register clock\n");
   355			return PTR_ERR(clk);
   356		}
   357	
   358		ao_cec->core = clk;
   359	
   360		return 0;
   361	}
   362	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 52455 bytes --]

[-- Attachment #3: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: kbuild test robot <lkp@intel.com>
To: Neil Armstrong <narmstrong@baylibre.com>
Cc: Neil Armstrong <narmstrong@baylibre.com>,
	linux-kernel@vger.kernel.org, hverkuil@xs4all.nl,
	kbuild-all@01.org, linux-amlogic@lists.infradead.org,
	mchehab@kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-media@vger.kernel.org
Subject: Re: [PATCH v3 2/3] media: platform: meson: Add Amlogic Meson G12A AO CEC Controller driver
Date: Tue, 9 Apr 2019 02:08:04 +0800	[thread overview]
Message-ID: <201904090252.BPKOeIGV%lkp@intel.com> (raw)
In-Reply-To: <20190408092358.25894-3-narmstrong@baylibre.com>

[-- Attachment #1: Type: text/plain, Size: 13398 bytes --]

Hi Neil,

I love your patch! Yet something to improve:

[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v5.1-rc4 next-20190408]
[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/Neil-Armstrong/media-dt-bindings-media-meson-ao-cec-Add-G12A-AO-CEC-B-Compatible/20190408-233912
base:   git://linuxtv.org/media_tree.git master
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=ia64 

All error/warnings (new ones prefixed by >>):

>> drivers/media/platform/meson/ao-cec-g12a.c:206:16: error: field 'hw' has incomplete type
     struct clk_hw hw;
                   ^~
   In file included from include/linux/build_bug.h:5,
                    from include/linux/bitfield.h:18,
                    from drivers/media/platform/meson/ao-cec-g12a.c:10:
   drivers/media/platform/meson/ao-cec-g12a.c: In function 'meson_ao_cec_g12a_dualdiv_clk_recalc_rate':
   include/linux/kernel.h:979:32: error: dereferencing pointer to incomplete type 'struct clk_hw'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                                   ^~~~~~
   include/linux/compiler.h:324:9: note: in definition of macro '__compiletime_assert'
      if (!(condition))     \
            ^~~~~~~~~
   include/linux/compiler.h:344:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:979:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:979:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:211:2: note: in expansion of macro 'container_of'
     container_of(_hw, struct meson_ao_cec_g12a_dualdiv_clk, hw) \
     ^~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:218:3: note: in expansion of macro 'hw_to_meson_ao_cec_g12a_dualdiv_clk'
      hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c: At top level:
>> drivers/media/platform/meson/ao-cec-g12a.c:317:21: error: variable 'meson_ao_cec_g12a_dualdiv_clk_ops' has initializer but incomplete type
    static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
                        ^~~~~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:318:3: error: 'const struct clk_ops' has no member named 'recalc_rate'
     .recalc_rate = meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
      ^~~~~~~~~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:318:17: warning: excess elements in struct initializer
     .recalc_rate = meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:318:17: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:319:3: error: 'const struct clk_ops' has no member named 'is_enabled'
     .is_enabled = meson_ao_cec_g12a_dualdiv_clk_is_enabled,
      ^~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:319:16: warning: excess elements in struct initializer
     .is_enabled = meson_ao_cec_g12a_dualdiv_clk_is_enabled,
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:319:16: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:320:3: error: 'const struct clk_ops' has no member named 'enable'
     .enable  = meson_ao_cec_g12a_dualdiv_clk_enable,
      ^~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:320:13: warning: excess elements in struct initializer
     .enable  = meson_ao_cec_g12a_dualdiv_clk_enable,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:320:13: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
>> drivers/media/platform/meson/ao-cec-g12a.c:321:3: error: 'const struct clk_ops' has no member named 'disable'
     .disable = meson_ao_cec_g12a_dualdiv_clk_disable,
      ^~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:321:13: warning: excess elements in struct initializer
     .disable = meson_ao_cec_g12a_dualdiv_clk_disable,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/meson/ao-cec-g12a.c:321:13: note: (near initialization for 'meson_ao_cec_g12a_dualdiv_clk_ops')
   drivers/media/platform/meson/ao-cec-g12a.c: In function 'meson_ao_cec_g12a_setup_clk':
>> drivers/media/platform/meson/ao-cec-g12a.c:328:23: error: storage size of 'init' isn't known
     struct clk_init_data init;
                          ^~~~
>> drivers/media/platform/meson/ao-cec-g12a.c:341:16: error: implicit declaration of function '__clk_get_name'; did you mean 'clk_get_rate'? [-Werror=implicit-function-declaration]
     parent_name = __clk_get_name(ao_cec->oscin);
                   ^~~~~~~~~~~~~~
                   clk_get_rate
>> drivers/media/platform/meson/ao-cec-g12a.c:341:14: warning: assignment to 'const char *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
     parent_name = __clk_get_name(ao_cec->oscin);
                 ^
>> drivers/media/platform/meson/ao-cec-g12a.c:351:8: error: implicit declaration of function 'devm_clk_register'; did you mean 'device_register'? [-Werror=implicit-function-declaration]
     clk = devm_clk_register(dev, &dualdiv_clk->hw);
           ^~~~~~~~~~~~~~~~~
           device_register
   drivers/media/platform/meson/ao-cec-g12a.c:328:23: warning: unused variable 'init' [-Wunused-variable]
     struct clk_init_data init;
                          ^~~~
   drivers/media/platform/meson/ao-cec-g12a.c: At top level:
>> drivers/media/platform/meson/ao-cec-g12a.c:317:29: error: storage size of 'meson_ao_cec_g12a_dualdiv_clk_ops' isn't known
    static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

vim +/hw +206 drivers/media/platform/meson/ao-cec-g12a.c

   186	
   187	/*
   188	 * The AO-CECB embeds a dual/divider to generate a more precise
   189	 * 32,768KHz clock for CEC core clock.
   190	 *                      ______   ______
   191	 *                     |      | |      |
   192	 *         ______      | Div1 |-| Cnt1 |       ______
   193	 *        |      |    /|______| |______|\     |      |
   194	 * Xtal-->| Gate |---|  ______   ______  X-X--| Gate |-->
   195	 *        |______| |  \|      | |      |/  |  |______|
   196	 *                 |   | Div2 |-| Cnt2 |   |
   197	 *                 |   |______| |______|   |
   198	 *                 |_______________________|
   199	 *
   200	 * The dividing can be switched to single or dual, with a counter
   201	 * for each divider to set when the switching is done.
   202	 * The entire dividing mechanism can be also bypassed.
   203	 */
   204	
   205	struct meson_ao_cec_g12a_dualdiv_clk {
 > 206		struct clk_hw hw;
   207		struct regmap *regmap;
   208	};
   209	
   210	#define hw_to_meson_ao_cec_g12a_dualdiv_clk(_hw)			\
 > 211		container_of(_hw, struct meson_ao_cec_g12a_dualdiv_clk, hw)	\
   212	
   213	static unsigned long
   214	meson_ao_cec_g12a_dualdiv_clk_recalc_rate(struct clk_hw *hw,
   215						  unsigned long parent_rate)
   216	{
   217		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
 > 218			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   219		unsigned long n1;
   220		u32 reg0, reg1;
   221	
   222		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &reg0);
   223		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &reg1);
   224	
   225		if (reg1 & CECB_CLK_CNTL_BYPASS_EN)
   226			return parent_rate;
   227	
   228		if (reg0 & CECB_CLK_CNTL_DUAL_EN) {
   229			unsigned long n2, m1, m2, f1, f2, p1, p2;
   230	
   231			n1 = FIELD_GET(CECB_CLK_CNTL_N1, reg0) + 1;
   232			n2 = FIELD_GET(CECB_CLK_CNTL_N2, reg0) + 1;
   233	
   234			m1 = FIELD_GET(CECB_CLK_CNTL_M1, reg1) + 1;
   235			m2 = FIELD_GET(CECB_CLK_CNTL_M1, reg1) + 1;
   236	
   237			f1 = DIV_ROUND_CLOSEST(parent_rate, n1);
   238			f2 = DIV_ROUND_CLOSEST(parent_rate, n2);
   239	
   240			p1 = DIV_ROUND_CLOSEST(100000000 * m1, f1 * (m1 + m2));
   241			p2 = DIV_ROUND_CLOSEST(100000000 * m2, f2 * (m1 + m2));
   242	
   243			return DIV_ROUND_UP(100000000, p1 + p2);
   244		}
   245	
   246		n1 = FIELD_GET(CECB_CLK_CNTL_N1, reg0) + 1;
   247	
   248		return DIV_ROUND_CLOSEST(parent_rate, n1);
   249	}
   250	
   251	static int meson_ao_cec_g12a_dualdiv_clk_enable(struct clk_hw *hw)
   252	{
   253		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   254			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   255	
   256	
   257		/* Disable Input & Output */
   258		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   259				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   260				   0);
   261	
   262		/* Set N1 & N2 */
   263		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   264				   CECB_CLK_CNTL_N1,
   265				   FIELD_PREP(CECB_CLK_CNTL_N1, 733 - 1));
   266	
   267		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   268				   CECB_CLK_CNTL_N2,
   269				   FIELD_PREP(CECB_CLK_CNTL_N2, 732 - 1));
   270	
   271		/* Set M1 & M2 */
   272		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   273				   CECB_CLK_CNTL_M1,
   274				   FIELD_PREP(CECB_CLK_CNTL_M1, 8 - 1));
   275	
   276		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   277				   CECB_CLK_CNTL_M2,
   278				   FIELD_PREP(CECB_CLK_CNTL_M2, 11 - 1));
   279	
   280		/* Enable Dual divisor */
   281		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   282				   CECB_CLK_CNTL_DUAL_EN, CECB_CLK_CNTL_DUAL_EN);
   283	
   284		/* Disable divisor bypass */
   285		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
   286				   CECB_CLK_CNTL_BYPASS_EN, 0);
   287	
   288		/* Enable Input & Output */
   289		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   290				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   291				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN);
   292	
   293		return 0;
   294	}
   295	
   296	static void meson_ao_cec_g12a_dualdiv_clk_disable(struct clk_hw *hw)
   297	{
   298		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   299			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   300	
   301		regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
   302				   CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
   303				   0);
   304	}
   305	
   306	static int meson_ao_cec_g12a_dualdiv_clk_is_enabled(struct clk_hw *hw)
   307	{
   308		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
   309			hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
   310		int val;
   311	
   312		regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &val);
   313	
   314		return !!(val & (CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN));
   315	}
   316	
 > 317	static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
 > 318		.recalc_rate	= meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
 > 319		.is_enabled	= meson_ao_cec_g12a_dualdiv_clk_is_enabled,
 > 320		.enable		= meson_ao_cec_g12a_dualdiv_clk_enable,
 > 321		.disable	= meson_ao_cec_g12a_dualdiv_clk_disable,
   322	};
   323	
   324	static int meson_ao_cec_g12a_setup_clk(struct meson_ao_cec_g12a_device *ao_cec)
   325	{
   326		struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk;
   327		struct device *dev = &ao_cec->pdev->dev;
 > 328		struct clk_init_data init;
   329		const char *parent_name;
   330		struct clk *clk;
   331		char *name;
   332	
   333		dualdiv_clk = devm_kzalloc(dev, sizeof(*dualdiv_clk), GFP_KERNEL);
   334		if (!dualdiv_clk)
   335			return -ENOMEM;
   336	
   337		name = kasprintf(GFP_KERNEL, "%s#dualdiv_clk", dev_name(dev));
   338		if (!name)
   339			return -ENOMEM;
   340	
 > 341		parent_name = __clk_get_name(ao_cec->oscin);
   342	
   343		init.name = name;
   344		init.ops = &meson_ao_cec_g12a_dualdiv_clk_ops;
   345		init.flags = 0;
   346		init.parent_names = &parent_name;
   347		init.num_parents = 1;
   348		dualdiv_clk->regmap = ao_cec->regmap;
   349		dualdiv_clk->hw.init = &init;
   350	
 > 351		clk = devm_clk_register(dev, &dualdiv_clk->hw);
   352		kfree(name);
   353		if (IS_ERR(clk)) {
   354			dev_err(dev, "failed to register clock\n");
   355			return PTR_ERR(clk);
   356		}
   357	
   358		ao_cec->core = clk;
   359	
   360		return 0;
   361	}
   362	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 52455 bytes --]

[-- Attachment #3: Type: text/plain, Size: 167 bytes --]

_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic

  reply	other threads:[~2019-04-08 18:08 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-08  9:23 [PATCH v3 0/3] media: platform: Add support for the Amlogic Meson G12A AO CEC Controller Neil Armstrong
2019-04-08  9:23 ` Neil Armstrong
2019-04-08  9:23 ` Neil Armstrong
2019-04-08  9:23 ` [PATCH v3 1/3] media: dt-bindings: media: meson-ao-cec: Add G12A AO-CEC-B Compatible Neil Armstrong
2019-04-08  9:23   ` Neil Armstrong
2019-04-08  9:23   ` Neil Armstrong
2019-04-08  9:23 ` [PATCH v3 2/3] media: platform: meson: Add Amlogic Meson G12A AO CEC Controller driver Neil Armstrong
2019-04-08  9:23   ` Neil Armstrong
2019-04-08  9:23   ` Neil Armstrong
2019-04-08 18:08   ` kbuild test robot [this message]
2019-04-08 18:08     ` kbuild test robot
2019-04-08 18:08     ` kbuild test robot
2019-04-09  7:25     ` Neil Armstrong
2019-04-09  7:25       ` Neil Armstrong
2019-04-09  7:25       ` Neil Armstrong
2019-04-08 18:24   ` kbuild test robot
2019-04-08 18:24     ` kbuild test robot
2019-04-08 18:24     ` kbuild test robot
2019-04-08  9:23 ` [PATCH v3 3/3] MAINTAINERS: Update AO CEC with ao-cec-g12a driver Neil Armstrong
2019-04-08  9:23   ` Neil Armstrong
2019-04-08  9:23   ` Neil Armstrong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201904090252.BPKOeIGV%lkp@intel.com \
    --to=lkp@intel.com \
    --cc=hverkuil@xs4all.nl \
    --cc=kbuild-all@01.org \
    --cc=linux-amlogic@lists.infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=narmstrong@baylibre.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.