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?

> 
> 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
> 
> 
> 
> 

-- 
Best Regards,
Chanwoo Choi
Samsung Electronics

Reply via email to