From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0D4C8C77B72 for ; Thu, 20 Apr 2023 16:24:08 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 9A63B863A9; Thu, 20 Apr 2023 18:23:56 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="PWXc/5sJ"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id E72A4863AF; Thu, 20 Apr 2023 18:23:53 +0200 (CEST) Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 38A5E863A2 for ; Thu, 20 Apr 2023 18:23:49 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=clamor95@gmail.com Received: by mail-ej1-x630.google.com with SMTP id xd13so7698513ejb.4 for ; Thu, 20 Apr 2023 09:23:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682007829; x=1684599829; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QFR+vS0bogAjT4tg4eQaCFKzUzRTj2popgUiFhI4q1s=; b=PWXc/5sJXundQAbm0uuR2bw7LkqwNdwt4qFRVgrpNhiHvdct5r8e6dQpU+rUGAteCn alsTw50Lb1+V0UrttXwtRKp8Ekxeb0/1n0dand/WEGzuZ5X1y5VpDgNi/XBKbOkaV+/5 S/CSPXyLfCZE3XxljO9T5bWhefVN1XxGRon5WDPEntZISeL8qbqM9dQ/YS1Cnj4+CW59 aIdgX8wQPEZd/tuuXoFiV+Vt7iFrlcKfTcV/f42LsOeeN2FBe2Pk9ZtgUcYUGPGs5icJ dxPB1R4g8XtggZ3HC4KyCB685lTb/vAhQi54J9tUVz2bDZA6bfg34LwaFqlQigRC4Kla 3AnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682007829; x=1684599829; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QFR+vS0bogAjT4tg4eQaCFKzUzRTj2popgUiFhI4q1s=; b=ATAppHEaIsjugXzfFrrIHpUi7JeCB6U/nBz+9WIdonIeYH6NV2NXoxhTSx0gGcsQv8 2Tz0Z5dx9m+OFEmDQ7lhaR4z7gizKc+9/GIZm6Scsz2qnmXhnS61hpQ0rcMY9S+rHNlP kMV+4SSNoimRxcLMfq4blDmMEkB9OLmVnz7onbPF3Mphbr6fweB16VA3stkGH+Yjgg2U SG8Yf/TXp9TVr9q9W0YsveSACWlkjlUf/Y9PnYV3HUO/NFIe3jlx8Ith3qA/41BqUxtZ t3MnrD5vs5zFWhoCkJMXk7N/FY5nGiGRmX4pQ/w4jPDLK+p5nCFo1FdAlVhe85lC6ja+ hSFw== X-Gm-Message-State: AAQBX9cuBnaysXszoy2fgdfEX2loQQLUvKtgULD0VdEEG3Z+7MfxNXRk dyHn1S+v/q5B1kQ7g2UGVXg= X-Google-Smtp-Source: AKy350Yqol0uqCGateph2bjO5ifYdD0wbCkOC2qLv0lvTX4sNMOHj4rNn2SE2/b0MI8F838bRG7uyA== X-Received: by 2002:a17:906:7215:b0:94f:61b2:c990 with SMTP id m21-20020a170906721500b0094f61b2c990mr2210574ejk.25.1682007828728; Thu, 20 Apr 2023 09:23:48 -0700 (PDT) Received: from xeon.. ([188.163.112.59]) by smtp.gmail.com with ESMTPSA id gq18-20020a170906e25200b0094eeda0df09sm894154ejb.179.2023.04.20.09.23.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Apr 2023 09:23:48 -0700 (PDT) From: Svyatoslav Ryhel To: Marek Vasut , Stefan Roese , Simon Glass , Svyatoslav Ryhel Cc: u-boot@lists.denx.de Subject: [PATCH v2 1/1] misc: extcon: add MAX14526 MUIC support Date: Thu, 20 Apr 2023 19:23:37 +0300 Message-Id: <20230420162337.24666-2-clamor95@gmail.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20230420162337.24666-1-clamor95@gmail.com> References: <20230420162337.24666-1-clamor95@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean MAX14526 is a powerful extcon chip which allows detection of various plugs like usb, mhl, uart, headset etc. This version of driver implements support of AP-usb and CP-usb/uart paths. Tested-by: Andreas Westman Dorcsak # LG P880 T30 Tested-by: Svyatoslav Ryhel # LG P895 T30 Signed-off-by: Svyatoslav Ryhel --- drivers/misc/Kconfig | 2 + drivers/misc/Makefile | 1 + drivers/misc/extcon/Kconfig | 8 ++ drivers/misc/extcon/Makefile | 2 + drivers/misc/extcon/extcon-max14526.c | 151 ++++++++++++++++++++++++++ 5 files changed, 164 insertions(+) create mode 100644 drivers/misc/extcon/Kconfig create mode 100644 drivers/misc/extcon/Makefile create mode 100644 drivers/misc/extcon/extcon-max14526.c diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 4e1ae03e9f..1b49f3cf72 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -659,4 +659,6 @@ config SL28CPLD the base driver which provides common access methods for the sub-drivers. +source "drivers/misc/extcon/Kconfig" + endmenu diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 3b792f2a14..6d4fc8ddf9 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -87,3 +87,4 @@ obj-$(CONFIG_K3_AVS0) += k3_avs.o obj-$(CONFIG_ESM_K3) += k3_esm.o obj-$(CONFIG_ESM_PMIC) += esm_pmic.o obj-$(CONFIG_SL28CPLD) += sl28cpld.o +obj-y += extcon/ diff --git a/drivers/misc/extcon/Kconfig b/drivers/misc/extcon/Kconfig new file mode 100644 index 0000000000..99c38224f3 --- /dev/null +++ b/drivers/misc/extcon/Kconfig @@ -0,0 +1,8 @@ +config EXTCON_MAX14526 + bool "Maxim MAX14526 EXTCON Support" + select DM_I2C + select DM_MISC + help + If you say yes here you get support for the MUIC device of + Maxim MAX14526. The MAX14526 MUIC is a USB port accessory + detector and switch. diff --git a/drivers/misc/extcon/Makefile b/drivers/misc/extcon/Makefile new file mode 100644 index 0000000000..f012b688ce --- /dev/null +++ b/drivers/misc/extcon/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0+ +obj-$(CONFIG_EXTCON_MAX14526) += extcon-max14526.o diff --git a/drivers/misc/extcon/extcon-max14526.c b/drivers/misc/extcon/extcon-max14526.c new file mode 100644 index 0000000000..b957d2575a --- /dev/null +++ b/drivers/misc/extcon/extcon-max14526.c @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2022 Svyatoslav Ryhel + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define CONTROL_1 0x01 +#define SW_CONTROL 0x03 + +#define ID_200 0x10 +#define ADC_EN 0x02 +#define CP_EN 0x01 + +#define DP_USB 0x00 +#define DP_UART 0x08 +#define DP_AUDIO 0x10 +#define DP_OPEN 0x38 + +#define DM_USB 0x00 +#define DM_UART 0x01 +#define DM_AUDIO 0x02 +#define DM_OPEN 0x07 + +#define AP_USB BIT(0) +#define CP_USB BIT(1) +#define CP_UART BIT(2) + +struct max14526_priv { + struct gpio_desc usif_gpio; + struct gpio_desc dp2t_gpio; + struct gpio_desc ifx_usb_vbus_gpio; +}; + +static void max14526_set_mode(struct udevice *dev, int mode) +{ + struct max14526_priv *priv = dev_get_priv(dev); + int ret; + + if ((mode & AP_USB) || (mode & CP_USB)) { + /* Connect CP UART signals to AP */ + ret = dm_gpio_set_value(&priv->usif_gpio, 0); + if (ret) + log_debug("cp-uart > ap failed (%d)\n", ret); + } + + if (mode & CP_UART) { + /* Connect CP UART signals to DP2T */ + ret = dm_gpio_set_value(&priv->usif_gpio, 1); + if (ret) + log_debug("cp-uart > dp2t failed (%d)\n", ret); + } + + if (mode & CP_USB) { + /* Connect CP USB to MUIC UART */ + ret = dm_gpio_set_value(&priv->ifx_usb_vbus_gpio, 1); + if (ret) + log_debug("usb-vbus-gpio enable failed (%d)\n", ret); + + ret = dm_gpio_set_value(&priv->dp2t_gpio, 1); + if (ret) + log_debug("cp-usb > muic-uart failed (%d)\n", ret); + } + + if ((mode & AP_USB) || (mode & CP_UART)) { + /* Connect CP UART to MUIC UART */ + ret = dm_gpio_set_value(&priv->dp2t_gpio, 0); + if (ret) + log_debug("cp-uart > muic-uart failed (%d)\n", ret); + } + + if (mode & AP_USB) { + /* Enables USB Path */ + ret = dm_i2c_reg_write(dev, SW_CONTROL, DP_USB | DM_USB); + if (ret) + log_debug("USB path set failed: %d\n", ret); + } + + if ((mode & CP_USB) || (mode & CP_UART)) { + /* Enables UART Path */ + ret = dm_i2c_reg_write(dev, SW_CONTROL, DP_UART | DM_UART); + if (ret) + log_debug("UART path set failed: %d\n", ret); + } + + /* Enables 200K, Charger Pump, and ADC */ + ret = dm_i2c_reg_write(dev, CONTROL_1, ID_200 | ADC_EN | CP_EN); + if (ret) + log_debug("200K, Charger Pump, and ADC set failed: %d\n", ret); +} + +static int max14526_probe(struct udevice *dev) +{ + struct max14526_priv *priv = dev_get_priv(dev); + int ret, mode = 0; + + ret = gpio_request_by_name(dev, "usif-gpios", 0, + &priv->usif_gpio, GPIOD_IS_OUT); + if (ret) { + log_err("could not decode usif-gpios (%d)\n", ret); + return ret; + } + + ret = gpio_request_by_name(dev, "dp2t-gpios", 0, + &priv->dp2t_gpio, GPIOD_IS_OUT); + if (ret) { + log_err("could not decode dp2t-gpios (%d)\n", ret); + return ret; + } + + if (dev_read_bool(dev, "maxim,ap-usb")) + mode |= AP_USB; + + if (dev_read_bool(dev, "maxim,cp-usb")) { + mode |= CP_USB; + + ret = gpio_request_by_name(dev, "usb-vbus-gpios", 0, + &priv->ifx_usb_vbus_gpio, GPIOD_IS_OUT); + if (ret) { + log_err("could not decode usb-vbus-gpios (%d)\n", ret); + return ret; + } + } + + if (dev_read_bool(dev, "maxim,cp-uart")) + mode |= CP_UART; + + max14526_set_mode(dev, mode); + + return 0; +} + +static const struct udevice_id max14526_ids[] = { + { .compatible = "maxim,max14526-muic" }, + { } +}; + +U_BOOT_DRIVER(extcon_max14526) = { + .name = "extcon_max14526", + .id = UCLASS_MISC, + .of_match = max14526_ids, + .probe = max14526_probe, + .priv_auto = sizeof(struct max14526_priv), +}; -- 2.37.2