From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7829AC742D2 for ; Fri, 12 Jul 2019 16:34:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4A9D720838 for ; Fri, 12 Jul 2019 16:34:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="DB9nrgDc" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727319AbfGLQeh (ORCPT ); Fri, 12 Jul 2019 12:34:37 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:40149 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726449AbfGLQeg (ORCPT ); Fri, 12 Jul 2019 12:34:36 -0400 Received: by mail-pg1-f195.google.com with SMTP id w10so4764962pgj.7 for ; Fri, 12 Jul 2019 09:34:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZxxOs+WHCN8yYkzCsPdgx/BKilpEGbNbxFs4VxLjJ2g=; b=DB9nrgDcMI6Oxw7g0G5qgE+YfDLCtL5YMm1MsmimFl+ntc+vS7rbj6LPaNpSrC7Vpr z/s4BskP50NzM8fMIcx1kjb4elWF5laVPt8idXtYmoRiCF/NAF0ps6Yk077kQSY7KDXi O+DE5PpPU3o/dhoWtgz4BIeO0MBBNGCRYtzlc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZxxOs+WHCN8yYkzCsPdgx/BKilpEGbNbxFs4VxLjJ2g=; b=tmr7NX9eS70yAjzJwAGlGueEols1N72N6W98fWYciYi+WWQZ4rNLlzW3bANc5obso9 6Q+GpXnp+DOKr/fA++ywVb20eExuNtjjGD2y6zOsZWCYZLB6wKcaPOijhqe/tzasFx0M zpFTOfItYpW9JEvKolGGrVTWRlvaV7L9v6fEeW3piEZ6N8yKNq2DbiefbN9HviVFaHbY qy2pF8cBvrmoPFYv0aujqF93rKcTfOS76ewSYRJRWxRp0zTgrA1x+X/5mSKbWbURIaEU ZozIHl9lhYF5/GLPZRP3uyp0mPNU7Iv/DRPhAcsHdUFa/sQCiD78f8aAbZdV8YT7jyMr /2+g== X-Gm-Message-State: APjAAAW8FcCu7sxzn27W4i4ud5CEmz9P/aClEW+6jWc0+D+lTeURTOF6 +c3egBNM0MLsy3AvfmF5g87lCw== X-Google-Smtp-Source: APXvYqzatfDOusSPBh1WqKakLZc0DpjwdDToWjQSECc6hYoF0HYaCY+/Mnn4NcckBdYDj4y7irbB9Q== X-Received: by 2002:a63:fa57:: with SMTP id g23mr11522684pgk.75.1562949275764; Fri, 12 Jul 2019 09:34:35 -0700 (PDT) Received: from tictac2.mtv.corp.google.com ([2620:15c:202:1:24fa:e766:52c9:e3b2]) by smtp.gmail.com with ESMTPSA id d15sm21571604pjc.8.2019.07.12.09.34.35 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 12 Jul 2019 09:34:35 -0700 (PDT) From: Douglas Anderson To: Thierry Reding , Sam Ravnborg Cc: Sean Paul , Boris Brezillon , Douglas Anderson , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, David Airlie , Daniel Vetter Subject: [PATCH] drm/panel: simple: Doxygenize 'struct panel_desc'; rename a few functions Date: Fri, 12 Jul 2019 09:33:33 -0700 Message-Id: <20190712163333.231884-1-dianders@chromium.org> X-Mailer: git-send-email 2.22.0.510.g264f2c817a-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This attempts to address outstanding review feedback from commit b8a2948fa2b3 ("drm/panel: simple: Add ability to override typical timing"). Specifically: * It was requested that I document (in the structure definition) that the device tree override had no effect if 'struct drm_display_mode' was used in the panel description. I have provided full Doxygen comments for 'struct panel_desc' to accomplish that. * panel_simple_get_fixed_modes() was thought to be a confusing name, so it has been renamed to panel_simple_get_display_modes(). * panel_simple_parse_override_mode() was thought to be better named as panel_simple_parse_panel_timing_node(). Suggested-by: Sam Ravnborg Signed-off-by: Douglas Anderson --- NOTES: - I have not addressed the suggestion of doing 'bool has_override = panel->override_mode.type != 0;'. As per my reply on the mailing list I think the convention in this file is to rely on implicit conversions from int to bool. - Sam said that there was still something that he didn't understand with regards to the flags. Sam: if this is something that needs to be addressed, please yell. drivers/gpu/drm/panel/panel-simple.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index a50871c6836b..f3c0e203f40f 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -38,6 +38,22 @@ #include #include +/** + * @modes: Pointer to array of fixed modes appropriate for this panel. If + * only one mode then this can just be the address of this the mode. + * NOTE: cannot be used with "timings" and also if this is specified + * then you cannot override the mode in the device tree. + * @num_modes: Number of elements in modes array. + * @timings: Pointer to array of display timings. NOTE: cannot be used with + * "modes" and also these will be used to validate a device tree + * override if one is present. + * @num_timings: Number of elements in timings array. + * @bpc: Bits per color. + * @size: Structure containing the physical size of this panel. + * @delay: Structure containing various delay values for this panel. + * @bus_format: See MEDIA_BUS_FMT_... defines. + * @bus_flags: See DRM_BUS_FLAG_... defines. + */ struct panel_desc { const struct drm_display_mode *modes; unsigned int num_modes; @@ -135,7 +151,7 @@ static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel) return num; } -static unsigned int panel_simple_get_fixed_modes(struct panel_simple *panel) +static unsigned int panel_simple_get_display_modes(struct panel_simple *panel) { struct drm_connector *connector = panel->base.connector; struct drm_device *drm = panel->base.drm; @@ -199,7 +215,7 @@ static int panel_simple_get_non_edid_modes(struct panel_simple *panel) */ WARN_ON(panel->desc->num_timings && panel->desc->num_modes); if (num == 0) - num = panel_simple_get_fixed_modes(panel); + num = panel_simple_get_display_modes(panel); connector->display_info.bpc = panel->desc->bpc; connector->display_info.width_mm = panel->desc->size.width; @@ -351,9 +367,9 @@ static const struct drm_panel_funcs panel_simple_funcs = { #define PANEL_SIMPLE_BOUNDS_CHECK(to_check, bounds, field) \ (to_check->field.typ >= bounds->field.min && \ to_check->field.typ <= bounds->field.max) -static void panel_simple_parse_override_mode(struct device *dev, - struct panel_simple *panel, - const struct display_timing *ot) +static void panel_simple_parse_panel_timing_node(struct device *dev, + struct panel_simple *panel, + const struct display_timing *ot) { const struct panel_desc *desc = panel->desc; struct videomode vm; @@ -446,7 +462,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) } if (!of_get_display_timing(dev->of_node, "panel-timing", &dt)) - panel_simple_parse_override_mode(dev, panel, &dt); + panel_simple_parse_panel_timing_node(dev, panel, &dt); drm_panel_init(&panel->base); panel->base.dev = dev; -- 2.22.0.510.g264f2c817a-goog From mboxrd@z Thu Jan 1 00:00:00 1970 From: Douglas Anderson Subject: [PATCH] drm/panel: simple: Doxygenize 'struct panel_desc'; rename a few functions Date: Fri, 12 Jul 2019 09:33:33 -0700 Message-ID: <20190712163333.231884-1-dianders@chromium.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) by gabe.freedesktop.org (Postfix) with ESMTPS id 388766E314 for ; Fri, 12 Jul 2019 16:34:36 +0000 (UTC) Received: by mail-pf1-x442.google.com with SMTP id y15so4536475pfn.5 for ; Fri, 12 Jul 2019 09:34:36 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Thierry Reding , Sam Ravnborg Cc: David Airlie , Douglas Anderson , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Boris Brezillon , Sean Paul List-Id: dri-devel@lists.freedesktop.org VGhpcyBhdHRlbXB0cyB0byBhZGRyZXNzIG91dHN0YW5kaW5nIHJldmlldyBmZWVkYmFjayBmcm9t IGNvbW1pdApiOGEyOTQ4ZmEyYjMgKCJkcm0vcGFuZWw6IHNpbXBsZTogQWRkIGFiaWxpdHkgdG8g b3ZlcnJpZGUgdHlwaWNhbAp0aW1pbmciKS4gIFNwZWNpZmljYWxseToKCiogSXQgd2FzIHJlcXVl c3RlZCB0aGF0IEkgZG9jdW1lbnQgKGluIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbikgdGhhdAog IHRoZSBkZXZpY2UgdHJlZSBvdmVycmlkZSBoYWQgbm8gZWZmZWN0IGlmICdzdHJ1Y3QgZHJtX2Rp c3BsYXlfbW9kZScKICB3YXMgdXNlZCBpbiB0aGUgcGFuZWwgZGVzY3JpcHRpb24uICBJIGhhdmUg cHJvdmlkZWQgZnVsbCBEb3h5Z2VuCiAgY29tbWVudHMgZm9yICdzdHJ1Y3QgcGFuZWxfZGVzYycg dG8gYWNjb21wbGlzaCB0aGF0LgoqIHBhbmVsX3NpbXBsZV9nZXRfZml4ZWRfbW9kZXMoKSB3YXMg dGhvdWdodCB0byBiZSBhIGNvbmZ1c2luZyBuYW1lLAogIHNvIGl0IGhhcyBiZWVuIHJlbmFtZWQg dG8gcGFuZWxfc2ltcGxlX2dldF9kaXNwbGF5X21vZGVzKCkuCiogcGFuZWxfc2ltcGxlX3BhcnNl X292ZXJyaWRlX21vZGUoKSB3YXMgdGhvdWdodCB0byBiZSBiZXR0ZXIgbmFtZWQgYXMKICBwYW5l bF9zaW1wbGVfcGFyc2VfcGFuZWxfdGltaW5nX25vZGUoKS4KClN1Z2dlc3RlZC1ieTogU2FtIFJh dm5ib3JnIDxzYW1AcmF2bmJvcmcub3JnPgpTaWduZWQtb2ZmLWJ5OiBEb3VnbGFzIEFuZGVyc29u IDxkaWFuZGVyc0BjaHJvbWl1bS5vcmc+Ci0tLQpOT1RFUzoKLSBJIGhhdmUgbm90IGFkZHJlc3Nl ZCB0aGUgc3VnZ2VzdGlvbiBvZiBkb2luZyAnYm9vbCBoYXNfb3ZlcnJpZGUgPQogIHBhbmVsLT5v dmVycmlkZV9tb2RlLnR5cGUgIT0gMDsnLiAgQXMgcGVyIG15IHJlcGx5IG9uIHRoZSBtYWlsaW5n CiAgbGlzdCBJIHRoaW5rIHRoZSBjb252ZW50aW9uIGluIHRoaXMgZmlsZSBpcyB0byByZWx5IG9u IGltcGxpY2l0CiAgY29udmVyc2lvbnMgZnJvbSBpbnQgdG8gYm9vbC4KLSBTYW0gc2FpZCB0aGF0 IHRoZXJlIHdhcyBzdGlsbCBzb21ldGhpbmcgdGhhdCBoZSBkaWRuJ3QgdW5kZXJzdGFuZAogIHdp dGggcmVnYXJkcyB0byB0aGUgZmxhZ3MuICBTYW06IGlmIHRoaXMgaXMgc29tZXRoaW5nIHRoYXQg bmVlZHMgdG8KICBiZSBhZGRyZXNzZWQsIHBsZWFzZSB5ZWxsLgoKIGRyaXZlcnMvZ3B1L2RybS9w YW5lbC9wYW5lbC1zaW1wbGUuYyB8IDI4ICsrKysrKysrKysrKysrKysrKysrKystLS0tLS0KIDEg ZmlsZSBjaGFuZ2VkLCAyMiBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1zaW1wbGUuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9wYW5lbC9wYW5lbC1zaW1wbGUuYwppbmRleCBhNTA4NzFjNjgzNmIuLmYzYzBlMjAzZjQwZiAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3BhbmVsL3BhbmVsLXNpbXBsZS5jCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1zaW1wbGUuYwpAQCAtMzgsNiArMzgsMjIgQEAKICNp bmNsdWRlIDxkcm0vZHJtX21pcGlfZHNpLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9wYW5lbC5oPgog CisvKioKKyAqIEBtb2RlczogUG9pbnRlciB0byBhcnJheSBvZiBmaXhlZCBtb2RlcyBhcHByb3By aWF0ZSBmb3IgdGhpcyBwYW5lbC4gIElmCisgKiAgICAgICAgIG9ubHkgb25lIG1vZGUgdGhlbiB0 aGlzIGNhbiBqdXN0IGJlIHRoZSBhZGRyZXNzIG9mIHRoaXMgdGhlIG1vZGUuCisgKiAgICAgICAg IE5PVEU6IGNhbm5vdCBiZSB1c2VkIHdpdGggInRpbWluZ3MiIGFuZCBhbHNvIGlmIHRoaXMgaXMg c3BlY2lmaWVkCisgKiAgICAgICAgIHRoZW4geW91IGNhbm5vdCBvdmVycmlkZSB0aGUgbW9kZSBp biB0aGUgZGV2aWNlIHRyZWUuCisgKiBAbnVtX21vZGVzOiBOdW1iZXIgb2YgZWxlbWVudHMgaW4g bW9kZXMgYXJyYXkuCisgKiBAdGltaW5nczogUG9pbnRlciB0byBhcnJheSBvZiBkaXNwbGF5IHRp bWluZ3MuICBOT1RFOiBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAgICAgICAgICAgIm1vZGVzIiBh bmQgYWxzbyB0aGVzZSB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkZXZpY2UgdHJlZQorICog ICAgICAgICAgIG92ZXJyaWRlIGlmIG9uZSBpcyBwcmVzZW50LgorICogQG51bV90aW1pbmdzOiBO dW1iZXIgb2YgZWxlbWVudHMgaW4gdGltaW5ncyBhcnJheS4KKyAqIEBicGM6IEJpdHMgcGVyIGNv bG9yLgorICogQHNpemU6IFN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwaHlzaWNhbCBzaXplIG9m IHRoaXMgcGFuZWwuCisgKiBAZGVsYXk6IFN0cnVjdHVyZSBjb250YWluaW5nIHZhcmlvdXMgZGVs YXkgdmFsdWVzIGZvciB0aGlzIHBhbmVsLgorICogQGJ1c19mb3JtYXQ6IFNlZSBNRURJQV9CVVNf Rk1UXy4uLiBkZWZpbmVzLgorICogQGJ1c19mbGFnczogU2VlIERSTV9CVVNfRkxBR18uLi4gZGVm aW5lcy4KKyAqLwogc3RydWN0IHBhbmVsX2Rlc2MgewogCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICptb2RlczsKIAl1bnNpZ25lZCBpbnQgbnVtX21vZGVzOwpAQCAtMTM1LDcgKzE1MSw3 IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgcGFuZWxfc2ltcGxlX2dldF90aW1pbmdzX21vZGVzKHN0 cnVjdCBwYW5lbF9zaW1wbGUgKnBhbmVsKQogCXJldHVybiBudW07CiB9CiAKLXN0YXRpYyB1bnNp Z25lZCBpbnQgcGFuZWxfc2ltcGxlX2dldF9maXhlZF9tb2RlcyhzdHJ1Y3QgcGFuZWxfc2ltcGxl ICpwYW5lbCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFuZWxfc2ltcGxlX2dldF9kaXNwbGF5X21v ZGVzKHN0cnVjdCBwYW5lbF9zaW1wbGUgKnBhbmVsKQogewogCXN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IgPSBwYW5lbC0+YmFzZS5jb25uZWN0b3I7CiAJc3RydWN0IGRybV9kZXZpY2Ug KmRybSA9IHBhbmVsLT5iYXNlLmRybTsKQEAgLTE5OSw3ICsyMTUsNyBAQCBzdGF0aWMgaW50IHBh bmVsX3NpbXBsZV9nZXRfbm9uX2VkaWRfbW9kZXMoc3RydWN0IHBhbmVsX3NpbXBsZSAqcGFuZWwp CiAJICovCiAJV0FSTl9PTihwYW5lbC0+ZGVzYy0+bnVtX3RpbWluZ3MgJiYgcGFuZWwtPmRlc2Mt Pm51bV9tb2Rlcyk7CiAJaWYgKG51bSA9PSAwKQotCQludW0gPSBwYW5lbF9zaW1wbGVfZ2V0X2Zp eGVkX21vZGVzKHBhbmVsKTsKKwkJbnVtID0gcGFuZWxfc2ltcGxlX2dldF9kaXNwbGF5X21vZGVz KHBhbmVsKTsKIAogCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYyA9IHBhbmVsLT5kZXNjLT5i cGM7CiAJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ud2lkdGhfbW0gPSBwYW5lbC0+ZGVzYy0+c2l6 ZS53aWR0aDsKQEAgLTM1MSw5ICszNjcsOSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wYW5l bF9mdW5jcyBwYW5lbF9zaW1wbGVfZnVuY3MgPSB7CiAjZGVmaW5lIFBBTkVMX1NJTVBMRV9CT1VO RFNfQ0hFQ0sodG9fY2hlY2ssIGJvdW5kcywgZmllbGQpIFwKIAkodG9fY2hlY2stPmZpZWxkLnR5 cCA+PSBib3VuZHMtPmZpZWxkLm1pbiAmJiBcCiAJIHRvX2NoZWNrLT5maWVsZC50eXAgPD0gYm91 bmRzLT5maWVsZC5tYXgpCi1zdGF0aWMgdm9pZCBwYW5lbF9zaW1wbGVfcGFyc2Vfb3ZlcnJpZGVf bW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgc3RydWN0IHBhbmVsX3NpbXBsZSAq cGFuZWwsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGRpc3BsYXlfdGltaW5nICpvdCkKK3N0YXRp YyB2b2lkIHBhbmVsX3NpbXBsZV9wYXJzZV9wYW5lbF90aW1pbmdfbm9kZShzdHJ1Y3QgZGV2aWNl ICpkZXYsCisJCQkJCQkgc3RydWN0IHBhbmVsX3NpbXBsZSAqcGFuZWwsCisJCQkJCQkgY29uc3Qg c3RydWN0IGRpc3BsYXlfdGltaW5nICpvdCkKIHsKIAljb25zdCBzdHJ1Y3QgcGFuZWxfZGVzYyAq ZGVzYyA9IHBhbmVsLT5kZXNjOwogCXN0cnVjdCB2aWRlb21vZGUgdm07CkBAIC00NDYsNyArNDYy LDcgQEAgc3RhdGljIGludCBwYW5lbF9zaW1wbGVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBj b25zdCBzdHJ1Y3QgcGFuZWxfZGVzYyAqZGVzYykKIAl9CiAKIAlpZiAoIW9mX2dldF9kaXNwbGF5 X3RpbWluZyhkZXYtPm9mX25vZGUsICJwYW5lbC10aW1pbmciLCAmZHQpKQotCQlwYW5lbF9zaW1w bGVfcGFyc2Vfb3ZlcnJpZGVfbW9kZShkZXYsIHBhbmVsLCAmZHQpOworCQlwYW5lbF9zaW1wbGVf cGFyc2VfcGFuZWxfdGltaW5nX25vZGUoZGV2LCBwYW5lbCwgJmR0KTsKIAogCWRybV9wYW5lbF9p bml0KCZwYW5lbC0+YmFzZSk7CiAJcGFuZWwtPmJhc2UuZGV2ID0gZGV2OwotLSAKMi4yMi4wLjUx MC5nMjY0ZjJjODE3YS1nb29nCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVz a3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9k cmktZGV2ZWw=