All of lore.kernel.org
 help / color / mirror / Atom feed
From: rkir@google.com
To: gregkh@linuxfoundation.org
Cc: tkjos@google.com, linux-kernel@vger.kernel.org,
	Roman Kiryanov <rkir@google.com>
Subject: [PATCH 09/21] platform: goldfish: pipe: Remove the goldfish_pipe_dev global variable
Date: Fri, 14 Sep 2018 10:51:10 -0700	[thread overview]
Message-ID: <20180914175122.21036-9-rkir@google.com> (raw)
In-Reply-To: <20180914175122.21036-1-rkir@google.com>

From: Roman Kiryanov <rkir@google.com>

This is the last patch in the series of patches to remove mutable
global variables to introduce another version of the pipe driver
for the older host interface. I don't want to have two driver
states where only one is used.

Signed-off-by: Roman Kiryanov <rkir@google.com>
---
 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 53832e46ad1a..c68035be4389 100644
--- a/drivers/platform/goldfish/goldfish_pipe.c
+++ b/drivers/platform/goldfish/goldfish_pipe.c
@@ -202,6 +202,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
@@ -251,8 +254,6 @@ struct goldfish_pipe_dev {
 	size_t dma_alloc_total;
 };
 
-struct goldfish_pipe_dev goldfish_pipe_dev;
-
 static int goldfish_pipe_cmd_locked(struct goldfish_pipe *pipe,
 				    enum PipeCmdCode cmd)
 {
@@ -647,6 +648,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:
  *
@@ -667,7 +671,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 */
@@ -719,6 +723,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
@@ -732,7 +744,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;
@@ -1112,9 +1124,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,
@@ -1169,26 +1181,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);
@@ -1203,10 +1218,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;
 
 	/*
@@ -1221,20 +1235,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.397.gdd90340f6a-goog


  parent reply	other threads:[~2018-09-14 17:52 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-14 17:51 [PATCH 01/21] platform: goldfish: pipe: Remove license boilerplate rkir
2018-09-14 17:51 ` [PATCH 02/21] platform: goldfish: pipe: Prevent memory corruption from several threads writing to the same variable rkir
2018-09-14 17:51 ` [PATCH 03/21] platform: goldfish: pipe: Remove a redundant blank line rkir
2018-09-14 17:51 ` [PATCH 04/21] platform: goldfish: pipe: Remove redundant struct declarations rkir
2018-09-14 17:51 ` [PATCH 05/21] platform: goldfish: pipe: Remove redundant header include rkir
2018-09-14 17:51 ` [PATCH 06/21] platform: goldfish: pipe: Add DMA support to goldfish pipe rkir
2018-09-25 18:31   ` Greg KH
2018-09-25 23:06     ` Roman Kiryanov
2018-09-14 17:51 ` [PATCH 07/21] platform: goldfish: pipe: Remove the goldfish_interrupt_tasklet global variable rkir
2018-09-14 17:51 ` [PATCH 08/21] platform: goldfish: pipe: Remove the goldfish_pipe_miscdev " rkir
2018-09-14 17:51 ` rkir [this message]
2018-09-14 17:51 ` [PATCH 10/21] platform: goldfish: pipe: Move goldfish_pipe to goldfish_pipe_v2 rkir
2018-09-14 17:51 ` [PATCH 11/21] platform: goldfish: pipe: Move memory allocation from probe to init rkir
2018-09-14 17:51 ` [PATCH 12/21] platform: goldfish: pipe: Return status from "deinit" since "remove" does not do much rkir
2018-09-14 17:51 ` [PATCH 13/21] platform: goldfish: pipe: Split the driver to v2 specific and the rest rkir
2018-09-14 17:51 ` [PATCH 14/21] platform: goldfish: pipe: Add a blank line to separate varibles and code rkir
2018-09-14 17:51 ` [PATCH 15/21] platform: goldfish: pipe: Rename the init function (add "v2") rkir
2018-09-14 17:51 ` [PATCH 16/21] platform: goldfish: pipe: Call misc_deregister if init fails rkir
2018-09-14 17:51 ` [PATCH 17/21] platform: goldfish: pipe: Add a dedicated constant for the device name rkir
2018-09-14 17:51 ` [PATCH 18/21] platform: goldfish: pipe: Rename PIPE_REG to PIPE_V2_REG rkir
2018-09-14 17:51 ` [PATCH 19/21] platform: goldfish: pipe: Add the goldfish_pipe_v1 driver rkir
2018-09-14 17:51 ` [PATCH 20/21] platform: goldfish: pipe: Remove redundant casting rkir
2018-09-14 17:51 ` [PATCH 21/21] platform: goldfish: pipe: Fix allmodconfig build rkir
2018-09-25 18:28   ` Greg KH
2018-09-26 22:27     ` Roman Kiryanov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180914175122.21036-9-rkir@google.com \
    --to=rkir@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tkjos@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.