get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.0/patches/2175598/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2175598,
    "url": "http://patchwork.ozlabs.org/api/1.0/patches/2175598/?format=api",
    "project": {
        "id": 35,
        "url": "http://patchwork.ozlabs.org/api/1.0/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": ""
    },
    "msgid": "<20251218151509.361617-4-heikki.krogerus@linux.intel.com>",
    "date": "2025-12-18T15:15:02",
    "name": "[v2,3/6] i2c: designware: Combine some of the common functions",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "c5d106c2d5f66f30ab8febbc053d573475d31015",
    "submitter": {
        "id": 23674,
        "url": "http://patchwork.ozlabs.org/api/1.0/people/23674/?format=api",
        "name": "Heikki Krogerus",
        "email": "heikki.krogerus@linux.intel.com"
    },
    "delegate": {
        "id": 149066,
        "url": "http://patchwork.ozlabs.org/api/1.0/users/149066/?format=api",
        "username": "cazzacarna",
        "first_name": "Andi",
        "last_name": "Shyti",
        "email": "andi.shyti@kernel.org"
    },
    "mbox": "http://patchwork.ozlabs.org/project/linux-i2c/patch/20251218151509.361617-4-heikki.krogerus@linux.intel.com/mbox/",
    "series": [
        {
            "id": 485867,
            "url": "http://patchwork.ozlabs.org/api/1.0/series/485867/?format=api",
            "date": "2025-12-18T15:14:59",
            "name": "i2c: designware: Enable mode swapping",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/485867/mbox/"
        }
    ],
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2175598/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <linux-i2c+bounces-14645-incoming=patchwork.ozlabs.org@vger.kernel.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "linux-i2c@vger.kernel.org"
        ],
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256\n header.s=Intel header.b=YC3Wcv+y;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c15:e001:75::12fc:5321; helo=sin.lore.kernel.org;\n envelope-from=linux-i2c+bounces-14645-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com\n header.b=\"YC3Wcv+y\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=192.198.163.9",
            "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.intel.com",
            "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=linux.intel.com"
        ],
        "Received": [
            "from sin.lore.kernel.org (sin.lore.kernel.org\n [IPv6:2600:3c15:e001:75::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dXDkh5T5cz1y2F\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 19 Dec 2025 02:15:40 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sin.lore.kernel.org (Postfix) with ESMTP id 1EB9D301913B\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 18 Dec 2025 15:15:34 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id A0459225775;\n\tThu, 18 Dec 2025 15:15:29 +0000 (UTC)",
            "from mgamail.intel.com (mgamail.intel.com [192.198.163.9])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 823C92EC0A7;\n\tThu, 18 Dec 2025 15:15:20 +0000 (UTC)",
            "from orviesa010.jf.intel.com ([10.64.159.150])\n  by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 18 Dec 2025 07:15:18 -0800",
            "from black.igk.intel.com ([10.91.253.5])\n  by orviesa010.jf.intel.com with ESMTP; 18 Dec 2025 07:15:17 -0800"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1766070928; cv=none;\n b=I9ztXjhAU4eLOaer9rsIXem80Uk3dgrsjXDQN9oH6egb1ZOiNOw9cqkjE8ZkDlplOAfNTdkBrso2HrttGKT9mnVXDmA6vC/fXLIPu4uFb9rBLnbNQDYM4VQNQwwfx9V+FwUhRRmtbCLyGrTAERJwRDXGlA1ZfEIewW8C0yM0NqM=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1766070928; c=relaxed/simple;\n\tbh=LOFyzY+s40BW9OGVVI9S8t54tp2Xdd8z4HLtupMLEH0=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=QQfG/SGX0J9ZYp7EULD2XfSzj51UcucaP5SnVQQWH9+bWfu5CoQ7OnXyMzpaY7nqNtldA1TqW95D5XQUsgf0ESBYESOLh3S8YfSXTVYDlO/Jr+ihBM6f1waW7xWZqPQO+xyc44gLAviSMZ6DqpNhWPZ6AJPyS85uaQiDdc4qY0g=",
        "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.intel.com;\n spf=pass smtp.mailfrom=linux.intel.com;\n dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com\n header.b=YC3Wcv+y; arc=none smtp.client-ip=192.198.163.9",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n  d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n  t=1766070921; x=1797606921;\n  h=from:to:cc:subject:date:message-id:in-reply-to:\n   references:mime-version:content-transfer-encoding;\n  bh=LOFyzY+s40BW9OGVVI9S8t54tp2Xdd8z4HLtupMLEH0=;\n  b=YC3Wcv+yNAQ6hIs4HgYLvMKwaI3cHxscwju5cHZI5+6UC4xQbje3jPof\n   oyZr7hSDXlO2+LJFRddKsVViVlKCT5rU5aForELtmaWuwgajB97P/EyWI\n   2sRHEkgS0C27j/hJMYM/thmm2nviObHu9/+gOvSAxwEVISQxYZduHblWt\n   e2/rcjw1NRYfWeBy4zjWRDUgn4jMmtirrpduvDPOa2iI/eBWXqNihdG46\n   H6w4RH9rOB5I1kO1MZmAMo0tY4y8sTYXCzA2bcJn/tYr735iVxUMkLzKv\n   jd2ZJmSEA57RZP2faoUtvNi+sjLMCMhD8s6LaMpsd3lKczS5Fi4HB/tfb\n   g==;",
        "X-CSE-ConnectionGUID": [
            "jIpi+1oNRlCBq19K+jCHcQ==",
            "Cmny67/RS/mMPhmmKq5mYQ=="
        ],
        "X-CSE-MsgGUID": [
            "Nqr2DVj+RF2dpLLgtkAWaw==",
            "ztlFSxUXQ9OrDlaGTKmC2w=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6800,10657,11646\"; a=\"78739540\"",
            "E=Sophos;i=\"6.21,158,1763452800\";\n   d=\"scan'208\";a=\"78739540\"",
            "E=Sophos;i=\"6.21,158,1763452800\";\n   d=\"scan'208\";a=\"197857498\""
        ],
        "X-ExtLoop1": "1",
        "From": "Heikki Krogerus <heikki.krogerus@linux.intel.com>",
        "To": "Andi Shyti <andi.shyti@kernel.org>,\n\tMika Westerberg <mika.westerberg@linux.intel.com>",
        "Cc": "Andy Shevchenko <andriy.shevchenko@linux.intel.com>,\n\tJan Dabros <jsd@semihalf.com>,\n\tRaag Jadav <raag.jadav@intel.com>,\n\tlinux-i2c@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org",
        "Subject": "[PATCH v2 3/6] i2c: designware: Combine some of the common functions",
        "Date": "Thu, 18 Dec 2025 16:15:02 +0100",
        "Message-ID": "<20251218151509.361617-4-heikki.krogerus@linux.intel.com>",
        "X-Mailer": "git-send-email 2.50.1",
        "In-Reply-To": "<20251218151509.361617-1-heikki.krogerus@linux.intel.com>",
        "References": "<20251218151509.361617-1-heikki.krogerus@linux.intel.com>",
        "Precedence": "bulk",
        "X-Mailing-List": "linux-i2c@vger.kernel.org",
        "List-Id": "<linux-i2c.vger.kernel.org>",
        "List-Subscribe": "<mailto:linux-i2c+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:linux-i2c+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit"
    },
    "content": "The adapter can be registered just in the core instead of\nseparately in the master and slave drivers. The same applies\nto the interrupt.\n\nSigned-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>\n---\n drivers/i2c/busses/i2c-designware-common.c | 108 +++++++++++++++++++--\n drivers/i2c/busses/i2c-designware-core.h   |  11 ++-\n drivers/i2c/busses/i2c-designware-master.c |  97 +++---------------\n drivers/i2c/busses/i2c-designware-slave.c  |  53 ++--------\n 4 files changed, 126 insertions(+), 143 deletions(-)",
    "diff": "diff --git a/drivers/i2c/busses/i2c-designware-common.c b/drivers/i2c/busses/i2c-designware-common.c\nindex 5b1e8f74c4ac..1823e4b71004 100644\n--- a/drivers/i2c/busses/i2c-designware-common.c\n+++ b/drivers/i2c/busses/i2c-designware-common.c\n@@ -131,7 +131,7 @@ static int dw_reg_write_word(void *context, unsigned int reg, unsigned int val)\n  *\n  * Return: 0 on success, or negative errno otherwise.\n  */\n-int i2c_dw_init_regmap(struct dw_i2c_dev *dev)\n+static int i2c_dw_init_regmap(struct dw_i2c_dev *dev)\n {\n \tstruct regmap_config map_cfg = {\n \t\t.reg_bits = 32,\n@@ -457,7 +457,7 @@ u32 i2c_dw_scl_lcnt(struct dw_i2c_dev *dev, unsigned int reg, u32 ic_clk,\n \treturn DIV_ROUND_CLOSEST_ULL((u64)ic_clk * (tLOW + tf), MICRO) - 1 + offset;\n }\n \n-int i2c_dw_set_sda_hold(struct dw_i2c_dev *dev)\n+static int i2c_dw_set_sda_hold(struct dw_i2c_dev *dev)\n {\n \tunsigned int reg;\n \tint ret;\n@@ -672,7 +672,7 @@ int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev)\n \treturn -EIO;\n }\n \n-int i2c_dw_set_fifo_size(struct dw_i2c_dev *dev)\n+static int i2c_dw_set_fifo_size(struct dw_i2c_dev *dev)\n {\n \tu32 tx_fifo_depth, rx_fifo_depth;\n \tunsigned int param;\n@@ -741,19 +741,113 @@ void i2c_dw_disable(struct dw_i2c_dev *dev)\n }\n EXPORT_SYMBOL_GPL(i2c_dw_disable);\n \n+static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)\n+{\n+\tstruct dw_i2c_dev *dev = dev_id;\n+\n+\tif (dev->mode == DW_IC_SLAVE)\n+\t\treturn i2c_dw_isr_slave(dev);\n+\n+\treturn i2c_dw_isr_master(dev);\n+}\n+\n+static const struct i2c_algorithm i2c_dw_algo = {\n+\t.xfer = i2c_dw_xfer,\n+\t.functionality = i2c_dw_func,\n+#if IS_ENABLED(CONFIG_I2C_SLAVE)\n+\t.reg_slave = i2c_dw_reg_slave,\n+\t.unreg_slave = i2c_dw_unreg_slave,\n+#endif\n+};\n+\n+static const struct i2c_adapter_quirks i2c_dw_quirks = {\n+\t.flags = I2C_AQ_NO_ZERO_LEN,\n+};\n+\n int i2c_dw_probe(struct dw_i2c_dev *dev)\n {\n+\tstruct i2c_adapter *adap = &dev->adapter;\n+\tunsigned long irq_flags;\n+\tint ret;\n+\n \tdevice_set_node(&dev->adapter.dev, dev_fwnode(dev->dev));\n \n+\tret = i2c_dw_init_regmap(dev);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = i2c_dw_set_sda_hold(dev);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = i2c_dw_set_fifo_size(dev);\n+\tif (ret)\n+\t\treturn ret;\n+\n \tswitch (dev->mode) {\n \tcase DW_IC_SLAVE:\n-\t\treturn i2c_dw_probe_slave(dev);\n+\t\tret = i2c_dw_probe_slave(dev);\n+\t\tbreak;\n \tcase DW_IC_MASTER:\n-\t\treturn i2c_dw_probe_master(dev);\n+\t\tret = i2c_dw_probe_master(dev);\n+\t\tbreak;\n \tdefault:\n-\t\tdev_err(dev->dev, \"Wrong operation mode: %d\\n\", dev->mode);\n-\t\treturn -EINVAL;\n+\t\tret = -EINVAL;\n+\t\tbreak;\n \t}\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = dev->init(dev);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tif (!adap->name[0])\n+\t\tstrscpy(adap->name, \"Synopsys DesignWare I2C adapter\");\n+\n+\tadap->retries = 3;\n+\tadap->algo = &i2c_dw_algo;\n+\tadap->quirks = &i2c_dw_quirks;\n+\tadap->dev.parent = dev->dev;\n+\ti2c_set_adapdata(adap, dev);\n+\n+\t/*\n+\t * REVISIT: The mode check may not be necessary.\n+\t * For now keeping the flags as they were originally.\n+\t */\n+\tif (dev->mode == DW_IC_SLAVE)\n+\t\tirq_flags = IRQF_SHARED;\n+\telse if (dev->flags & ACCESS_NO_IRQ_SUSPEND)\n+\t\tirq_flags = IRQF_NO_SUSPEND;\n+\telse\n+\t\tirq_flags = IRQF_SHARED | IRQF_COND_SUSPEND;\n+\n+\tret = i2c_dw_acquire_lock(dev);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t__i2c_dw_write_intr_mask(dev, 0);\n+\ti2c_dw_release_lock(dev);\n+\n+\tif (!(dev->flags & ACCESS_POLLING)) {\n+\t\tret = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr,\n+\t\t\t\t       irq_flags, dev_name(dev->dev), dev);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n+\t/*\n+\t * Increment PM usage count during adapter registration in order to\n+\t * avoid possible spurious runtime suspend when adapter device is\n+\t * registered to the device core and immediate resume in case bus has\n+\t * registered I2C slaves that do I2C transfers in their probe.\n+\t */\n+\tACQUIRE(pm_runtime_noresume, pm)(dev->dev);\n+\tret = ACQUIRE_ERR(pm_runtime_noresume, &pm);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\treturn i2c_add_numbered_adapter(adap);\n }\n EXPORT_SYMBOL_GPL(i2c_dw_probe);\n \ndiff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h\nindex 2a7decc24931..0f58c4b50377 100644\n--- a/drivers/i2c/busses/i2c-designware-core.h\n+++ b/drivers/i2c/busses/i2c-designware-core.h\n@@ -13,6 +13,7 @@\n #include <linux/completion.h>\n #include <linux/errno.h>\n #include <linux/i2c.h>\n+#include <linux/irqreturn.h>\n #include <linux/pm.h>\n #include <linux/regmap.h>\n #include <linux/types.h>\n@@ -333,20 +334,18 @@ struct i2c_dw_semaphore_callbacks {\n \tint\t(*probe)(struct dw_i2c_dev *dev);\n };\n \n-int i2c_dw_init_regmap(struct dw_i2c_dev *dev);\n u32 i2c_dw_scl_hcnt(struct dw_i2c_dev *dev, unsigned int reg, u32 ic_clk,\n \t\t    u32 tSYMBOL, u32 tf, int offset);\n u32 i2c_dw_scl_lcnt(struct dw_i2c_dev *dev, unsigned int reg, u32 ic_clk,\n \t\t    u32 tLOW, u32 tf, int offset);\n-int i2c_dw_set_sda_hold(struct dw_i2c_dev *dev);\n u32 i2c_dw_clk_rate(struct dw_i2c_dev *dev);\n int i2c_dw_prepare_clk(struct dw_i2c_dev *dev, bool prepare);\n int i2c_dw_acquire_lock(struct dw_i2c_dev *dev);\n void i2c_dw_release_lock(struct dw_i2c_dev *dev);\n int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev);\n int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev);\n-int i2c_dw_set_fifo_size(struct dw_i2c_dev *dev);\n u32 i2c_dw_func(struct i2c_adapter *adap);\n+irqreturn_t i2c_dw_isr_master(struct dw_i2c_dev *dev);\n \n extern const struct dev_pm_ops i2c_dw_dev_pm_ops;\n \n@@ -386,12 +385,18 @@ void i2c_dw_disable(struct dw_i2c_dev *dev);\n extern void i2c_dw_configure_master(struct dw_i2c_dev *dev);\n extern int i2c_dw_probe_master(struct dw_i2c_dev *dev);\n \n+int i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);\n+\n #if IS_ENABLED(CONFIG_I2C_SLAVE)\n extern void i2c_dw_configure_slave(struct dw_i2c_dev *dev);\n extern int i2c_dw_probe_slave(struct dw_i2c_dev *dev);\n+irqreturn_t i2c_dw_isr_slave(struct dw_i2c_dev *dev);\n+int i2c_dw_reg_slave(struct i2c_client *client);\n+int i2c_dw_unreg_slave(struct i2c_client *client);\n #else\n static inline void i2c_dw_configure_slave(struct dw_i2c_dev *dev) { }\n static inline int i2c_dw_probe_slave(struct dw_i2c_dev *dev) { return -EINVAL; }\n+static inline irqreturn_t i2c_dw_isr_slave(struct dw_i2c_dev *dev) { return IRQ_NONE; }\n #endif\n \n static inline void i2c_dw_configure(struct dw_i2c_dev *dev)\ndiff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c\nindex 15b3a46f0132..91540a4520a3 100644\n--- a/drivers/i2c/busses/i2c-designware-master.c\n+++ b/drivers/i2c/busses/i2c-designware-master.c\n@@ -191,10 +191,6 @@ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)\n \t\t\tdev->hs_hcnt, dev->hs_lcnt);\n \t}\n \n-\tret = i2c_dw_set_sda_hold(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n \tdev_dbg(dev->dev, \"Bus speed: %s\\n\", i2c_freq_mode_string(t->bus_freq_hz));\n \treturn 0;\n }\n@@ -353,9 +349,8 @@ static int i2c_dw_status(struct dw_i2c_dev *dev)\n  * Initiate and continue master read/write transaction with polling\n  * based transfer routine afterward write messages into the Tx buffer.\n  */\n-static int amd_i2c_dw_xfer_quirk(struct i2c_adapter *adap, struct i2c_msg *msgs, int num_msgs)\n+static int amd_i2c_dw_xfer_quirk(struct dw_i2c_dev *dev, struct i2c_msg *msgs, int num_msgs)\n {\n-\tstruct dw_i2c_dev *dev = i2c_get_adapdata(adap);\n \tint msg_wrt_idx, msg_itr_lmt, buf_len, data_idx;\n \tint cmd = 0, status;\n \tu8 *tx_buf;\n@@ -752,9 +747,8 @@ static void i2c_dw_process_transfer(struct dw_i2c_dev *dev, unsigned int stat)\n  * Interrupt service routine. This gets called whenever an I2C master interrupt\n  * occurs.\n  */\n-static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)\n+irqreturn_t i2c_dw_isr_master(struct dw_i2c_dev *dev)\n {\n-\tstruct dw_i2c_dev *dev = dev_id;\n \tunsigned int stat, enabled;\n \n \tregmap_read(dev->map, DW_IC_ENABLE, &enabled);\n@@ -815,9 +809,8 @@ static int i2c_dw_wait_transfer(struct dw_i2c_dev *dev)\n  * Prepare controller for a transaction and call i2c_dw_xfer_msg.\n  */\n static int\n-i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)\n+i2c_dw_xfer_common(struct dw_i2c_dev *dev, struct i2c_msg msgs[], int num)\n {\n-\tstruct dw_i2c_dev *dev = i2c_get_adapdata(adap);\n \tint ret;\n \n \tdev_dbg(dev->dev, \"%s: msgs: %d\\n\", __func__, num);\n@@ -908,19 +901,15 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)\n \treturn ret;\n }\n \n-static const struct i2c_algorithm i2c_dw_algo = {\n-\t.xfer = i2c_dw_xfer,\n-\t.functionality = i2c_dw_func,\n-};\n+int i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)\n+{\n+\tstruct dw_i2c_dev *dev = i2c_get_adapdata(adap);\n \n-static const struct i2c_algorithm amd_i2c_dw_algo = {\n-\t.xfer = amd_i2c_dw_xfer_quirk,\n-\t.functionality = i2c_dw_func,\n-};\n+\tif ((dev->flags & MODEL_MASK) == MODEL_AMD_NAVI_GPU)\n+\t\treturn amd_i2c_dw_xfer_quirk(dev, msgs, num);\n \n-static const struct i2c_adapter_quirks i2c_dw_quirks = {\n-\t.flags = I2C_AQ_NO_ZERO_LEN,\n-};\n+\treturn i2c_dw_xfer_common(dev, msgs, num);\n+}\n \n void i2c_dw_configure_master(struct dw_i2c_dev *dev)\n {\n@@ -1005,8 +994,6 @@ static int i2c_dw_init_recovery_info(struct dw_i2c_dev *dev)\n \n int i2c_dw_probe_master(struct dw_i2c_dev *dev)\n {\n-\tstruct i2c_adapter *adap = &dev->adapter;\n-\tunsigned long irq_flags;\n \tunsigned int ic_con;\n \tint ret;\n \n@@ -1014,18 +1001,10 @@ int i2c_dw_probe_master(struct dw_i2c_dev *dev)\n \n \tdev->init = i2c_dw_init_master;\n \n-\tret = i2c_dw_init_regmap(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n \tret = i2c_dw_set_timings_master(dev);\n \tif (ret)\n \t\treturn ret;\n \n-\tret = i2c_dw_set_fifo_size(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n \t/* Lock the bus for accessing DW_IC_CON */\n \tret = i2c_dw_acquire_lock(dev);\n \tif (ret)\n@@ -1045,61 +1024,7 @@ int i2c_dw_probe_master(struct dw_i2c_dev *dev)\n \tif (ic_con & DW_IC_CON_BUS_CLEAR_CTRL)\n \t\tdev->master_cfg |= DW_IC_CON_BUS_CLEAR_CTRL;\n \n-\tret = dev->init(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\tif (!adap->name[0])\n-\t\tscnprintf(adap->name, sizeof(adap->name),\n-\t\t\t  \"Synopsys DesignWare I2C adapter\");\n-\tadap->retries = 3;\n-\tif ((dev->flags & MODEL_MASK) == MODEL_AMD_NAVI_GPU)\n-\t\tadap->algo = &amd_i2c_dw_algo;\n-\telse\n-\t\tadap->algo = &i2c_dw_algo;\n-\tadap->quirks = &i2c_dw_quirks;\n-\tadap->dev.parent = dev->dev;\n-\ti2c_set_adapdata(adap, dev);\n-\n-\tif (dev->flags & ACCESS_NO_IRQ_SUSPEND) {\n-\t\tirq_flags = IRQF_NO_SUSPEND;\n-\t} else {\n-\t\tirq_flags = IRQF_SHARED | IRQF_COND_SUSPEND;\n-\t}\n-\n-\tret = i2c_dw_acquire_lock(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\t__i2c_dw_write_intr_mask(dev, 0);\n-\ti2c_dw_release_lock(dev);\n-\n-\tif (!(dev->flags & ACCESS_POLLING)) {\n-\t\tret = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr,\n-\t\t\t\t       irq_flags, dev_name(dev->dev), dev);\n-\t\tif (ret)\n-\t\t\treturn dev_err_probe(dev->dev, ret,\n-\t\t\t\t\t     \"failure requesting irq %i: %d\\n\",\n-\t\t\t\t\t     dev->irq, ret);\n-\t}\n-\n-\tret = i2c_dw_init_recovery_info(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\t/*\n-\t * Increment PM usage count during adapter registration in order to\n-\t * avoid possible spurious runtime suspend when adapter device is\n-\t * registered to the device core and immediate resume in case bus has\n-\t * registered I2C slaves that do I2C transfers in their probe.\n-\t */\n-\tpm_runtime_get_noresume(dev->dev);\n-\tret = i2c_add_numbered_adapter(adap);\n-\tif (ret)\n-\t\tdev_err(dev->dev, \"failure adding adapter: %d\\n\", ret);\n-\tpm_runtime_put_noidle(dev->dev);\n-\n-\treturn ret;\n+\treturn i2c_dw_init_recovery_info(dev);\n }\n \n MODULE_DESCRIPTION(\"Synopsys DesignWare I2C bus master adapter\");\ndiff --git a/drivers/i2c/busses/i2c-designware-slave.c b/drivers/i2c/busses/i2c-designware-slave.c\nindex 1995be79544d..c0baf53e97d8 100644\n--- a/drivers/i2c/busses/i2c-designware-slave.c\n+++ b/drivers/i2c/busses/i2c-designware-slave.c\n@@ -63,7 +63,7 @@ static int i2c_dw_init_slave(struct dw_i2c_dev *dev)\n \treturn 0;\n }\n \n-static int i2c_dw_reg_slave(struct i2c_client *slave)\n+int i2c_dw_reg_slave(struct i2c_client *slave)\n {\n \tstruct dw_i2c_dev *dev = i2c_get_adapdata(slave->adapter);\n \n@@ -88,7 +88,7 @@ static int i2c_dw_reg_slave(struct i2c_client *slave)\n \treturn 0;\n }\n \n-static int i2c_dw_unreg_slave(struct i2c_client *slave)\n+int i2c_dw_unreg_slave(struct i2c_client *slave)\n {\n \tstruct dw_i2c_dev *dev = i2c_get_adapdata(slave->adapter);\n \n@@ -152,9 +152,8 @@ static u32 i2c_dw_read_clear_intrbits_slave(struct dw_i2c_dev *dev)\n  * Interrupt service routine. This gets called whenever an I2C slave interrupt\n  * occurs.\n  */\n-static irqreturn_t i2c_dw_isr_slave(int this_irq, void *dev_id)\n+irqreturn_t i2c_dw_isr_slave(struct dw_i2c_dev *dev)\n {\n-\tstruct dw_i2c_dev *dev = dev_id;\n \tunsigned int raw_stat, stat, enabled, tmp;\n \tu8 val = 0, slave_activity;\n \n@@ -217,12 +216,6 @@ static irqreturn_t i2c_dw_isr_slave(int this_irq, void *dev_id)\n \treturn IRQ_HANDLED;\n }\n \n-static const struct i2c_algorithm i2c_dw_algo = {\n-\t.functionality = i2c_dw_func,\n-\t.reg_slave = i2c_dw_reg_slave,\n-\t.unreg_slave = i2c_dw_unreg_slave,\n-};\n-\n void i2c_dw_configure_slave(struct dw_i2c_dev *dev)\n {\n \tdev->functionality = I2C_FUNC_SLAVE;\n@@ -236,46 +229,12 @@ EXPORT_SYMBOL_GPL(i2c_dw_configure_slave);\n \n int i2c_dw_probe_slave(struct dw_i2c_dev *dev)\n {\n-\tstruct i2c_adapter *adap = &dev->adapter;\n-\tint ret;\n+\tif (dev->flags & ACCESS_POLLING)\n+\t\treturn -EOPNOTSUPP;\n \n \tdev->init = i2c_dw_init_slave;\n \n-\tret = i2c_dw_init_regmap(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\tret = i2c_dw_set_sda_hold(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\tret = i2c_dw_set_fifo_size(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\tret = dev->init(dev);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\tsnprintf(adap->name, sizeof(adap->name),\n-\t\t \"Synopsys DesignWare I2C Slave adapter\");\n-\tadap->retries = 3;\n-\tadap->algo = &i2c_dw_algo;\n-\tadap->dev.parent = dev->dev;\n-\ti2c_set_adapdata(adap, dev);\n-\n-\tret = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr_slave,\n-\t\t\t       IRQF_SHARED, dev_name(dev->dev), dev);\n-\tif (ret)\n-\t\treturn dev_err_probe(dev->dev, ret,\n-\t\t\t\t     \"failure requesting IRQ %i: %d\\n\",\n-\t\t\t\t     dev->irq, ret);\n-\n-\tret = i2c_add_numbered_adapter(adap);\n-\tif (ret)\n-\t\tdev_err(dev->dev, \"failure adding adapter: %d\\n\", ret);\n-\n-\treturn ret;\n+\treturn 0;\n }\n \n MODULE_AUTHOR(\"Luis Oliveira <lolivei@synopsys.com>\");\n",
    "prefixes": [
        "v2",
        "3/6"
    ]
}