Received: by 2002:a25:b323:0:0:0:0:0 with SMTP id l35csp1804911ybj; Sun, 22 Sep 2019 12:18:32 -0700 (PDT) X-Google-Smtp-Source: APXvYqxTFHlX89WOD+IWRRzd7dbn9pKJHB/uL+8Nv++t9XICTPi0IH/eVgNkmymKm5VEPcu23uUX X-Received: by 2002:a17:906:f19a:: with SMTP id gs26mr2647525ejb.298.1569179912750; Sun, 22 Sep 2019 12:18:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569179912; cv=none; d=google.com; s=arc-20160816; b=X8O8s1g497cPRykZZEK5+75UHS0Zfh0SeHLfPLU3nwIpu6YW0OQlL3VVV8d/x5Tico IzOSNOFxL0NysZo42SajAW4tShekucWNHSaHdk1WHgB9L2ckxd+NcdBA39WP2OXuax47 vjqjZtD8/mGTbiSuJUxUYD8TVVSrr1Wk35q5Zc9LM0CnWfobSf8r1q9dmMVfCT4HDg/f PvsHrohEGttB3/1bEi2Uj5JU+NSfSLhSYiPit1itmn+Bsn8Bx8VzMEUZxPCdqfGgaRNw KW3TFsmzy/0onJh6zepEg43ecawLNMM/i8p1oKQgy7DPVxJvrAROI0F1t3hJtRuJtnDT lotA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=7mgLj8IDyUE5BJFX9MvT1FWuxbUfbcvm+KspqaFd9sI=; b=Qut81oFDOUZ4BWZESMQSVr9sDtMMluxxrEd6f5K1nDvrVxo5YTuGE5v439WYdP+w2v iB4eqR6R+rIWpM++rU4GTB4/Yi7wGyzn80nnF0c3h/1HwX6q48/1gl8kFAACAF5EicjT 3eSghkojrsDwEYF1RUSeyzt5WyiDkbMdd3AK9TnzhuFI1P53gSLjd/4Px0HIF3lmrtbN piqJZQcPZz/MDTpkfWc7+ySZpIq+58/YjHcrf0P6xeB8KDB77QNBT6QqQKZLZ0XSAZ1f gWLo8U4zCp0ZIEQCgZ+Mkj9EYXhHz0+rybh1+aKxZ+H3o3jiMBz9n8dsFuy9i9UHVNsp aAfw== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=iki.fi Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s20si4066283eja.63.2019.09.22.12.18.09; Sun, 22 Sep 2019 12:18:32 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=iki.fi Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2407605AbfIUMuO (ORCPT + 99 others); Sat, 21 Sep 2019 08:50:14 -0400 Received: from mx1.riseup.net ([198.252.153.129]:47176 "EHLO mx1.riseup.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405593AbfIUMuO (ORCPT ); Sat, 21 Sep 2019 08:50:14 -0400 Received: from capuchin.riseup.net (capuchin-pn.riseup.net [10.0.1.176]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "COMODO RSA Domain Validation Secure Server CA" (verified OK)) by mx1.riseup.net (Postfix) with ESMTPS id 5F6C51B932C; Sat, 21 Sep 2019 05:49:40 -0700 (PDT) X-Riseup-User-ID: E904BF54A9D00DEAC807850919DC7C9386AA0504DF66F720342B6B7C22BA1A3A Received: from [127.0.0.1] (localhost [127.0.0.1]) by capuchin.riseup.net (Postfix) with ESMTPSA id A3A7F120063; Sat, 21 Sep 2019 05:49:36 -0700 (PDT) From: =?UTF-8?q?Joonas=20Kylm=C3=A4l=C3=A4?= To: Thierry Reding , Sam Ravnborg , David Airlie , Daniel Vetter , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: paul.kocialkowski@bootlin.com, GNUtoo@cyberdimension.org, Andrzej Hajda , =?UTF-8?q?Joonas=20Kylm=C3=A4l=C3=A4?= Subject: [PATCH] drm/panel: samsung: s6e8aa0: Add backlight control support Date: Sat, 21 Sep 2019 15:48:43 +0300 Message-Id: <20190921124843.6967-1-joonas.kylmala@iki.fi> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This makes the backlight brightness controllable from the userspace. Signed-off-by: Joonas Kylmälä --- drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c | 82 ++++++++++++++++++++------- 1 file changed, 60 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c index dbced6501204..aa75934f5bed 100644 --- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c +++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c @@ -10,8 +10,12 @@ * Eunchul Kim * Tomasz Figa * Andrzej Hajda + * + * Derived from panel-samsung-s6e63m0.c: + * Copyright (C) 2019 Paweł Chmiel */ +#include #include #include #include @@ -85,6 +89,8 @@ #define AID_2 (0x6) #define AID_3 (0x7) +#define MAX_BRIGHTNESS (GAMMA_LEVEL_NUM - 1) + typedef u8 s6e8aa0_gamma_table[GAMMA_TABLE_LEN]; struct s6e8aa0_variant { @@ -95,6 +101,7 @@ struct s6e8aa0_variant { struct s6e8aa0 { struct device *dev; struct drm_panel panel; + struct backlight_device *bl_dev; struct regulator_bulk_data supplies[2]; struct gpio_desc *reset_gpio; @@ -110,7 +117,6 @@ struct s6e8aa0 { u8 version; u8 id; const struct s6e8aa0_variant *variant; - int brightness; /* This field is tested by functions directly accessing DSI bus before * transfer, transfer is skipped if it is set. In case of transfer @@ -321,9 +327,10 @@ static void s6e8aa0_etc_elvss_control(struct s6e8aa0 *ctx) static void s6e8aa0_elvss_nvm_set_v142(struct s6e8aa0 *ctx) { + struct backlight_device *bd = ctx->bl_dev; u8 br; - switch (ctx->brightness) { + switch (bd->props.brightness) { case 0 ... 6: /* 30cd ~ 100cd */ br = 0xdf; break; @@ -762,24 +769,6 @@ static const struct s6e8aa0_variant s6e8aa0_variants[] = { } }; -static void s6e8aa0_brightness_set(struct s6e8aa0 *ctx) -{ - const u8 *gamma; - - if (ctx->error) - return; - - gamma = ctx->variant->gamma_tables[ctx->brightness]; - - if (ctx->version >= 142) - s6e8aa0_elvss_nvm_set(ctx); - - s6e8aa0_dcs_write(ctx, gamma, GAMMA_TABLE_LEN); - - /* update gamma table. */ - s6e8aa0_dcs_write_seq_static(ctx, 0xf7, 0x03); -} - static void s6e8aa0_panel_init(struct s6e8aa0 *ctx) { s6e8aa0_apply_level_1_key(ctx); @@ -791,7 +780,7 @@ static void s6e8aa0_panel_init(struct s6e8aa0 *ctx) s6e8aa0_panel_cond_set(ctx); s6e8aa0_display_condition_set(ctx); - s6e8aa0_brightness_set(ctx); + backlight_enable(ctx->bl_dev); s6e8aa0_etc_source_control(ctx); s6e8aa0_etc_pentile_control(ctx); s6e8aa0_elvss_nvm_set(ctx); @@ -974,6 +963,53 @@ static int s6e8aa0_parse_dt(struct s6e8aa0 *ctx) return 0; } +static int s6e8aa0_set_brightness(struct backlight_device *bd) +{ + struct s6e8aa0 *ctx = bl_get_data(bd); + const u8 *gamma; + + if (ctx->error) + return; + + gamma = ctx->variant->gamma_tables[bd->props.brightness]; + + if (ctx->version >= 142) + s6e8aa0_elvss_nvm_set(ctx); + + s6e8aa0_dcs_write(ctx, gamma, GAMMA_TABLE_LEN); + + /* update gamma table. */ + s6e8aa0_dcs_write_seq_static(ctx, 0xf7, 0x03); + + return s6e8aa0_clear_error(ctx); +} + +static const struct backlight_ops s6e8aa0_backlight_ops = { + .update_status = s6e8aa0_set_brightness, +}; + +static int s6e8aa0_backlight_register(struct s6e8aa0 *ctx) +{ + struct backlight_properties props = { + .type = BACKLIGHT_RAW, + .brightness = MAX_BRIGHTNESS, + .max_brightness = MAX_BRIGHTNESS + }; + struct device *dev = ctx->dev; + int ret = 0; + + ctx->bl_dev = devm_backlight_device_register(dev, "panel", dev, ctx, + &s6e8aa0_backlight_ops, + &props); + if (IS_ERR(ctx->bl_dev)) { + ret = PTR_ERR(ctx->bl_dev); + DRM_DEV_ERROR(dev, "error registering backlight device (%d)\n", + ret); + } + + return ret; +} + static int s6e8aa0_probe(struct mipi_dsi_device *dsi) { struct device *dev = &dsi->dev; @@ -1015,7 +1051,9 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi) return PTR_ERR(ctx->reset_gpio); } - ctx->brightness = GAMMA_LEVEL_NUM - 1; + ret = s6e8aa0_backlight_register(ctx); + if (ret < 0) + return ret; drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs, DRM_MODE_CONNECTOR_DSI); -- 2.11.0