[alsa-devel] [RFC] add a "private" field to the ac97 struct
Sebastian Siewior
al+sa at ml.breakpoint.cc
Thu Mar 6 18:22:25 CET 2008
* William Pitcock | 2008-03-06 11:12:37 [-0600]:
>Hi,
Hi,
>Why not modify ucb1400_detect_irq() to get an openfirmware handle on
>PowerPC and read the resource tree at that time? This seems like a
>better approach.
That was my first approach:
---
drivers/input/touchscreen/Kconfig | 7 ++++
drivers/input/touchscreen/ucb1400_ts.c | 57 +++++++++++++++++++++++++++++++-
2 files changed, 63 insertions(+), 1 deletions(-)
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 90e8e92..8f4d752 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -185,6 +185,13 @@ config TOUCHSCREEN_UCB1400
To compile this driver as a module, choose M here: the
module will be called ucb1400_ts.
+config TOUCHSCREEN_UCB1400_OF
+ bool "Get device informations via the device tree"
+ depends on TOUCHSCREEN_UCB1400 && OF
+ help
+ Select this option if you want to obtain interrupt information from
+ the device tree instead of auto probing.
+
config TOUCHSCREEN_USB_COMPOSITE
tristate "USB Touchscreen Driver"
depends on USB_ARCH_HAS_HCD
diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c
index 607f993..9337352 100644
--- a/drivers/input/touchscreen/ucb1400_ts.c
+++ b/drivers/input/touchscreen/ucb1400_ts.c
@@ -26,6 +26,11 @@
#include <linux/kthread.h>
#include <linux/freezer.h>
+#ifdef CONFIG_TOUCHSCREEN_UCB1400_OF
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#endif
+
#include <sound/core.h>
#include <sound/ac97_codec.h>
@@ -418,6 +423,9 @@ static int ucb1400_ts_resume(struct device *dev)
#define NO_IRQ 0
#endif
+#ifdef CONFIG_TOUCHSCREEN_UCB1400_OF
+static int ucb1400_irq;
+#else
/*
* Try to probe our interrupt, rather than relying on lots of
* hard-coded machine dependencies.
@@ -467,6 +475,7 @@ static int ucb1400_detect_irq(struct ucb1400 *ucb)
return 0;
}
+#endif
static int ucb1400_ts_probe(struct device *dev)
{
@@ -491,12 +500,15 @@ static int ucb1400_ts_probe(struct device *dev)
error = -ENODEV;
goto err_free_devs;
}
-
+#ifdef CONFIG_TOUCHSCREEN_UCB1400_OF
+ ucb->irq = ucb1400_irq;
+#else
error = ucb1400_detect_irq(ucb);
if (error) {
printk(KERN_ERR "UCB1400: IRQ probe failed\n");
goto err_free_devs;
}
+#endif
error = request_irq(ucb->irq, ucb1400_hard_irq, IRQF_TRIGGER_RISING,
"UCB1400", ucb);
@@ -562,14 +574,57 @@ static struct device_driver ucb1400_ts_driver = {
.resume = ucb1400_ts_resume,
};
+#ifdef CONFIG_TOUCHSCREEN_UCB1400_OF
+static int __devinit of_ucb_probe(struct of_device *dev,
+ const struct of_device_id *match)
+{
+ struct device_node *dp = dev->node;
+
+ ucb1400_irq = irq_of_parse_and_map(dp, 0);
+ if (ucb1400_irq == IRQ_NONE)
+ return -ENODEV;
+
+ return driver_register(&ucb1400_ts_driver);
+}
+
+static int of_ucb_remove(struct of_device *dev)
+{
+ driver_unregister(&ucb1400_ts_driver);
+ return 0;
+}
+
+static struct of_device_id of_ucb_match[] = {
+ {
+ .compatible = "Phillips-ucb1400_ts",
+ },
+ { },
+};
+MODULE_DEVICE_TABLE(of, of_ucb_match);
+
+static struct of_platform_driver of_ucb1400_ts_driver = {
+ .name = "of-ucb1400_ts",
+ .match_table = of_ucb_match,
+ .probe = of_ucb_probe,
+ .remove = of_ucb_remove,
+};
+#endif
+
static int __init ucb1400_ts_init(void)
{
+#ifdef CONFIG_TOUCHSCREEN_UCB1400_OF
+ return of_register_platform_driver(&of_ucb1400_ts_driver);
+#else
return driver_register(&ucb1400_ts_driver);
+#endif
}
static void __exit ucb1400_ts_exit(void)
{
+#ifdef CONFIG_TOUCHSCREEN_UCB1400_OF
+ of_unregister_platform_driver(&of_ucb1400_ts_driver);
+#else
driver_unregister(&ucb1400_ts_driver);
+#endif
}
module_param(adcsync, bool, 0444);
--
1.5.3.5
The problem is more or less that I can't pass the value to the other
probe function and the global variable doesn't look all that pretty. Am
I missing something here?
>William
Sebastian
More information about the Alsa-devel
mailing list