tahvo-usb: Use platform device interface properly (don't crash)

SVN-Revision: 22780
This commit is contained in:
Michael Büsch 2010-08-23 14:24:39 +00:00
parent 1dfa6cffb1
commit e54b810ace
2 changed files with 75 additions and 64 deletions

View file

@ -72,7 +72,7 @@ define KernelPackage/usb-tahvo
TITLE:=Support for Tahvo (Nokia n810) USB TITLE:=Support for Tahvo (Nokia n810) USB
KCONFIG:= \ KCONFIG:= \
CONFIG_CBUS_TAHVO_USB \ CONFIG_CBUS_TAHVO_USB \
CONFIG_CBUS_TAHVO_USB_HOST_BY_DEFAULT=y \ CONFIG_CBUS_TAHVO_USB_HOST_BY_DEFAULT=n \
CONFIG_USB_OHCI_HCD_OMAP1=y \ CONFIG_USB_OHCI_HCD_OMAP1=y \
CONFIG_USB_GADGET_DEBUG_FS=n CONFIG_USB_GADGET_DEBUG_FS=n
DEPENDS:=@TARGET_omap24xx +kmod-usb-ohci DEPENDS:=@TARGET_omap24xx +kmod-usb-ohci

View file

@ -7,20 +7,20 @@
drivers/cbus/cbus.h | 36 + drivers/cbus/cbus.h | 36 +
drivers/cbus/retu-headset.c | 356 ++++++++++++++++++ drivers/cbus/retu-headset.c | 356 ++++++++++++++++++
drivers/cbus/retu-pwrbutton.c | 118 ++++++ drivers/cbus/retu-pwrbutton.c | 118 ++++++
drivers/cbus/retu-rtc.c | 477 +++++++++++++++++++++++++ drivers/cbus/retu-rtc.c | 477 ++++++++++++++++++++++++
drivers/cbus/retu-user.c | 425 ++++++++++++++++++++++ drivers/cbus/retu-user.c | 425 ++++++++++++++++++++++
drivers/cbus/retu-wdt.c | 388 ++++++++++++++++++++ drivers/cbus/retu-wdt.c | 388 ++++++++++++++++++++
drivers/cbus/retu.c | 468 ++++++++++++++++++++++++ drivers/cbus/retu.c | 468 ++++++++++++++++++++++++
drivers/cbus/retu.h | 77 ++++ drivers/cbus/retu.h | 77 ++++
drivers/cbus/tahvo-usb.c | 777 +++++++++++++++++++++++++++++++++++++++++ drivers/cbus/tahvo-usb.c | 788 +++++++++++++++++++++++++++++++++++++++++
drivers/cbus/tahvo-user.c | 407 +++++++++++++++++++++ drivers/cbus/tahvo-user.c | 407 +++++++++++++++++++++
drivers/cbus/tahvo.c | 443 +++++++++++++++++++++++ drivers/cbus/tahvo.c | 443 +++++++++++++++++++++++
drivers/cbus/tahvo.h | 61 +++ drivers/cbus/tahvo.h | 61 +++
drivers/cbus/user_retu_tahvo.h | 75 +++ drivers/cbus/user_retu_tahvo.h | 75 +++
18 files changed, 4525 insertions(+), 1 deletion(-) 18 files changed, 4536 insertions(+), 1 deletion(-)
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/cbus.c +++ linux-2.6.35.3/drivers/cbus/cbus.c
@@ -0,0 +1,309 @@ @@ -0,0 +1,309 @@
+/* +/*
+ * drivers/cbus/cbus.c + * drivers/cbus/cbus.c
@ -332,7 +332,7 @@
+MODULE_AUTHOR("Mikko Ylinen"); +MODULE_AUTHOR("Mikko Ylinen");
+ +
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/cbus.h +++ linux-2.6.35.3/drivers/cbus/cbus.h
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
+/* +/*
+ * drivers/cbus/cbus.h + * drivers/cbus/cbus.h
@ -371,7 +371,7 @@
+ +
+#endif /* __DRIVERS_CBUS_CBUS_H */ +#endif /* __DRIVERS_CBUS_CBUS_H */
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/Kconfig +++ linux-2.6.35.3/drivers/cbus/Kconfig
@@ -0,0 +1,89 @@ @@ -0,0 +1,89 @@
+# +#
+# CBUS device configuration +# CBUS device configuration
@ -463,7 +463,7 @@
+ +
+endmenu +endmenu
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/Makefile +++ linux-2.6.35.3/drivers/cbus/Makefile
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
+# +#
+# Makefile for CBUS. +# Makefile for CBUS.
@ -480,7 +480,7 @@
+obj-$(CONFIG_CBUS_RETU_USER) += retu-user.o +obj-$(CONFIG_CBUS_RETU_USER) += retu-user.o
+obj-$(CONFIG_CBUS_RETU_HEADSET) += retu-headset.o +obj-$(CONFIG_CBUS_RETU_HEADSET) += retu-headset.o
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/retu.c +++ linux-2.6.35.3/drivers/cbus/retu.c
@@ -0,0 +1,468 @@ @@ -0,0 +1,468 @@
+/** +/**
+ * drivers/cbus/retu.c + * drivers/cbus/retu.c
@ -951,7 +951,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Juha Yrjölä, David Weinehall, and Mikko Ylinen"); +MODULE_AUTHOR("Juha Yrjölä, David Weinehall, and Mikko Ylinen");
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/retu.h +++ linux-2.6.35.3/drivers/cbus/retu.h
@@ -0,0 +1,77 @@ @@ -0,0 +1,77 @@
+/** +/**
+ * drivers/cbus/retu.h + * drivers/cbus/retu.h
@ -1031,7 +1031,7 @@
+ +
+#endif /* __DRIVERS_CBUS_RETU_H */ +#endif /* __DRIVERS_CBUS_RETU_H */
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/retu-headset.c +++ linux-2.6.35.3/drivers/cbus/retu-headset.c
@@ -0,0 +1,356 @@ @@ -0,0 +1,356 @@
+/** +/**
+ * Retu/Vilma headset detection + * Retu/Vilma headset detection
@ -1390,7 +1390,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Juha Yrjölä"); +MODULE_AUTHOR("Juha Yrjölä");
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/retu-pwrbutton.c +++ linux-2.6.35.3/drivers/cbus/retu-pwrbutton.c
@@ -0,0 +1,118 @@ @@ -0,0 +1,118 @@
+/** +/**
+ * drivers/cbus/retu-pwrbutton.c + * drivers/cbus/retu-pwrbutton.c
@ -1511,7 +1511,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Ari Saastamoinen"); +MODULE_AUTHOR("Ari Saastamoinen");
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/retu-rtc.c +++ linux-2.6.35.3/drivers/cbus/retu-rtc.c
@@ -0,0 +1,477 @@ @@ -0,0 +1,477 @@
+/** +/**
+ * drivers/cbus/retu-rtc.c + * drivers/cbus/retu-rtc.c
@ -1991,7 +1991,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Paul Mundt and Igor Stoppa"); +MODULE_AUTHOR("Paul Mundt and Igor Stoppa");
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/retu-user.c +++ linux-2.6.35.3/drivers/cbus/retu-user.c
@@ -0,0 +1,425 @@ @@ -0,0 +1,425 @@
+/** +/**
+ * drivers/cbus/retu-user.c + * drivers/cbus/retu-user.c
@ -2419,7 +2419,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mikko Ylinen"); +MODULE_AUTHOR("Mikko Ylinen");
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/retu-wdt.c +++ linux-2.6.35.3/drivers/cbus/retu-wdt.c
@@ -0,0 +1,388 @@ @@ -0,0 +1,388 @@
+/** +/**
+ * drivers/cbus/retu-wdt.c + * drivers/cbus/retu-wdt.c
@ -2810,7 +2810,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+ +
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/tahvo.c +++ linux-2.6.35.3/drivers/cbus/tahvo.c
@@ -0,0 +1,443 @@ @@ -0,0 +1,443 @@
+/** +/**
+ * drivers/cbus/tahvo.c + * drivers/cbus/tahvo.c
@ -3256,7 +3256,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Juha Yrjölä, David Weinehall, and Mikko Ylinen"); +MODULE_AUTHOR("Juha Yrjölä, David Weinehall, and Mikko Ylinen");
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/tahvo.h +++ linux-2.6.35.3/drivers/cbus/tahvo.h
@@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
+/* +/*
+ * drivers/cbus/tahvo.h + * drivers/cbus/tahvo.h
@ -3320,8 +3320,8 @@
+ +
+#endif /* __DRIVERS_CBUS_TAHVO_H */ +#endif /* __DRIVERS_CBUS_TAHVO_H */
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/tahvo-usb.c +++ linux-2.6.35.3/drivers/cbus/tahvo-usb.c
@@ -0,0 +1,777 @@ @@ -0,0 +1,788 @@
+/** +/**
+ * drivers/cbus/tahvo-usb.c + * drivers/cbus/tahvo-usb.c
+ * + *
@ -3510,23 +3510,25 @@
+ return 0; + return 0;
+} +}
+ +
+static int omap_otg_probe(struct device *dev) +static int omap_otg_probe(struct platform_device *pdev)
+{ +{
+ int ret; + int ret, err;
+ +
+ tahvo_otg_dev = to_platform_device(dev); + tahvo_otg_dev = pdev;
+ ret = omap_otg_init(); + ret = omap_otg_init();
+ if (ret != 0) { + if (ret != 0) {
+ printk(KERN_ERR "tahvo-usb: omap_otg_init failed\n"); + printk(KERN_ERR "tahvo-usb: omap_otg_init failed\n");
+ return ret; + return ret;
+ } + }
+ +
+ return request_irq(tahvo_otg_dev->resource[1].start, + err = request_irq(tahvo_otg_dev->resource[1].start,
+ omap_otg_irq, IRQF_DISABLED, DRIVER_NAME, + omap_otg_irq, IRQF_DISABLED, DRIVER_NAME,
+ &tahvo_usb_device); + &tahvo_usb_device);
+
+ return err;
+} +}
+ +
+static int omap_otg_remove(struct device *dev) +static int omap_otg_remove(struct platform_device *pdev)
+{ +{
+ free_irq(tahvo_otg_dev->resource[1].start, &tahvo_usb_device); + free_irq(tahvo_otg_dev->resource[1].start, &tahvo_usb_device);
+ tahvo_otg_dev = NULL; + tahvo_otg_dev = NULL;
@ -3534,11 +3536,12 @@
+ return 0; + return 0;
+} +}
+ +
+struct device_driver omap_otg_driver = { +static struct platform_driver omap_otg_driver = {
+ .name = "omap_otg",
+ .bus = &platform_bus_type,
+ .probe = omap_otg_probe, + .probe = omap_otg_probe,
+ .remove = omap_otg_remove, + .remove = omap_otg_remove,
+ .driver = {
+ .name = "omap_otg",
+ }
+}; +};
+ +
+/* +/*
@ -3551,7 +3554,8 @@
+static ssize_t vbus_state_show(struct device *device, +static ssize_t vbus_state_show(struct device *device,
+ struct device_attribute *attr, char *buf) + struct device_attribute *attr, char *buf)
+{ +{
+ struct tahvo_usb *tu = dev_get_drvdata(device); + struct platform_device *pdev = to_platform_device(device);
+ struct tahvo_usb *tu = platform_get_drvdata(pdev);
+ return sprintf(buf, "%d\n", tu->vbus_state); + return sprintf(buf, "%d\n", tu->vbus_state);
+} +}
+static DEVICE_ATTR(vbus_state, 0444, vbus_state_show, NULL); +static DEVICE_ATTR(vbus_state, 0444, vbus_state_show, NULL);
@ -3914,13 +3918,16 @@
+static ssize_t otg_mode_show(struct device *device, +static ssize_t otg_mode_show(struct device *device,
+ struct device_attribute *attr, char *buf) + struct device_attribute *attr, char *buf)
+{ +{
+ struct tahvo_usb *tu = dev_get_drvdata(device); + struct platform_device *pdev = to_platform_device(device);
+ struct tahvo_usb *tu = platform_get_drvdata(pdev);
+
+ switch (tu->tahvo_mode) { + switch (tu->tahvo_mode) {
+ case TAHVO_MODE_HOST: + case TAHVO_MODE_HOST:
+ return sprintf(buf, "host\n"); + return sprintf(buf, "host\n");
+ case TAHVO_MODE_PERIPHERAL: + case TAHVO_MODE_PERIPHERAL:
+ return sprintf(buf, "peripheral\n"); + return sprintf(buf, "peripheral\n");
+ } + }
+
+ return sprintf(buf, "unknown\n"); + return sprintf(buf, "unknown\n");
+} +}
+ +
@ -3928,7 +3935,8 @@
+ struct device_attribute *attr, + struct device_attribute *attr,
+ const char *buf, size_t count) + const char *buf, size_t count)
+{ +{
+ struct tahvo_usb *tu = dev_get_drvdata(device); + struct platform_device *pdev = to_platform_device(device);
+ struct tahvo_usb *tu = platform_get_drvdata(pdev);
+ int r; + int r;
+ +
+ r = strlen(buf); + r = strlen(buf);
@ -3965,19 +3973,19 @@
+static DEVICE_ATTR(otg_mode, 0644, otg_mode_show, otg_mode_store); +static DEVICE_ATTR(otg_mode, 0644, otg_mode_show, otg_mode_store);
+#endif +#endif
+ +
+static int tahvo_usb_probe(struct device *dev) +static int tahvo_usb_probe(struct platform_device *pdev)
+{ +{
+ struct tahvo_usb *tu; + struct tahvo_usb *tu;
+ int ret; + int ret;
+ +
+ dev_dbg(dev, "probe\n"); + dev_dbg(&pdev->dev, "probe\n");
+ +
+ /* Create driver data */ + /* Create driver data */
+ tu = kmalloc(sizeof(*tu), GFP_KERNEL); + tu = kmalloc(sizeof(*tu), GFP_KERNEL);
+ if (!tu) + if (!tu)
+ return -ENOMEM; + return -ENOMEM;
+ memset(tu, 0, sizeof(*tu)); + memset(tu, 0, sizeof(*tu));
+ tu->pt_dev = container_of(dev, struct platform_device, dev); + tu->pt_dev = pdev;
+#ifdef CONFIG_USB_OTG +#ifdef CONFIG_USB_OTG
+ /* Default mode */ + /* Default mode */
+#ifdef CONFIG_CBUS_TAHVO_USB_HOST_BY_DEFAULT +#ifdef CONFIG_CBUS_TAHVO_USB_HOST_BY_DEFAULT
@ -4004,9 +4012,9 @@
+ } + }
+ +
+ /* Attributes */ + /* Attributes */
+ ret = device_create_file(dev, &dev_attr_vbus_state); + ret = device_create_file(&pdev->dev, &dev_attr_vbus_state);
+#ifdef CONFIG_USB_OTG +#ifdef CONFIG_USB_OTG
+ ret |= device_create_file(dev, &dev_attr_otg_mode); + ret |= device_create_file(&pdev->dev, &dev_attr_otg_mode);
+#endif +#endif
+ if (ret) + if (ret)
+ printk(KERN_ERR "attribute creation failed: %d\n", ret); + printk(KERN_ERR "attribute creation failed: %d\n", ret);
@ -4030,7 +4038,7 @@
+ return ret; + return ret;
+ } + }
+ +
+ dev_set_drvdata(dev, tu); + platform_set_drvdata(pdev, tu);
+ +
+ /* Act upon current vbus state once at startup. A vbus state irq may or + /* Act upon current vbus state once at startup. A vbus state irq may or
+ * may not be generated in addition to this. */ + * may not be generated in addition to this. */
@ -4038,25 +4046,26 @@
+ return 0; + return 0;
+} +}
+ +
+static int tahvo_usb_remove(struct device *dev) +static int tahvo_usb_remove(struct platform_device *pdev)
+{ +{
+ dev_dbg(dev, "remove\n"); + dev_dbg(&pdev->dev, "remove\n");
+ +
+ tahvo_free_irq(TAHVO_INT_VBUSON); + tahvo_free_irq(TAHVO_INT_VBUSON);
+ flush_scheduled_work(); + flush_scheduled_work();
+ otg_set_transceiver(0); + otg_set_transceiver(0);
+ device_remove_file(dev, &dev_attr_vbus_state); + device_remove_file(&pdev->dev, &dev_attr_vbus_state);
+#ifdef CONFIG_USB_OTG +#ifdef CONFIG_USB_OTG
+ device_remove_file(dev, &dev_attr_otg_mode); + device_remove_file(&pdev->dev, &dev_attr_otg_mode);
+#endif +#endif
+ return 0; + return 0;
+} +}
+ +
+static struct device_driver tahvo_usb_driver = { +static struct platform_driver tahvo_usb_driver = {
+ .name = "tahvo-usb",
+ .bus = &platform_bus_type,
+ .probe = tahvo_usb_probe, + .probe = tahvo_usb_probe,
+ .remove = tahvo_usb_remove, + .remove = tahvo_usb_remove,
+ .driver = {
+ .name = "tahvo-usb",
+ }
+}; +};
+ +
+static struct platform_device tahvo_usb_device = { +static struct platform_device tahvo_usb_device = {
@ -4069,30 +4078,32 @@
+ int ret = 0; + int ret = 0;
+ +
+ printk(KERN_INFO "Tahvo USB transceiver driver initializing\n"); + printk(KERN_INFO "Tahvo USB transceiver driver initializing\n");
+ ret = driver_register(&tahvo_usb_driver); +
+ ret = platform_driver_register(&tahvo_usb_driver);
+ if (ret) + if (ret)
+ return ret; + return ret;
+ ret = platform_device_register(&tahvo_usb_device); + ret = platform_driver_register(&omap_otg_driver);
+ if (ret < 0) {
+ driver_unregister(&tahvo_usb_driver);
+ return ret;
+ }
+ ret = driver_register(&omap_otg_driver);
+ if (ret) { + if (ret) {
+ platform_device_unregister(&tahvo_usb_device); + platform_driver_unregister(&tahvo_usb_driver);
+ driver_unregister(&tahvo_usb_driver);
+ return ret; + return ret;
+ } + }
+
+ ret = platform_device_register(&tahvo_usb_device);
+ if (ret) {
+ platform_driver_unregister(&omap_otg_driver);
+ platform_driver_unregister(&tahvo_usb_driver);
+ return ret;
+ }
+
+ return 0; + return 0;
+} +}
+
+subsys_initcall(tahvo_usb_init); +subsys_initcall(tahvo_usb_init);
+ +
+static void __exit tahvo_usb_exit(void) +static void __exit tahvo_usb_exit(void)
+{ +{
+ driver_unregister(&omap_otg_driver);
+ platform_device_unregister(&tahvo_usb_device); + platform_device_unregister(&tahvo_usb_device);
+ driver_unregister(&tahvo_usb_driver); + platform_driver_unregister(&omap_otg_driver);
+ platform_driver_unregister(&tahvo_usb_driver);
+} +}
+module_exit(tahvo_usb_exit); +module_exit(tahvo_usb_exit);
+ +
@ -4100,7 +4111,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Juha Yrjölä, Tony Lindgren, and Timo Teräs"); +MODULE_AUTHOR("Juha Yrjölä, Tony Lindgren, and Timo Teräs");
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/tahvo-user.c +++ linux-2.6.35.3/drivers/cbus/tahvo-user.c
@@ -0,0 +1,407 @@ @@ -0,0 +1,407 @@
+/** +/**
+ * drivers/cbus/tahvo-user.c + * drivers/cbus/tahvo-user.c
@ -4510,7 +4521,7 @@
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mikko Ylinen"); +MODULE_AUTHOR("Mikko Ylinen");
--- /dev/null --- /dev/null
+++ linux-2.6.35/drivers/cbus/user_retu_tahvo.h +++ linux-2.6.35.3/drivers/cbus/user_retu_tahvo.h
@@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
+/** +/**
+ * drivers/cbus/user_retu_tahvo.h + * drivers/cbus/user_retu_tahvo.h
@ -4587,8 +4598,8 @@
+}; +};
+ +
+#endif +#endif
--- linux-2.6.35.orig/drivers/Makefile --- linux-2.6.35.3.orig/drivers/Makefile
+++ linux-2.6.35/drivers/Makefile +++ linux-2.6.35.3/drivers/Makefile
@@ -74,7 +74,7 @@ obj-$(CONFIG_GAMEPORT) += input/gamepor @@ -74,7 +74,7 @@ obj-$(CONFIG_GAMEPORT) += input/gamepor
obj-$(CONFIG_INPUT) += input/ obj-$(CONFIG_INPUT) += input/
obj-$(CONFIG_I2O) += message/ obj-$(CONFIG_I2O) += message/
@ -4598,9 +4609,9 @@
obj-$(CONFIG_PPS) += pps/ obj-$(CONFIG_PPS) += pps/
obj-$(CONFIG_W1) += w1/ obj-$(CONFIG_W1) += w1/
obj-$(CONFIG_POWER_SUPPLY) += power/ obj-$(CONFIG_POWER_SUPPLY) += power/
--- linux-2.6.35.orig/arch/arm/Kconfig --- linux-2.6.35.3.orig/arch/arm/Kconfig
+++ linux-2.6.35/arch/arm/Kconfig +++ linux-2.6.35.3/arch/arm/Kconfig
@@ -1669,6 +1669,10 @@ source "net/Kconfig" @@ -1681,6 +1681,10 @@ source "net/Kconfig"
source "drivers/Kconfig" source "drivers/Kconfig"