get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 793176,
    "url": "http://patchwork.ozlabs.org/api/patches/793176/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/patch/1500954024-6860-10-git-send-email-preid@electromag.com.au/",
    "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": "<1500954024-6860-10-git-send-email-preid@electromag.com.au>",
    "list_archive_url": null,
    "date": "2017-07-25T03:40:23",
    "name": "[v10,09/10] power: supply: sbs-manager: Add alert callback and battery change notification",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "0f85c5132b5d67691886fd8bf709f278807af1dc",
    "submitter": {
        "id": 66145,
        "url": "http://patchwork.ozlabs.org/api/people/66145/?format=api",
        "name": "Phil Reid",
        "email": "preid@electromag.com.au"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-i2c/patch/1500954024-6860-10-git-send-email-preid@electromag.com.au/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/793176/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/793176/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<linux-i2c-owner@vger.kernel.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-i2c-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xGkY61j1dz9s78\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 25 Jul 2017 13:40:58 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1755455AbdGYDku (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tMon, 24 Jul 2017 23:40:50 -0400",
            "from anchovy2.45ru.net.au ([203.30.46.146]:51569 \"EHLO\n\tanchovy.45ru.net.au\" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org\n\twith ESMTP id S1754791AbdGYDkg (ORCPT\n\t<rfc822; linux-i2c@vger.kernel.org>); Mon, 24 Jul 2017 23:40:36 -0400",
            "(qmail 15025 invoked by uid 5089); 25 Jul 2017 03:40:33 -0000",
            "by simscan 1.2.0 ppid: 14958, pid: 14959, t: 0.0555s\n\tscanners: regex: 1.2.0 attach: 1.2.0 clamav: 0.88.3/m:40/d:1950",
            "from unknown (HELO preid-centos7.electromag.com.au)\n\t(preid@electromag.com.au@203.59.230.133)\n\tby anchovy3.45ru.net.au with ESMTPA; 25 Jul 2017 03:40:33 -0000",
            "by preid-centos7.electromag.com.au (Postfix, from userid 1000)\n\tid A43F730249B7F; Tue, 25 Jul 2017 11:40:29 +0800 (AWST)"
        ],
        "X-RBL": "$rbltext",
        "From": "Phil Reid <preid@electromag.com.au>",
        "To": "wsa@the-dreams.de, robh+dt@kernel.org, mark.rutland@arm.com,\n\tsre@kernel.org, jdelvare@suse.com, jglauber@cavium.com,\n\tdavid.daney@cavium.com, peda@axentia.se, preid@electromag.com.au,\n\tbenjamin.tissoires@redhat.com, linux-i2c@vger.kernel.org,\n\tdevicetree@vger.kernel.org, linux-pm@vger.kernel.org",
        "Subject": "[PATCH v10 09/10] power: supply: sbs-manager: Add alert callback\n\tand battery change notification",
        "Date": "Tue, 25 Jul 2017 11:40:23 +0800",
        "Message-Id": "<1500954024-6860-10-git-send-email-preid@electromag.com.au>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1500954024-6860-1-git-send-email-preid@electromag.com.au>",
        "References": "<1500954024-6860-1-git-send-email-preid@electromag.com.au>",
        "Sender": "linux-i2c-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<linux-i2c.vger.kernel.org>",
        "X-Mailing-List": "linux-i2c@vger.kernel.org"
    },
    "content": "This adds smb alert support via the smbus_alert driver to generate\npower_supply_changed notifications when either external power is\nremoved / applied or a battery inserted / removed.\nUse the i2c alert callback to notify the attached battery driver that a\nchange has occurred.\n\nSigned-off-by: Phil Reid <preid@electromag.com.au>\nAcked-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>\n---\n drivers/power/supply/Kconfig       |   3 +-\n drivers/power/supply/sbs-manager.c | 129 +++++++++++++++++++++++++++++++++++--\n 2 files changed, 127 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig\nindex e7e16ec..1b05021 100644\n--- a/drivers/power/supply/Kconfig\n+++ b/drivers/power/supply/Kconfig\n@@ -186,7 +186,8 @@ config CHARGER_SBS\n \n config MANAGER_SBS\n \ttristate \"Smart Battery System Manager\"\n-\tdepends on I2C && I2C_MUX\n+\tdepends on I2C && I2C_MUX && GPIOLIB\n+\tselect I2C_SMBUS\n \thelp\n \t  Say Y here to include support for Smart Battery System Manager\n \t  ICs. The driver reports online and charging status via sysfs.\ndiff --git a/drivers/power/supply/sbs-manager.c b/drivers/power/supply/sbs-manager.c\nindex 47c09a1..3e3ad09 100644\n--- a/drivers/power/supply/sbs-manager.c\n+++ b/drivers/power/supply/sbs-manager.c\n@@ -16,10 +16,12 @@\n  * published by the Free Software Foundation.\n  */\n \n+#include <linux/gpio.h>\n #include <linux/module.h>\n #include <linux/i2c.h>\n #include <linux/i2c-mux.h>\n #include <linux/power_supply.h>\n+#include <linux/property.h>\n \n #define SBSM_MAX_BATS  4\n #define SBSM_RETRY_CNT 3\n@@ -43,7 +45,12 @@ struct sbsm_data {\n \tstruct power_supply *psy;\n \n \tu8 cur_chan;          /* currently selected channel */\n+\tstruct gpio_chip chip;\n \tbool is_ltc1760;      /* special capabilities */\n+\n+\tunsigned int supported_bats;\n+\tunsigned int last_state;\n+\tunsigned int last_state_cont;\n };\n \n static enum power_supply_property sbsm_props[] = {\n@@ -186,6 +193,117 @@ static int sbsm_select(struct i2c_mux_core *muxc, u32 chan)\n \treturn ret;\n }\n \n+static int sbsm_gpio_get_value(struct gpio_chip *gc, unsigned off)\n+{\n+\tstruct sbsm_data *data = gpiochip_get_data(gc);\n+\tint ret;\n+\n+\tret = sbsm_read_word(data->client, SBSM_CMD_BATSYSSTATE);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\treturn ret & BIT(off);\n+}\n+\n+/*\n+ * This needs to be defined or the GPIO lib fails to register the pin.\n+ * But the 'gpio' is always an input.\n+ */\n+static int sbsm_gpio_direction_input(struct gpio_chip *gc, unsigned off)\n+{\n+\treturn 0;\n+}\n+\n+static int sbsm_do_alert(struct device *dev, void *d)\n+{\n+\tstruct i2c_client *client = i2c_verify_client(dev);\n+\tstruct i2c_driver *driver;\n+\n+\tif (!client || client->addr != 0x0b)\n+\t\treturn 0;\n+\n+\tdevice_lock(dev);\n+\tif (client->dev.driver) {\n+\t\tdriver = to_i2c_driver(client->dev.driver);\n+\t\tif (driver->alert)\n+\t\t\tdriver->alert(client, I2C_PROTOCOL_SMBUS_ALERT, 0);\n+\t\telse\n+\t\t\tdev_warn(&client->dev, \"no driver alert()!\\n\");\n+\t} else\n+\t\tdev_dbg(&client->dev, \"alert with no driver\\n\");\n+\tdevice_unlock(dev);\n+\n+\treturn -EBUSY;\n+}\n+\n+static void sbsm_alert(struct i2c_client *client, enum i2c_alert_protocol prot,\n+\t\t       unsigned int d)\n+{\n+\tstruct sbsm_data *sbsm = i2c_get_clientdata(client);\n+\n+\tint ret, i, irq_bat = 0, state = 0;\n+\n+\tret = sbsm_read_word(sbsm->client, SBSM_CMD_BATSYSSTATE);\n+\tif (ret >= 0) {\n+\t\tirq_bat = ret ^ sbsm->last_state;\n+\t\tsbsm->last_state = ret;\n+\t\tstate = ret;\n+\t}\n+\n+\tret = sbsm_read_word(sbsm->client, SBSM_CMD_BATSYSSTATECONT);\n+\tif ((ret >= 0) &&\n+\t    ((ret ^ sbsm->last_state_cont) & SBSM_BIT_AC_PRESENT)) {\n+\t\tirq_bat |= sbsm->supported_bats & state;\n+\t\tpower_supply_changed(sbsm->psy);\n+\t}\n+\tsbsm->last_state_cont = ret;\n+\n+\tfor (i = 0; i < SBSM_MAX_BATS; i++) {\n+\t\tif (irq_bat & BIT(i)) {\n+\t\t\tdevice_for_each_child(&sbsm->muxc->adapter[i]->dev,\n+\t\t\t\t\t      NULL, sbsm_do_alert);\n+\t\t}\n+\t}\n+}\n+\n+static int sbsm_gpio_setup(struct sbsm_data *data)\n+{\n+\tstruct gpio_chip *gc = &data->chip;\n+\tstruct i2c_client *client = data->client;\n+\tstruct device *dev = &client->dev;\n+\tint ret;\n+\n+\tif (!device_property_present(dev, \"gpio-controller\"))\n+\t\treturn 0;\n+\n+\tret  = sbsm_read_word(client, SBSM_CMD_BATSYSSTATE);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\tdata->last_state = ret;\n+\n+\tret  = sbsm_read_word(client, SBSM_CMD_BATSYSSTATECONT);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\tdata->last_state_cont = ret;\n+\n+\tgc->get = sbsm_gpio_get_value;\n+\tgc->direction_input  = sbsm_gpio_direction_input;\n+\tgc->can_sleep = true;\n+\tgc->base = -1;\n+\tgc->ngpio = SBSM_MAX_BATS;\n+\tgc->label = client->name;\n+\tgc->parent = dev;\n+\tgc->owner = THIS_MODULE;\n+\n+\tret = devm_gpiochip_add_data(dev, gc, data);\n+\tif (ret) {\n+\t\tdev_err(dev, \"devm_gpiochip_add_data failed: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\treturn ret;\n+}\n+\n static const struct power_supply_desc sbsm_default_psy_desc = {\n \t.type = POWER_SUPPLY_TYPE_MAINS,\n \t.properties = sbsm_props,\n@@ -203,7 +321,7 @@ static int sbsm_probe(struct i2c_client *client,\n \tstruct device *dev = &client->dev;\n \tstruct power_supply_desc *psy_desc;\n \tstruct power_supply_config psy_cfg = {};\n-\tint ret = 0, i, supported_bats;\n+\tint ret = 0, i;\n \n \t/* Device listens only at address 0x0a */\n \tif (client->addr != 0x0a)\n@@ -224,8 +342,7 @@ static int sbsm_probe(struct i2c_client *client,\n \tret  = sbsm_read_word(client, SBSM_CMD_BATSYSINFO);\n \tif (ret < 0)\n \t\treturn ret;\n-\tsupported_bats = ret & SBSM_MASK_BAT_SUPPORTED;\n-\n+\tdata->supported_bats = ret & SBSM_MASK_BAT_SUPPORTED;\n \tdata->muxc = i2c_mux_alloc(adapter, dev, SBSM_MAX_BATS, 0,\n \t\t\t\t   I2C_MUX_LOCKED, &sbsm_select, NULL);\n \tif (!data->muxc) {\n@@ -237,7 +354,7 @@ static int sbsm_probe(struct i2c_client *client,\n \n \t/* register muxed i2c channels. One for each supported battery */\n \tfor (i = 0; i < SBSM_MAX_BATS; ++i) {\n-\t\tif (supported_bats & BIT(i)) {\n+\t\tif (data->supported_bats & BIT(i)) {\n \t\t\tret = i2c_mux_add_adapter(data->muxc, 0, i + 1, 0);\n \t\t\tif (ret)\n \t\t\t\tbreak;\n@@ -262,6 +379,9 @@ static int sbsm_probe(struct i2c_client *client,\n \t\tret = -ENOMEM;\n \t\tgoto err_psy;\n \t}\n+\tret = sbsm_gpio_setup(data);\n+\tif (ret < 0)\n+\t\tgoto err_psy;\n \n \tpsy_cfg.drv_data = data;\n \tpsy_cfg.of_node = dev->of_node;\n@@ -314,6 +434,7 @@ static int sbsm_remove(struct i2c_client *client)\n \t},\n \t.probe\t\t= sbsm_probe,\n \t.remove\t\t= sbsm_remove,\n+\t.alert\t\t= sbsm_alert,\n \t.id_table\t= sbsm_ids\n };\n module_i2c_driver(sbsm_driver);\n",
    "prefixes": [
        "v10",
        "09/10"
    ]
}