Received: by 2002:a25:86ce:0:0:0:0:0 with SMTP id y14csp593951ybm; Mon, 20 May 2019 23:36:55 -0700 (PDT) X-Google-Smtp-Source: APXvYqwawW6b3a6oYZu9fv2Oa0JUs8ic/PP8OkTazfWxkmlFYIkAkAHpsUHXoJ/CknTpbGmVICjQ X-Received: by 2002:a63:c64c:: with SMTP id x12mr79470689pgg.379.1558420615076; Mon, 20 May 2019 23:36:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558420615; cv=none; d=google.com; s=arc-20160816; b=PY0bNnL+oJd47IlnXuVHCnWugQgF/0daTwDRrWnrYigLOyrj12pFCHsri+eRZLxIHy lvQZCL3PXmmZOP6Grfw9n9vVepPsaSsEX5OvhKZ/yW/xYapv7ZM3DweqzJjhTtrZ136m UdF+8L9rgSZku3kxLXiq237vn2TbFhw5/w7rE6lmGtFcM/w8Zvl8XNaTeDjbEJT80isp wkxE1belC9fdRbqdEkAFMNlkBRFTsw3BchXQft858wSjChUJqPF9L3XhwiBwjD7hr/H6 dNomcIj0rDinf5OsRBVIE0FeYG3qpliH2ggF9Cnz2LohGRTJgEtlKnQK9HUGqFhw65Wi nQvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=W3GlCv1Xf75voj97yMkTOk+viJux+/jCsXzHPW1rbqc=; b=mDh121o64B5uffM+S/NDR/jRzLSwqU5Sj0RTyfvOvjW0VZ5WjGyw2Fj4/jwrwen4U4 6Y+mmWag6DGYD1LG9jWmr5euozLkaqIB96y3kiIl7Djsr1xjeo8JR7RXsFMIwDpgukKt Votheg1RFWmz/PDy5d5dYHpRJzNIySQj6HSLE0G583eqFCNvYlUfizai6C5NEzuh/IYy Xx/bxKettUmy2156nU9DgWl/zFHmiPIaG4JQkRzyOPxM/vS3sTPcYzB7utdp/SLtzwT6 F8KicwNYfnyucbgfcd3rbw7lN8cBg7y3xd5w0xVoidYYaXduwguUUU5EFdctSgsGPYRw g3Tw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 129si22668056pfb.270.2019.05.20.23.36.39; Mon, 20 May 2019 23:36:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727995AbfEUGfe (ORCPT + 99 others); Tue, 21 May 2019 02:35:34 -0400 Received: from olimex.com ([184.105.72.32]:39401 "EHLO olimex.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725835AbfEUGfd (ORCPT ); Tue, 21 May 2019 02:35:33 -0400 Received: from localhost.localdomain ([94.155.250.134]) by olimex.com with ESMTPSA (ECDHE-RSA-AES128-GCM-SHA256:TLSv1.2:Kx=ECDH:Au=RSA:Enc=AESGCM(128):Mac=AEAD) (SMTP-AUTH username stefan@olimex.com, mechanism PLAIN) for ; Mon, 20 May 2019 23:25:27 -0700 From: Stefan Mavrodiev To: Heiko Stuebner , Lee Jones , linux-kernel@vger.kernel.org Cc: Stefan Mavrodiev Subject: [PATCH v2 1/2] mfd: rk808: Check pm_power_off pointer Date: Tue, 21 May 2019 09:24:48 +0300 Message-Id: <20190521062449.29410-2-stefan@olimex.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190521062449.29410-1-stefan@olimex.com> References: <20190521062449.29410-1-stefan@olimex.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The function pointer pm_power_off may point to function from other module (PSCI for example). If rk808 is removed, pm_power_off is overwritten to NULL and the system cannot be powered off. This patch checks if pm_power_off points to a module function. Signed-off-by: Stefan Mavrodiev --- Changes in v2: - Initial release actually drivers/mfd/rk808.c | 13 +++++++------ include/linux/mfd/rk808.h | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c index 94377782d208..c0b179792bbf 100644 --- a/drivers/mfd/rk808.c +++ b/drivers/mfd/rk808.c @@ -438,7 +438,6 @@ static int rk808_probe(struct i2c_client *client, struct rk808 *rk808; const struct rk808_reg_data *pre_init_reg; const struct mfd_cell *cells; - void (*pm_pwroff_fn)(void); int nr_pre_init_regs; int nr_cells; int pm_off = 0, msb, lsb; @@ -475,7 +474,7 @@ static int rk808_probe(struct i2c_client *client, nr_pre_init_regs = ARRAY_SIZE(rk805_pre_init_reg); cells = rk805s; nr_cells = ARRAY_SIZE(rk805s); - pm_pwroff_fn = rk805_device_shutdown; + rk808->pm_pwroff_fn = rk805_device_shutdown; break; case RK808_ID: rk808->regmap_cfg = &rk808_regmap_config; @@ -484,7 +483,7 @@ static int rk808_probe(struct i2c_client *client, nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg); cells = rk808s; nr_cells = ARRAY_SIZE(rk808s); - pm_pwroff_fn = rk808_device_shutdown; + rk808->pm_pwroff_fn = rk808_device_shutdown; break; case RK818_ID: rk808->regmap_cfg = &rk818_regmap_config; @@ -493,7 +492,7 @@ static int rk808_probe(struct i2c_client *client, nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg); cells = rk818s; nr_cells = ARRAY_SIZE(rk818s); - pm_pwroff_fn = rk818_device_shutdown; + rk808->pm_pwroff_fn = rk818_device_shutdown; break; default: dev_err(&client->dev, "Unsupported RK8XX ID %lu\n", @@ -548,7 +547,7 @@ static int rk808_probe(struct i2c_client *client, "rockchip,system-power-controller"); if (pm_off && !pm_power_off) { rk808_i2c_client = client; - pm_power_off = pm_pwroff_fn; + pm_power_off = rk808->pm_pwroff_fn; } return 0; @@ -563,7 +562,9 @@ static int rk808_remove(struct i2c_client *client) struct rk808 *rk808 = i2c_get_clientdata(client); regmap_del_irq_chip(client->irq, rk808->irq_data); - pm_power_off = NULL; + + if (rk808->pm_pwroff_fn && pm_power_off == rk808->pm_pwroff_fn) + pm_power_off = NULL; return 0; } diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h index d3156594674c..8b5d68a7bb9c 100644 --- a/include/linux/mfd/rk808.h +++ b/include/linux/mfd/rk808.h @@ -453,5 +453,6 @@ struct rk808 { long variant; const struct regmap_config *regmap_cfg; const struct regmap_irq_chip *regmap_irq_chip; + void (*pm_pwroff_fn)(void); }; #endif /* __LINUX_REGULATOR_RK808_H */ -- 2.17.1