Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp985379pxb; Fri, 15 Apr 2022 17:26:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJykhxfJUqTfTnWyY1h2CJJ4iwTytm+ublYlG1qZ/wa/RHj2+8Z/QcJPjR6TL5IIvjMiTvPn X-Received: by 2002:a63:2006:0:b0:39d:8460:48a4 with SMTP id g6-20020a632006000000b0039d846048a4mr1112623pgg.623.1650068809412; Fri, 15 Apr 2022 17:26:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650068809; cv=none; d=google.com; s=arc-20160816; b=yc4a/ko7Fle9bRb3bW1jmhLG7tNT/CpGZ56M8IBiGjZ/ucdaeEfCzm6Uf/XCimaoha H1nXG9ZeGDWpv82/dsSKylX/VE/suZ3qjLrsR6hMZ+d3VBwl9thkiNEkPC3JETeIyomO IBaAPjuWsbasl4Vpn+JPCyePx4xzPxz7W61qKbK9FVMfuUAapK61C3JdCglY5XYvc1dj MdIAAq+biLbdSZRaDwUqtWSnNKYnN1yPiOiGKuQDn3NIOWOGyrdrOHh/FQE6U/KZtBN5 TtDhDPnQn681qZovBhqQTHPBGwYv7HRTm4Z1xLIo80SG9p+slacVW7364Mj5Thhc4Sln rzIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Zu1iv2slDEmPJIqcluQVGAP7gHAtNvDuvYomfYWCtOo=; b=mTiysZgpyPz+51qzHO6mVTqUoWmeEElRxZ/gTkzy0weNK9GV6kcJ8rZkOpzH4Eu9ik C/nzJmrngYIC38JhGR0YwM3QLEZEbSUMKHnCzoJ2lLljoxvtR5iFU9nhge+3w9W9ZE+r Lo8dTXjb6NtVl3Ux2x1kcLnnh1CgIti9p/jS0oLDv9Bfhs7yBQ017XXa9h2b3nZ415x2 cH6CvOwew8DvImew5rbai4pzqG/bTnNtcZ0K+Z/AYhq5Gt5glGHYinOKz3vjfzgzE74r k1BdJulosjbhdCwL6cFmxztNFYh/VktkS7Eu7ypy3nH/0jCWjpPBj6jltHgroCQTIsNZ GLCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=fWBi2DQW; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id na3-20020a17090b4c0300b001c6fd746c71si5578827pjb.119.2022.04.15.17.26.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Apr 2022 17:26:49 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=fWBi2DQW; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 9DCB31209A; Fri, 15 Apr 2022 17:24:42 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352575AbiDOLDJ (ORCPT + 99 others); Fri, 15 Apr 2022 07:03:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60910 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352582AbiDOLDB (ORCPT ); Fri, 15 Apr 2022 07:03:01 -0400 Received: from mail-lj1-x230.google.com (mail-lj1-x230.google.com [IPv6:2a00:1450:4864:20::230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 23B669D046; Fri, 15 Apr 2022 04:00:32 -0700 (PDT) Received: by mail-lj1-x230.google.com with SMTP id a8so8919247ljq.5; Fri, 15 Apr 2022 04:00:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Zu1iv2slDEmPJIqcluQVGAP7gHAtNvDuvYomfYWCtOo=; b=fWBi2DQW7cTLNzmlI4SzWC5X2HG3LnFqoZJDYT0iZKb7Aiw9H0rJ+zl6NRcH0hS5k2 IQ6iF16zm0w7TDtIrdn1B1yLza1Lpvzj+UAn1/hUeBR1TK32XiujW+6wJW3TzyR2xLBS 9V7vwvicGSwWjuPmceuEJSX/pvBmiZ6IV4hD4j1ZFvd1bH1TPNm3H5F1Mm8kuRPBeVx+ 8UjCHhq8YmqeqsJqpjWQkexW0PL0wiYOK7+oNO9sd4z/WczGehiYemsgy7CzwjCFtYUm k0yqH1xXF29WE4M4V47niBEd0MHLi7ovb745CA71eTp0Ml2J18OFNcYZmvvSnkRs4EoU S3fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Zu1iv2slDEmPJIqcluQVGAP7gHAtNvDuvYomfYWCtOo=; b=1uYSQhFl+J3iABbFee2qY+8k7S3M2S1aMhR4ZuTzzeHOWP6iby8ldLUxoeStw8dYQJ hsA6HEo8bpcPseU56b+D26YjZzmWs4IXzrZJ7sMl6L+AFY60mSe2A578Wl081xrL2uck m4wbNvak50ndWBcAC3/rujWvgHzjQu1UoRHfPd8EMAIxH9NQF9JcVO90bmM06wBAR9Ll NwEKWcKBQGtmhA+7JHJMlhW6pIYGU9e1vNt3vxOMo94YGO5pTtGZLPdIximySmiQNlsB SRrmv1U4eiJcUrKTTE3iKK7GAKJFdUgbAkjHieBpCJVA+wHFwxXrw9IA0VwgpMOoLewc svRw== X-Gm-Message-State: AOAM533NcyPiD0d3fcUjwEbCglkl3YlGkXTAobUkWAjDn1Ut7e818twJ nYSEEyQWShPyUCK24j9s5ce3xRQkIp8= X-Received: by 2002:a05:651c:b13:b0:24d:a2fc:f434 with SMTP id b19-20020a05651c0b1300b0024da2fcf434mr2214181ljr.267.1650020430227; Fri, 15 Apr 2022 04:00:30 -0700 (PDT) Received: from nergzd-desktop.localdomain ([194.39.226.133]) by smtp.gmail.com with ESMTPSA id q14-20020a0565123a8e00b0044a7b26ae1dsm292341lfu.109.2022.04.15.04.00.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Apr 2022 04:00:29 -0700 (PDT) From: Markuss Broks To: linux-kernel@vger.kernel.org Cc: phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Markuss Broks , Lee Jones , Rob Herring , Krzysztof Kozlowski , Liam Girdwood , Mark Brown , devicetree@vger.kernel.org Subject: [PATCH v2 3/4] mfd: sm5703: Add support for SM5703 MFD Date: Fri, 15 Apr 2022 14:00:12 +0300 Message-Id: <20220415110014.7384-4-markuss.broks@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220415110014.7384-1-markuss.broks@gmail.com> References: <20220415110014.7384-1-markuss.broks@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Silicon Mitus SM5703 is a multi-function device, meant to be used in mobile devices. It has several modules: LDO, BUCK regulators, charger circuit, flash LED driver, a fuel gauge for monitoring the battery and a MUIC USB switcher. The MUIC and fuel gauge parts are separate in that they use separate i2c lines to communicate with the device, while charger circuit, LED driver and regulators are on the main i2c line the device is controlled with. Signed-off-by: Markuss Broks --- MAINTAINERS | 8 +++ drivers/mfd/Kconfig | 12 +++++ drivers/mfd/Makefile | 1 + drivers/mfd/sm5703.c | 81 ++++++++++++++++++++++++++++ include/linux/mfd/sm5703.h | 105 +++++++++++++++++++++++++++++++++++++ 5 files changed, 207 insertions(+) create mode 100644 drivers/mfd/sm5703.c create mode 100644 include/linux/mfd/sm5703.h diff --git a/MAINTAINERS b/MAINTAINERS index 2a83ac6bfa4d..d3eef171eb8c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -17886,6 +17886,14 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev F: include/linux/srcu*.h F: kernel/rcu/srcu*.c +SM5703 MFD DRIVER +M: Markuss Broks +S: Maintained +F: Documentation/devicetree/bindings/mfd/siliconmitus,sm5703.yaml +F: Documentation/devicetree/bindings/regulator/siliconmitus,sm5703-regulator.yaml +F: drivers/mfd/sm5703.c +F: drivers/regulator/sm5703-regulator.c + SMACK SECURITY MODULE M: Casey Schaufler L: linux-security-module@vger.kernel.org diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index e0d2fcb10a0c..e553a8db24c2 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -1223,6 +1223,18 @@ config MFD_SM501 interface. The device may be connected by PCI or local bus with varying functions enabled. +config MFD_SM5703 + tristate "Silicon Mitus SM5703 MFD" + depends on I2C + select MFD_CORE + select REGMAP_I2C + help + This is the core driver for the Silicon Mitus SM5703 multi-function + device. This device is meant to be used in phones and it has numerous + modules, including LED controller, regulators, fuel gauge, MUIC and + charger circuit. It also support muxing a serial interface over USB + data lines. + config MFD_SM501_GPIO bool "Export GPIO via GPIO layer" depends on MFD_SM501 && GPIOLIB diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index df1ecc4a4c95..3278069d3461 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -275,3 +275,4 @@ rsmu-i2c-objs := rsmu_core.o rsmu_i2c.o rsmu-spi-objs := rsmu_core.o rsmu_spi.o obj-$(CONFIG_MFD_RSMU_I2C) += rsmu-i2c.o obj-$(CONFIG_MFD_RSMU_SPI) += rsmu-spi.o +obj-$(CONFIG_MFD_SM5703) += sm5703.o diff --git a/drivers/mfd/sm5703.c b/drivers/mfd/sm5703.c new file mode 100644 index 000000000000..0eb6f257f109 --- /dev/null +++ b/drivers/mfd/sm5703.c @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const struct mfd_cell sm5703_devs[] = { + { + .name = "sm5703-regulator", + .of_compatible = "siliconmitus,sm5703-regulator", + }, +}; + +static const struct regmap_config sm5703_regmap_config = { + .reg_bits = 8, + .val_bits = 8, +}; + +static int sm5703_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct sm5703_dev *sm5703; + struct device *dev = &i2c->dev; + unsigned int dev_id; + int ret; + + sm5703 = devm_kzalloc(dev, sizeof(*sm5703), GFP_KERNEL); + if (!sm5703) + return -ENOMEM; + + i2c_set_clientdata(i2c, sm5703); + sm5703->dev = dev; + + sm5703->regmap = devm_regmap_init_i2c(i2c, &sm5703_regmap_config); + if (IS_ERR(sm5703->regmap)) + return dev_err_probe(dev, PTR_ERR(sm5703->regmap), + "Failed to allocate the register map\n"); + + sm5703->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(sm5703->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(sm5703->reset_gpio), "Cannot get reset GPIO\n"); + + gpiod_set_value_cansleep(sm5703->reset_gpio, 1); + msleep(20); + + ret = regmap_read(sm5703->regmap, SM5703_DEVICE_ID, &dev_id); + if (ret) + return dev_err_probe(dev, -ENODEV, "Device not found\n"); + + ret = devm_mfd_add_devices(sm5703->dev, -1, sm5703_devs, + ARRAY_SIZE(sm5703_devs), NULL, 0, NULL); + if (ret) + return dev_err_probe(dev, ret, "Failed to add child devices\n"); + + return 0; +} + +static const struct of_device_id sm5703_of_match[] = { + { .compatible = "siliconmitus,sm5703-mfd", }, + { } +}; +MODULE_DEVICE_TABLE(of, sm5703_of_match); + +static struct i2c_driver sm5703_driver = { + .driver = { + .name = "sm5703", + .of_match_table = sm5703_of_match, + }, + .probe = sm5703_i2c_probe, +}; +module_i2c_driver(sm5703_driver); + +MODULE_DESCRIPTION("Silicon Mitus SM5703 multi-function device driver"); +MODULE_AUTHOR("Markuss Broks "); +MODULE_LICENSE("GPL"); diff --git a/include/linux/mfd/sm5703.h b/include/linux/mfd/sm5703.h new file mode 100644 index 000000000000..c62affa0d3f1 --- /dev/null +++ b/include/linux/mfd/sm5703.h @@ -0,0 +1,105 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef _SM5703_H +#define _SM5703_H + +struct sm5703_dev { + struct device *dev; + struct regmap *regmap; + struct gpio_desc *reset_gpio; +}; + +// Regulator-related defines + +#define SM5703_REG_LDO1 0x1A +#define SM5703_REG_LDO2 0x1B +#define SM5703_REG_LDO3 0x1C +#define SM5703_LDO_EN BIT(3) +#define SM5703_LDO_VOLT_MASK 0x7 +#define SM5703_BUCK_VOLT_MASK 0x1F +#define SM5703_REG_USBLDO12 0x1C +#define SM5703_REG_EN_USBLDO1 BIT(6) +#define SM5703_REG_EN_USBLDO2 BIT(7) +#define SM5703_REG_BUCK 0x1D +#define SM5703_REG_EN_BUCK BIT(6) +#define SM5703_USBLDO_MICROVOLT 4800000 +#define SM5703_VBUS_MICROVOLT 5000000 + +// Fuel-Gauge-related defines + +#define SM5703_FG_REG_DEVICE_ID 0x00 +#define SM5703_FG_REG_CNTL 0x01 +#define SM5703_FG_REG_INTFG 0x02 +#define SM5703_FG_REG_INTFG_MASK 0x03 +#define SM5703_FG_REG_STATUS 0x04 +#define SM5703_FG_REG_SOC 0x05 +#define SM5703_FG_REG_OCV 0x06 +#define SM5703_FG_REG_VOLTAGE 0x07 +#define SM5703_FG_REG_CURRENT 0x08 +#define SM5703_FG_REG_TEMPERATURE 0x09 +#define SM5703_FG_REG_CURRENT_EST 0x85 +#define SM5703_FG_REG_FG_OP_STATUS 0x10 + +// Flash LED driver-related defines + +#define SM5703_FLEDCNTL1 0x14 +#define SM5703_FLEDCNTL2 0x15 +#define SM5703_FLEDCNTL3 0x16 +#define SM5703_FLEDCNTL4 0x17 +#define SM5703_FLEDCNTL5 0x18 +#define SM5703_FLEDCNTL6 0x19 + +#define SM5703_FLEDEN_MASK 0x03 +#define SM5703_FLEDEN_DISABLE 0x00 +#define SM5703_FLEDEN_MOVIE_MODE 0x01 +#define SM5703_FLEDEN_FLASH_MODE 0x02 +#define SM5703_FLEDEN_EXTERNAL 0x03 + +#define SM5703_IFLED_MASK 0x1F +#define SM5703_IMLED_MASK 0x1F + +// Charger-related, IRQ and device ID defines + +#define SM5703_REG_CNTL 0x0C +#define SM5703_VBUSCNTL 0x0D +#define SM5703_CHGCNTL1 0x0E +#define SM5703_CHGCNTL2 0x0F +#define SM5703_CHGCNTL3 0x10 +#define SM5703_CHGCNTL4 0x11 +#define SM5703_CHGCNTL5 0x12 +#define SM5703_CHGCNTL6 0x13 +#define SM5703_OTGCURRENTCNTL 0x60 +#define SM5703_Q3LIMITCNTL 0x66 +#define SM5703_DEVICE_ID 0x1E +#define SM5703_OPERATION_MODE 0x07 +#define SM5703_OPERATION_MODE_MASK 0x07 + +#define SM5703_OPERATION_MODE_SUSPEND 0x00 +#define SM5703_OPERATION_MODE_CHARGING_OFF 0x04 +#define SM5703_OPERATION_MODE_CHARGING_ON 0x05 +#define SM5703_OPERATION_MODE_FLASH_BOOST_MODE 0x06 +#define SM5703_OPERATION_MODE_USB_OTG_MODE 0x07 + +#define SM5703_BSTOUT 0x0F +#define SM5703_BSTOUT_MASK 0x0F +#define SM5703_BSTOUT_SHIFT 0 + +#define SM5703_BSTOUT_4P5 0x05 +#define SM5703_BSTOUT_5P0 0x0A +#define SM5703_BSTOUT_5P1 0x0B + +#define SM5703_IRQ_STATUS1 0x08 +#define SM5703_IRQ_STATUS2 0x09 +#define SM5703_IRQ_STATUS3 0x0A +#define SM5703_IRQ_STATUS4 0x0B +#define SM5703_IRQ_STATUS5 0x6B + +#define SM5703_STATUS1_OTGFAIL 0x80 +#define SM5703_STATUS3_DONE 0x08 +#define SM5703_STATUS3_TOPOFF 0x04 +#define SM5703_STATUS3_CHGON 0x01 +#define SM5703_STATUS5_VBUSOVP 0x80 +#define SM5703_STATUS5_VBUSUVLO 0x40 +#define SM5703_STATUS5_VBUSOK 0x20 + +#endif -- 2.35.1