From patchwork Mon Jan 22 19:50:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Duje_Mihanovi=C4=87?= X-Patchwork-Id: 190390 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp2817770dyb; Mon, 22 Jan 2024 12:19:51 -0800 (PST) X-Google-Smtp-Source: AGHT+IF43+7jvE/0qubdzwhp0XahsPizb6n9XT3uoOnQkJE+OniJcgoy57CFppL2O3mAH4SfrfW0 X-Received: by 2002:a05:6a20:4f86:b0:199:e728:3ccf with SMTP id gh6-20020a056a204f8600b00199e7283ccfmr4554917pzb.62.1705954791201; Mon, 22 Jan 2024 12:19:51 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705954791; cv=pass; d=google.com; s=arc-20160816; b=fiwJox3cPt2a1Be0jS/yvqdszd5y9+NZPSisjxqOe1WhUkna49Y4cSr8oSPsaNXBWa VDI5gs8vo3lusMB54Mk0TLWPacNiW3wTJjCCGFGjHhCBX54JLuhNHCwv+O+Ff822rVxW 356foIrkEgc3uJ2DhE7ARjhibuMvXY/q2wZPCkr0is6ttsfmJau1Hzp9araxZFeueF2G IxfhB0qIcHnCSNULggK+S7SND/XOKR6HDFQKhzErXfd3UqgmpMt/JZRwdeXLwc6VT3GV OAHn+U1ToJpK8qlb1tzwTwCngcFDsiirs2jG/gBPog8BwGB7GVguOCdYQp8jWpxXsx6+ 94kQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :subject:date:from; bh=WB17wCRJ4n78WgA2LDRna5JCVwtWXepgKS35q+HDyC0=; fh=OO60JPQ19LinwQ+qUc1qSX52f+SlYRTiEWKt2aK1QSg=; b=CmoZMWRNB1d6Dq9TqOH6ljKq7CtxBk77XRuFdLCGd4BhUn55BlcvyvuQr+tr1CQ99m pGDOWvXnKTFlBA6GriRbhwulzagwxVlS+ij0QmHmMkkFaRN3Vm17sutQYCtO6E204E6/ jYc0fq3wtfbhROKGrs/jhdoTuRCEfYefNZfnKczvaJQTbzvJWX6JBkhBcwjFPnY8Obvl CwVz3UZ2CJJcyNix1f9KJfYXIgVfQ+Q/WPkjLTVdVflaoo+iSVdZs0m8vva82ubJLXPv CzxU6W+5LaEWzXrnml643fcu8LtcgWHOxxfSfVhgtCWmKeOK3J6MFdVZ9v0lGgCjUUmv 5yaA== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=skole.hr); spf=pass (google.com: domain of linux-kernel+bounces-34089-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-34089-ouuuleilei=gmail.com@vger.kernel.org" Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id q27-20020a63751b000000b005ce00b97c9esi8765237pgc.650.2024.01.22.12.19.50 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Jan 2024 12:19:51 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-34089-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=skole.hr); spf=pass (google.com: domain of linux-kernel+bounces-34089-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-34089-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 4D01EB2CAC5 for ; Mon, 22 Jan 2024 19:52:57 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D4A7247764; Mon, 22 Jan 2024 19:51:49 +0000 (UTC) Received: from mx.skole.hr (mx1.hosting.skole.hr [161.53.165.185]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CDC4D3FB2A; Mon, 22 Jan 2024 19:51:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=161.53.165.185 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705953105; cv=none; b=Ho4kJ3F0tgZABNyvyyY9tb1PDGRWo8ewcFMjp5CzaOLH8wbud+HwWLB1MqHG18tW3Hk7xWpO7gJ0w0x24FJMzZjcXApW/Mm8gXW3XQDrhMSrlmcpoWxR2nF6LWiRZfEXaS6vqmTjqGZtw7lLoQVnGHhvjJ/E/KmprSc9eT9AO/I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705953105; c=relaxed/simple; bh=/deHGhZM4v1ejh147wzc38UxFpPL5Gbj/z5Z/Hg66YE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VBrEKsTt7uXx0SiU0WOxU3ypn0sh+sNng2kqzq2/PQOhL6buFQlqL2j6Rz1S2p2+LfVLMnvAjq2YKpWYSUTcmbcQ+CYmSvaLK+7/6EvJGVmHOUYTN62pcPKrH4xyE9wYnIshrzFrlgOSTqDeuay16zVfBqlgpB7vgPT1LO6bOP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=skole.hr; spf=pass smtp.mailfrom=skole.hr; arc=none smtp.client-ip=161.53.165.185 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=skole.hr Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=skole.hr Received: from mx1.hosting.skole.hr (localhost.localdomain [127.0.0.1]) by mx.skole.hr (mx.skole.hr) with ESMTP id 614118596B; Mon, 22 Jan 2024 20:51:40 +0100 (CET) From: =?utf-8?q?Duje_Mihanovi=C4=87?= Date: Mon, 22 Jan 2024 20:50:57 +0100 Subject: [PATCH v4 1/3] leds: ktd2692: move ExpressWire code to library Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240122-ktd2801-v4-1-33c986a3eb68@skole.hr> References: <20240122-ktd2801-v4-0-33c986a3eb68@skole.hr> In-Reply-To: <20240122-ktd2801-v4-0-33c986a3eb68@skole.hr> To: Lee Jones , Daniel Thompson , Jingoo Han , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Helge Deller , Linus Walleij Cc: Karel Balej , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-fbdev@vger.kernel.org, =?utf-8?q?Duje_M?= =?utf-8?q?ihanovi=C4=87?= X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=openpgp-sha256; l=14250; i=duje.mihanovic@skole.hr; h=from:subject:message-id; bh=/deHGhZM4v1ejh147wzc38UxFpPL5Gbj/z5Z/Hg66YE=; b=owEBbQKS/ZANAwAIAZoRnrBCLZbhAcsmYgBlrsckZ7Y4YLfxYq80odpepNoXCa3vAAfG6/HLt xv9PQk/nZaJAjMEAAEIAB0WIQRT351NnD/hEPs2LXiaEZ6wQi2W4QUCZa7HJAAKCRCaEZ6wQi2W 4RmwD/9TJhxnCcpqK0uqy+ddEz/0AIHDh07v1CrECICgA1+2ILlN3WSugKmPp/OQVu6SI3QdrDC nklA7ax+fdBzmftio4rtDUi5nmSuyJUzAQ278QG+l34dn57kmdXGjUY2585GeJNNjXOxt/K+Gun /apaawe/eBpkxLBbihEchADWBH9oFiLI7VhjVDGqbcxcFDihbs5widecGURMYGB7VbmoDwIHbgy LkKSL+GKcJFhpuDSSjrlbN5Mv4pErnk0MqG0na4pVthckCOhhJBUCun91jJKUa+sCiA4unUQKbh 7gmzt/ZPhYC6RLtgg/HS9XLjTyLSOObCMpBr43DGS7PEg0cSy9mJ/N1GUTbobL8hDcw6EMsrCh7 Kv8QnIap7nF98JZr9vB0KMtA4Vf94/Iajcv6nsrBW3FIDoQ6miXYLvcFU4uP6GF/YASUsNWN6Hu cmcoXz7mec/AIR0p2C94JuL6fZ4ovW4RWbMYCExZK83U1ZJzpnRzcZDakXwilHsYm7MFUh5LB9w OJLpU/8m+qXJEcj+Ug648b5adyC4pE1cRrzNVf4RBsFzmst7X0xT9ncPb/Y552IcNeFZ8krBI2i 3AK4zvSUVlTKxs8pH8bD1RRn+tPdRlxY2qm13mUkSF2JsBm9IiFd+8SOzSSm8cU4x9i2FLJp95f luyYnMqrcwbZ4zw== X-Developer-Key: i=duje.mihanovic@skole.hr; a=openpgp; fpr=53DF9D4D9C3FE110FB362D789A119EB0422D96E1 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788823250946022910 X-GMAIL-MSGID: 1788823250946022910 The ExpressWire protocol is shared between at least KTD2692 and KTD2801 with slight differences such as timings and the former not having a defined set of pulses for enabling the protocol (possibly because it does not support PWM unlike KTD2801). Despite these differences the ExpressWire handling code can be shared between the two, so move it into a library in preparation for adding KTD2801 support. Suggested-by: Daniel Thompson Reviewed-by: Linus Walleij Signed-off-by: Duje Mihanović Reviewed-by: Daniel Thompson --- MAINTAINERS | 7 +++ drivers/leds/Kconfig | 4 ++ drivers/leds/Makefile | 3 + drivers/leds/flash/Kconfig | 2 +- drivers/leds/flash/leds-ktd2692.c | 116 +++++++++----------------------------- drivers/leds/leds-expresswire.c | 68 ++++++++++++++++++++++ include/linux/leds-expresswire.h | 36 ++++++++++++ 7 files changed, 146 insertions(+), 90 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index a7c4cf8201e0..87b12d2448a0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7902,6 +7902,13 @@ S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat.git F: fs/exfat/ +EXPRESSWIRE PROTOCOL LIBRARY +M: Duje Mihanović +L: linux-leds@vger.kernel.org +S: Maintained +F: drivers/leds/leds-expresswire.c +F: include/linux/leds-expresswire.h + EXT2 FILE SYSTEM M: Jan Kara L: linux-ext4@vger.kernel.org diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 6292fddcc55c..15e1c3c238ab 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -181,6 +181,10 @@ config LEDS_EL15203000 To compile this driver as a module, choose M here: the module will be called leds-el15203000. +config LEDS_EXPRESSWIRE + bool + depends on GPIOLIB + config LEDS_TURRIS_OMNIA tristate "LED support for CZ.NIC's Turris Omnia" depends on LEDS_CLASS_MULTICOLOR diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index d7348e8bc019..a63a07d01c6f 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -89,6 +89,9 @@ obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o +# Kinetic ExpressWire Protocol +obj-$(CONFIG_LEDS_EXPRESSWIRE) += leds-expresswire.o + # LED SPI Drivers obj-$(CONFIG_LEDS_CR0014114) += leds-cr0014114.o obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o diff --git a/drivers/leds/flash/Kconfig b/drivers/leds/flash/Kconfig index 4e08dbc05709..a0fb755b58dc 100644 --- a/drivers/leds/flash/Kconfig +++ b/drivers/leds/flash/Kconfig @@ -23,7 +23,7 @@ config LEDS_AS3645A config LEDS_KTD2692 tristate "LED support for Kinetic KTD2692 flash LED controller" depends on OF - depends on GPIOLIB || COMPILE_TEST + select LEDS_EXPRESSWIRE help This option enables support for Kinetic KTD2692 LED flash connected through ExpressWire interface. diff --git a/drivers/leds/flash/leds-ktd2692.c b/drivers/leds/flash/leds-ktd2692.c index 598eee5daa52..7bb0aa2753e3 100644 --- a/drivers/leds/flash/leds-ktd2692.c +++ b/drivers/leds/flash/leds-ktd2692.c @@ -6,9 +6,9 @@ * Ingi Kim */ -#include #include #include +#include #include #include #include @@ -37,22 +37,9 @@ #define KTD2692_REG_FLASH_CURRENT_BASE 0x80 #define KTD2692_REG_MODE_BASE 0xA0 -/* Set bit coding time for expresswire interface */ -#define KTD2692_TIME_RESET_US 700 -#define KTD2692_TIME_DATA_START_TIME_US 10 -#define KTD2692_TIME_HIGH_END_OF_DATA_US 350 -#define KTD2692_TIME_LOW_END_OF_DATA_US 10 -#define KTD2692_TIME_SHORT_BITSET_US 4 -#define KTD2692_TIME_LONG_BITSET_US 12 - /* KTD2692 default length of name */ #define KTD2692_NAME_LENGTH 20 -enum ktd2692_bitset { - KTD2692_LOW = 0, - KTD2692_HIGH, -}; - /* Movie / Flash Mode Control */ enum ktd2692_led_mode { KTD2692_MODE_DISABLE = 0, /* default */ @@ -71,7 +58,19 @@ struct ktd2692_led_config_data { enum led_brightness max_brightness; }; +const struct expresswire_timing ktd2692_timing = { + .poweroff_us = 700, + .data_start_us = 10, + .end_of_data_low_us = 10, + .end_of_data_high_us = 350, + .short_bitset_us = 4, + .long_bitset_us = 12 +}; + struct ktd2692_context { + /* Common ExpressWire properties (ctrl GPIO and timing) */ + struct expresswire_common_props props; + /* Related LED Flash class device */ struct led_classdev_flash fled_cdev; @@ -80,7 +79,6 @@ struct ktd2692_context { struct regulator *regulator; struct gpio_desc *aux_gpio; - struct gpio_desc *ctrl_gpio; enum ktd2692_led_mode mode; enum led_brightness torch_brightness; @@ -92,67 +90,6 @@ static struct ktd2692_context *fled_cdev_to_led( return container_of(fled_cdev, struct ktd2692_context, fled_cdev); } -static void ktd2692_expresswire_start(struct ktd2692_context *led) -{ - gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); - udelay(KTD2692_TIME_DATA_START_TIME_US); -} - -static void ktd2692_expresswire_reset(struct ktd2692_context *led) -{ - gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); - udelay(KTD2692_TIME_RESET_US); -} - -static void ktd2692_expresswire_end(struct ktd2692_context *led) -{ - gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); - udelay(KTD2692_TIME_LOW_END_OF_DATA_US); - gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); - udelay(KTD2692_TIME_HIGH_END_OF_DATA_US); -} - -static void ktd2692_expresswire_set_bit(struct ktd2692_context *led, bool bit) -{ - /* - * The Low Bit(0) and High Bit(1) is based on a time detection - * algorithm between time low and time high - * Time_(L_LB) : Low time of the Low Bit(0) - * Time_(H_LB) : High time of the LOW Bit(0) - * Time_(L_HB) : Low time of the High Bit(1) - * Time_(H_HB) : High time of the High Bit(1) - * - * It can be simplified to: - * Low Bit(0) : 2 * Time_(H_LB) < Time_(L_LB) - * High Bit(1) : 2 * Time_(L_HB) < Time_(H_HB) - * HIGH ___ ____ _.. _________ ___ - * |_________| |_.. |____| |__| - * LOW - * [ Low Bit (0) ] [ High Bit(1) ] - */ - if (bit) { - gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); - udelay(KTD2692_TIME_SHORT_BITSET_US); - gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); - udelay(KTD2692_TIME_LONG_BITSET_US); - } else { - gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); - udelay(KTD2692_TIME_LONG_BITSET_US); - gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); - udelay(KTD2692_TIME_SHORT_BITSET_US); - } -} - -static void ktd2692_expresswire_write(struct ktd2692_context *led, u8 value) -{ - int i; - - ktd2692_expresswire_start(led); - for (i = 7; i >= 0; i--) - ktd2692_expresswire_set_bit(led, value & BIT(i)); - ktd2692_expresswire_end(led); -} - static int ktd2692_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness brightness) { @@ -163,14 +100,14 @@ static int ktd2692_led_brightness_set(struct led_classdev *led_cdev, if (brightness == LED_OFF) { led->mode = KTD2692_MODE_DISABLE; - gpiod_direction_output(led->aux_gpio, KTD2692_LOW); + gpiod_direction_output(led->aux_gpio, 0); } else { - ktd2692_expresswire_write(led, brightness | + expresswire_write_u8(&led->props, brightness | KTD2692_REG_MOVIE_CURRENT_BASE); led->mode = KTD2692_MODE_MOVIE; } - ktd2692_expresswire_write(led, led->mode | KTD2692_REG_MODE_BASE); + expresswire_write_u8(&led->props, led->mode | KTD2692_REG_MODE_BASE); mutex_unlock(&led->lock); return 0; @@ -187,17 +124,17 @@ static int ktd2692_led_flash_strobe_set(struct led_classdev_flash *fled_cdev, if (state) { flash_tm_reg = GET_TIMEOUT_OFFSET(timeout->val, timeout->step); - ktd2692_expresswire_write(led, flash_tm_reg + expresswire_write_u8(&led->props, flash_tm_reg | KTD2692_REG_FLASH_TIMEOUT_BASE); led->mode = KTD2692_MODE_FLASH; - gpiod_direction_output(led->aux_gpio, KTD2692_HIGH); + gpiod_direction_output(led->aux_gpio, 1); } else { led->mode = KTD2692_MODE_DISABLE; - gpiod_direction_output(led->aux_gpio, KTD2692_LOW); + gpiod_direction_output(led->aux_gpio, 0); } - ktd2692_expresswire_write(led, led->mode | KTD2692_REG_MODE_BASE); + expresswire_write_u8(&led->props, led->mode | KTD2692_REG_MODE_BASE); fled_cdev->led_cdev.brightness = LED_OFF; led->mode = KTD2692_MODE_DISABLE; @@ -247,12 +184,12 @@ static void ktd2692_init_flash_timeout(struct led_classdev_flash *fled_cdev, static void ktd2692_setup(struct ktd2692_context *led) { led->mode = KTD2692_MODE_DISABLE; - ktd2692_expresswire_reset(led); - gpiod_direction_output(led->aux_gpio, KTD2692_LOW); + expresswire_power_off(&led->props); + gpiod_direction_output(led->aux_gpio, 0); - ktd2692_expresswire_write(led, (KTD2692_MM_MIN_CURR_THRESHOLD_SCALE - 1) + expresswire_write_u8(&led->props, (KTD2692_MM_MIN_CURR_THRESHOLD_SCALE - 1) | KTD2692_REG_MM_MIN_CURR_THRESHOLD_BASE); - ktd2692_expresswire_write(led, KTD2692_FLASH_MODE_CURR_PERCENT(45) + expresswire_write_u8(&led->props, KTD2692_FLASH_MODE_CURR_PERCENT(45) | KTD2692_REG_FLASH_CURRENT_BASE); } @@ -277,8 +214,8 @@ static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev, if (!np) return -ENXIO; - led->ctrl_gpio = devm_gpiod_get(dev, "ctrl", GPIOD_ASIS); - ret = PTR_ERR_OR_ZERO(led->ctrl_gpio); + led->props.ctrl_gpio = devm_gpiod_get(dev, "ctrl", GPIOD_ASIS); + ret = PTR_ERR_OR_ZERO(led->props.ctrl_gpio); if (ret) return dev_err_probe(dev, ret, "cannot get ctrl-gpios\n"); @@ -412,6 +349,7 @@ static struct platform_driver ktd2692_driver = { module_platform_driver(ktd2692_driver); +MODULE_IMPORT_NS(EXPRESSWIRE); MODULE_AUTHOR("Ingi Kim "); MODULE_DESCRIPTION("Kinetic KTD2692 LED driver"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/leds/leds-expresswire.c b/drivers/leds/leds-expresswire.c new file mode 100644 index 000000000000..89e147b0e019 --- /dev/null +++ b/drivers/leds/leds-expresswire.c @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Shared library for Kinetic's ExpressWire protocol. + * This protocol works by pulsing the ExpressWire IC's control GPIO. + * ktd2692 and ktd2801 are known to use this protocol. + */ + +#include +#include +#include + +void expresswire_power_off(struct expresswire_common_props *props) +{ + gpiod_set_value_cansleep(props->ctrl_gpio, 0); + usleep_range(props->timing.poweroff_us, props->timing.poweroff_us * 2); +} +EXPORT_SYMBOL_NS_GPL(expresswire_power_off, EXPRESSWIRE); + +void expresswire_enable(struct expresswire_common_props *props) +{ + gpiod_set_value(props->ctrl_gpio, 1); + udelay(props->timing.detect_delay_us); + gpiod_set_value(props->ctrl_gpio, 0); + udelay(props->timing.detect_us); + gpiod_set_value(props->ctrl_gpio, 1); +} +EXPORT_SYMBOL_NS_GPL(expresswire_enable, EXPRESSWIRE); + +void expresswire_start(struct expresswire_common_props *props) +{ + gpiod_set_value(props->ctrl_gpio, 1); + udelay(props->timing.data_start_us); +} +EXPORT_SYMBOL_NS_GPL(expresswire_start, EXPRESSWIRE); + +void expresswire_end(struct expresswire_common_props *props) +{ + gpiod_set_value(props->ctrl_gpio, 0); + udelay(props->timing.end_of_data_low_us); + gpiod_set_value(props->ctrl_gpio, 1); + udelay(props->timing.end_of_data_high_us); +} +EXPORT_SYMBOL_NS_GPL(expresswire_end, EXPRESSWIRE); + +void expresswire_set_bit(struct expresswire_common_props *props, bool bit) +{ + if (bit) { + gpiod_set_value(props->ctrl_gpio, 0); + udelay(props->timing.short_bitset_us); + gpiod_set_value(props->ctrl_gpio, 1); + udelay(props->timing.long_bitset_us); + } else { + gpiod_set_value(props->ctrl_gpio, 0); + udelay(props->timing.long_bitset_us); + gpiod_set_value(props->ctrl_gpio, 1); + udelay(props->timing.short_bitset_us); + } +} +EXPORT_SYMBOL_NS_GPL(expresswire_set_bit, EXPRESSWIRE); + +void expresswire_write_u8(struct expresswire_common_props *props, u8 val) +{ + expresswire_start(props); + for (int i = 7; i >= 0; i--) + expresswire_set_bit(props, val & BIT(i)); + expresswire_end(props); +} +EXPORT_SYMBOL_NS_GPL(expresswire_write_u8, EXPRESSWIRE); diff --git a/include/linux/leds-expresswire.h b/include/linux/leds-expresswire.h new file mode 100644 index 000000000000..3c61902ccac8 --- /dev/null +++ b/include/linux/leds-expresswire.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Shared library for Kinetic's ExpressWire protocol. + * This protocol works by pulsing the ExpressWire IC's control GPIO. + * ktd2692 and ktd2801 are known to use this protocol. + */ + +#ifndef _LEDS_EXPRESSWIRE_H +#define _LEDS_EXPRESSWIRE_H + +#include + +struct expresswire_timing { + unsigned long poweroff_us; + unsigned long detect_delay_us; + unsigned long detect_us; + unsigned long data_start_us; + unsigned long end_of_data_low_us; + unsigned long end_of_data_high_us; + unsigned long short_bitset_us; + unsigned long long_bitset_us; +}; + +struct expresswire_common_props { + struct gpio_desc *ctrl_gpio; + struct expresswire_timing timing; +}; + +void expresswire_power_off(struct expresswire_common_props *props); +void expresswire_enable(struct expresswire_common_props *props); +void expresswire_start(struct expresswire_common_props *props); +void expresswire_end(struct expresswire_common_props *props); +void expresswire_set_bit(struct expresswire_common_props *props, bool bit); +void expresswire_write_u8(struct expresswire_common_props *props, u8 val); + +#endif /* _LEDS_EXPRESSWIRE_H */ From patchwork Mon Jan 22 19:50:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Duje_Mihanovi=C4=87?= X-Patchwork-Id: 190384 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp2801193dyb; Mon, 22 Jan 2024 11:52:33 -0800 (PST) X-Google-Smtp-Source: AGHT+IFFO2KlI2ovezeGJUpQjVIlqqdETtC2JLf3AddmCrIwqnPCwQQXe5FLKCkQkGvbWc1rBM5Y X-Received: by 2002:a05:6808:1b0e:b0:3bd:c072:a971 with SMTP id bx14-20020a0568081b0e00b003bdc072a971mr781012oib.53.1705953153717; Mon, 22 Jan 2024 11:52:33 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705953153; cv=pass; d=google.com; s=arc-20160816; b=VaabsiSgXntNZ6R/W9w5Uk1TtH/nbfsMu4lAvlUFJDAzFd050aLRIbl6fBY/I5kN6o fPNWDoB9Va53wrqWf2JIq5rWsmW/7g1iL9lv00dGpaJc8mZYkG/oNzk64sms7dZMMeI2 JfucUxuVHUG8TK9KU5goJnHKCTVvikOTVH77CQaMqCXPfDQQUHav8MAC7JNgJ2/Lb6UB pspS6SKq8JZQAVORLGwc0ewREsU0pdIMFi7StajoxOnLUwD2HUPBPOXumwCewHc44jpC ODcR9ADP2CQdwdA+COxDl87B2SMpgMddmEkf7mhAD8QPBrhGRiSLaZbRzfx6z7QzH72G 3twg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :subject:date:from; bh=XIm8CNoUe11/OQbwbYbfgrbW/LE5qZ3XmbkQT3/03ko=; fh=lO9n7b9mQNj9ZBnDJZOJQdNL2p5f0HxXENzpoxlGpGs=; b=kkolXOn/QBcDvczu9Ycu1wJcYGvCQAHn2sd1+OAC4e07JC/uwCKmt5dd89qfMhEIfA kO5bvgOGsRhV8fA9Vqqjk+mxURkuahSE8G8k7Up7bNSUfjICnL/SNBRMxvOyBkyc15x5 rjkHQu4awhjpb2g99iKLfPnNlmdj0XoCGykd9BdgPfLaOBsULAS2NQXHM7PI7BUs2b0/ ILPN/EIxaXZjorJ9HEzo10KuDyCfpWk9/nFJnHT/GwwC7OsUD28+ULUU2T/SBv9DRMs8 ljsgUcHnkE4yN6pj7XSUphbLFQr0ei1Iy0DvBOwBSegWM04nHqGW68Mdp7NNmttg98yk nKGw== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=skole.hr); spf=pass (google.com: domain of linux-kernel+bounces-34088-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-34088-ouuuleilei=gmail.com@vger.kernel.org" Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id w16-20020a05622a135000b0042a3d156a8csi3084713qtk.565.2024.01.22.11.52.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Jan 2024 11:52:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-34088-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=skole.hr); spf=pass (google.com: domain of linux-kernel+bounces-34088-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-34088-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 7F2D41C29612 for ; Mon, 22 Jan 2024 19:52:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 425414439B; Mon, 22 Jan 2024 19:51:47 +0000 (UTC) Received: from mx.skole.hr (mx2.hosting.skole.hr [161.53.165.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AF8413D981; Mon, 22 Jan 2024 19:51:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=161.53.165.186 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705953105; cv=none; b=KzjiOsLCtOBT8B2z7w7/hSy6xNjHS/xNGbHbpPgH1u7horJs410qX0sdN126dapBR80XjWtNe5ke2pGsInEnvc3NFhUEX0QOQJ6A8q521NDqsEIB/3f2mYCQldV/+XLmrqIY+eUIBZebaKBzarAJw1DVYCkcxa2YoI2DUOo7L0I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705953105; c=relaxed/simple; bh=0YufyoxCcDHdvrCe1DCC6ao7YtZtJoU6/jXb8S7jhuc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S25jM3KhssSfZZcCdpVG4SiIv/dEkbRbUZMaMgUv633jlALSLVS2Gx5JPf/KWU577/LGGouPtzfuGUn5JVqfNb8Xg7t/4HrfCp3uePpgs1lMC/WxmmJXJXK+gelfYmiLQQ/eRTpsjSj3Lg9y+XbQR0GIYnMIY2Z5tvFfbvVeOOg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=skole.hr; spf=pass smtp.mailfrom=skole.hr; arc=none smtp.client-ip=161.53.165.186 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=skole.hr Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=skole.hr Received: from mx2.hosting.skole.hr (localhost.localdomain [127.0.0.1]) by mx.skole.hr (mx.skole.hr) with ESMTP id 898648689C; Mon, 22 Jan 2024 20:51:40 +0100 (CET) From: =?utf-8?q?Duje_Mihanovi=C4=87?= Date: Mon, 22 Jan 2024 20:50:58 +0100 Subject: [PATCH v4 2/3] dt-bindings: backlight: add Kinetic KTD2801 binding Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240122-ktd2801-v4-2-33c986a3eb68@skole.hr> References: <20240122-ktd2801-v4-0-33c986a3eb68@skole.hr> In-Reply-To: <20240122-ktd2801-v4-0-33c986a3eb68@skole.hr> To: Lee Jones , Daniel Thompson , Jingoo Han , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Helge Deller , Linus Walleij Cc: Karel Balej , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-fbdev@vger.kernel.org, =?utf-8?q?Duje_M?= =?utf-8?q?ihanovi=C4=87?= , Krzysztof Kozlowski X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=openpgp-sha256; l=1941; i=duje.mihanovic@skole.hr; h=from:subject:message-id; bh=0YufyoxCcDHdvrCe1DCC6ao7YtZtJoU6/jXb8S7jhuc=; b=owEBbQKS/ZANAwAIAZoRnrBCLZbhAcsmYgBlrsckO1mwx44YvZ3Dc3vxmj9vux3yBgfybdSqz pzWPxya09WJAjMEAAEIAB0WIQRT351NnD/hEPs2LXiaEZ6wQi2W4QUCZa7HJAAKCRCaEZ6wQi2W 4WmYEACb+8QNWDYRs9Ws6URBZHTMcmYpGX91/smv02pU7AujWpAUZbArxpyHjWMitPiPK9BierL PKG8VVdhfjMI6fIrzH5QaK18hn4XoRNDD6XWWvAnoxl6J4CEAXjfCCFUAAvQhmneuT0+noHNm3h OPwO8J6BxRLur/AfCjA2tle6EtXcYRv34Ww4M36hZzn7URzoiCvabtf0yctEQAhfFpo6Y/rAqQm 7uJSfVssxae0QXqhfC4m5LE0zw6Xl2Mv8shxWrlI8hHoF77eVUe8jJo8EtfEcJbj0t22ZHJlwJj Np1Y/Q9F2h8kJTScvHnfwkmrAKLn9upCiPQQ7E+QDF0LP8fMed8pY4GT779n9W2duZf5N0+eRlz Wcsp9jxQmdfHpRYZvfrWqvJ4s5Rkpa+NkJFdlCXlDeVk1F3G0i6vsth2vM85UNDmIWr2F1Xji6o UIN9Vrww/2vX0/Hct0ZNg9Ss7cVckIVyxc4QmLsRI17gVPztD+FLrDOWXod1qSTIGJRT00SKJJD O/TGjCJWJo6cQJLis4gJ34Fy8Fza66t/DNNluaJSkSYSHZzW1iX5CsjPsBTKT8N5Larxa+epgi3 iRy2FHLgA/GMOCeCP2jOGNjx8Gnz1ECU6tNdYV4Hu38n2ovebY4jX+OhCLi0my0QSuBdvDga9SE 3ahH/6ZkawbaQqw== X-Developer-Key: i=duje.mihanovic@skole.hr; a=openpgp; fpr=53DF9D4D9C3FE110FB362D789A119EB0422D96E1 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788821534238431430 X-GMAIL-MSGID: 1788821534238431430 KTD2801 is a LED backlight driver IC found in samsung,coreprimevelte. The brightness can be set using PWM or the ExpressWire protocol. Add a DT binding for the KTD2801. Reviewed-by: Krzysztof Kozlowski Reviewed-by: Linus Walleij Signed-off-by: Duje Mihanović Reviewed-by: Daniel Thompson --- .../bindings/leds/backlight/kinetic,ktd2801.yaml | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml new file mode 100644 index 000000000000..b005065e0f48 --- /dev/null +++ b/Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/leds/backlight/kinetic,ktd2801.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Kinetic Technologies KTD2801 one-wire backlight + +maintainers: + - Duje Mihanović + +description: | + The Kinetic Technologies KTD2801 is a LED backlight driver controlled + by a single GPIO line. The driver can be controlled with a PWM signal + or by pulsing the GPIO line to set the backlight level. This is called + "ExpressWire". + +allOf: + - $ref: common.yaml# + +properties: + compatible: + const: kinetic,ktd2801 + + ctrl-gpios: + maxItems: 1 + + default-brightness: true + max-brightness: true + +required: + - compatible + - ctrl-gpios + +additionalProperties: false + +examples: + - | + #include + + backlight { + compatible = "kinetic,ktd2801"; + ctrl-gpios = <&gpio 97 GPIO_ACTIVE_HIGH>; + max-brightness = <210>; + default-brightness = <100>; + }; From patchwork Mon Jan 22 19:50:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Duje_Mihanovi=C4=87?= X-Patchwork-Id: 190385 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp2801355dyb; Mon, 22 Jan 2024 11:52:49 -0800 (PST) X-Google-Smtp-Source: AGHT+IHhrUe114MOiLt+1KP8MFQjRIWXppTZucRC5/h9P5xMYpzEwf/UtJtqYjJ0DaGeySKr5Wsl X-Received: by 2002:a05:6402:12d1:b0:557:7037:1a41 with SMTP id k17-20020a05640212d100b0055770371a41mr453622edx.25.1705953169403; Mon, 22 Jan 2024 11:52:49 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705953169; cv=pass; d=google.com; s=arc-20160816; b=ADFKPY9Em+pOCZzLmvdRur+MEjzF2uAAN9TuHM5fKY8ThpnfHAIxKIHDcAMO4iTOE3 t35jo/3KpPl2cfbTecTgiLqMNrEXaPL//lx28YHKvug3WHcuBzmO5YV0io6ZEtBjaVtD oTgSNHGovJRnULi/abTl7VgdXRtEs+O8Vc/ua+do1LBUzkO4BTXn843NPry+R0NCH/vr o0OXH1jF2b9hn1sKxF7N3Y3no6aEpT+8wUvQutlQHbcjGzJVg7DaMjtN8T29PTLArldn YyOh7v/+TQ5HifJcRV9E1YacHTgfWTm5pQ1DTmvdfXDZ/GEaXV7R8qs6ngQXka0WpeQI YeHg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :subject:date:from; bh=K8fZZPjWWNHSEorhgYydlg9N7OI3GoQ/Fu03uvIPG4M=; fh=OO60JPQ19LinwQ+qUc1qSX52f+SlYRTiEWKt2aK1QSg=; b=g6zcggy7IPL6DwCWVnKF8eWKmi8BirPSfbq7NQLK/PiSS43rfaEDbBYXsBPad9Xcyz 9AVww9gwh2mBK9+HIJyMwV0nG72XuEcBAcRqiHLHGa3zlY8LWabAL/mD+ehnjL61NSCB U68grVitxy7/qw5touY7vvfkueXghdoPbpeZQ5X/ij1nRjsaxxBoOnZ/waCD8x21F3Ln LR0HgYwjdIY0rYX4cZCeIGcn7GUP7KazfPJY7t8RG5Hw3O9NGEB3ii1ktuzh7tZlBVPR zM5Ln+NQB19vhN+Gctk9xVSxzPMm2E/1nWOyAQKSkZ0g4IAHHOau33+3jM22DpeHtTwV UL9w== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=skole.hr); spf=pass (google.com: domain of linux-kernel+bounces-34090-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-34090-ouuuleilei=gmail.com@vger.kernel.org" Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id s3-20020a056402036300b00559c53f2b96si2899656edw.68.2024.01.22.11.52.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Jan 2024 11:52:49 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-34090-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=skole.hr); spf=pass (google.com: domain of linux-kernel+bounces-34090-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-34090-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id D77121F2BDC0 for ; Mon, 22 Jan 2024 19:52:48 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 657C546532; Mon, 22 Jan 2024 19:51:48 +0000 (UTC) Received: from mx.skole.hr (mx1.hosting.skole.hr [161.53.165.185]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B88F63FB33; Mon, 22 Jan 2024 19:51:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=161.53.165.185 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705953105; cv=none; b=nRchK+0xiBTzs2OgKODeorDjfnb6jfLtRclqd7E57fxR9EYZuAGk4c098cFJUwPtXDmmiA1dd6jY/0BdhRlNZMpbdNnY5kkwNFs5DbExNPylDXCorIfHqVRCSBebUYINnZESemG+y8the9AW6zjTf3USaDai/D+/+aENMlpCoG8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705953105; c=relaxed/simple; bh=5fQOXzMx0sk8VbcIHgQr1j5EvAtZ+SFCQYKkGVxpjwQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Xt5nKFindA7oidiIOukj1G80G4OYwApqtyIjAXv6rHuCS9XkjHDPRUc4t5EBv+C4JkotHgC2UJCzYOUep+QMkSrM8oYxEXUcyCm2gBakkM01T9AoZ+oUUZU6FvrD5Bjl3H/cFmk/qwcgQE1t4lPeBxyrNgyK1SucOjTmXh7RWbY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=skole.hr; spf=pass smtp.mailfrom=skole.hr; arc=none smtp.client-ip=161.53.165.185 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=skole.hr Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=skole.hr Received: from mx1.hosting.skole.hr (localhost.localdomain [127.0.0.1]) by mx.skole.hr (mx.skole.hr) with ESMTP id 7EEC085970; Mon, 22 Jan 2024 20:51:41 +0100 (CET) From: =?utf-8?q?Duje_Mihanovi=C4=87?= Date: Mon, 22 Jan 2024 20:50:59 +0100 Subject: [PATCH v4 3/3] backlight: Add Kinetic KTD2801 backlight support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240122-ktd2801-v4-3-33c986a3eb68@skole.hr> References: <20240122-ktd2801-v4-0-33c986a3eb68@skole.hr> In-Reply-To: <20240122-ktd2801-v4-0-33c986a3eb68@skole.hr> To: Lee Jones , Daniel Thompson , Jingoo Han , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Helge Deller , Linus Walleij Cc: Karel Balej , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-fbdev@vger.kernel.org, =?utf-8?q?Duje_M?= =?utf-8?q?ihanovi=C4=87?= X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=openpgp-sha256; l=6449; i=duje.mihanovic@skole.hr; h=from:subject:message-id; bh=5fQOXzMx0sk8VbcIHgQr1j5EvAtZ+SFCQYKkGVxpjwQ=; b=owEBbQKS/ZANAwAIAZoRnrBCLZbhAcsmYgBlrsck71V1SHKFF5Fndc5m9LwAhxluGt6iuSrqj IeJCCf8H3GJAjMEAAEIAB0WIQRT351NnD/hEPs2LXiaEZ6wQi2W4QUCZa7HJAAKCRCaEZ6wQi2W 4RrUD/4q1q+fvjmFi87rZXxY30ZZb8xlXQr9AqNVHJdGddHm96yN3cEwj+pP3hdwpkkk+x+jLwV i79VDHNQ5A/ltb9lKFn7/IHbpdYYOIOV4JeXjWa8hrEJNc5M3P7cFNH2JhJa+e8HPIofWovhog9 v6YjwZgqu6oEwywumapJsNFRIgQStOZuSbtaOVlEcuvGlHaReLfJ4QzNw/xTkqM80boyF2pV4qS Cwf0Q76p0gf7qiYrac3nJe2G7nkpOru4hFactSINrMe14eLSdZvngCfXPFgZ5AjOKs0vXRklDjS 7p+wlKCwHNm5S2nImfYNUq9iPrHAbZQ140PJSd8lieBEV+7O4iqo1PYFWaaF9HalveIQxIFSfHp EowMFexZau05bMsAZfdHil0W1AlPgdy5eIcEq4WrbiD4QAX/6i7oP2Ivb4OjB8Rm0OM9xmvVdWz lhwA+Rc7DI6BaVN4sNiL2clAM7aLGJ9uvfxPp4uOtujBSRKe5dRakjTi5sNNVYlAypMewApUAUS P40YUucfmG0205GM0ZAqSIrl1l9dhPPD354hpCMYSYBCFTAvDaqCT+f8lH39aDxlaxZQMV7W8PV pvPczZ5zyzwCN+6xR6k4FZYjr7hlH5N42eY7DPzxaaOghP88zL1X4d9QFZTtQF2kuRUZAJY9fng /qswvQA6ccnCSOQ== X-Developer-Key: i=duje.mihanovic@skole.hr; a=openpgp; fpr=53DF9D4D9C3FE110FB362D789A119EB0422D96E1 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788821550201465634 X-GMAIL-MSGID: 1788821550201465634 KTD2801 is a LED backlight driver IC found in samsung,coreprimevelte. The brightness can be set using PWM or the ExpressWire protocol. Add support for the KTD2801. Reviewed-by: Linus Walleij Signed-off-by: Duje Mihanović Reviewed-by: Daniel Thompson --- MAINTAINERS | 6 ++ drivers/video/backlight/Kconfig | 7 ++ drivers/video/backlight/Makefile | 1 + drivers/video/backlight/ktd2801-backlight.c | 128 ++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 87b12d2448a0..dddffbd8d2a0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -11891,6 +11891,12 @@ S: Maintained F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml F: drivers/video/backlight/ktd253-backlight.c +KTD2801 BACKLIGHT DRIVER +M: Duje Mihanović +S: Maintained +F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml +F: drivers/video/backlight/ktd2801-backlight.c + KTEST M: Steven Rostedt M: John Hawley diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 51387b1ef012..bba9d8ffccff 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -183,6 +183,13 @@ config BACKLIGHT_KTD253 which is a 1-wire GPIO-controlled backlight found in some mobile phones. +config BACKLIGHT_KTD2801 + tristate "Backlight Driver for Kinetic KTD2801" + select LEDS_EXPRESSWIRE + help + Say Y to enable the backlight driver for the Kinetic KTD2801 1-wire + GPIO-controlled backlight found in Samsung Galaxy Core Prime VE LTE. + config BACKLIGHT_KTZ8866 tristate "Backlight Driver for Kinetic KTZ8866" depends on I2C diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index f72e1c3c59e9..b33b647f31ca 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -35,6 +35,7 @@ obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o obj-$(CONFIG_BACKLIGHT_KTD253) += ktd253-backlight.o +obj-$(CONFIG_BACKLIGHT_KTD2801) += ktd2801-backlight.o obj-$(CONFIG_BACKLIGHT_KTZ8866) += ktz8866.o obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o diff --git a/drivers/video/backlight/ktd2801-backlight.c b/drivers/video/backlight/ktd2801-backlight.c new file mode 100644 index 000000000000..c020acff40f1 --- /dev/null +++ b/drivers/video/backlight/ktd2801-backlight.c @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Datasheet: + * https://www.kinet-ic.com/uploads/web/KTD2801/KTD2801-04b.pdf + */ +#include +#include +#include +#include +#include + +#define KTD2801_DEFAULT_BRIGHTNESS 100 +#define KTD2801_MAX_BRIGHTNESS 255 + +/* These values have been extracted from Samsung's driver. */ +const struct expresswire_timing ktd2801_timing = { + .poweroff_us = 2600, + .detect_delay_us = 150, + .detect_us = 270, + .data_start_us = 5, + .short_bitset_us = 5, + .long_bitset_us = 15, + .end_of_data_low_us = 10, + .end_of_data_high_us = 350 +}; + +struct ktd2801_backlight { + struct expresswire_common_props props; + struct backlight_device *bd; + bool was_on; +}; + +static int ktd2801_update_status(struct backlight_device *bd) +{ + struct ktd2801_backlight *ktd2801 = bl_get_data(bd); + u8 brightness = (u8) backlight_get_brightness(bd); + + if (backlight_is_blank(bd)) { + expresswire_power_off(&ktd2801->props); + ktd2801->was_on = false; + return 0; + } + + if (!ktd2801->was_on) { + expresswire_enable(&ktd2801->props); + ktd2801->was_on = true; + } + + expresswire_write_u8(&ktd2801->props, brightness); + + return 0; +} + +static const struct backlight_ops ktd2801_backlight_ops = { + .update_status = ktd2801_update_status, +}; + +static int ktd2801_backlight_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct backlight_device *bd; + struct ktd2801_backlight *ktd2801; + u32 brightness, max_brightness; + int ret; + + ktd2801 = devm_kzalloc(dev, sizeof(*ktd2801), GFP_KERNEL); + if (!ktd2801) + return -ENOMEM; + ktd2801->was_on = true; + ktd2801->props.timing = ktd2801_timing; + + ret = device_property_read_u32(dev, "max-brightness", &max_brightness); + if (ret) + max_brightness = KTD2801_MAX_BRIGHTNESS; + if (max_brightness > KTD2801_MAX_BRIGHTNESS) { + dev_err(dev, "illegal max brightness specified\n"); + max_brightness = KTD2801_MAX_BRIGHTNESS; + } + + ret = device_property_read_u32(dev, "default-brightness", &brightness); + if (ret) + brightness = KTD2801_DEFAULT_BRIGHTNESS; + if (brightness > max_brightness) { + dev_err(dev, "default brightness exceeds max\n"); + brightness = max_brightness; + } + + ktd2801->props.ctrl_gpio = devm_gpiod_get(dev, "ctrl", GPIOD_OUT_HIGH); + if (IS_ERR(ktd2801->props.ctrl_gpio)) + return dev_err_probe(dev, PTR_ERR(ktd2801->props.ctrl_gpio), + "failed to get backlight GPIO"); + gpiod_set_consumer_name(ktd2801->props.ctrl_gpio, dev_name(dev)); + + bd = devm_backlight_device_register(dev, dev_name(dev), dev, ktd2801, + &ktd2801_backlight_ops, NULL); + if (IS_ERR(bd)) + return dev_err_probe(dev, PTR_ERR(bd), + "failed to register backlight"); + + bd->props.max_brightness = max_brightness; + bd->props.brightness = brightness; + + ktd2801->bd = bd; + platform_set_drvdata(pdev, bd); + backlight_update_status(bd); + + return 0; +} + +static const struct of_device_id ktd2801_of_match[] = { + { .compatible = "kinetic,ktd2801" }, + { } +}; +MODULE_DEVICE_TABLE(of, ktd2801_of_match); + +static struct platform_driver ktd2801_backlight_driver = { + .driver = { + .name = "ktd2801-backlight", + .of_match_table = ktd2801_of_match, + }, + .probe = ktd2801_backlight_probe, +}; +module_platform_driver(ktd2801_backlight_driver); + +MODULE_IMPORT_NS(EXPRESSWIRE); +MODULE_AUTHOR("Duje Mihanović "); +MODULE_DESCRIPTION("Kinetic KTD2801 Backlight Driver"); +MODULE_LICENSE("GPL");