Received: by 10.213.65.68 with SMTP id h4csp158235imn; Mon, 19 Mar 2018 23:26:19 -0700 (PDT) X-Google-Smtp-Source: AG47ELvQ2TdS5XoOamHMkZr7MlpKGk1mLD8l8WEtoDnb1p/f656zAe+73eOvVmKF4F78vOV1ulUt X-Received: by 10.101.88.76 with SMTP id s12mr11247034pgr.423.1521527179470; Mon, 19 Mar 2018 23:26:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521527179; cv=none; d=google.com; s=arc-20160816; b=f59c6IQ/Dual1z9josvNF42PoIWjVkGKZOXSc/6pXtR2Wq1l7+MQCjm7RJMOB3TJMO 8b8KiZpryAVCoMTl7w0sHGp6DCUoOAKGa767RKT6jOTsRo+oOguxei/yXJ2QPnaWKYdp j+e1UzTTSRAoeW/IRbEkcKIOTLe9lu6O7nqxMxY+GtQD/nCPMQ25ETPDtxsZWwBe6ZoJ egnVct7lPSV7/M2Zo/C0aJ6iugCUvSUMa6xMFk6mgFmofTTLx6Yo3Gevp6FNsBh21wcT GEblOR2oJGw0IvFwWKWbJYI9y76pSHGUrcdUSMHVf1hjwZ3FrpVANpYORDLzAgFbETaa CUXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=QMk2hDOCEm6uKyQqPjPsMqEmhbMUkkiJZDVZOup6dQk=; b=VSMZbplq1524mGTA8fyK/UmwfZGZwXeJAILahH8HcmeeeJrcuVGHmMCcAW66JA/mvI MkMODKjbjVkLIN4gjk95fbv4AQ97yC8iFGh76DcYflZwTiSbIA9yFeKEPMW08n6vWCy3 aDhw76EEId2i5a9eJBmwkSzCyCp5MhwbhxXuhzttRVVGC2WfzrnjNFqis2RcvZq4VaJH 0awxhe0oGXAf4vBtTj8/5Ph/i37vsRb9uAiRmQWbQ2pj/cqiTwpu/DmxSJlL3JRk7Sll Q/Ros4HpSAfodzyZfK+md0786Lfmy2qx87YN5o57K6UVz7eSSRA/muLtjpYSpUC8KCNY cmOw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i23-v6si264139pll.251.2018.03.19.23.26.05; Mon, 19 Mar 2018 23:26:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752090AbeCTGZH (ORCPT + 99 others); Tue, 20 Mar 2018 02:25:07 -0400 Received: from lucky1.263xmail.com ([211.157.147.130]:39774 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751330AbeCTGZD (ORCPT ); Tue, 20 Mar 2018 02:25:03 -0400 Received: from hl?rock-chips.com (unknown [192.168.165.141]) by lucky1.263xmail.com (Postfix) with ESMTP id E16871F59B5; Tue, 20 Mar 2018 14:24:50 +0800 (CST) X-263anti-spam: KSV:0;BIG:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ADDR-CHECKED4: 1 X-ABS-CHECKED: 1 X-SKE-CHECKED: 1 X-ANTISPAM-LEVEL: 2 Received: from [172.16.22.132] (localhost [127.0.0.1]) by smtp.263.net (Postfix) with ESMTPA id 28EA2416; Tue, 20 Mar 2018 14:24:45 +0800 (CST) X-RL-SENDER: hl@rock-chips.com X-FST-TO: dri-devel@lists.freedesktop.org X-SENDER-IP: 103.29.142.67 X-LOGIN-NAME: hl@rock-chips.com X-UNIQUE-TAG: <921359daadcd313cf18e3c8d0db72d7f> X-ATTACHMENT-NUM: 0 X-SENDER: hl@rock-chips.com X-DNS-TYPE: 0 Received: from [172.16.22.132] (unknown [103.29.142.67]) by smtp.263.net (Postfix) whith ESMTP id 29966Z2JH2E; Tue, 20 Mar 2018 14:24:49 +0800 (CST) Subject: Re: [PATCH v4 1/3] drm/panel: refactor INNOLUX P079ZCA panel driver To: Emil Velikov Cc: Thierry Reding , Brian Norris , Rob Herring , Sean Paul , David Airlie , "Linux-Kernel@Vger. Kernel. Org" , ML dri-devel References: <1521018736-20980-1-git-send-email-hl@rock-chips.com> From: hl Message-ID: <577e35f7-b7ca-ca97-1391-f5759e81254e@rock-chips.com> Date: Tue, 20 Mar 2018 14:24:45 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Emil, On Monday, March 19, 2018 09:09 PM, Emil Velikov wrote: > On 15 March 2018 at 02:35, hl wrote: >> Hi Emil, >> >> >> >> On Wednesday, March 14, 2018 08:02 PM, Emil Velikov wrote: >>> Hi Lin, >>> >>> On 14 March 2018 at 09:12, Lin Huang wrote: >>>> From: huang lin >>>> >>>> Refactor Innolux P079ZCA panel driver, let it support >>>> multi panel. >>>> >>>> Change-Id: If89be5e56dba8cb498e2d50c1bbeb0e8016123a2 >>>> Signed-off-by: Lin Huang >>>> --- >>>> Changes in v2: >>>> - Change regulator property name to meet the panel datasheet >>>> Changes in v3: >>>> - this patch only refactor P079ZCA panel to support multi panel, support >>>> P097PFG panel in another patch >>>> Changes in v4: >>>> - Modify the patch which suggest by Thierry >>>> >>> Thanks for splitting this up. I think there's another piece that fell >>> through the cracks. >>> I'm not deeply familiar with the driver, so just sharing some quick notes. >>> >>> >>>> struct innolux_panel { >>>> struct drm_panel base; >>>> struct mipi_dsi_device *link; >>>> + const struct panel_desc *desc; >>>> >>>> struct backlight_device *backlight; >>>> - struct regulator *supply; >>>> + struct regulator *vddi; >>>> + struct regulator *avdd; >>>> + struct regulator *avee; >>> These two seem are new addition, as opposed to a dummy refactor. >>> Are they optional, does one need them for the existing panel (separate >>> patch?) or only for the new one (squash with the new panel code)? >>> >>> >>>> struct gpio_desc *enable_gpio; >>>> >>>> bool prepared; >>>> @@ -77,9 +93,9 @@ static int innolux_panel_unprepare(struct drm_panel >>>> *panel) >>>> /* T8: 80ms - 1000ms */ >>>> msleep(80); >>>> >>>> - err = regulator_disable(innolux->supply); >>>> - if (err < 0) >>>> - return err; >>> Good call on dropping the early return here. >>> >>> >>>> @@ -207,19 +248,28 @@ static const struct drm_panel_funcs >>>> innolux_panel_funcs = { >>>> - innolux->supply = devm_regulator_get(dev, "power"); >>>> - if (IS_ERR(innolux->supply)) >>>> - return PTR_ERR(innolux->supply); >>>> + innolux = devm_kzalloc(dev, sizeof(*innolux), GFP_KERNEL); >>>> + if (!innolux) >>>> + return -ENOMEM; >>>> + >>>> + innolux->desc = desc; >>>> + innolux->vddi = devm_regulator_get(dev, "power"); >>>> + innolux->avdd = devm_regulator_get(dev, "avdd"); >>>> + innolux->avee = devm_regulator_get(dev, "avee"); >>>> >>> AFAICT devm_regulator_get returns a pointer which is unsuitable to be >>> passed into regulator_{enable,disable}. >>> Hence, the IS_ERR check should stay. If any of the regulators are >>> optional, you want to call regulator_{enable,disable} only as >>> applicable. >> >> devm_regulator_get() will use dummy_regulator if there not regulator pass to >> driver, so it not affect regulator_{enable, disable}. > One of us is getting confused here: > devm_regulator_get does not _use_ a regulator, it returns a pointer to > a regulator, right? > > According to the 4.16-rc6 codebase - one error > returns a ERR_PTR [1]. devm_regulator_get() will not reurn a ERR_PTR,  it will pass NORMAL_GET mode to _regulator_get() when you call devm_regulator_get(), and with following code: rdev = regulator_dev_lookup(dev, id);     if (IS_ERR(rdev)) { ..... ......     switch (get_type) {         case NORMAL_GET:             /*              * Assume that a regulator is physically present and              * enabled, even if it isn't hooked up, and just              * provide a dummy.              */             dev_warn(dev,                  "%s supply %s not found, using dummy regulator\n",                  devname, id);             rdev = dummy_regulator_rdev;             get_device(&rdev->dev);             break; ... ... } .... regulator = create_regulator(rdev, dev, id); ... it wil get a dummy_regulator for it. > With the pointer dereferenced in regulator_enable [2], without a > IS_ERR check, hence thing will go boom(?) > >> These three regulator are >> optional, >> the p079zca will use "power" and , >> so i think it better not to check ERR here. >> > What should happen if p079zca is missing "power" or p097pgf - "avdd" and "avee"? > Obviously the latter two should be introduced with the p097pgf support. i think it need dts to make sure configure the power node correct, if missing "power" node fo p079zca or "avdd" "avee" node for p097pgf, the panel can not work, but do not affcet other driver, the kernel do not crash(as i explain before and i also test it). > > HTH > Emil > > [1] https://elixir.bootlin.com/linux/v4.16-rc6/source/drivers/regulator/devres.c#L27 > [2] https://elixir.bootlin.com/linux/v4.16-rc6/source/drivers/regulator/core.c#L2189 > > >