Hi Maciej,
FYI, the error/warning still remains.
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
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 [email protected] 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!
> 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
--
~Randy
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 [email protected] 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
On 05/07/2018 12:09 AM, Andrzej Hajda wrote:
> 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 [email protected] 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
Thank you for the info.
--
~Randy
On 05/07/2018 09:13 AM, Randy Dunlap wrote:
> On 05/07/2018 12:09 AM, Andrzej Hajda wrote:
>> 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 [email protected] 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
>
> Thank you for the info.
and
Tested-by: Randy Dunlap <[email protected]>
--
~Randy