public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: matthieu castet <castet.matthieu@free.fr>
To: Andi Kleen <ak@suse.de>
Cc: discuss@x86-64.org, linux-kernel@vger.kernel.org,
	linux-acpi@vger.kernel.org
Subject: Re: [discuss]  Re: [RFC] make PC Speaker driver work on x86-64
Date: Tue, 02 May 2006 19:37:58 +0200	[thread overview]
Message-ID: <445798F6.3050102@free.fr> (raw)
In-Reply-To: <200604301050.22984.ak@suse.de>

[-- Attachment #1: Type: text/plain, Size: 454 bytes --]

Hi,

Andi Kleen wrote:
> On Saturday 29 April 2006 23:00, Matthieu CASTET wrote:
> 
>>Hi,
>>
>>Le Sat, 29 Apr 2006 20:30:10 +0200, Mikael Pettersson a écrit :
>>
>>
>>
>>>Is there a better way to do this? ACPI?
>>>
>>
>>Yes, I believe using PNP layer (that use ACPI with pnpacpi) with PNP0800
>>will be cleaner.
> 
> 
> Please do a patch then.
> 
Is something like that is acceptable ?

Matthieu

Signed-off-by: Matthieu CASTET <castet.matthieu@free.fr>

[-- Attachment #2: pcspkr_pnp.diff --]
[-- Type: text/plain, Size: 4712 bytes --]

--- linux.old/drivers/input/misc/pcspkr.c	2006-04-30 18:16:09.000000000 +0200
+++ linux/drivers/input/misc/pcspkr.c	2006-05-02 19:35:09.000000000 +0200
@@ -17,6 +17,7 @@
 #include <linux/init.h>
 #include <linux/input.h>
 #include <linux/platform_device.h>
+#include <linux/pnp.h>
 #include <asm/8253pit.h>
 #include <asm/io.h>
 
@@ -26,6 +27,7 @@
 
 static struct platform_device *pcspkr_platform_device;
 static DEFINE_SPINLOCK(i8253_beep_lock);
+static int pnp_registered;
 
 static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
 {
@@ -64,7 +66,7 @@
 	return 0;
 }
 
-static int __devinit pcspkr_probe(struct platform_device *dev)
+static int __devinit pcspkr_probe(struct device *dev, struct input_dev **pcspkr_dev_pointer)
 {
 	struct input_dev *pcspkr_dev;
 	int err;
@@ -79,7 +81,7 @@
 	pcspkr_dev->id.vendor = 0x001f;
 	pcspkr_dev->id.product = 0x0001;
 	pcspkr_dev->id.version = 0x0100;
-	pcspkr_dev->cdev.dev = &dev->dev;
+	pcspkr_dev->cdev.dev = dev;
 
 	pcspkr_dev->evbit[0] = BIT(EV_SND);
 	pcspkr_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
@@ -90,32 +92,48 @@
 		input_free_device(pcspkr_dev);
 		return err;
 	}
+	*pcspkr_dev_pointer = pcspkr_dev;
 
-	platform_set_drvdata(dev, pcspkr_dev);
+	return 0;
+}
+
+static int __devexit pcspkr_remove(struct input_dev *pcspkr_dev)
+{
+	input_unregister_device(pcspkr_dev);
+	/* turn off the speaker */
+	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
 
 	return 0;
 }
 
-static int __devexit pcspkr_remove(struct platform_device *dev)
+static int __devinit pcspkr_probe_platform(struct platform_device *dev)
+{
+	struct input_dev *pcspkr_dev;
+	int err;
+	err = pcspkr_probe(&dev->dev, &pcspkr_dev);
+	if (err == 0)
+		platform_set_drvdata(dev, pcspkr_dev);
+	return err;
+}
+
+static int __devexit pcspkr_remove_platform(struct platform_device *dev)
 {
 	struct input_dev *pcspkr_dev = platform_get_drvdata(dev);
 
-	input_unregister_device(pcspkr_dev);
+	pcspkr_remove(pcspkr_dev);
 	platform_set_drvdata(dev, NULL);
-	/* turn off the speaker */
-	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
 
 	return 0;
 }
 
-static int pcspkr_suspend(struct platform_device *dev, pm_message_t state)
+static int pcspkr_suspend_platform(struct platform_device *dev, pm_message_t state)
 {
 	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
 
 	return 0;
 }
 
-static void pcspkr_shutdown(struct platform_device *dev)
+static void pcspkr_shutdown_platform(struct platform_device *dev)
 {
 	/* turn off the speaker */
 	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
@@ -126,17 +144,80 @@
 		.name	= "pcspkr",
 		.owner	= THIS_MODULE,
 	},
-	.probe		= pcspkr_probe,
-	.remove		= __devexit_p(pcspkr_remove),
-	.suspend	= pcspkr_suspend,
-	.shutdown	= pcspkr_shutdown,
+	.probe		= pcspkr_probe_platform,
+	.remove		= __devexit_p(pcspkr_remove_platform),
+	.suspend	= pcspkr_suspend_platform,
+	.shutdown	= pcspkr_shutdown_platform,
+};
+
+#ifdef CONFIG_PNP
+static struct pnp_device_id pcspkr_pnpids[] = {
+	{ .id = "PNP0800" },
+	{ .id = "" }
+};
+
+MODULE_DEVICE_TABLE(pnp, pcspkr_pnpids);
+
+static int __devinit pcspkr_pnp_probe(struct pnp_dev *pnp_dev,
+					  const struct pnp_device_id *id)
+{
+	struct input_dev *pcspkr_dev;
+	int err;
+	err = pcspkr_probe(&pnp_dev->dev, &pcspkr_dev);
+	if (err == 0) {
+		pnp_set_drvdata(pnp_dev, pcspkr_dev);
+		pnp_registered++;
+	}
+	return err;
+}
+
+static void __devexit pcspkr_pnp_remove(struct pnp_dev *dev)
+{
+	struct input_dev *pcspkr_dev = (struct input_dev *)pnp_get_drvdata(dev);
+
+	pcspkr_remove(pcspkr_dev);
+	pnp_set_drvdata(dev, NULL);
+
+	return;
+}
+
+#ifdef CONFIG_PM
+static int pcspkr_suspend_pnp(struct pnp_dev *pdev, pm_message_t state)
+{
+	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
+
+	return 0;
+}
+#endif
+
+static struct pnp_driver pcspkr_pnp_driver = {
+	.name = "pcspkr",
+	.id_table = pcspkr_pnpids,
+	.probe = pcspkr_pnp_probe,
+	.remove = __devexit_p(pcspkr_pnp_remove),
+#ifdef CONFIG_PM
+	.suspend = pcspkr_suspend_pnp,
+#endif
 };
+#else
+static struct pnp_driver pcspkr_pnp_driver;
+#endif
 
 
 static int __init pcspkr_init(void)
 {
 	int err;
 
+	err = pnp_register_driver(&pcspkr_pnp_driver);
+	if (err < 0)
+		pnp_registered = 0;
+	if (err == 0 && pnp_registered == 0)
+		pnp_unregister_driver(&pcspkr_pnp_driver);
+
+	if (pnp_registered)
+		return 0;
+
+	/* Try platform driver if pnp failed or found nothing */
 	err = platform_driver_register(&pcspkr_platform_driver);
 	if (err)
 		return err;
@@ -163,6 +244,10 @@
 
 static void __exit pcspkr_exit(void)
 {
+	if (pnp_registered) {
+		pnp_unregister_driver(&pcspkr_pnp_driver);
+		return;
+	}
 	platform_device_unregister(pcspkr_platform_device);
 	platform_driver_unregister(&pcspkr_platform_driver);
 }

  reply	other threads:[~2006-05-02 17:38 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-04-29 18:30 [RFC] make PC Speaker driver work on x86-64 Mikael Pettersson
2006-04-29 20:36 ` Jeff Garzik
2006-04-29 21:00 ` Matthieu CASTET
2006-04-30  8:50   ` [discuss] " Andi Kleen
2006-05-02 17:37     ` matthieu castet [this message]
2006-05-02 17:50       ` Andi Kleen
2006-05-02 20:33         ` matthieu castet
2006-05-02 20:35           ` Andi Kleen
2006-05-02 20:54           ` Andi Kleen
2006-04-30  8:46 ` [discuss] " Andi Kleen
2006-04-30 14:32   ` Goswin von Brederlow
2006-04-30 16:29     ` Alistair John Strachan
2006-05-01  7:09   ` Jan Engelhardt

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=445798F6.3050102@free.fr \
    --to=castet.matthieu@free.fr \
    --cc=ak@suse.de \
    --cc=discuss@x86-64.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox