On 06.04.2018 12:34, Chanwoo Choi wrote: > Hi Andrzej, > > On 2018년 04월 06일 19:14, Andrzej Hajda wrote: >> Hi Chanwoo, >> >> It looks like something went wrong, sii8620 patch was merged without >> extcon dependencies. >> Could you look at it? > If add the 'select EXTCON' to sii8620's Kconfig, it will be solved. > Is there other solution?
I wonder if 'imply EXTCON' wouldn't be better, I will prepare patch for it. Regards Andrzej > >> Regards >> Andrzej >> >> On 06.04.2018 11:52, kbuild test robot wrote: >>> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git >>> master >>> head: 38c23685b273cfb4ccf31a199feccce3bdcb5d83 >>> commit: 688838442147d9dd94c2ef7c2c31a35cf150c5fa drm/bridge/sii8620: use >>> micro-USB cable detection logic to detect MHL >>> date: 4 weeks ago >>> config: i386-randconfig-x0-04061534 (attached as .config) >>> compiler: gcc-5 (Debian 5.5.0-3) 5.4.1 20171010 >>> 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 +2405 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 >> >> >>