From patchwork Thu Jan 25 15:30:53 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: 192139 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:e09d:b0:103:945f:af90 with SMTP id gm29csp56518dyb; Thu, 25 Jan 2024 07:33:48 -0800 (PST) X-Google-Smtp-Source: AGHT+IFncttB6Lj5YIwdLZrPY72Rj3S5bUrR5gOft0RSbIN0zc1R6m5YTYebo/VXV85RhzPLwN9l X-Received: by 2002:a17:907:96aa:b0:a31:524f:60e4 with SMTP id hd42-20020a17090796aa00b00a31524f60e4mr720772ejc.38.1706196828036; Thu, 25 Jan 2024 07:33:48 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706196828; cv=pass; d=google.com; s=arc-20160816; b=h0GkCoTvpaWtvoHtWhPPwUVC5a6u5NxoSUJ2mWZnj6nf6rWM0RD/M2Gl4nKkxXkUaS ueRkT4mABettSwtcYqzUB8YH9rsl6y5ODEpU0TRIirMPCfbkE2mQaQV0D7atEg44oKmt hptpLnu3b9951qq8bRD3lvb1Yu6hA5iwj6MtRt/Lit+c3P8EDTwNoJAka/DgD9zLOJyw YiELIRvX5DhR1GBEGMGEr87D9Ht8C5M5KwiH4PCXvsqI6nDVjKz6hUKMCFucRcSnLLbz D07yff7z7tFjOA2QTjEmGu20dZ7r2Wk6ppZ5j5kaWD3QF++ui/JlX3cuAThWZ1jStLQo 6OSA== 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=DVq1bxiKpkNzXEIWMTxDaV+fCbmRK3+NfI6Iq1lFNOE=; fh=OO60JPQ19LinwQ+qUc1qSX52f+SlYRTiEWKt2aK1QSg=; b=m0222X3HoXBMtrxpXac7Cayb+SrJ+4UNQu2kG69WYs7R7xmi5bpbrJVM89FlzE6gXN 0YeF5hCXNkATTY7NYJUO4vxr+05lG1wS4vSf+jww+NL7F40YobPSU2vIcLNIJAGu6k+G pw8kThqeTeE693Fw+8soxDlRIvIPA9ElZz7nkh5INg7Y8Kf2zKedUEvitfQVuH+udMyr 5bIX1qNvTUT5b4NEfCz8CxjiNeVadIYlXFCm+e27mNzazBGLJoSYNX5GnqB5MBFtONQX 2rbynX84WsU7JiRlvxiWw1y331xsJSposuflLYHoczwUhXT5T158CbuRxS+JCEToQPPW UozA== 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-38833-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-38833-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 p27-20020a1709060ddb00b00a26e257793esi1057246eji.452.2024.01.25.07.33.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jan 2024 07:33:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-38833-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-38833-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-38833-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 7D1BB1F23A93 for ; Thu, 25 Jan 2024 15:33:47 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6986F77647; Thu, 25 Jan 2024 15:32:10 +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 F0ED87316F; Thu, 25 Jan 2024 15:32:03 +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=1706196727; cv=none; b=eLOdyQysV9hgGE4aWPG8AKXeNg4cvMi0h63ksgajK0CTkwluAbdDYBw8r/JDRIKW5XM36wMt+EiL0hx6K0wXbj8rF+YgHH9LkB+qZqZUfpOmCUSMvYUtVYlhR6o38DMKkpBRGKUeRhWEDb93wf8B/ZjNn4DbUOuNToSVnM7hp3w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706196727; c=relaxed/simple; bh=EmBtZVpm+2jJo0+oBnQB1a+nHfZMWJwr8ePwkRQqIvM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BWNBwtZ7mgALgCU/d+CF06PvlvuQ1gFFfHTbHNtMO7YBYgvnm9BK/jqKV/54eKtuuMiqNte4/keh96tQMyxsttk5iFVOU3DUvY4O3YOtotOGevZZ4bxpgfSRSSYC3YQI/guiQh36NRIEg69py3stCb3tExrP++82vjXjgyHQTKU= 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 104DF84F6E; Thu, 25 Jan 2024 16:31:56 +0100 (CET) From: =?utf-8?q?Duje_Mihanovi=C4=87?= Date: Thu, 25 Jan 2024 16:30:53 +0100 Subject: [PATCH v5 1/4] leds: introduce ExpressWire library Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240125-ktd2801-v5-1-e22da232a825@skole.hr> References: <20240125-ktd2801-v5-0-e22da232a825@skole.hr> In-Reply-To: <20240125-ktd2801-v5-0-e22da232a825@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=6456; i=duje.mihanovic@skole.hr; h=from:subject:message-id; bh=EmBtZVpm+2jJo0+oBnQB1a+nHfZMWJwr8ePwkRQqIvM=; b=owEBbQKS/ZANAwAIAZoRnrBCLZbhAcsmYgBlsn7DfN3tI6caY5seGs5+QL9PGrkwNvXOL0Sue VbwtyVxGSWJAjMEAAEIAB0WIQRT351NnD/hEPs2LXiaEZ6wQi2W4QUCZbJ+wwAKCRCaEZ6wQi2W 4b2uEACQ+Al72XGNOC52NpzDW/JVVVe3UODtl272aLQfQSnnX3AHgIj34cZBt1PFFquUnRAJnDr itqposRDO5747+OdD4dCDEObOrr4EjJvtr1tLnAzo+2OaT6L4HVLWSnTY6GgWrdHx5fUK2JHV9U gMmNQeycJoPwo/7kY7WtGzlJJrTDldS9UtL9V5LnWG5cXsN9ZNb5suFyvEYj7nrHJTqVXg2djRs qd7m/1/fxkpJPV1qm2YUeYlTp4e/ZPVshYwtSHEWzrrAqsKIt5nDCsNivPN4JX094i6rTqdumZu 7W874oq0MuNJ0bGQnoL067KGbkwoqfyo0XwgawcZHNp8ibEM/yoCvBpiTMzhCR1CP6fQoGWKPLT t0JGjAW/17synjXDVXXAv4VCZMCqmUgL58Rgo1q8ChRQWM2yTkHskjuLh84nwoc2DhMP059IO68 1j2lM2i5wbMBvYxM4ZoCXS37vR7CUdMODqHLGTVuUGnaxeDl4CPiLRvaT9aPjErAoeTq190NQCz kHNP51PxX/ozV+ouyR7muDWwzHpEnLyFIZ0xtWVkyhOb1korptaga37qUphyBtrjF3GYeH1NLJE 9YSEG0TPxhy1/BI9dFvQ4ZMem1nLdsSphyozRy4VKUdAkU23tEaPWMA4D6Hfvdx+Kpco6QbBACo D2tfRksekaUFlHQ== X-Developer-Key: i=duje.mihanovic@skole.hr; a=openpgp; fpr=53DF9D4D9C3FE110FB362D789A119EB0422D96E1 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789077045032431142 X-GMAIL-MSGID: 1789077045032431142 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 in preparation for adding KTD2801 support introduce a library implementing this protocol. Suggested-by: Daniel Thompson Reviewed-by: Linus Walleij Reviewed-by: Daniel Thompson Signed-off-by: Duje Mihanović --- MAINTAINERS | 7 +++++ drivers/leds/Kconfig | 4 +++ drivers/leds/Makefile | 3 ++ drivers/leds/leds-expresswire.c | 68 ++++++++++++++++++++++++++++++++++++++++ include/linux/leds-expresswire.h | 36 +++++++++++++++++++++ 5 files changed, 118 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 8d1052fa6a69..e1c83e0e837a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7979,6 +7979,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 d721b254e1e4..64bb2de237e9 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -186,6 +186,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 ce07dc295ff0..effdfc6f1e95 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -91,6 +91,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/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 */