Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/1839972/?format=api
{ "id": 1839972, "url": "http://patchwork.ozlabs.org/api/patches/1839972/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/patch/20230926234801.4078042-4-chris.packham@alliedtelesis.co.nz/", "project": { "id": 35, "url": "http://patchwork.ozlabs.org/api/projects/35/?format=api", "name": "Linux I2C development", "link_name": "linux-i2c", "list_id": "linux-i2c.vger.kernel.org", "list_email": "linux-i2c@vger.kernel.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20230926234801.4078042-4-chris.packham@alliedtelesis.co.nz>", "list_archive_url": null, "date": "2023-09-26T23:48:01", "name": "[3/3] i2c: mv64xxx: add support for FSM based recovery", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "1e56215ef6a9e521fafaae5c1fd49c1d929a4d98", "submitter": { "id": 27499, "url": "http://patchwork.ozlabs.org/api/people/27499/?format=api", "name": "Chris Packham", "email": "chris.packham@alliedtelesis.co.nz" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-i2c/patch/20230926234801.4078042-4-chris.packham@alliedtelesis.co.nz/mbox/", "series": [ { "id": 375016, "url": "http://patchwork.ozlabs.org/api/series/375016/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/list/?series=375016", "date": "2023-09-26T23:47:58", "name": "[1/3] dt-bindings: i2c: mv64xxx: update bindings for unstuck register", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/375016/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/1839972/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/1839972/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<linux-i2c-owner@vger.kernel.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=alliedtelesis.co.nz header.i=@alliedtelesis.co.nz\n header.a=rsa-sha256 header.s=mail181024 header.b=yoC0VhJ3;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2620:137:e000::1:20; helo=out1.vger.email;\n envelope-from=linux-i2c-owner@vger.kernel.org; receiver=patchwork.ozlabs.org)" ], "Received": [ "from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20])\n\tby legolas.ozlabs.org (Postfix) with ESMTP id 4RwHmm3J6gz1ypS\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 27 Sep 2023 10:39:20 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n id S232979AbjI0AjI (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n Tue, 26 Sep 2023 20:39:08 -0400", "from lindbergh.monkeyblade.net ([23.128.96.19]:47866 \"EHLO\n lindbergh.monkeyblade.net\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n with ESMTP id S231985AbjI0AhH (ORCPT\n <rfc822;linux-i2c@vger.kernel.org>); Tue, 26 Sep 2023 20:37:07 -0400", "from gate2.alliedtelesis.co.nz (gate2.alliedtelesis.co.nz\n [202.36.163.20])\n by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 12AD72D75\n for <linux-i2c@vger.kernel.org>; Tue, 26 Sep 2023 16:48:10 -0700 (PDT)", "from svr-chch-seg1.atlnz.lc (mmarshal3.atlnz.lc [10.32.18.43])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits)\n server-digest SHA256)\n (Client did not present a certificate)\n by gate2.alliedtelesis.co.nz (Postfix) with ESMTPS id 537702C066D;\n Wed, 27 Sep 2023 12:48:08 +1300 (NZDT)", "from pat.atlnz.lc (Not Verified[10.32.16.33]) by\n svr-chch-seg1.atlnz.lc with Trustwave SEG (v8,2,6,11305)\n id <B65136db80002>; Wed, 27 Sep 2023 12:48:08 +1300", "from chrisp-dl.ws.atlnz.lc (chrisp-dl.ws.atlnz.lc [10.33.22.30])\n by pat.atlnz.lc (Postfix) with ESMTP id EED7813EEA1;\n Wed, 27 Sep 2023 12:48:07 +1300 (NZDT)", "by chrisp-dl.ws.atlnz.lc (Postfix, from userid 1030)\n id EDCB028160F; Wed, 27 Sep 2023 12:48:07 +1300 (NZDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=alliedtelesis.co.nz;\n s=mail181024; t=1695772088;\n bh=KR9YXJasf5jtvRl6VEb7GUZv9d995ayF9hchctxuvZ8=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=yoC0VhJ3EZVg8XM27manwPD9Ghj7zbdpeYO8W3Rt8RMx51ekI/8P/sLS2PUgmHiOV\n Dr+Ud48fuzjmUEjJ19Wg+u6uEiTV/5gpmyYWtqZU0/TDMsaTqHgl+EWVhjYML7wv9y\n A5rB17Td1K15jIfaY+UAldwsWx7/aS/Q/ifhehHS+r5SPCfVznZF2XBeRGskUH+z80\n JyDAvq8+odXGb637ey7EQonPxThtMD+nwqu83r7tckchFf4v/eoYEEXnhnjjBikutB\n PaZIBQIYChyEDoLMDfJ2ldYyzMNQYhVVC1oKR58c4aU9iXDUc67h0hMbKDhY2wr3wJ\n syOVqhNgBL0Kg==", "From": "Chris Packham <chris.packham@alliedtelesis.co.nz>", "To": "gregory.clement@bootlin.com, andi.shyti@kernel.org,\n robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org,\n conor+dt@kernel.org, pierre.gondois@arm.com", "Cc": "linux-i2c@vger.kernel.org, devicetree@vger.kernel.org,\n linux-kernel@vger.kernel.org,\n Chris Packham <chris.packham@alliedtelesis.co.nz>", "Subject": "[PATCH 3/3] i2c: mv64xxx: add support for FSM based recovery", "Date": "Wed, 27 Sep 2023 12:48:01 +1300", "Message-ID": "<20230926234801.4078042-4-chris.packham@alliedtelesis.co.nz>", "X-Mailer": "git-send-email 2.42.0", "In-Reply-To": "<20230926234801.4078042-1-chris.packham@alliedtelesis.co.nz>", "References": "<20230926234801.4078042-1-chris.packham@alliedtelesis.co.nz>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "quoted-printable", "X-SEG-SpamProfiler-Analysis": "v=2.3 cv=fOpHIqSe c=1 sm=1 tr=0\n a=KLBiSEs5mFS1a/PbTCJxuA==:117 a=zNV7Rl7Rt7sA:10 a=B8jpvDMl2VDXHxTB5w4A:9", "X-SEG-SpamProfiler-Score": "0", "x-atlnz-ls": "pat", "X-Spam-Status": "No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_PASS,SPF_PASS autolearn=unavailable autolearn_force=no\n version=3.4.6", "X-Spam-Checker-Version": "SpamAssassin 3.4.6 (2021-04-09) on\n lindbergh.monkeyblade.net", "Precedence": "bulk", "List-ID": "<linux-i2c.vger.kernel.org>", "X-Mailing-List": "linux-i2c@vger.kernel.org" }, "content": "Some newer Marvell SoCs (AC5 and CN9130, possibly more) support a I2C\nunstuck function. This provides a recovery function as part of the FSM\nas an alternative to changing pinctrl modes and using the generic GPIO\nbased recovery. Allow for using this by adding an optional resource to\nthe platform data which contains the address of the I2C unstuck register\nfor the I2C controller.\n\nSigned-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>\n---\n drivers/i2c/busses/i2c-mv64xxx.c | 71 ++++++++++++++++++++++++++++++--\n 1 file changed, 67 insertions(+), 4 deletions(-)", "diff": "diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c\nindex fd8403b07fa6..4345ab19b89c 100644\n--- a/drivers/i2c/busses/i2c-mv64xxx.c\n+++ b/drivers/i2c/busses/i2c-mv64xxx.c\n@@ -21,6 +21,7 @@\n #include <linux/pm_runtime.h>\n #include <linux/reset.h>\n #include <linux/io.h>\n+#include <linux/iopoll.h>\n #include <linux/of.h>\n #include <linux/of_device.h>\n #include <linux/of_irq.h>\n@@ -82,6 +83,13 @@\n /* Bridge Status values */\n #define\tMV64XXX_I2C_BRIDGE_STATUS_ERROR\t\t\tBIT(0)\n \n+/* Unstuck Register values */\n+#define MV64XXX_I2C_UNSTUCK_TRIGGER\t\t\tBIT(0)\n+#define MV64XXX_I2C_UNSTUCK_ON_GOING\t\t\tBIT(1)\n+#define MV64XXX_I2C_UNSTUCK_ERROR\t\t\tBIT(2)\n+#define MV64XXX_I2C_UNSTUCK_COUNT(val)\t\t\t((val & 0xf0) >> 4)\n+#define MV64XXX_I2C_UNSTUCK_INPROGRESS (MV64XXX_I2C_UNSTUCK_TRIGGER|MV64XXX_I2C_UNSTUCK_ON_GOING)\n+\n /* Driver states */\n enum {\n \tMV64XXX_I2C_STATE_INVALID,\n@@ -126,6 +134,7 @@ struct mv64xxx_i2c_data {\n \tu32\t\t\taborting;\n \tu32\t\t\tcntl_bits;\n \tvoid __iomem\t\t*reg_base;\n+\tvoid __iomem\t\t*unstuck_reg;\n \tstruct mv64xxx_i2c_regs\treg_offsets;\n \tu32\t\t\taddr1;\n \tu32\t\t\taddr2;\n@@ -735,6 +744,33 @@ mv64xxx_i2c_can_offload(struct mv64xxx_i2c_data *drv_data)\n \treturn false;\n }\n \n+static int\n+mv64xxx_i2c_recover_bus(struct i2c_adapter *adap)\n+{\n+\tstruct mv64xxx_i2c_data *drv_data = i2c_get_adapdata(adap);\n+\tint ret;\n+\tu32 val;\n+\n+\tdev_dbg(&adap->dev, \"Trying i2c bus recovery\\n\");\n+\twritel(MV64XXX_I2C_UNSTUCK_TRIGGER, drv_data->unstuck_reg);\n+\tret = readl_poll_timeout_atomic(drv_data->unstuck_reg, val,\n+\t\t\t\t\t!(val & MV64XXX_I2C_UNSTUCK_INPROGRESS),\n+\t\t\t\t\t1000, 5000);\n+\tif (ret) {\n+\t\tdev_err(&adap->dev, \"recovery timeout\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tif (val & MV64XXX_I2C_UNSTUCK_ERROR) {\n+\t\tdev_err(&adap->dev, \"recovery failed\\n\");\n+\t\treturn -EBUSY;\n+\t}\n+\n+\tdev_info(&adap->dev, \"recovery complete after %d pulses\\n\", MV64XXX_I2C_UNSTUCK_COUNT(val));\n+\n+\treturn 0;\n+}\n+\n /*\n *****************************************************************************\n *\n@@ -914,7 +950,8 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,\n \t\t\tdrv_data->errata_delay = true;\n \t}\n \n-\tif (of_device_is_compatible(np, \"marvell,mv78230-a0-i2c\")) {\n+\tif (of_device_is_compatible(np, \"marvell,mv78230-a0-i2c\") ||\n+\t of_device_is_compatible(np, \"marvell,armada-8k-i2c\")) {\n \t\tdrv_data->offload_enabled = false;\n \t\t/* The delay is only needed in standard mode (100kHz) */\n \t\tif (bus_freq <= I2C_MAX_STANDARD_MODE_FREQ)\n@@ -936,8 +973,21 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,\n }\n #endif /* CONFIG_OF */\n \n-static int mv64xxx_i2c_init_recovery_info(struct mv64xxx_i2c_data *drv_data,\n-\t\t\t\t\t struct device *dev)\n+static int mv64xxx_i2c_init_fsm_recovery_info(struct mv64xxx_i2c_data *drv_data,\n+\t\t\t\t\t struct device *dev)\n+{\n+\tstruct i2c_bus_recovery_info *rinfo = &drv_data->rinfo;\n+\n+\tdev_info(dev, \"using FSM for recovery\\n\");\n+\trinfo->recover_bus = mv64xxx_i2c_recover_bus;\n+\tdrv_data->adapter.bus_recovery_info = rinfo;\n+\n+\treturn 0;\n+\n+}\n+\n+static int mv64xxx_i2c_init_gpio_recovery_info(struct mv64xxx_i2c_data *drv_data,\n+\t\t\t\t\t struct device *dev)\n {\n \tstruct i2c_bus_recovery_info *rinfo = &drv_data->rinfo;\n \n@@ -986,6 +1036,7 @@ mv64xxx_i2c_probe(struct platform_device *pd)\n {\n \tstruct mv64xxx_i2c_data\t\t*drv_data;\n \tstruct mv64xxx_i2c_pdata\t*pdata = dev_get_platdata(&pd->dev);\n+\tstruct resource *res;\n \tint\trc;\n \n \tif ((!pdata && !pd->dev.of_node))\n@@ -1000,6 +1051,14 @@ mv64xxx_i2c_probe(struct platform_device *pd)\n \tif (IS_ERR(drv_data->reg_base))\n \t\treturn PTR_ERR(drv_data->reg_base);\n \n+\t/* optional unstuck support */\n+\tres = platform_get_resource(pd, IORESOURCE_MEM, 1);\n+\tif (res) {\n+\t\tdrv_data->unstuck_reg = devm_ioremap_resource(&pd->dev, res);\n+\t\tif (IS_ERR(drv_data->unstuck_reg))\n+\t\t\treturn PTR_ERR(drv_data->unstuck_reg);\n+\t}\n+\n \tstrscpy(drv_data->adapter.name, MV64XXX_I2C_CTLR_NAME \" adapter\",\n \t\tsizeof(drv_data->adapter.name));\n \n@@ -1037,7 +1096,11 @@ mv64xxx_i2c_probe(struct platform_device *pd)\n \t\t\treturn rc;\n \t}\n \n-\trc = mv64xxx_i2c_init_recovery_info(drv_data, &pd->dev);\n+\tif (drv_data->unstuck_reg)\n+\t\trc = mv64xxx_i2c_init_fsm_recovery_info(drv_data, &pd->dev);\n+\telse\n+\t\trc = mv64xxx_i2c_init_gpio_recovery_info(drv_data, &pd->dev);\n+\n \tif (rc == -EPROBE_DEFER)\n \t\treturn rc;\n \n", "prefixes": [ "3/3" ] }