On 06.05.2018 02:46, Randy Dunlap wrote: > On 05/05/2018 04:22 PM, kbuild test robot wrote: >> Hi Maciej, >> >> FYI, the error/warning still remains. > Hi M. Robot, > > I am cc-ing dri-devel@xxxxxxxxxxxxxxxxxxxxx so that they are aware of the > multiple times that you have posted this kbuild error (I have 3 different > posts in my Inbox with the same errors; I may have missed some). > > I hope that someone there will have some insights into this problem. > > I have looked at the issues and concluded that the correct fix for this IMO is: > > config DRM_SIL_SII8620 > ... > depends on EXTCON || !EXTCON > > However, that causes some unhappy errors from scripts/kconfig/ concerning > Kconfig recursive dependencies detected. Alternatively, using > select EXTCON > does not cause any kconfig recursive dependency issues and solves the build > errors. > > > thanks! Hi Randy, Proper patch was posted some times ago[1], and it was merged today to drm-misc-fixes branch. [1]: https://patchwork.kernel.org/patch/10330653/ Regards Andrzej > >> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master >> head: c1c07416cdd47161a359286021d483f449ad8c4f >> commit: 688838442147d9dd94c2ef7c2c31a35cf150c5fa drm/bridge/sii8620: use micro-USB cable detection logic to detect MHL >> date: 8 weeks ago >> config: i386-randconfig-c0-05060527 (attached as .config) >> compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 >> reproduce: >> git checkout 688838442147d9dd94c2ef7c2c31a35cf150c5fa >> # save the attached .config to linux build tree >> make ARCH=i386 >> >> All errors (new ones prefixed by >>): >> >> drivers/gpu/drm/bridge/sil-sii8620.o: In function `sii8620_remove': >> drivers/gpu/drm/bridge/sil-sii8620.c:2405: undefined reference to `extcon_unregister_notifier' >> drivers/gpu/drm/bridge/sil-sii8620.o: In function `sii8620_extcon_init': >>>> drivers/gpu/drm/bridge/sil-sii8620.c:2229: undefined reference to `extcon_find_edev_by_node' >>>> drivers/gpu/drm/bridge/sil-sii8620.c:2241: undefined reference to `extcon_register_notifier' >> drivers/gpu/drm/bridge/sil-sii8620.o: In function `sii8620_extcon_work': >> drivers/gpu/drm/bridge/sil-sii8620.c:2189: undefined reference to `extcon_get_state' >> >> vim +2229 drivers/gpu/drm/bridge/sil-sii8620.c >> >> 2212 >> 2213 static int sii8620_extcon_init(struct sii8620 *ctx) >> 2214 { >> 2215 struct extcon_dev *edev; >> 2216 struct device_node *musb, *muic; >> 2217 int ret; >> 2218 >> 2219 /* get micro-USB connector node */ >> 2220 musb = of_graph_get_remote_node(ctx->dev->of_node, 1, -1); >> 2221 /* next get micro-USB Interface Controller node */ >> 2222 muic = of_get_next_parent(musb); >> 2223 >> 2224 if (!muic) { >> 2225 dev_info(ctx->dev, "no extcon found, switching to 'always on' mode\n"); >> 2226 return 0; >> 2227 } >> 2228 >>> 2229 edev = extcon_find_edev_by_node(muic); >> 2230 of_node_put(muic); >> 2231 if (IS_ERR(edev)) { >> 2232 if (PTR_ERR(edev) == -EPROBE_DEFER) >> 2233 return -EPROBE_DEFER; >> 2234 dev_err(ctx->dev, "Invalid or missing extcon\n"); >> 2235 return PTR_ERR(edev); >> 2236 } >> 2237 >> 2238 ctx->extcon = edev; >> 2239 ctx->extcon_nb.notifier_call = sii8620_extcon_notifier; >> 2240 INIT_WORK(&ctx->extcon_wq, sii8620_extcon_work); >>> 2241 ret = extcon_register_notifier(edev, EXTCON_DISP_MHL, &ctx->extcon_nb); >> 2242 if (ret) { >> 2243 dev_err(ctx->dev, "failed to register notifier for MHL\n"); >> 2244 return ret; >> 2245 } >> 2246 >> 2247 return 0; >> 2248 } >> 2249 >> 2250 static inline struct sii8620 *bridge_to_sii8620(struct drm_bridge *bridge) >> 2251 { >> 2252 return container_of(bridge, struct sii8620, bridge); >> 2253 } >> 2254 >> 2255 static int sii8620_attach(struct drm_bridge *bridge) >> 2256 { >> 2257 struct sii8620 *ctx = bridge_to_sii8620(bridge); >> 2258 >> 2259 sii8620_init_rcp_input_dev(ctx); >> 2260 >> 2261 return sii8620_clear_error(ctx); >> 2262 } >> 2263 >> 2264 static void sii8620_detach(struct drm_bridge *bridge) >> 2265 { >> 2266 struct sii8620 *ctx = bridge_to_sii8620(bridge); >> 2267 >> 2268 rc_unregister_device(ctx->rc_dev); >> 2269 } >> 2270 >> 2271 static enum drm_mode_status sii8620_mode_valid(struct drm_bridge *bridge, >> 2272 const struct drm_display_mode *mode) >> 2273 { >> 2274 struct sii8620 *ctx = bridge_to_sii8620(bridge); >> 2275 bool can_pack = ctx->devcap[MHL_DCAP_VID_LINK_MODE] & >> 2276 MHL_DCAP_VID_LINK_PPIXEL; >> 2277 unsigned int max_pclk = sii8620_is_mhl3(ctx) ? MHL3_MAX_LCLK : >> 2278 MHL1_MAX_LCLK; >> 2279 max_pclk /= can_pack ? 2 : 3; >> 2280 >> 2281 return (mode->clock > max_pclk) ? MODE_CLOCK_HIGH : MODE_OK; >> 2282 } >> 2283 >> 2284 static bool sii8620_mode_fixup(struct drm_bridge *bridge, >> 2285 const struct drm_display_mode *mode, >> 2286 struct drm_display_mode *adjusted_mode) >> 2287 { >> 2288 struct sii8620 *ctx = bridge_to_sii8620(bridge); >> 2289 int max_lclk; >> 2290 bool ret = true; >> 2291 >> 2292 mutex_lock(&ctx->lock); >> 2293 >> 2294 max_lclk = sii8620_is_mhl3(ctx) ? MHL3_MAX_LCLK : MHL1_MAX_LCLK; >> 2295 if (max_lclk > 3 * adjusted_mode->clock) { >> 2296 ctx->use_packed_pixel = 0; >> 2297 goto end; >> 2298 } >> 2299 if ((ctx->devcap[MHL_DCAP_VID_LINK_MODE] & MHL_DCAP_VID_LINK_PPIXEL) && >> 2300 max_lclk > 2 * adjusted_mode->clock) { >> 2301 ctx->use_packed_pixel = 1; >> 2302 goto end; >> 2303 } >> 2304 ret = false; >> 2305 end: >> 2306 if (ret) { >> 2307 u8 vic = drm_match_cea_mode(adjusted_mode); >> 2308 >> 2309 if (!vic) { >> 2310 union hdmi_infoframe frm; >> 2311 u8 mhl_vic[] = { 0, 95, 94, 93, 98 }; >> 2312 >> 2313 /* FIXME: We need the connector here */ >> 2314 drm_hdmi_vendor_infoframe_from_display_mode( >> 2315 &frm.vendor.hdmi, NULL, adjusted_mode); >> 2316 vic = frm.vendor.hdmi.vic; >> 2317 if (vic >= ARRAY_SIZE(mhl_vic)) >> 2318 vic = 0; >> 2319 vic = mhl_vic[vic]; >> 2320 } >> 2321 ctx->video_code = vic; >> 2322 ctx->pixel_clock = adjusted_mode->clock; >> 2323 } >> 2324 mutex_unlock(&ctx->lock); >> 2325 return ret; >> 2326 } >> 2327 >> 2328 static const struct drm_bridge_funcs sii8620_bridge_funcs = { >> 2329 .attach = sii8620_attach, >> 2330 .detach = sii8620_detach, >> 2331 .mode_fixup = sii8620_mode_fixup, >> 2332 .mode_valid = sii8620_mode_valid, >> 2333 }; >> 2334 >> 2335 static int sii8620_probe(struct i2c_client *client, >> 2336 const struct i2c_device_id *id) >> 2337 { >> 2338 struct device *dev = &client->dev; >> 2339 struct sii8620 *ctx; >> 2340 int ret; >> 2341 >> 2342 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); >> 2343 if (!ctx) >> 2344 return -ENOMEM; >> 2345 >> 2346 ctx->dev = dev; >> 2347 mutex_init(&ctx->lock); >> 2348 INIT_LIST_HEAD(&ctx->mt_queue); >> 2349 >> 2350 ctx->clk_xtal = devm_clk_get(dev, "xtal"); >> 2351 if (IS_ERR(ctx->clk_xtal)) { >> 2352 dev_err(dev, "failed to get xtal clock from DT\n"); >> 2353 return PTR_ERR(ctx->clk_xtal); >> 2354 } >> 2355 >> 2356 if (!client->irq) { >> 2357 dev_err(dev, "no irq provided\n"); >> 2358 return -EINVAL; >> 2359 } >> 2360 irq_set_status_flags(client->irq, IRQ_NOAUTOEN); >> 2361 ret = devm_request_threaded_irq(dev, client->irq, NULL, >> 2362 sii8620_irq_thread, >> 2363 IRQF_TRIGGER_HIGH | IRQF_ONESHOT, >> 2364 "sii8620", ctx); >> 2365 if (ret < 0) { >> 2366 dev_err(dev, "failed to install IRQ handler\n"); >> 2367 return ret; >> 2368 } >> 2369 >> 2370 ctx->gpio_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); >> 2371 if (IS_ERR(ctx->gpio_reset)) { >> 2372 dev_err(dev, "failed to get reset gpio from DT\n"); >> 2373 return PTR_ERR(ctx->gpio_reset); >> 2374 } >> 2375 >> 2376 ctx->supplies[0].supply = "cvcc10"; >> 2377 ctx->supplies[1].supply = "iovcc18"; >> 2378 ret = devm_regulator_bulk_get(dev, 2, ctx->supplies); >> 2379 if (ret) >> 2380 return ret; >> 2381 >> 2382 ret = sii8620_extcon_init(ctx); >> 2383 if (ret < 0) { >> 2384 dev_err(ctx->dev, "failed to initialize EXTCON\n"); >> 2385 return ret; >> 2386 } >> 2387 >> 2388 i2c_set_clientdata(client, ctx); >> 2389 >> 2390 ctx->bridge.funcs = &sii8620_bridge_funcs; >> 2391 ctx->bridge.of_node = dev->of_node; >> 2392 drm_bridge_add(&ctx->bridge); >> 2393 >> 2394 if (!ctx->extcon) >> 2395 sii8620_cable_in(ctx); >> 2396 >> 2397 return 0; >> 2398 } >> 2399 >> 2400 static int sii8620_remove(struct i2c_client *client) >> 2401 { >> 2402 struct sii8620 *ctx = i2c_get_clientdata(client); >> 2403 >> 2404 if (ctx->extcon) { >>> 2405 extcon_unregister_notifier(ctx->extcon, EXTCON_DISP_MHL, >> 2406 &ctx->extcon_nb); >> 2407 flush_work(&ctx->extcon_wq); >> 2408 if (ctx->cable_state > 0) >> 2409 sii8620_cable_out(ctx); >> 2410 } else { >> 2411 sii8620_cable_out(ctx); >> 2412 } >> 2413 drm_bridge_remove(&ctx->bridge); >> 2414 >> 2415 return 0; >> 2416 } >> 2417 >> >> --- >> 0-DAY kernel test infrastructure Open Source Technology Center >> https://lists.01.org/pipermail/kbuild-all Intel Corporation _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel