Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp2865540imm; Wed, 3 Oct 2018 10:18:35 -0700 (PDT) X-Google-Smtp-Source: ACcGV63ijyEeUCOy5RRYWaHSXi7QHPyL2cM2tR9muNNpdWrzarBr3myUFRH1jIBop8+d0DF4Z+UT X-Received: by 2002:a17:902:848d:: with SMTP id c13-v6mr2471757plo.303.1538587115292; Wed, 03 Oct 2018 10:18:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538587115; cv=none; d=google.com; s=arc-20160816; b=hD17qXlmpjH+jsDcW9tA5QmPAjxmXN6Q0fvouChAC2zCnpdbcn+d8ajkBg9hQbBx8d j+u7guNpGH5Qehz1JtSpISvXxBUKMqNJfjIdIBrAVZCcWZBXRzqyxNDLdR2JDK2g0GQp x2AUh0h1Lxyj5vG4UzEqXifd0yqFkJ2UOgCvJ70oFPp2lMdhJhvPV6THGNmMVmomv4Xe 68UEgh6osFcn5lqO90U22OuJfHfOLulJfUawXcX8AqymBS5pmgslaS50W0+iV6L+VwI0 PnnkuX7qy2z0a0yWRED0nUO32PNk1FVjTr8zcmp2HPx6Sthn1iCw3TnLjZeS8eqc24na GJTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=C004DOwT6NID5heV2WJGLPCnOGxQPBgCic5gZ0Jwtc0=; b=jgOg+VU6xvvDQIb1RK/60wJRZcGjs5zhPh3nQQU1RoWGe9K6SRZ+Q3kgc7xBpm/YI7 tyD/1hJxJm24/cgY5u+J85nzM6z7nccEReIw1NP2BysHipOLabFlf9dpR7VuP3pd54A5 ADPAX3FKK+d9s7Cxz2dY85fFJzlJ6fcsIyTbZC7blnev/IAjo4mjlvHh827D6oGEs6ee n+YZIWz9ZFHiyb7SHfF25Olpw4SHfMqi8WJI1HD/5gn6yInJCtncCQRrX5ZwZ9ObZNHY EOME/hwVjScr5msP+p+rDAG/z0DD1X+022Co9pqMA3qxFGwNFBrQx+Zrdcn1fuUv+Po8 b1hA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=vQlB6qUE; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m23-v6si2087350pls.399.2018.10.03.10.18.10; Wed, 03 Oct 2018 10:18:35 -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; dkim=pass header.i=@google.com header.s=20161025 header.b=vQlB6qUE; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727283AbeJDAHL (ORCPT + 99 others); Wed, 3 Oct 2018 20:07:11 -0400 Received: from mail-qt1-f202.google.com ([209.85.160.202]:36817 "EHLO mail-qt1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726842AbeJDAHL (ORCPT ); Wed, 3 Oct 2018 20:07:11 -0400 Received: by mail-qt1-f202.google.com with SMTP id u28-v6so5794354qtu.3 for ; Wed, 03 Oct 2018 10:17:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=C004DOwT6NID5heV2WJGLPCnOGxQPBgCic5gZ0Jwtc0=; b=vQlB6qUEUMXLPsFDifHnuFrWDOZ9ryfey/Sr1EcdCbrWMc+e50dD6GKIRbM2g2kxTP TwXbqG8tITAhkr0NDihrSGMbK7b3ioAn4PKYwrgpbshY1nMfLlk9mt8rHZuL641XVBI2 kt5K8c6zZkfeKlevYXly9ndeZFkfTA+LbbN067wgRn8/CJgbskeOGrxNMm+SSsJFme+U Aca/HVEwX6tpllFJ2zNMFpqfzFSmVUclQjQSkL8Cmlz2aQUbVRGB8RtsNpQqzBwvQms3 limQRhJDU5nYNp2AkLC68fMqQkdwBvHrdcPr9jbArmcPI7RYdLdWLwh1FKSfN33dGFhw A0EQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=C004DOwT6NID5heV2WJGLPCnOGxQPBgCic5gZ0Jwtc0=; b=OaGuQyBOxL3wYFXSqHJQCHY4V1qICmy3AS+PHr/SvSVEo0emDBvETJ8ScmhCoQlpck B1XSesVsFNXxc7oVrwS6ErgxBfakdDjDa6hevqY6KF8klSt0Jbr/M3FLmv7Qi3+mGk7v YW8gS9yzysPkprneBPVPd8c6opyE+2rW4CYq/R/Y7XXykSlIV61vc4MD/jRpdkpwSMXs pN224ly4RPP6+Vkfhuuu29rxELownWKAYhcf693q7K9Zdua75QNHE1a5Ww0RiMhtBfum hqJ7uNKl6pzKFx2+jlHiWuYl9QeTd29UW7Ketb3VQxBku7jXWasx1adauiTJrAYXncm4 aFcg== X-Gm-Message-State: ABuFfohTdXFo1wQGef00YTqPYGmicBwqVUXv6ZxM48kPrVgQHbSav4bn ++MsiW68oyTCEH8y5kgkiRNskCJ+ X-Received: by 2002:aed:2541:: with SMTP id w1-v6mr1753017qtc.27.1538587073294; Wed, 03 Oct 2018 10:17:53 -0700 (PDT) Date: Wed, 3 Oct 2018 10:17:08 -0700 In-Reply-To: <20181003171720.169953-1-rkir@google.com> Message-Id: <20181003171720.169953-3-rkir@google.com> Mime-Version: 1.0 References: <20181003171720.169953-1-rkir@google.com> X-Mailer: git-send-email 2.19.0.605.g01d371f741-goog Subject: [PATCH v3 03/15] platform: goldfish: pipe: Move the file-scope goldfish_pipe_dev variable into the driver state From: rkir@google.com To: gregkh@linuxfoundation.org Cc: linux-kernel@vger.kernel.org, tkjos@google.com, Roman Kiryanov Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Roman Kiryanov This is the last patch in the series of patches to move file-scope variables into the driver state. This change will help to introduce another version of the pipe driver (with different state) for the older host interface or having several instances of this device. Signed-off-by: Roman Kiryanov --- Changes in v3: - No change. Changes in v2: - Updated the commit message. drivers/platform/goldfish/goldfish_pipe.c | 66 +++++++++++++---------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/drivers/platform/goldfish/goldfish_pipe.c b/drivers/platform/goldfish/goldfish_pipe.c index 8ca709b45e1f..4013832f38fb 100644 --- a/drivers/platform/goldfish/goldfish_pipe.c +++ b/drivers/platform/goldfish/goldfish_pipe.c @@ -169,6 +169,9 @@ struct goldfish_pipe { * waiting to be awoken. */ struct goldfish_pipe_dev { + /* A magic number to check if this is an instance of this struct */ + void *magic; + /* * Global device spinlock. Protects the following members: * - pipes, pipes_capacity @@ -215,8 +218,6 @@ struct goldfish_pipe_dev { struct miscdevice miscdev; }; -static struct goldfish_pipe_dev goldfish_pipe_dev; - static int goldfish_pipe_cmd_locked(struct goldfish_pipe *pipe, enum PipeCmdCode cmd) { @@ -611,6 +612,9 @@ static void goldfish_interrupt_task(unsigned long dev_addr) } } +static void goldfish_pipe_device_deinit(struct platform_device *pdev, + struct goldfish_pipe_dev *dev); + /* * The general idea of the interrupt handling: * @@ -631,7 +635,7 @@ static irqreturn_t goldfish_pipe_interrupt(int irq, void *dev_id) unsigned long flags; struct goldfish_pipe_dev *dev = dev_id; - if (dev != &goldfish_pipe_dev) + if (dev->magic != &goldfish_pipe_device_deinit) return IRQ_NONE; /* Request the signalled pipes from the device */ @@ -683,6 +687,14 @@ static int get_free_pipe_id_locked(struct goldfish_pipe_dev *dev) return id; } +/* A helper function to get the instance of goldfish_pipe_dev from file */ +static struct goldfish_pipe_dev *to_goldfish_pipe_dev(struct file *file) +{ + struct miscdevice *miscdev = file->private_data; + + return container_of(miscdev, struct goldfish_pipe_dev, miscdev); +} + /** * goldfish_pipe_open - open a channel to the AVD * @inode: inode of device @@ -696,7 +708,7 @@ static int get_free_pipe_id_locked(struct goldfish_pipe_dev *dev) */ static int goldfish_pipe_open(struct inode *inode, struct file *file) { - struct goldfish_pipe_dev *dev = &goldfish_pipe_dev; + struct goldfish_pipe_dev *dev = to_goldfish_pipe_dev(file); unsigned long flags; int id; int status; @@ -804,9 +816,9 @@ static void write_pa_addr(void *addr, void __iomem *portl, void __iomem *porth) writel(lower_32_bits(paddr), portl); } -static int goldfish_pipe_device_init(struct platform_device *pdev) +static int goldfish_pipe_device_init(struct platform_device *pdev, + struct goldfish_pipe_dev *dev) { - struct goldfish_pipe_dev *dev = &goldfish_pipe_dev; int err; tasklet_init(&dev->irq_tasklet, &goldfish_interrupt_task, @@ -861,26 +873,29 @@ static int goldfish_pipe_device_init(struct platform_device *pdev) dev->base + PIPE_REG_OPEN_BUFFER, dev->base + PIPE_REG_OPEN_BUFFER_HIGH); + platform_set_drvdata(pdev, dev); return 0; } -static void goldfish_pipe_device_deinit(struct platform_device *pdev) +static void goldfish_pipe_device_deinit(struct platform_device *pdev, + struct goldfish_pipe_dev *dev) { - misc_deregister(&goldfish_pipe_dev.miscdev); - tasklet_kill(&goldfish_pipe_dev.irq_tasklet); - kfree(goldfish_pipe_dev.pipes); - free_page((unsigned long)goldfish_pipe_dev.buffers); + misc_deregister(&dev->miscdev); + tasklet_kill(&dev->irq_tasklet); + kfree(dev->pipes); + free_page((unsigned long)dev->buffers); } static int goldfish_pipe_probe(struct platform_device *pdev) { - int err; struct resource *r; - struct goldfish_pipe_dev *dev = &goldfish_pipe_dev; + struct goldfish_pipe_dev *dev; - /* not thread safe, but this should not happen */ - WARN_ON(dev->base); + dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); + if (!dev) + return -ENOMEM; + dev->magic = &goldfish_pipe_device_deinit; spin_lock_init(&dev->lock); r = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -895,10 +910,9 @@ static int goldfish_pipe_probe(struct platform_device *pdev) } r = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (!r) { - err = -EINVAL; - goto error; - } + if (!r) + return -EINVAL; + dev->irq = r->start; /* @@ -913,20 +927,14 @@ static int goldfish_pipe_probe(struct platform_device *pdev) if (WARN_ON(dev->version < PIPE_CURRENT_DEVICE_VERSION)) return -EINVAL; - err = goldfish_pipe_device_init(pdev); - if (!err) - return 0; - -error: - dev->base = NULL; - return err; + return goldfish_pipe_device_init(pdev, dev); } static int goldfish_pipe_remove(struct platform_device *pdev) { - struct goldfish_pipe_dev *dev = &goldfish_pipe_dev; - goldfish_pipe_device_deinit(pdev); - dev->base = NULL; + struct goldfish_pipe_dev *dev = platform_get_drvdata(pdev); + + goldfish_pipe_device_deinit(pdev, dev); return 0; } -- 2.19.0.605.g01d371f741-goog