Received: by 2002:ab2:7407:0:b0:1f4:b336:87c4 with SMTP id e7csp282301lqn; Fri, 12 Apr 2024 00:51:40 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVp58Cryr7Nz80QzL7Yjep3k6ROpOi3l6DQZdTAOJhjbLwTxm8yoVypE4nR61QzJ0j1E1DU0CnRQEqxDnrXB8OLRrgU7ZXrbSzemt4qew== X-Google-Smtp-Source: AGHT+IHQJ+U4+OfdB45GGq8XevTySQCS24YOF0zbM5fYDkfbkJR3iQsG4SK5j6yjJC3VuSp5a5Wd X-Received: by 2002:a9d:6257:0:b0:6ea:286d:1577 with SMTP id i23-20020a9d6257000000b006ea286d1577mr2036978otk.17.1712908299913; Fri, 12 Apr 2024 00:51:39 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712908299; cv=pass; d=google.com; s=arc-20160816; b=mJHSWlMi/d0BjnLT6h6vUn2ijVpoAaNZyNOqBd8UM7olatLAMrllmeOiYZgJf4ekuo rmgcmLPUKOdjpNWhORGeN18tPed58i2K6rNFZwQnbnZyzd1dJsVDuDHXumKc/nDXGFGe PImbqYdN/6bEASwuNSFyFXxzCoadzDwBdGiKdAbckvty9m0toj/hgP57Oi1S/42ZNDnA r5w3LWMn/7alHGzvGtJa45bWxD361seVCAU4nKsHDKkeDI8/PwZsNVubIJ0cytYuJd19 Uin9KQmwJ3RxDYkcw8Rk1zQILRH1tG2yxUm3bsrI3u8w05lvp8eyxc1qRB4Q4EdCwQw/ mXXg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :references:message-id:subject:cc:to:from:date:dkim-signature; bh=k8pguIAvtI6yYAk9zIvWqDlWPEuphdnjDfzKCSBR/tw=; fh=eBbknorkvw7X63aEvim/BW/pjeueHJWta1Q/8AvGY4Q=; b=mg5FVMhoHSfMDj7gIOsuJn5nuZQAsEkAAWuCX0Ns20wiSiZneI6aJEe7IGgOIPBE5p 95yEBeRxt8+Cq3sDkl02k4oJbpWv+jJZq4xAxqnpXlHYy+S9gaO352NdUzOM5MLsPEmg HISHh02hEF6U0fufLv4S/glw2CfPkIxFmBVxIdF+Y3GHzV6UMUJgmi/CaUwumpLgVPAx 30+Y+m2vvyzATftPUhfKpyPoOpehPm5GWEVJHc+uoCccPSHm24qzU5T+VOdJImt9hjcE cULYOvpeqoRBhx4msqOSq9CkD63HW+0EBmqSihkEUD8sUhkw1P7uO1x6t3ekSvlRSo0N Gbcw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tBoPVn5u; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-142170-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-142170-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id t18-20020a635352000000b005d7bf204e26si2807911pgl.899.2024.04.12.00.51.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 00:51:39 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-142170-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tBoPVn5u; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-142170-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-142170-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=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 0A86FB22A7E for ; Fri, 12 Apr 2024 07:44:06 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3B1105027F; Fri, 12 Apr 2024 07:43:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="tBoPVn5u" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 30A335026B for ; Fri, 12 Apr 2024 07:43:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712907828; cv=none; b=qxQw4RNZXgqPHJGf8TaFUi3pdyDVsxXa7C1AthKKJLiF8pr107ay58LkMFK6kOTQlcyHmAiTgizpqEeRiGx3J7m3UwfjVbmxkgMvVoNEl3mQKF6Wc18KsNqFlyjj/Mmo5H8G/DobFznIK+DcKvGLFC93Th+fJh09jOpRzbXQHkU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712907828; c=relaxed/simple; bh=Lp7pujWU1SN5Yqh9R8ylDr89ozBe25tKE3JyBV77E7o=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=tG7qfo6E/R69/hcxRol/iSo4l24NlYmkBczlADKesQCouiYq4UE/8UUzO636sifl/IB9wYVmFFMZv80T1F67Y7/xVV2k01vlDwHK735fYnYQ2h+8ddWA76uYuDBUMFhwIY3fizWHef1UkLS9rzWX6yETRJr/q276kqnpIUK0KkY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tBoPVn5u; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id D9366C113CC; Fri, 12 Apr 2024 07:43:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1712907827; bh=Lp7pujWU1SN5Yqh9R8ylDr89ozBe25tKE3JyBV77E7o=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=tBoPVn5u4UF6/IrlxJ5DcGxNC8SdCBB8SE4n6Jh2ipU7Spya/vvL6MDt1n4e9buG4 pinExls7ZCDSDUY6Ol6xrKgltUIT7ysgdnv7vdAzaMUzPRkLBeaWdFn5oLb7oVvBCB +3J9dsgBu/Q5MnzryrIBDCbxlPxHS5oUSmsgriViQ1WGwgqAFdStwfBvLbbq8iQrtS TxOOkdMD11Ujoah2noeLjpSWaKhrQ9k2Vt2rqLfIyQnx2cu8WEYRZdeFKDkyDKIlbu 9hxbGrTF2y7L4UQ1NDMjeFZMqb/YoEn1jb7AwuYcNNmWqeyx/dNlkbG+iq25PoFktG WV57slUx61h6g== Date: Fri, 12 Apr 2024 08:43:44 +0100 From: Lee Jones To: Min Li Cc: linux-kernel@vger.kernel.org, Min Li Subject: Re: [PATCH mfd v1 1/2] mfd: rsmu: support I2C SMBus access Message-ID: <20240412074344.GQ2399047@google.com> References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Thu, 11 Apr 2024, Min Li wrote: > From: Min Li > > 8a3400x device implements its own reg_read and reg_write, > which only supports I2C bus access. This patch adds support > for SMBus access. > > Signed-off-by: Min Li > --- > send the patch series as --thread suggested by Lee These are still not connected. > drivers/mfd/rsmu_i2c.c | 107 +++++++++++++++++++++++++++++++++++------ > drivers/mfd/rsmu_spi.c | 8 +-- > 2 files changed, 97 insertions(+), 18 deletions(-) > > diff --git a/drivers/mfd/rsmu_i2c.c b/drivers/mfd/rsmu_i2c.c > index 5711e512b..cba64f107 100644 > --- a/drivers/mfd/rsmu_i2c.c > +++ b/drivers/mfd/rsmu_i2c.c > @@ -32,6 +32,8 @@ > #define RSMU_SABRE_PAGE_ADDR 0x7F > #define RSMU_SABRE_PAGE_WINDOW 128 > > +typedef int (*rsmu_rw_device)(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u8 bytes); > + > static const struct regmap_range_cfg rsmu_sabre_range_cfg[] = { > { > .range_min = 0, > @@ -54,7 +56,28 @@ static bool rsmu_sabre_volatile_reg(struct device *dev, unsigned int reg) > } > } > > -static int rsmu_read_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes) > +static int rsmu_smbus_i2c_write_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u8 bytes) > +{ > + struct i2c_client *client = to_i2c_client(rsmu->dev); > + > + return i2c_smbus_write_i2c_block_data(client, reg, bytes, buf); > +} > + > +static int rsmu_smbus_i2c_read_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u8 bytes) > +{ > + struct i2c_client *client = to_i2c_client(rsmu->dev); > + int ret; > + > + ret = i2c_smbus_read_i2c_block_data(client, reg, bytes, buf); > + if (ret == bytes) > + return 0; > + else if (ret < 0) > + return ret; > + else > + return -EIO; > +} > + > +static int rsmu_i2c_read_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u8 bytes) > { > struct i2c_client *client = to_i2c_client(rsmu->dev); > struct i2c_msg msg[2]; > @@ -84,10 +107,11 @@ static int rsmu_read_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes) > return 0; > } > > -static int rsmu_write_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes) > +static int rsmu_i2c_write_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u8 bytes) > { > struct i2c_client *client = to_i2c_client(rsmu->dev); > - u8 msg[RSMU_MAX_WRITE_COUNT + 1]; /* 1 Byte added for the device register */ > + /* we add 1 byte for device register */ > + u8 msg[RSMU_MAX_WRITE_COUNT + 1]; > int cnt; > > if (bytes > RSMU_MAX_WRITE_COUNT) > @@ -107,7 +131,8 @@ static int rsmu_write_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes > return 0; > } > > -static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg) > +static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg, > + rsmu_rw_device rsmu_write_device) > { > u32 page = reg & RSMU_CM_PAGE_MASK; > u8 buf[4]; > @@ -136,35 +161,35 @@ static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg) > return err; > } > > -static int rsmu_reg_read(void *context, unsigned int reg, unsigned int *val) > +static int rsmu_i2c_reg_read(void *context, unsigned int reg, unsigned int *val) > { > struct rsmu_ddata *rsmu = i2c_get_clientdata((struct i2c_client *)context); > u8 addr = (u8)(reg & RSMU_CM_ADDRESS_MASK); > int err; > > - err = rsmu_write_page_register(rsmu, reg); > + err = rsmu_write_page_register(rsmu, reg, rsmu_i2c_write_device); > if (err) > return err; > > - err = rsmu_read_device(rsmu, addr, (u8 *)val, 1); > + err = rsmu_i2c_read_device(rsmu, addr, (u8 *)val, 1); > if (err) > dev_err(rsmu->dev, "Failed to read offset address 0x%x\n", addr); > > return err; > } > > -static int rsmu_reg_write(void *context, unsigned int reg, unsigned int val) > +static int rsmu_i2c_reg_write(void *context, unsigned int reg, unsigned int val) > { > struct rsmu_ddata *rsmu = i2c_get_clientdata((struct i2c_client *)context); > u8 addr = (u8)(reg & RSMU_CM_ADDRESS_MASK); > u8 data = (u8)val; > int err; > > - err = rsmu_write_page_register(rsmu, reg); > + err = rsmu_write_page_register(rsmu, reg, rsmu_i2c_write_device); > if (err) > return err; > > - err = rsmu_write_device(rsmu, addr, &data, 1); > + err = rsmu_i2c_write_device(rsmu, addr, &data, 1); > if (err) > dev_err(rsmu->dev, > "Failed to write offset address 0x%x\n", addr); > @@ -172,12 +197,57 @@ static int rsmu_reg_write(void *context, unsigned int reg, unsigned int val) > return err; > } > > -static const struct regmap_config rsmu_cm_regmap_config = { > +static int rsmu_smbus_i2c_reg_read(void *context, unsigned int reg, unsigned int *val) > +{ > + struct rsmu_ddata *rsmu = i2c_get_clientdata((struct i2c_client *)context); > + u8 addr = (u8)(reg & RSMU_CM_ADDRESS_MASK); > + int err; > + > + err = rsmu_write_page_register(rsmu, reg, rsmu_smbus_i2c_write_device); > + if (err) > + return err; > + > + err = rsmu_smbus_i2c_read_device(rsmu, addr, (u8 *)val, 1); > + if (err) > + dev_err(rsmu->dev, "Failed to read offset address 0x%x\n", addr); > + > + return err; > +} > + > +static int rsmu_smbus_i2c_reg_write(void *context, unsigned int reg, unsigned int val) > +{ > + struct rsmu_ddata *rsmu = i2c_get_clientdata((struct i2c_client *)context); > + u8 addr = (u8)(reg & RSMU_CM_ADDRESS_MASK); > + u8 data = (u8)val; > + int err; > + > + err = rsmu_write_page_register(rsmu, reg, rsmu_smbus_i2c_write_device); > + if (err) > + return err; > + > + err = rsmu_smbus_i2c_write_device(rsmu, addr, &data, 1); > + if (err) > + dev_err(rsmu->dev, > + "Failed to write offset address 0x%x\n", addr); > + > + return err; > +} > + > +static const struct regmap_config rsmu_i2c_cm_regmap_config = { > .reg_bits = 32, > .val_bits = 8, > .max_register = 0x20120000, > - .reg_read = rsmu_reg_read, > - .reg_write = rsmu_reg_write, > + .reg_read = rsmu_i2c_reg_read, > + .reg_write = rsmu_i2c_reg_write, > + .cache_type = REGCACHE_NONE, > +}; > + > +static const struct regmap_config rsmu_smbus_i2c_cm_regmap_config = { > + .reg_bits = 32, > + .val_bits = 8, > + .max_register = 0x20120000, > + .reg_read = rsmu_smbus_i2c_reg_read, > + .reg_write = rsmu_smbus_i2c_reg_write, > .cache_type = REGCACHE_NONE, > }; > > @@ -219,7 +289,15 @@ static int rsmu_i2c_probe(struct i2c_client *client) > > switch (rsmu->type) { > case RSMU_CM: > - cfg = &rsmu_cm_regmap_config; > + if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { > + cfg = &rsmu_i2c_cm_regmap_config; > + } else if (i2c_check_functionality(client->adapter, > + I2C_FUNC_SMBUS_I2C_BLOCK)) { > + cfg = &rsmu_smbus_i2c_cm_regmap_config; > + } else { > + dev_err(rsmu->dev, "Unsupported i2c adapter\n"); > + return -ENOTSUPP; > + } > break; > case RSMU_SABRE: > cfg = &rsmu_sabre_regmap_config; > @@ -236,6 +314,7 @@ static int rsmu_i2c_probe(struct i2c_client *client) > rsmu->regmap = devm_regmap_init(&client->dev, NULL, client, cfg); > else > rsmu->regmap = devm_regmap_init_i2c(client, cfg); > + > if (IS_ERR(rsmu->regmap)) { > ret = PTR_ERR(rsmu->regmap); > dev_err(rsmu->dev, "Failed to allocate register map: %d\n", ret); > diff --git a/drivers/mfd/rsmu_spi.c b/drivers/mfd/rsmu_spi.c > index ca0a1202c..39d9be1e1 100644 > --- a/drivers/mfd/rsmu_spi.c > +++ b/drivers/mfd/rsmu_spi.c > @@ -106,10 +106,10 @@ static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg) > return 0; > page_reg = RSMU_CM_PAGE_ADDR; > page = reg & RSMU_PAGE_MASK; > - buf[0] = (u8)(page & 0xff); > - buf[1] = (u8)((page >> 8) & 0xff); > - buf[2] = (u8)((page >> 16) & 0xff); > - buf[3] = (u8)((page >> 24) & 0xff); > + buf[0] = (u8)(page & 0xFF); > + buf[1] = (u8)((page >> 8) & 0xFF); > + buf[2] = (u8)((page >> 16) & 0xFF); > + buf[3] = (u8)((page >> 24) & 0xFF); > bytes = 4; > break; > case RSMU_SABRE: > -- > 2.39.2 > -- Lee Jones [李琼斯]