From patchwork Mon Mar 25 14:23:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Murphy X-Patchwork-Id: 161119 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp4035098jan; Mon, 25 Mar 2019 07:25:07 -0700 (PDT) X-Google-Smtp-Source: APXvYqwStoCaV4HtPg0IEXglVo2pqvMbXLxMqBi8OCTCrJafpff+0LoRoNJ2EsAWAeO5ypHzi45j X-Received: by 2002:a63:6881:: with SMTP id d123mr23310976pgc.10.1553523907521; Mon, 25 Mar 2019 07:25:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553523907; cv=none; d=google.com; s=arc-20160816; b=HS1nAkYg1gU04tzrHI1GvtwCvcNqInyH3nHz7g+CZdsQRf8jr4+b4PUOzvxylovTV6 54GtKqUVkqSQKcNZ8XtvcZoKys3DnIkkvHVQP8v9KZQ+2nCTYhWy2nZOchQjuLoSdLW4 EgAN9xViwKp0DMwokLf8wIB5S9R/sapAIEb9K7dgUIJhfQMFF85l4Rkd//YWt9FTIZE1 +G5WiLfIOcvyezyC58Xyh8EODwn10D0qLqji0HNzJPpCoyTui0WAno0Gm+F+jfXwBaBv WhXAsfDRyE6AO+v5u1ebh19J64YNpKSkNfeoXcmJEZjLDpcCLJdjM3/rp0vWKxqS3xeY FMGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=+IaYHILKE2eJ8ALiMnRLwvk4Pibnmz5NTbCbmzqjgH0=; b=OTaT7Yz7u+HK591NYydVd23FmNrdBYmk7ZA75P3WYS/T1YPWcI3HMItt96b65sVw4K bwESkuzJZbUifVjNhWUedeOEZKkChQORJy2pQjUg3fKOjlEoFa1lXE5KzMWPr2rPiLSf D+4r2EW+/1FJP+hf63K4W9uc9amnUGm+mTj9PvbUGStBZEHBCBSIrrrRMdmrkV2wmVZf EjSaJRYKdGQk/ngr967AnSxsq7AZauh+bqUSbbz+duzL15FNa0M+w+iOYyJnBtLXvAHp NyffFON+DiMRIEdFjb4Iz0w3LDruVKoW0ouYNeuD9vpviLJ2HEbZfKHA7Oqxq+k9VttB gmXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=bm8j6c1G; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q8si1124763pgp.480.2019.03.25.07.25.07; Mon, 25 Mar 2019 07:25:07 -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; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=bm8j6c1G; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729345AbfCYOYj (ORCPT + 31 others); Mon, 25 Mar 2019 10:24:39 -0400 Received: from fllv0016.ext.ti.com ([198.47.19.142]:39938 "EHLO fllv0016.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726143AbfCYOYi (ORCPT ); Mon, 25 Mar 2019 10:24:38 -0400 Received: from fllv0034.itg.ti.com ([10.64.40.246]) by fllv0016.ext.ti.com (8.15.2/8.15.2) with ESMTP id x2PEOXqq023380; Mon, 25 Mar 2019 09:24:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1553523873; bh=+IaYHILKE2eJ8ALiMnRLwvk4Pibnmz5NTbCbmzqjgH0=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=bm8j6c1GPnovOn0RGAp24Qx6Ikqyv3egCWe/RnCiWUMQxGm8o+jsCjkVEOugkxkPr wZcooa/P3Dsr4ZfzuH8RS08oO1kv8IQAITO7MpYMVJplAVzu9xlRyTMuNG4nMuBDa+ WDTCkBGODOwmpIPmDjHtzAgwnLFHFh+PCb7SxXpA= Received: from DFLE108.ent.ti.com (dfle108.ent.ti.com [10.64.6.29]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x2PEOX9Y023281 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 25 Mar 2019 09:24:33 -0500 Received: from DFLE107.ent.ti.com (10.64.6.28) by DFLE108.ent.ti.com (10.64.6.29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Mon, 25 Mar 2019 09:24:33 -0500 Received: from dlep33.itg.ti.com (157.170.170.75) by DFLE107.ent.ti.com (10.64.6.28) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1713.5 via Frontend Transport; Mon, 25 Mar 2019 09:24:33 -0500 Received: from localhost (ileax41-snat.itg.ti.com [10.172.224.153]) by dlep33.itg.ti.com (8.14.3/8.13.8) with ESMTP id x2PEOXYs022486; Mon, 25 Mar 2019 09:24:33 -0500 From: Dan Murphy To: , , CC: , , Dan Murphy Subject: [PATCH 1/5] dt-bindings: mfd: Update the ramp up/down property Date: Mon, 25 Mar 2019 09:23:59 -0500 Message-ID: <20190325142403.30447-2-dmurphy@ti.com> X-Mailer: git-send-email 2.12.2 In-Reply-To: <20190325142403.30447-1-dmurphy@ti.com> References: <20190325142403.30447-1-dmurphy@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Modify the ramp-up/down property and add the property description to the binding. Signed-off-by: Dan Murphy --- .../devicetree/bindings/mfd/ti-lmu.txt | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) -- 2.19.0 diff --git a/Documentation/devicetree/bindings/mfd/ti-lmu.txt b/Documentation/devicetree/bindings/mfd/ti-lmu.txt index 980394d701a7..d9d529de6dc1 100644 --- a/Documentation/devicetree/bindings/mfd/ti-lmu.txt +++ b/Documentation/devicetree/bindings/mfd/ti-lmu.txt @@ -25,6 +25,12 @@ Required properties: Optional property: - enable-gpios: A GPIO specifier for hardware enable pin. + - ramp-up-ms: Current ramping from one brightness level to + the a higher brightness level. + Range from 2048 us - 117.44 s + - ramp-down-ms: Current ramping from one brightness level to + the a lower brightness level. + Range from 2048 us - 117.44 s Required node: - backlight: All LMU devices have backlight child nodes. @@ -90,7 +96,7 @@ lm3631@29 { lcd_bl { led-sources = <0 1>; - ramp-up-msec = <300>; + ramp-up-ms = <300>; }; }; }; @@ -152,15 +158,15 @@ lm3633@36 { main { label = "main_lcd"; led-sources = <1 2>; - ramp-up-msec = <500>; - ramp-down-msec = <500>; + ramp-up-ms = <500>; + ramp-down-ms = <500>; }; front { label = "front_lcd"; led-sources = <0>; - ramp-up-msec = <1000>; - ramp-down-msec = <0>; + ramp-up-ms = <1000>; + ramp-down-ms = <0>; }; }; @@ -212,8 +218,8 @@ lm3697@36 { lcd { led-sources = <0 1 2>; - ramp-up-msec = <200>; - ramp-down-msec = <200>; + ramp-up-ms = <200>; + ramp-down-ms = <200>; }; }; From patchwork Mon Mar 25 14:24:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Murphy X-Patchwork-Id: 161115 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp4034628jan; Mon, 25 Mar 2019 07:24:42 -0700 (PDT) X-Google-Smtp-Source: APXvYqxGdwwIoznq3cuSyxoJtDU/laqMT2r0VmGBkhXbXcbweDvAVv9ekYRdzcv9MEJZrY9l6KLO X-Received: by 2002:a63:d357:: with SMTP id u23mr23559639pgi.153.1553523882144; Mon, 25 Mar 2019 07:24:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553523882; cv=none; d=google.com; s=arc-20160816; b=eFS7c00J6iAfSiGt3RnriAfSwl1/eNC2VyAa2aKI/yLi5DJ+XwBZzUoI8lxpFODkjj 40lIXdVjRh7nc3EmMBYAldjzJLSXUnEa4KlYGf2z7+vK5lG8Owk9xjwd8+QpjJ+XDyHJ BFpiXjhRutRjzso9DTCJKSsZRm9AdA6W9YyzVXyj8t0rq17mNZhYXLiLdt5mp7WiCuPb WKB8U8P0x1F9oECr3loL9N1WQyMlX+NYq2d5wQjPLrFkbgwvbzCGcW6fkZf+0r94hb3q lG4tmjMRLUYo9oRg37jRqfNkRF34IKKiH9RSGVTjCFy84dKug2RxyodqAtz4j37V+RDM DQ1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=2tNH029d2WgJzWvKk3HYEvryLXUNAiUtv4dumFwU0kA=; b=Hy6L0ql6fQ3iMGz6BKdJbkc3rmkMSuM+59QPg2IdIcQfG4+wMhH1wx3Tqtw699kGxC h3R8z/b12Fq9PYXIpLp9Nxx7uFFGfTLFha9mPcnlEec5j7xRFhzQcye2sCoG+i6KJ1GZ LpucXRwFFX5ogYbAdxg9+GIINi7UVyM/fG+UYTI3+7XCg3dBCBOcYh+tHp28+0yTlFA7 /Ll3/3RLI1vOmJIkDOHJkl2mI5QZo/21bd4W7Mj2XaDbjVPgdNnvbNspWVDMwCOrlML1 apt+NL8YiDsxV27PHIWZiHgB9YCXRLEzBZKmC6vDBINhrKh+6ZsVq1gmSUJ4v6jk0yAO eNlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b="Wd/7cm64"; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s13si11557594pfe.188.2019.03.25.07.24.41; Mon, 25 Mar 2019 07:24:42 -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; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b="Wd/7cm64"; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729382AbfCYOYk (ORCPT + 31 others); Mon, 25 Mar 2019 10:24:40 -0400 Received: from fllv0015.ext.ti.com ([198.47.19.141]:52134 "EHLO fllv0015.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725788AbfCYOYi (ORCPT ); Mon, 25 Mar 2019 10:24:38 -0400 Received: from lelv0266.itg.ti.com ([10.180.67.225]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id x2PEOX9k086486; Mon, 25 Mar 2019 09:24:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1553523873; bh=2tNH029d2WgJzWvKk3HYEvryLXUNAiUtv4dumFwU0kA=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=Wd/7cm64JosFDXAMEfR8zgO1ch9Podhl0CkPnzkNS+m59E9VgJ7Czp7RRgzLZa0BW s4BpdOmBxNtBCUJjP1QOYiYElXC6sDzJ0FkGEF4QiJ1hKWzc62+2+EqqxChi2fO98o SEvtJqfBOX6t/HwGiNuHCk0BnJDqVbCxBlxFGG/4= Received: from DFLE109.ent.ti.com (dfle109.ent.ti.com [10.64.6.30]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x2PEOXbA124705 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 25 Mar 2019 09:24:33 -0500 Received: from DFLE102.ent.ti.com (10.64.6.23) by DFLE109.ent.ti.com (10.64.6.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Mon, 25 Mar 2019 09:24:33 -0500 Received: from dflp33.itg.ti.com (10.64.6.16) by DFLE102.ent.ti.com (10.64.6.23) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1713.5 via Frontend Transport; Mon, 25 Mar 2019 09:24:33 -0500 Received: from localhost (ileax41-snat.itg.ti.com [10.172.224.153]) by dflp33.itg.ti.com (8.14.3/8.13.8) with ESMTP id x2PEOXBQ032259; Mon, 25 Mar 2019 09:24:33 -0500 From: Dan Murphy To: , , CC: , , Dan Murphy Subject: [PATCH 2/5] leds: TI LMU: Add common code for TI LMU devices Date: Mon, 25 Mar 2019 09:24:00 -0500 Message-ID: <20190325142403.30447-3-dmurphy@ti.com> X-Mailer: git-send-email 2.12.2 In-Reply-To: <20190325142403.30447-1-dmurphy@ti.com> References: <20190325142403.30447-1-dmurphy@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Create a TI LMU common framework for TI LMU devices that share common features. Currently the runtime ramp and brightness setting have been identified as common features with common register settings. This work is derived from Milo Kims TI LMU MFD code. Signed-off-by: Dan Murphy --- drivers/leds/Kconfig | 8 ++ drivers/leds/Makefile | 1 + drivers/leds/ti-lmu-led-common.c | 131 ++++++++++++++++++++++++++++++ include/linux/ti-lmu-led-common.h | 44 ++++++++++ 4 files changed, 184 insertions(+) create mode 100644 drivers/leds/ti-lmu-led-common.c create mode 100644 include/linux/ti-lmu-led-common.h -- 2.19.0 Acked-by: Pavel Machek diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index da00b9ed5a5c..3ae24eaf4cde 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -776,6 +776,14 @@ config LEDS_NIC78BX To compile this driver as a module, choose M here: the module will be called leds-nic78bx. +config LEDS_TI_LMU_COMMON + tristate "LED driver for TI LMU" + depends on REGMAP + help + Say Y to enable the LED driver for TI LMU devices. + This supports common features between the TI LM3532, LM3631, LM3632, + LM3633, LM3695 and LM3697. + comment "LED Triggers" source "drivers/leds/trigger/Kconfig" diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index 7a8b1f55d459..85fd449c002d 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -80,6 +80,7 @@ obj-$(CONFIG_LEDS_MT6323) += leds-mt6323.o obj-$(CONFIG_LEDS_LM3692X) += leds-lm3692x.o obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o obj-$(CONFIG_LEDS_LM3601X) += leds-lm3601x.o +obj-$(CONFIG_LEDS_TI_LMU_COMMON) += ti-lmu-led-common.o # LED SPI Drivers obj-$(CONFIG_LEDS_CR0014114) += leds-cr0014114.o diff --git a/drivers/leds/ti-lmu-led-common.c b/drivers/leds/ti-lmu-led-common.c new file mode 100644 index 000000000000..65d44bde9050 --- /dev/null +++ b/drivers/leds/ti-lmu-led-common.c @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright 2015 Texas Instruments +// Copyright 2018 Sebastian Reichel +// Copyright 2018 Pavel Machek +// TI LMU LED common framework, based on previous work from +// Milo Kim + +#include +#include +#include + +#include + +const static int ramp_table[16] = { 2, 262, 524, 1049, 2090, 4194, 8389, + 16780, 33550, 41940, 50330, 58720, + 67110, 83880, 100660, 117440}; + +static int ti_lmu_common_update_brightness(struct ti_lmu_bank *lmu_bank, + int brightness) +{ + struct regmap *regmap = lmu_bank->regmap; + u8 reg, val; + int ret; + + /* + * Brightness register update + * + * 11 bit dimming: update LSB bits and write MSB byte. + * MSB brightness should be shifted. + * 8 bit dimming: write MSB byte. + */ + if (lmu_bank->max_brightness == MAX_BRIGHTNESS_11BIT) { + reg = lmu_bank->lsb_brightness_reg; + ret = regmap_update_bits(regmap, reg, + LMU_11BIT_LSB_MASK, + brightness); + if (ret) + return ret; + + val = brightness >> LMU_11BIT_MSB_SHIFT; + } else { + val = brightness; + } + + reg = lmu_bank->msb_brightness_reg; + + return regmap_write(regmap, reg, val); +} + +int ti_lmu_common_set_brightness(struct ti_lmu_bank *lmu_bank, int brightness) +{ + return ti_lmu_common_update_brightness(lmu_bank, brightness); +} +EXPORT_SYMBOL(ti_lmu_common_set_brightness); + +static int ti_lmu_common_convert_ramp_to_index(unsigned int msec) +{ + int size = ARRAY_SIZE(ramp_table); + int i; + + if (msec <= ramp_table[0]) + return 0; + + if (msec > ramp_table[size - 1]) + return size - 1; + + for (i = 1; i < size; i++) { + if (msec == ramp_table[i]) + return i; + + /* Find an approximate index by looking up the table */ + if (msec > ramp_table[i - 1] && msec < ramp_table[i]) { + if (msec - ramp_table[i - 1] < ramp_table[i] - msec) + return i - 1; + else + return i; + } + } + + return -EINVAL; +} + +int ti_lmu_common_set_ramp(struct ti_lmu_bank *lmu_bank) +{ + struct regmap *regmap = lmu_bank->regmap; + u8 ramp, ramp_up, ramp_down; + + if (lmu_bank->ramp_up_msec == 0 && lmu_bank->ramp_down_msec == 0) { + ramp_up = 0; + ramp_down = 0; + } else { + ramp_up = ti_lmu_common_convert_ramp_to_index(lmu_bank->ramp_up_msec); + ramp_down = ti_lmu_common_convert_ramp_to_index(lmu_bank->ramp_down_msec); + } + + if (ramp_up < 0 || ramp_down < 0) + return -EINVAL; + + ramp = (ramp_up << 4) | ramp_down; + + return regmap_write(regmap, lmu_bank->runtime_ramp_reg, ramp); + +} +EXPORT_SYMBOL(ti_lmu_common_set_ramp); + +int ti_lmu_common_get_ramp_params(struct device *dev, + struct fwnode_handle *child, + struct ti_lmu_bank *lmu_data) +{ + int ret; + + ret = fwnode_property_read_u32(child, "ramp-up-ms", + &lmu_data->ramp_up_msec); + if (ret) + dev_warn(dev, "ramp-up-ms property missing\n"); + + + ret = fwnode_property_read_u32(child, "ramp-down-ms", + &lmu_data->ramp_down_msec); + if (ret) + dev_warn(dev, "ramp-down-ms property missing\n"); + + return 0; +} +EXPORT_SYMBOL(ti_lmu_common_get_ramp_params); + +MODULE_DESCRIPTION("TI LMU common LED framework"); +MODULE_AUTHOR("Sebastian Reichel"); +MODULE_AUTHOR("Dan Murphy "); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("ti-lmu-led-common"); diff --git a/include/linux/ti-lmu-led-common.h b/include/linux/ti-lmu-led-common.h new file mode 100644 index 000000000000..510c07025117 --- /dev/null +++ b/include/linux/ti-lmu-led-common.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +// TI LMU Common Core +// Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/ + +#ifndef _TI_LMU_COMMON_H_ +#define _TI_LMU_COMMON_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define LMU_11BIT_LSB_MASK (BIT(0) | BIT(1) | BIT(2)) +#define LMU_11BIT_MSB_SHIFT 3 + +#define MAX_BRIGHTNESS_8BIT 255 +#define MAX_BRIGHTNESS_11BIT 2047 + +struct ti_lmu_bank { + struct regmap *regmap; + + int max_brightness; + + u8 lsb_brightness_reg; + u8 msb_brightness_reg; + + u8 runtime_ramp_reg; + u32 ramp_up_msec; + u32 ramp_down_msec; +}; + +int ti_lmu_common_set_brightness(struct ti_lmu_bank *lmu_bank, int brightness); + +int ti_lmu_common_set_ramp(struct ti_lmu_bank *lmu_bank); + +int ti_lmu_common_get_ramp_params(struct device *dev, + struct fwnode_handle *child, + struct ti_lmu_bank *lmu_data); + +#endif /* _TI_LMU_COMMON_H_ */ From patchwork Mon Mar 25 14:24:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Murphy X-Patchwork-Id: 161116 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp4034661jan; Mon, 25 Mar 2019 07:24:43 -0700 (PDT) X-Google-Smtp-Source: APXvYqxxalB3ALDZEAd9042641Wo7q7GmSoXPrBb5X4e7JlwpYTi0XzjBscujBIHjqWdAK8aq0fK X-Received: by 2002:a17:902:6a89:: with SMTP id n9mr24790798plk.223.1553523883512; Mon, 25 Mar 2019 07:24:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553523883; cv=none; d=google.com; s=arc-20160816; b=f3nbbFqtGvvy7fk9LG8Ibb1a/RYXPcUFQoGcEL+xmAnCN32XXJ0Pj3pmUcrT6D/Gsw L8CeXXcWvvCkJ50ffg98eSfFC3XB98f3Y0a3W+tochaSkuXE5KxttSD0x/dLMJNlLspo DCHP2HiJBlwvQcffDFzEfhqTcdiIkST3ZnU8tOug+dlSviwyzo0dlYLheIHVT5eZIRck 5HCMrAhx77n/PvE0vzSrZYgYxY2Um/CPBKSY2OwnuW/VfjJLnD44Xbw5ZDPMurrgp28R BZQiIfY2TqT8pO7HUjrZ1ciAkUg1aZOylKo0faX+hS9/A9T3/noKSyI110I8rGwqu/Cl rLmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=nnIfJ25WbVxUJiykPnKUsPj+REjqbsQSb7RuuLFTEuw=; b=Go4VhZXoE0Ly0/PbOh9FWJLLZNyHxtwXVOID7RcrURejZZDrUEdLl/vHvgUwo17j0C 1hlms+mFr2mKyQZ9jI/yEN5GjRnXXbicHuNojER9AjcW0y8eOjfHhRF/mTRknD1LL2zY CPEGCW03w/7XC17kqO732UrT+UcqqlINvjcCVOgqEYDHuVaattUgadvDjSWrqPmUR/pN /Xzh3LQSIzWcoCqDvkuOx0ETVQKkiuINW95tOJy2DOEHHpqzxt90xhLyA5/tAf9a/xyz Uf4EJPEXPbziTibwNJIj5M8VeDTTomJqXPa1jjo+gSfpoUTSMxwTPrGcQD1Jpe4OTrqa AP1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=IKw73r2a; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i195si5116406pgd.521.2019.03.25.07.24.43; Mon, 25 Mar 2019 07:24:43 -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; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=IKw73r2a; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729413AbfCYOYl (ORCPT + 31 others); Mon, 25 Mar 2019 10:24:41 -0400 Received: from lelv0142.ext.ti.com ([198.47.23.249]:50180 "EHLO lelv0142.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729127AbfCYOYk (ORCPT ); Mon, 25 Mar 2019 10:24:40 -0400 Received: from fllv0034.itg.ti.com ([10.64.40.246]) by lelv0142.ext.ti.com (8.15.2/8.15.2) with ESMTP id x2PEOYiM032329; Mon, 25 Mar 2019 09:24:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1553523874; bh=nnIfJ25WbVxUJiykPnKUsPj+REjqbsQSb7RuuLFTEuw=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=IKw73r2ayTMCT+kmor7iGPdt6Cnv3uFgbcGEPdwb97FDLPyz2dLUJu29rUq8UJCez Q5KSrqHl5hxc4mTymELa3ytVDrIWHu42/eIlFAGUHG625aMsjaVyTTE44adH08Zt7J R83WHZsY61Ow/wWyZdEfgLDgyFelPlot8KYJLaWE= Received: from DLEE112.ent.ti.com (dlee112.ent.ti.com [157.170.170.23]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x2PEOYFW023285 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 25 Mar 2019 09:24:34 -0500 Received: from DLEE106.ent.ti.com (157.170.170.36) by DLEE112.ent.ti.com (157.170.170.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Mon, 25 Mar 2019 09:24:33 -0500 Received: from dflp32.itg.ti.com (10.64.6.15) by DLEE106.ent.ti.com (157.170.170.36) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1713.5 via Frontend Transport; Mon, 25 Mar 2019 09:24:33 -0500 Received: from localhost (ileax41-snat.itg.ti.com [10.172.224.153]) by dflp32.itg.ti.com (8.14.3/8.13.8) with ESMTP id x2PEOXdm000848; Mon, 25 Mar 2019 09:24:33 -0500 From: Dan Murphy To: , , CC: , , Dan Murphy Subject: [PATCH 3/5] dt-bindings: ti-lmu: Modify dt bindings for the LM3697 Date: Mon, 25 Mar 2019 09:24:01 -0500 Message-ID: <20190325142403.30447-4-dmurphy@ti.com> X-Mailer: git-send-email 2.12.2 In-Reply-To: <20190325142403.30447-1-dmurphy@ti.com> References: <20190325142403.30447-1-dmurphy@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The LM3697 is a single function LED driver. The single function LED driver needs to reside in the LED directory as a dedicated LED driver and not as a MFD device. The device does have common brightness and ramp features and those can be accomodated by a TI LMU framework. The LM3697 dt binding needs to be moved from the ti-lmu.txt and a dedicated LED dt binding needs to be added. The new LM3697 LED dt binding will then reside in the Documentation/devicetree/bindings/leds directory and follow the current LED and general bindings guidelines. Signed-off-by: Dan Murphy --- .../devicetree/bindings/leds/leds-lm3697.txt | 77 +++++++++++++++++++ .../devicetree/bindings/mfd/ti-lmu.txt | 26 +------ 2 files changed, 78 insertions(+), 25 deletions(-) create mode 100644 Documentation/devicetree/bindings/leds/leds-lm3697.txt -- 2.19.0 diff --git a/Documentation/devicetree/bindings/leds/leds-lm3697.txt b/Documentation/devicetree/bindings/leds/leds-lm3697.txt new file mode 100644 index 000000000000..a780f11acd38 --- /dev/null +++ b/Documentation/devicetree/bindings/leds/leds-lm3697.txt @@ -0,0 +1,77 @@ +* Texas Instruments - LM3697 Highly Efficient White LED Driver + +The LM3697 11-bit LED driver provides high- +performance backlight dimming for 1, 2, or 3 series +LED strings while delivering up to 90% efficiency. + +This device is suitable for display and keypad Lighting + +Required properties: + - compatible: + "ti,lm3697" + - reg : I2C slave address + - #address-cells : 1 + - #size-cells : 0 + +Optional properties: + - enable-gpios : GPIO pin to enable/disable the device + - vled-supply : LED supply + +Required child properties: + - reg : 0 - LED is Controlled by bank A + 1 - LED is Controlled by bank B + - led-sources : Indicates which HVLED string is associated to which + control bank. This is a zero based property so + HVLED1 = 0, HVLED2 = 1, HVLED3 = 2. + Additional information is contained + in Documentation/devicetree/bindings/leds/common.txt + +Optional child properties: + - max_brightness - This determines whether to use 8 bit brightness mode + or 11 bit brightness mode. If this value is not + set the device is defaulted to the preferred 8bit + brightness mode per 7.3.4.1 of the data sheet. + The values are 255 (8bit) or 2047 (11bit). + - ramp-up-ms: see Documentation/devicetree/bindings/mfd/ti-lmu.txt + - ramp-down-ms: see Documentation/devicetree/bindings/mfd/ti-lmu.txt + - label : see Documentation/devicetree/bindings/leds/common.txt + - linux,default-trigger : + see Documentation/devicetree/bindings/leds/common.txt + +Example: + +HVLED string 1 and 3 are controlled by control bank A and HVLED 2 string is +controlled by control bank B. + +led-controller@36 { + compatible = "ti,lm3697"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x36>; + + enable-gpios = <&gpio1 28 GPIO_ACTIVE_HIGH>; + vled-supply = <&vbatt>; + + led@0 { + reg = <0>; + led-sources = <0 2>; + max_brightness = <2047>; + ramp-up-ms = <5000>; + ramp-down-ms = <1000>; + label = "white:first_backlight_cluster"; + linux,default-trigger = "backlight"; + }; + + led@1 { + reg = <1>; + led-sources = <1>; + max_brightness = <255>; + ramp-up-ms = <500>; + ramp-down-ms = <1000>; + label = "white:second_backlight_cluster"; + linux,default-trigger = "backlight"; + }; +} + +For more product information please see the link below: +http://www.ti.com/lit/ds/symlink/lm3697.pdf diff --git a/Documentation/devicetree/bindings/mfd/ti-lmu.txt b/Documentation/devicetree/bindings/mfd/ti-lmu.txt index d9d529de6dc1..4b2dc0ccfe26 100644 --- a/Documentation/devicetree/bindings/mfd/ti-lmu.txt +++ b/Documentation/devicetree/bindings/mfd/ti-lmu.txt @@ -8,7 +8,6 @@ TI LMU driver supports lighting devices below. LM3632 Backlight and regulator LM3633 Backlight, LED and fault monitor LM3695 Backlight - LM3697 Backlight and fault monitor Required properties: - compatible: Should be one of: @@ -16,11 +15,10 @@ Required properties: "ti,lm3632" "ti,lm3633" "ti,lm3695" - "ti,lm3697" - reg: I2C slave address. 0x11 for LM3632 0x29 for LM3631 - 0x36 for LM3633, LM3697 + 0x36 for LM3633 0x63 for LM3695 Optional property: @@ -41,7 +39,6 @@ Optional nodes: Required properties: - compatible: Should be one of: "ti,lm3633-fault-monitor" - "ti,lm3697-fault-monitor" - leds: LED properties for LM3633. Please refer to [2]. - regulators: Regulator properties for LM3631 and LM3632. Please refer to [3]. @@ -206,24 +203,3 @@ lm3695@63 { }; }; }; - -lm3697@36 { - compatible = "ti,lm3697"; - reg = <0x36>; - - enable-gpios = <&pioC 2 GPIO_ACTIVE_HIGH>; - - backlight { - compatible = "ti,lm3697-backlight"; - - lcd { - led-sources = <0 1 2>; - ramp-up-ms = <200>; - ramp-down-ms = <200>; - }; - }; - - fault-monitor { - compatible = "ti,lm3697-fault-monitor"; - }; -}; From patchwork Mon Mar 25 14:24:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Murphy X-Patchwork-Id: 161117 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp4034930jan; Mon, 25 Mar 2019 07:24:59 -0700 (PDT) X-Google-Smtp-Source: APXvYqzY46K2CU7PGx1TGpbC370iVAgp9jU0iEgS7q6aIvDR9KwIHu+t6yqe/3iPLaX8E5GmM/ZI X-Received: by 2002:a17:902:b43:: with SMTP id 61mr25253227plq.83.1553523899255; Mon, 25 Mar 2019 07:24:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553523899; cv=none; d=google.com; s=arc-20160816; b=gCFbOeAZlkUdMzSoXxRVBJ5WsyVExXLVXJp+p+M8GOPMgaBSXz2OCyjaLtK1JbkxCW nwj4GqME5z+SGhJdlkV9ClcgLCZyw57TcIjHpwmDFqLeAFFMQEs9kr2nKvHR/mHDxPD4 pmSkXgLavYbecK3qXmwB0PxPiSp59EtTVyMsPap/fKoY4zTnV5Hl4rCoH2eIam2kf6da lSe/hK5bwxfPPfC52EOXq7gyGxnrZCs4jHpFa50BIhXRnA/vQ03U2ULQMihqunLGWiTT sQJBRd757kU9Ku5VT/6uPFOq+zhJjaZPknEdHBkSLufLmnyNyEWwyKHziUr5eELDHqeU r80g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=J2uvelxDsPpZtJL/cGz42C2yVq/yUZNB6Lzrw9xP4Zg=; b=IhFzVXCNiwc8uVHJuuY5T/v2YaMdWihxCH42Dpw1h2UxuC4m/aGlt5ndxS4yU3ssxU EJbbWz9VMaRppSiRpF82WRyVzoo3ioe9tLpljugvqEU9bV/wR/wTbLnCpo43lCb+Ws3R 1miU/wzRCSAB/iBaHDsGyn2qij8OLHyzJPXyBVI2T0dyX1XnUa/Lj0iiuq8ReVwtfrUn uP6wvMqIMvI4BhtgBPcrOCUfXqOlmvwhDIC3ajIi26UcIV6fiBOqYRFrFvPuR0/oWPNg GFjxkBHiamLL0nNjdPVsAIW32jNWfgPI4aRnpAvj21wEMNhst6aHPXpXb/wxIsfenGrv M+7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=R5tHY0Ox; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o16si14330581pgc.327.2019.03.25.07.24.58; Mon, 25 Mar 2019 07:24:59 -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; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=R5tHY0Ox; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726237AbfCYOY5 (ORCPT + 31 others); Mon, 25 Mar 2019 10:24:57 -0400 Received: from lelv0143.ext.ti.com ([198.47.23.248]:54630 "EHLO lelv0143.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726243AbfCYOYj (ORCPT ); Mon, 25 Mar 2019 10:24:39 -0400 Received: from fllv0034.itg.ti.com ([10.64.40.246]) by lelv0143.ext.ti.com (8.15.2/8.15.2) with ESMTP id x2PEOYdT084127; Mon, 25 Mar 2019 09:24:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1553523874; bh=J2uvelxDsPpZtJL/cGz42C2yVq/yUZNB6Lzrw9xP4Zg=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=R5tHY0OxCpZN5Vx6TFfdjx6KoshZCgItcSuAcrB1I3v1lFBbpepU01FlGrrwOepq5 y+xVW2QeFas4YoWCicPgvP+0q9rhhmxud8IIkDblK0+47UQlWwZRICNY4gCeiFLfl0 mLrtiXteSlwZIo3KoiWZ9LmzDie7F8NnpLnfCPo8= Received: from DLEE115.ent.ti.com (dlee115.ent.ti.com [157.170.170.26]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x2PEOYS1023294 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 25 Mar 2019 09:24:34 -0500 Received: from DLEE104.ent.ti.com (157.170.170.34) by DLEE115.ent.ti.com (157.170.170.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Mon, 25 Mar 2019 09:24:33 -0500 Received: from dflp32.itg.ti.com (10.64.6.15) by DLEE104.ent.ti.com (157.170.170.34) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1713.5 via Frontend Transport; Mon, 25 Mar 2019 09:24:33 -0500 Received: from localhost (ileax41-snat.itg.ti.com [10.172.224.153]) by dflp32.itg.ti.com (8.14.3/8.13.8) with ESMTP id x2PEOXb9000857; Mon, 25 Mar 2019 09:24:33 -0500 From: Dan Murphy To: , , CC: , , Dan Murphy Subject: [PATCH 4/5] mfd: ti-lmu: Remove support for LM3697 Date: Mon, 25 Mar 2019 09:24:02 -0500 Message-ID: <20190325142403.30447-5-dmurphy@ti.com> X-Mailer: git-send-email 2.12.2 In-Reply-To: <20190325142403.30447-1-dmurphy@ti.com> References: <20190325142403.30447-1-dmurphy@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Remove support for the LM3697 from the ti-lmu driver in favor of a dedicated LED driver. Signed-off-by: Dan Murphy --- drivers/leds/Kconfig | 2 +- drivers/mfd/Kconfig | 2 +- drivers/mfd/ti-lmu.c | 17 ----------- include/linux/mfd/ti-lmu-register.h | 44 ----------------------------- include/linux/mfd/ti-lmu.h | 1 - 5 files changed, 2 insertions(+), 64 deletions(-) -- 2.19.0 diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 3ae24eaf4cde..735009e73414 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -782,7 +782,7 @@ config LEDS_TI_LMU_COMMON help Say Y to enable the LED driver for TI LMU devices. This supports common features between the TI LM3532, LM3631, LM3632, - LM3633, LM3695 and LM3697. + LM3633, and LM3695. comment "LED Triggers" source "drivers/leds/trigger/Kconfig" diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 0ce2d8dfc5f1..fa70ea209ec6 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -1312,7 +1312,7 @@ config MFD_TI_LMU help Say yes here to enable support for TI LMU chips. - TI LMU MFD supports LM3532, LM3631, LM3632, LM3633, LM3695 and LM3697. + TI LMU MFD supports LM3532, LM3631, LM3632, LM3633, and LM3695. It consists of backlight, LED and regulator driver. It provides consistent device controls for lighting functions. diff --git a/drivers/mfd/ti-lmu.c b/drivers/mfd/ti-lmu.c index b06cb908d1aa..89b1c5b584af 100644 --- a/drivers/mfd/ti-lmu.c +++ b/drivers/mfd/ti-lmu.c @@ -111,20 +111,6 @@ static const struct mfd_cell lm3695_devices[] = { }, }; -static const struct mfd_cell lm3697_devices[] = { - { - .name = "ti-lmu-backlight", - .id = LM3697, - .of_compatible = "ti,lm3697-backlight", - }, - /* Monitoring driver for open/short circuit detection */ - { - .name = "ti-lmu-fault-monitor", - .id = LM3697, - .of_compatible = "ti,lm3697-fault-monitor", - }, -}; - #define TI_LMU_DATA(chip, max_reg) \ static const struct ti_lmu_data chip##_data = \ { \ @@ -137,7 +123,6 @@ TI_LMU_DATA(lm3631, LM3631_MAX_REG); TI_LMU_DATA(lm3632, LM3632_MAX_REG); TI_LMU_DATA(lm3633, LM3633_MAX_REG); TI_LMU_DATA(lm3695, LM3695_MAX_REG); -TI_LMU_DATA(lm3697, LM3697_MAX_REG); static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id) { @@ -206,7 +191,6 @@ static const struct of_device_id ti_lmu_of_match[] = { { .compatible = "ti,lm3632", .data = &lm3632_data }, { .compatible = "ti,lm3633", .data = &lm3633_data }, { .compatible = "ti,lm3695", .data = &lm3695_data }, - { .compatible = "ti,lm3697", .data = &lm3697_data }, { } }; MODULE_DEVICE_TABLE(of, ti_lmu_of_match); @@ -216,7 +200,6 @@ static const struct i2c_device_id ti_lmu_ids[] = { { "lm3632", LM3632 }, { "lm3633", LM3633 }, { "lm3695", LM3695 }, - { "lm3697", LM3697 }, { } }; MODULE_DEVICE_TABLE(i2c, ti_lmu_ids); diff --git a/include/linux/mfd/ti-lmu-register.h b/include/linux/mfd/ti-lmu-register.h index f09510561a55..76998b01764b 100644 --- a/include/linux/mfd/ti-lmu-register.h +++ b/include/linux/mfd/ti-lmu-register.h @@ -189,48 +189,4 @@ #define LM3695_REG_BRT_MSB 0x14 #define LM3695_MAX_REG 0x14 - -/* LM3697 */ -#define LM3697_REG_HVLED_OUTPUT_CFG 0x10 -#define LM3697_HVLED1_CFG_MASK BIT(0) -#define LM3697_HVLED2_CFG_MASK BIT(1) -#define LM3697_HVLED3_CFG_MASK BIT(2) -#define LM3697_HVLED1_CFG_SHIFT 0 -#define LM3697_HVLED2_CFG_SHIFT 1 -#define LM3697_HVLED3_CFG_SHIFT 2 - -#define LM3697_REG_BL0_RAMP 0x11 -#define LM3697_REG_BL1_RAMP 0x12 -#define LM3697_RAMPUP_MASK 0xF0 -#define LM3697_RAMPUP_SHIFT 4 -#define LM3697_RAMPDN_MASK 0x0F -#define LM3697_RAMPDN_SHIFT 0 - -#define LM3697_REG_RAMP_CONF 0x14 -#define LM3697_RAMP_MASK 0x0F -#define LM3697_RAMP_EACH 0x05 - -#define LM3697_REG_PWM_CFG 0x1C -#define LM3697_PWM_A_MASK BIT(0) -#define LM3697_PWM_B_MASK BIT(1) - -#define LM3697_REG_IMAX_A 0x17 -#define LM3697_REG_IMAX_B 0x18 - -#define LM3697_REG_FEEDBACK_ENABLE 0x19 - -#define LM3697_REG_BRT_A_LSB 0x20 -#define LM3697_REG_BRT_A_MSB 0x21 -#define LM3697_REG_BRT_B_LSB 0x22 -#define LM3697_REG_BRT_B_MSB 0x23 - -#define LM3697_REG_ENABLE 0x24 - -#define LM3697_REG_OPEN_FAULT_STATUS 0xB0 - -#define LM3697_REG_SHORT_FAULT_STATUS 0xB2 - -#define LM3697_REG_MONITOR_ENABLE 0xB4 - -#define LM3697_MAX_REG 0xB4 #endif diff --git a/include/linux/mfd/ti-lmu.h b/include/linux/mfd/ti-lmu.h index 7762c1bce55d..54e9d272e81c 100644 --- a/include/linux/mfd/ti-lmu.h +++ b/include/linux/mfd/ti-lmu.h @@ -26,7 +26,6 @@ enum ti_lmu_id { LM3632, LM3633, LM3695, - LM3697, LMU_MAX_ID, }; From patchwork Mon Mar 25 14:24:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Murphy X-Patchwork-Id: 161118 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp4035006jan; Mon, 25 Mar 2019 07:25:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqwmfnZtiKKhq9zGiPq6UoEjabjAzCDufbWe8OTpUQNsDUWwZweEjrNCWezx9WAcQk1dpvnZ X-Received: by 2002:a62:ae13:: with SMTP id q19mr24026777pff.152.1553523903001; Mon, 25 Mar 2019 07:25:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553523902; cv=none; d=google.com; s=arc-20160816; b=lNEYRBYlsZuyJohITR6gJSSVTXQfrA4xKZovxU7Ug0iB7fm8/dHyYkYO5mfFL2wV89 qQp4fAarilY061OctrGnabHoRSxEZ0ERS9umdLK+S0wlVFLCk4vWo9wUWZiKVOP7TAqj 2E+CkG5ACiiljkgExb3toOjf7u/K1fvMS6yWgBI+gDYxj9imertjDY8ZOlP865jSefd0 qNciPD0xdkcmz6zfZu0ox2Nt8jCODUGWmFlKAjw44ziJqlCQDSO6uPnuZWhIqn7NXXlT zHo6pZHYxryi9OqPKPbOqbnQKYTBx6PuBmvzUmg+TshRYcB1777Rk/jHbj0E0ltqvUV/ 2gwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=qRt/K7q00kmjDmXoFqwjOsCRXE+d5IW2l1DqIO78LTw=; b=j1mrDW47HUbvYCj/8Rde0wSYjVCl9oRbibeunaqKF+QAIct52cdb/q/bFIv+o5xNek gl8R0NDR8wi4dSrof5icGqvQd//l5nKw9dqT1JH30zTKqHDrkDzOviu8WfBED9BxB7kD 5NCFmGcU/YOUv7oq8+AM59wi9spJ4QcQ3rE4JURcGPch/j+Q8IkITlDjqE+65e2587W1 V/7a7rjHMvh7JrL9a9AxLcJKH1IR08lGqMeyrfLl6d3AzWWmUW8G9zNhOK8qf8QFE1sZ IIkOygXEdWfF+QxMthjg4P8c+msqKTlVIDzWOQz7ZZ4xrWRDKkTOzldq7mt7/3ToLJK9 R9RQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b="nc/PXJZn"; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y11si14010074plk.323.2019.03.25.07.25.02; Mon, 25 Mar 2019 07:25:02 -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; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b="nc/PXJZn"; 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=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729514AbfCYOYz (ORCPT + 31 others); Mon, 25 Mar 2019 10:24:55 -0400 Received: from lelv0142.ext.ti.com ([198.47.23.249]:50182 "EHLO lelv0142.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729182AbfCYOYj (ORCPT ); Mon, 25 Mar 2019 10:24:39 -0400 Received: from lelv0266.itg.ti.com ([10.180.67.225]) by lelv0142.ext.ti.com (8.15.2/8.15.2) with ESMTP id x2PEOYC1032334; Mon, 25 Mar 2019 09:24:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1553523874; bh=qRt/K7q00kmjDmXoFqwjOsCRXE+d5IW2l1DqIO78LTw=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=nc/PXJZn3u6Dux6ev+sH+3lOJo0V/KxgGqIs7ZWznak+WJxKWQW3OC+vAFhMT0r0D JNB+Pn47Cq2IOzwT0rf8XmOnOVdEr0DPTJVVbutZKnO+FLKlDGZGEP4mWVKcBTkSBZ kbn9tA8dwt19/cs1mJAQ43sV0iS6R8rBWJDSbYkU= Received: from DFLE112.ent.ti.com (dfle112.ent.ti.com [10.64.6.33]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x2PEOY7W124721 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 25 Mar 2019 09:24:34 -0500 Received: from DFLE110.ent.ti.com (10.64.6.31) by DFLE112.ent.ti.com (10.64.6.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Mon, 25 Mar 2019 09:24:34 -0500 Received: from dlep33.itg.ti.com (157.170.170.75) by DFLE110.ent.ti.com (10.64.6.31) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1713.5 via Frontend Transport; Mon, 25 Mar 2019 09:24:34 -0500 Received: from localhost (ileax41-snat.itg.ti.com [10.172.224.153]) by dlep33.itg.ti.com (8.14.3/8.13.8) with ESMTP id x2PEOYsD022504; Mon, 25 Mar 2019 09:24:34 -0500 From: Dan Murphy To: , , CC: , , Dan Murphy Subject: [PATCH 5/5] leds: lm3697: Introduce the lm3697 driver Date: Mon, 25 Mar 2019 09:24:03 -0500 Message-ID: <20190325142403.30447-6-dmurphy@ti.com> X-Mailer: git-send-email 2.12.2 In-Reply-To: <20190325142403.30447-1-dmurphy@ti.com> References: <20190325142403.30447-1-dmurphy@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Introduce the lm3697 LED driver for backlighting and display. Datasheet location: http://www.ti.com/lit/ds/symlink/lm3697.pdf Signed-off-by: Dan Murphy --- drivers/leds/Kconfig | 8 +- drivers/leds/Makefile | 1 + drivers/leds/leds-lm3697.c | 401 +++++++++++++++++++++++++++++++++++++ 3 files changed, 409 insertions(+), 1 deletion(-) create mode 100644 drivers/leds/leds-lm3697.c -- 2.19.0 diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 735009e73414..688bb9a6f275 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -776,9 +776,15 @@ config LEDS_NIC78BX To compile this driver as a module, choose M here: the module will be called leds-nic78bx. +config LEDS_LM3697 + tristate "LED driver for LM3697" + depends on LEDS_TI_LMU_COMMON + help + Say Y to enable the LM3697 LED driver for TI LMU devices. + This supports the LED device LM3697. + config LEDS_TI_LMU_COMMON tristate "LED driver for TI LMU" - depends on REGMAP help Say Y to enable the LED driver for TI LMU devices. This supports common features between the TI LM3532, LM3631, LM3632, diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index 85fd449c002d..2eb0225d8dc6 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -80,6 +80,7 @@ obj-$(CONFIG_LEDS_MT6323) += leds-mt6323.o obj-$(CONFIG_LEDS_LM3692X) += leds-lm3692x.o obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o obj-$(CONFIG_LEDS_LM3601X) += leds-lm3601x.o +obj-$(CONFIG_LEDS_LM3697) += leds-lm3697.o obj-$(CONFIG_LEDS_TI_LMU_COMMON) += ti-lmu-led-common.o # LED SPI Drivers diff --git a/drivers/leds/leds-lm3697.c b/drivers/leds/leds-lm3697.c new file mode 100644 index 000000000000..0f3df7e17cbc --- /dev/null +++ b/drivers/leds/leds-lm3697.c @@ -0,0 +1,401 @@ +// SPDX-License-Identifier: GPL-2.0 +// TI LM3697 LED chip family driver +// Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/ + +#include +#include +#include +#include +#include +#include + +#define LM3697_REV 0x0 +#define LM3697_RESET 0x1 +#define LM3697_OUTPUT_CONFIG 0x10 +#define LM3697_CTRL_A_RAMP 0x11 +#define LM3697_CTRL_B_RAMP 0x12 +#define LM3697_CTRL_A_B_RT_RAMP 0x13 +#define LM3697_CTRL_A_B_RAMP_CFG 0x14 +#define LM3697_CTRL_A_B_BRT_CFG 0x16 +#define LM3697_CTRL_A_FS_CURR_CFG 0x17 +#define LM3697_CTRL_B_FS_CURR_CFG 0x18 +#define LM3697_PWM_CFG 0x1c +#define LM3697_CTRL_A_BRT_LSB 0x20 +#define LM3697_CTRL_A_BRT_MSB 0x21 +#define LM3697_CTRL_B_BRT_LSB 0x22 +#define LM3697_CTRL_B_BRT_MSB 0x23 +#define LM3697_CTRL_ENABLE 0x24 + +#define LM3697_SW_RESET BIT(0) + +#define LM3697_CTRL_A_EN BIT(0) +#define LM3697_CTRL_B_EN BIT(1) +#define LM3697_CTRL_A_B_EN (LM3697_CTRL_A_EN | LM3697_CTRL_B_EN) + +#define LM3697_MAX_LED_STRINGS 3 + +#define LM3697_CONTROL_A 0 +#define LM3697_CONTROL_B 1 +#define LM3697_MAX_CONTROL_BANKS 2 + +/** + * struct lm3697_led - + * @hvled_strings: Array of LED strings associated with a control bank + * @label: LED label + * @led_dev: LED class device + * @priv: Pointer to the device struct + * @lmu_data: Register and setting values for common code + * @control_bank: Control bank the LED is associated to. 0 is control bank A + * 1 is control bank B + */ +struct lm3697_led { + u32 hvled_strings[LM3697_MAX_LED_STRINGS]; + char label[LED_MAX_NAME_SIZE]; + struct led_classdev led_dev; + struct lm3697 *priv; + struct ti_lmu_bank lmu_data; + int control_bank; + int enabled; + int num_leds; +}; + +/** + * struct lm3697 - + * @enable_gpio: Hardware enable gpio + * @regulator: LED supply regulator pointer + * @client: Pointer to the I2C client + * @regmap: Devices register map + * @dev: Pointer to the devices device struct + * @lock: Lock for reading/writing the device + * @leds: Array of LED strings + */ +struct lm3697 { + struct gpio_desc *enable_gpio; + struct regulator *regulator; + struct i2c_client *client; + struct regmap *regmap; + struct device *dev; + struct mutex lock; + + int bank_cfg; + + struct lm3697_led leds[]; +}; + +static const struct reg_default lm3697_reg_defs[] = { + {LM3697_OUTPUT_CONFIG, 0x6}, + {LM3697_CTRL_A_RAMP, 0x0}, + {LM3697_CTRL_B_RAMP, 0x0}, + {LM3697_CTRL_A_B_RT_RAMP, 0x0}, + {LM3697_CTRL_A_B_RAMP_CFG, 0x0}, + {LM3697_CTRL_A_B_BRT_CFG, 0x0}, + {LM3697_CTRL_A_FS_CURR_CFG, 0x13}, + {LM3697_CTRL_B_FS_CURR_CFG, 0x13}, + {LM3697_PWM_CFG, 0xc}, + {LM3697_CTRL_A_BRT_LSB, 0x0}, + {LM3697_CTRL_A_BRT_MSB, 0x0}, + {LM3697_CTRL_B_BRT_LSB, 0x0}, + {LM3697_CTRL_B_BRT_MSB, 0x0}, + {LM3697_CTRL_ENABLE, 0x0}, +}; + +static const struct regmap_config lm3697_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + + .max_register = LM3697_CTRL_ENABLE, + .reg_defaults = lm3697_reg_defs, + .num_reg_defaults = ARRAY_SIZE(lm3697_reg_defs), + .cache_type = REGCACHE_FLAT, +}; + +static int lm3697_brightness_set(struct led_classdev *led_cdev, + enum led_brightness brt_val) +{ + struct lm3697_led *led = container_of(led_cdev, struct lm3697_led, + led_dev); + int ctrl_en_val = (1 << led->control_bank); + int ret; + + mutex_lock(&led->priv->lock); + + if (brt_val == LED_OFF) { + ret = regmap_update_bits(led->priv->regmap, LM3697_CTRL_ENABLE, + ctrl_en_val, ~ctrl_en_val); + if (ret) { + dev_err(&led->priv->client->dev, "Cannot write ctrl register\n"); + goto brightness_out; + } + + led->enabled = LED_OFF; + } else { + ret = ti_lmu_common_set_brightness(&led->lmu_data, brt_val); + if (ret) { + dev_err(&led->priv->client->dev, + "Cannot write brightness\n"); + goto brightness_out; + } + + if (!led->enabled) { + ret = regmap_update_bits(led->priv->regmap, + LM3697_CTRL_ENABLE, + ctrl_en_val, ctrl_en_val); + if (ret) { + dev_err(&led->priv->client->dev, + "Cannot enable the device\n"); + goto brightness_out; + } + + led->enabled = brt_val; + } + } + +brightness_out: + mutex_unlock(&led->priv->lock); + return ret; +} + +static int lm3697_init(struct lm3697 *priv) +{ + struct lm3697_led *led; + int i, ret; + + if (priv->enable_gpio) { + gpiod_direction_output(priv->enable_gpio, 1); + } else { + ret = regmap_write(priv->regmap, LM3697_RESET, LM3697_SW_RESET); + if (ret) { + dev_err(&priv->client->dev, "Cannot reset the device\n"); + goto out; + } + } + + ret = regmap_write(priv->regmap, LM3697_CTRL_ENABLE, 0x0); + if (ret) { + dev_err(&priv->client->dev, "Cannot write ctrl enable\n"); + goto out; + } + + ret = regmap_write(priv->regmap, LM3697_OUTPUT_CONFIG, priv->bank_cfg); + if (ret) + dev_err(&priv->client->dev, "Cannot write OUTPUT config\n"); + + for (i = 0; i < LM3697_MAX_CONTROL_BANKS; i++) { + led = &priv->leds[i]; + ret = ti_lmu_common_set_ramp(&led->lmu_data); + if (ret) + dev_err(&priv->client->dev, "Setting the ramp rate failed\n"); + } +out: + return ret; +} + +static int lm3697_probe_dt(struct lm3697 *priv) +{ + struct fwnode_handle *child = NULL; + struct lm3697_led *led; + const char *name; + u32 max_brightness; + int control_bank; + size_t i = 0; + int ret = -EINVAL; + int j; + + priv->enable_gpio = devm_gpiod_get_optional(&priv->client->dev, + "enable", GPIOD_OUT_LOW); + if (IS_ERR(priv->enable_gpio)) { + ret = PTR_ERR(priv->enable_gpio); + dev_err(&priv->client->dev, "Failed to get enable gpio: %d\n", + ret); + return ret; + } + + priv->regulator = devm_regulator_get(&priv->client->dev, "vled"); + if (IS_ERR(priv->regulator)) + priv->regulator = NULL; + + device_for_each_child_node(priv->dev, child) { + ret = fwnode_property_read_u32(child, "reg", &control_bank); + if (ret) { + dev_err(&priv->client->dev, "reg property missing\n"); + fwnode_handle_put(child); + goto child_out; + } + + if (control_bank > LM3697_CONTROL_B) { + dev_err(&priv->client->dev, "reg property is invalid\n"); + ret = -EINVAL; + fwnode_handle_put(child); + goto child_out; + } + + led = &priv->leds[i]; + + ret = fwnode_property_read_u32(child, "max_brightness", + &max_brightness); + if (ret) + max_brightness = MAX_BRIGHTNESS_8BIT; + + if (max_brightness > MAX_BRIGHTNESS_11BIT) + max_brightness = MAX_BRIGHTNESS_11BIT; + + led->control_bank = control_bank; + led->lmu_data.regmap = priv->regmap; + led->lmu_data.max_brightness = max_brightness; + led->lmu_data.runtime_ramp_reg = LM3697_CTRL_A_RAMP + + control_bank; + led->lmu_data.msb_brightness_reg = LM3697_CTRL_A_BRT_MSB + + led->control_bank * 2; + led->lmu_data.lsb_brightness_reg = LM3697_CTRL_A_BRT_LSB + + led->control_bank * 2; + + led->num_leds = fwnode_property_read_u32_array(child, + "led-sources", + NULL, 0); + + if (led->num_leds > LM3697_MAX_LED_STRINGS) { + dev_err(&priv->client->dev, "To many LED strings defined\n"); + continue; + } + + ret = fwnode_property_read_u32_array(child, "led-sources", + led->hvled_strings, + led->num_leds); + if (ret) { + dev_err(&priv->client->dev, "led-sources property missing\n"); + fwnode_handle_put(child); + goto child_out; + } + + for (j = 0; j < led->num_leds; j++) + priv->bank_cfg |= + (led->control_bank << led->hvled_strings[j]); + + + ret = ti_lmu_common_get_ramp_params(&priv->client->dev, + child, &led->lmu_data); + if (ret) + dev_warn(&priv->client->dev, "runtime-ramp properties missing\n"); + + fwnode_property_read_string(child, "linux,default-trigger", + &led->led_dev.default_trigger); + + ret = fwnode_property_read_string(child, "label", &name); + if (ret) + snprintf(led->label, sizeof(led->label), + "%s::", priv->client->name); + else + snprintf(led->label, sizeof(led->label), + "%s:%s", priv->client->name, name); + + led->priv = priv; + led->led_dev.name = led->label; + led->led_dev.max_brightness = max_brightness; + led->led_dev.brightness_set_blocking = lm3697_brightness_set; + + ret = devm_led_classdev_register(priv->dev, &led->led_dev); + if (ret) { + dev_err(&priv->client->dev, "led register err: %d\n", + ret); + fwnode_handle_put(child); + goto child_out; + } + + i++; + } + +child_out: + return ret; +} + +static int lm3697_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct lm3697 *led; + int count; + int ret; + + count = device_get_child_node_count(&client->dev); + if (!count) { + dev_err(&client->dev, "LEDs are not defined in device tree!"); + return -ENODEV; + } + + led = devm_kzalloc(&client->dev, struct_size(led, leds, count), + GFP_KERNEL); + if (!led) + return -ENOMEM; + + mutex_init(&led->lock); + i2c_set_clientdata(client, led); + + led->client = client; + led->dev = &client->dev; + led->regmap = devm_regmap_init_i2c(client, &lm3697_regmap_config); + if (IS_ERR(led->regmap)) { + ret = PTR_ERR(led->regmap); + dev_err(&client->dev, "Failed to allocate register map: %d\n", + ret); + return ret; + } + + ret = lm3697_probe_dt(led); + if (ret) + return ret; + + return lm3697_init(led); +} + +static int lm3697_remove(struct i2c_client *client) +{ + struct lm3697 *led = i2c_get_clientdata(client); + int ret; + + ret = regmap_update_bits(led->regmap, LM3697_CTRL_ENABLE, + LM3697_CTRL_A_B_EN, 0); + if (ret) { + dev_err(&led->client->dev, "Failed to disable the device\n"); + return ret; + } + + if (led->enable_gpio) + gpiod_direction_output(led->enable_gpio, 0); + + if (led->regulator) { + ret = regulator_disable(led->regulator); + if (ret) + dev_err(&led->client->dev, + "Failed to disable regulator\n"); + } + + mutex_destroy(&led->lock); + + return 0; +} + +static const struct i2c_device_id lm3697_id[] = { + { "lm3697", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, lm3697_id); + +static const struct of_device_id of_lm3697_leds_match[] = { + { .compatible = "ti,lm3697", }, + {}, +}; +MODULE_DEVICE_TABLE(of, of_lm3697_leds_match); + +static struct i2c_driver lm3697_driver = { + .driver = { + .name = "lm3697", + .of_match_table = of_lm3697_leds_match, + }, + .probe = lm3697_probe, + .remove = lm3697_remove, + .id_table = lm3697_id, +}; +module_i2c_driver(lm3697_driver); + +MODULE_DESCRIPTION("Texas Instruments LM3697 LED driver"); +MODULE_AUTHOR("Dan Murphy "); +MODULE_LICENSE("GPL v2");