* [RFC PATCH 0/4] USB: OMAP: Tahvo USB support for 770
@ 2013-03-07 14:40 Aaro Koskinen
2013-03-07 14:40 ` [RFC PATCH 1/4] retu-mfd: support also Tahvo Aaro Koskinen
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Aaro Koskinen @ 2013-03-07 14:40 UTC (permalink / raw)
To: linux-usb-u79uwXL29TY76Z2rM5mHXA,
linux-omap-u79uwXL29TY76Z2rM5mHXA, Felipe Balbi
Cc: Tony Lindgren, Aaro Koskinen
Hi,
These patches add support for Tahvo USB transceiver and allow use both
host and peripheral modes on Nokia 770.
Patches work with 3.9-rc1, but the following fixes must be also applied:
ARM: OMAP1: fix USB host on 1710
http://marc.info/?l=linux-omap&m=135906630828618&w=2
usb: gadget: fix omap_udc build errors
http://marc.info/?l=linux-arm-kernel&m=136252187712475&w=2
ARM: OMAP1: fix omap_udc registration
http://marc.info/?l=linux-omap&m=136266305725974&w=2
Test cases were roughly following:
- CONFIG_USB_OTG, CONFIG_TAHVO_USB_HOST_BY_DEFAULT
- ohci-hcd, omap_udc, g_ether loaded as modules during boot
- check host mode functionality after boot with USB keyboard
- switch to peripheral mode and check functionality with ssh
- switch back to host mode
- CONFIG_USB_OTG, !CONFIG_TAHVO_USB_HOST_BY_DEFAULT
- ohci-hcd, omap_udc, g_ether loaded as modules during boot
- check peripheral mode after boot with ssh
- switch to host mode and check with USB keyboard
- switch back to peripheral mode
- !CONFIG_USB_OTG, CONFIG_USB_OMAP
- check peripheral mode after boot by logging with ssh
- !CONFIG_USB_OTG, !CONFIG_USB_OMAP
- (not currently supported by ohci-hcd)
- other
- check USB cable on/off detection (Tahvo vbus interrupt)
Please review and comment. Thanks,
A.
Aaro Koskinen (4):
retu-mfd: support also Tahvo
ARM: OMAP1: nokia770: enable Tahvo
USB: OMAP: move omap-otg out from isp1301_omap
USB: OMAP: Tahvo USB transceiver driver
arch/arm/mach-omap1/board-nokia770.c | 10 +
drivers/mfd/Kconfig | 6 +-
drivers/mfd/retu-mfd.c | 95 ++++-
drivers/usb/otg/Kconfig | 21 ++
drivers/usb/otg/Makefile | 2 +
drivers/usb/otg/isp1301_omap.c | 78 +----
drivers/usb/otg/omap-otg.c | 99 ++++++
drivers/usb/otg/tahvo-usb.c | 643 ++++++++++++++++++++++++++++++++++
include/linux/mfd/retu.h | 8 +-
include/linux/usb/omap-otg.h | 30 ++
10 files changed, 900 insertions(+), 92 deletions(-)
create mode 100644 drivers/usb/otg/omap-otg.c
create mode 100644 drivers/usb/otg/tahvo-usb.c
create mode 100644 include/linux/usb/omap-otg.h
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC PATCH 1/4] retu-mfd: support also Tahvo
2013-03-07 14:40 [RFC PATCH 0/4] USB: OMAP: Tahvo USB support for 770 Aaro Koskinen
@ 2013-03-07 14:40 ` Aaro Koskinen
2013-03-07 14:48 ` Felipe Balbi
[not found] ` <1362667221-30659-2-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
2013-03-07 14:40 ` [RFC PATCH 2/4] ARM: OMAP1: nokia770: enable Tahvo Aaro Koskinen
` (2 subsequent siblings)
3 siblings, 2 replies; 11+ messages in thread
From: Aaro Koskinen @ 2013-03-07 14:40 UTC (permalink / raw)
To: linux-usb, linux-omap, Felipe Balbi
Cc: Tony Lindgren, Aaro Koskinen, Samuel Ortiz
Tahvo is a multi-function device on Nokia 770, implementing USB
transceiver and charge/battery control.
It's so close to Retu that a single driver can support both.
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Cc: Samuel Ortiz <sameo@linux.intel.com>
---
drivers/mfd/Kconfig | 6 +--
drivers/mfd/retu-mfd.c | 95 +++++++++++++++++++++++++++++++++++++++-------
include/linux/mfd/retu.h | 8 +++-
3 files changed, 92 insertions(+), 17 deletions(-)
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 671f5b1..0c3bdae 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1101,13 +1101,13 @@ config MFD_VIPERBOARD
The drivers do not support all features the board exposes.
config MFD_RETU
- tristate "Support for Retu multi-function device"
+ tristate "Support for Retu and Tahvo multi-function devices"
select MFD_CORE
depends on I2C && GENERIC_HARDIRQS
select REGMAP_IRQ
help
- Retu is a multi-function device found on Nokia Internet Tablets
- (770, N800 and N810).
+ Retu and Tahvo are multi-function devices found on Nokia
+ Internet Tablets (770, N800 and N810).
config MFD_AS3711
bool "Support for AS3711"
diff --git a/drivers/mfd/retu-mfd.c b/drivers/mfd/retu-mfd.c
index 3ba0486..fa0204b 100644
--- a/drivers/mfd/retu-mfd.c
+++ b/drivers/mfd/retu-mfd.c
@@ -1,5 +1,5 @@
/*
- * Retu MFD driver
+ * Retu/Tahvo MFD driver
*
* Copyright (C) 2004, 2005 Nokia Corporation
*
@@ -29,11 +29,15 @@
#include <linux/interrupt.h>
#include <linux/moduleparam.h>
+#define RETU_ID 0
+#define TAHVO_ID 1
+
/* Registers */
#define RETU_REG_ASICR 0x00 /* ASIC ID and revision */
#define RETU_REG_ASICR_VILMA (1 << 7) /* Bit indicating Vilma */
#define RETU_REG_IDR 0x01 /* Interrupt ID */
-#define RETU_REG_IMR 0x02 /* Interrupt mask */
+#define RETU_REG_IMR 0x02 /* Interrupt mask (Retu) */
+#define TAHVO_REG_IMR 0x03 /* Interrupt mask (Tahvo) */
/* Interrupt sources */
#define RETU_INT_PWR 0 /* Power button */
@@ -84,6 +88,62 @@ static struct regmap_irq_chip retu_irq_chip = {
/* Retu device registered for the power off. */
static struct retu_dev *retu_pm_power_off;
+static struct resource tahvo_usb_res[] = {
+ {
+ .name = "tahvo-usb",
+ .start = TAHVO_INT_VBUS,
+ .end = TAHVO_INT_VBUS,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static struct mfd_cell tahvo_devs[] = {
+ {
+ .name = "tahvo-usb",
+ .resources = tahvo_usb_res,
+ .num_resources = ARRAY_SIZE(tahvo_usb_res),
+ },
+};
+
+static struct regmap_irq tahvo_irqs[] = {
+ [TAHVO_INT_VBUS] = {
+ .mask = 1 << TAHVO_INT_VBUS,
+ }
+};
+
+static struct regmap_irq_chip tahvo_irq_chip = {
+ .name = "TAHVO",
+ .irqs = tahvo_irqs,
+ .num_irqs = ARRAY_SIZE(tahvo_irqs),
+ .num_regs = 1,
+ .status_base = RETU_REG_IDR,
+ .mask_base = TAHVO_REG_IMR,
+ .ack_base = RETU_REG_IDR,
+};
+
+static const struct {
+ char *chip_name;
+ char *companion_name;
+ struct regmap_irq_chip *irq_chip;
+ struct mfd_cell *children;
+ int nchildren;
+} retu_data[] = {
+ [RETU_ID] = {
+ .chip_name = "Retu",
+ .companion_name = "Vilma",
+ .irq_chip = &retu_irq_chip,
+ .children = retu_devs,
+ .nchildren = ARRAY_SIZE(retu_devs),
+ },
+ [TAHVO_ID] = {
+ .chip_name = "Tahvo",
+ .companion_name = "Betty",
+ .irq_chip = &tahvo_irq_chip,
+ .children = tahvo_devs,
+ .nchildren = ARRAY_SIZE(tahvo_devs),
+ }
+};
+
int retu_read(struct retu_dev *rdev, u8 reg)
{
int ret;
@@ -173,9 +233,13 @@ static struct regmap_config retu_config = {
static int retu_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
{
+ int chip = id->driver_data;
struct retu_dev *rdev;
int ret;
+ if (chip >= ARRAY_SIZE(retu_data))
+ return -EINVAL;
+
rdev = devm_kzalloc(&i2c->dev, sizeof(*rdev), GFP_KERNEL);
if (rdev == NULL)
return -ENOMEM;
@@ -190,33 +254,37 @@ static int retu_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
ret = retu_read(rdev, RETU_REG_ASICR);
if (ret < 0) {
- dev_err(rdev->dev, "could not read Retu revision: %d\n", ret);
+ dev_err(rdev->dev, "could not read %s revision: %d\n",
+ retu_data[chip].chip_name, ret);
return ret;
}
- dev_info(rdev->dev, "Retu%s v%d.%d found\n",
- (ret & RETU_REG_ASICR_VILMA) ? " & Vilma" : "",
+ dev_info(rdev->dev, "%s%s%s v%d.%d found\n",
+ retu_data[chip].chip_name,
+ (ret & RETU_REG_ASICR_VILMA) ? " & " : "",
+ (ret & RETU_REG_ASICR_VILMA) ?
+ retu_data[chip].companion_name : "",
(ret >> 4) & 0x7, ret & 0xf);
- /* Mask all RETU interrupts. */
- ret = retu_write(rdev, RETU_REG_IMR, 0xffff);
+ /* Mask all interrupts. */
+ ret = retu_write(rdev, retu_data[chip].irq_chip->mask_base, 0xffff);
if (ret < 0)
return ret;
ret = regmap_add_irq_chip(rdev->regmap, i2c->irq, IRQF_ONESHOT, -1,
- &retu_irq_chip, &rdev->irq_data);
+ retu_data[chip].irq_chip, &rdev->irq_data);
if (ret < 0)
return ret;
- ret = mfd_add_devices(rdev->dev, -1, retu_devs, ARRAY_SIZE(retu_devs),
- NULL, regmap_irq_chip_get_base(rdev->irq_data),
- NULL);
+ ret = mfd_add_devices(rdev->dev, -1, retu_data[chip].children,
+ retu_data[chip].nchildren, NULL,
+ regmap_irq_chip_get_base(rdev->irq_data), NULL);
if (ret < 0) {
regmap_del_irq_chip(i2c->irq, rdev->irq_data);
return ret;
}
- if (!pm_power_off) {
+ if (chip == RETU_ID && !pm_power_off) {
retu_pm_power_off = rdev;
pm_power_off = retu_power_off;
}
@@ -239,7 +307,8 @@ static int retu_remove(struct i2c_client *i2c)
}
static const struct i2c_device_id retu_id[] = {
- { "retu-mfd", 0 },
+ { "retu-mfd", RETU_ID },
+ { "tahvo-mfd", TAHVO_ID },
{ }
};
MODULE_DEVICE_TABLE(i2c, retu_id);
diff --git a/include/linux/mfd/retu.h b/include/linux/mfd/retu.h
index 1e2715d..65471c4 100644
--- a/include/linux/mfd/retu.h
+++ b/include/linux/mfd/retu.h
@@ -1,5 +1,5 @@
/*
- * Retu MFD driver interface
+ * Retu/Tahvo MFD driver interface
*
* This file is subject to the terms and conditions of the GNU General
* Public License. See the file "COPYING" in the main directory of this
@@ -19,4 +19,10 @@ int retu_write(struct retu_dev *, u8, u16);
#define RETU_REG_CC1 0x0d /* Common control register 1 */
#define RETU_REG_STATUS 0x16 /* Status register */
+/* Interrupt sources */
+#define TAHVO_INT_VBUS 0 /* VBUS state */
+
+/* Interrupt status */
+#define TAHVO_STAT_VBUS (1 << TAHVO_INT_VBUS)
+
#endif /* __LINUX_MFD_RETU_H */
--
1.7.10.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 2/4] ARM: OMAP1: nokia770: enable Tahvo
2013-03-07 14:40 [RFC PATCH 0/4] USB: OMAP: Tahvo USB support for 770 Aaro Koskinen
2013-03-07 14:40 ` [RFC PATCH 1/4] retu-mfd: support also Tahvo Aaro Koskinen
@ 2013-03-07 14:40 ` Aaro Koskinen
[not found] ` <1362667221-30659-1-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
2013-03-07 14:40 ` [RFC PATCH 4/4] USB: OMAP: Tahvo USB transceiver driver Aaro Koskinen
3 siblings, 0 replies; 11+ messages in thread
From: Aaro Koskinen @ 2013-03-07 14:40 UTC (permalink / raw)
To: linux-usb, linux-omap, Felipe Balbi; +Cc: Tony Lindgren, Aaro Koskinen
Add platform data for Tahvo.
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
---
arch/arm/mach-omap1/board-nokia770.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c
index 62a15e2..91449c5 100644
--- a/arch/arm/mach-omap1/board-nokia770.c
+++ b/arch/arm/mach-omap1/board-nokia770.c
@@ -234,16 +234,26 @@ static struct i2c_board_info nokia770_i2c_board_info_2[] __initdata = {
{
I2C_BOARD_INFO("retu-mfd", 0x01),
},
+ {
+ I2C_BOARD_INFO("tahvo-mfd", 0x02),
+ },
};
static void __init nokia770_cbus_init(void)
{
const int retu_irq_gpio = 62;
+ const int tahvo_irq_gpio = 40;
if (gpio_request_one(retu_irq_gpio, GPIOF_IN, "Retu IRQ"))
return;
+ if (gpio_request_one(tahvo_irq_gpio, GPIOF_IN, "Tahvo IRQ")) {
+ gpio_free(retu_irq_gpio);
+ return;
+ }
irq_set_irq_type(gpio_to_irq(retu_irq_gpio), IRQ_TYPE_EDGE_RISING);
+ irq_set_irq_type(gpio_to_irq(tahvo_irq_gpio), IRQ_TYPE_EDGE_RISING);
nokia770_i2c_board_info_2[0].irq = gpio_to_irq(retu_irq_gpio);
+ nokia770_i2c_board_info_2[1].irq = gpio_to_irq(tahvo_irq_gpio);
i2c_register_board_info(2, nokia770_i2c_board_info_2,
ARRAY_SIZE(nokia770_i2c_board_info_2));
platform_device_register(&nokia770_cbus_device);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 3/4] USB: OMAP: move omap-otg out from isp1301_omap
[not found] ` <1362667221-30659-1-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
@ 2013-03-07 14:40 ` Aaro Koskinen
[not found] ` <1362667221-30659-4-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
0 siblings, 1 reply; 11+ messages in thread
From: Aaro Koskinen @ 2013-03-07 14:40 UTC (permalink / raw)
To: linux-usb-u79uwXL29TY76Z2rM5mHXA,
linux-omap-u79uwXL29TY76Z2rM5mHXA, Felipe Balbi
Cc: Tony Lindgren, Aaro Koskinen
omap-otg platform device will be needed also by other transceivers.
It's not possible to have multiple instances of the driver, so it needs
to be moved into a separate file so that other drivers can hook into it.
Start this change with a very simplest implementation, much of the
OMAP OTG code in isp1301 is tightly coupled with isp1301 and cannot be
trivially moved out, but still this provides a way for other drivers to
register to OTG interrupt.
Signed-off-by: Aaro Koskinen <aaro.koskinen-X3B1VOXEql0@public.gmane.org>
---
drivers/usb/otg/Kconfig | 5 ++
drivers/usb/otg/Makefile | 1 +
drivers/usb/otg/isp1301_omap.c | 78 ++-----------------------------
drivers/usb/otg/omap-otg.c | 99 ++++++++++++++++++++++++++++++++++++++++
include/linux/usb/omap-otg.h | 30 ++++++++++++
5 files changed, 138 insertions(+), 75 deletions(-)
create mode 100644 drivers/usb/otg/omap-otg.c
create mode 100644 include/linux/usb/omap-otg.h
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig
index 37962c9..12af870 100644
--- a/drivers/usb/otg/Kconfig
+++ b/drivers/usb/otg/Kconfig
@@ -27,9 +27,14 @@ config USB_GPIO_VBUS
optionally control of a D+ pullup GPIO as well as a VBUS
current limit regulator.
+config OMAP_OTG
+ tristate
+ depends on ARCH_OMAP_OTG
+
config ISP1301_OMAP
tristate "Philips ISP1301 with OMAP OTG"
depends on I2C && ARCH_OMAP_OTG
+ select OMAP_OTG if USB_OTG
select USB_OTG_UTILS
help
If you say yes here you get support for the Philips ISP1301
diff --git a/drivers/usb/otg/Makefile b/drivers/usb/otg/Makefile
index a844b8d..4e05c6a 100644
--- a/drivers/usb/otg/Makefile
+++ b/drivers/usb/otg/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_USB_OTG_UTILS) += otg.o
# transceiver drivers
obj-$(CONFIG_USB_GPIO_VBUS) += gpio_vbus.o
+obj-$(CONFIG_OMAP_OTG) += omap-otg.o
obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o
obj-$(CONFIG_TWL4030_USB) += twl4030-usb.o
obj-$(CONFIG_TWL6030_USB) += twl6030-usb.o
diff --git a/drivers/usb/otg/isp1301_omap.c b/drivers/usb/otg/isp1301_omap.c
index af9cb11..5217b7e 100644
--- a/drivers/usb/otg/isp1301_omap.c
+++ b/drivers/usb/otg/isp1301_omap.c
@@ -28,6 +28,7 @@
#include <linux/gpio.h>
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
+#include <linux/usb/omap-otg.h>
#include <linux/usb.h>
#include <linux/usb/otg.h>
#include <linux/i2c.h>
@@ -74,22 +75,6 @@ struct isp1301 {
# define WORK_STOP 7 /* don't resubmit */
};
-
-/* bits in OTG_CTRL */
-
-#define OTG_XCEIV_OUTPUTS \
- (OTG_ASESSVLD|OTG_BSESSEND|OTG_BSESSVLD|OTG_VBUSVLD|OTG_ID)
-#define OTG_XCEIV_INPUTS \
- (OTG_PULLDOWN|OTG_PULLUP|OTG_DRV_VBUS|OTG_PD_VBUS|OTG_PU_VBUS|OTG_PU_ID)
-#define OTG_CTRL_BITS \
- (OTG_A_BUSREQ|OTG_A_SETB_HNPEN|OTG_B_BUSREQ|OTG_B_HNPEN|OTG_BUSDROP)
- /* and OTG_PULLUP is sometimes written */
-
-#define OTG_CTRL_MASK (OTG_DRIVER_SEL| \
- OTG_XCEIV_OUTPUTS|OTG_XCEIV_INPUTS| \
- OTG_CTRL_BITS)
-
-
/*-------------------------------------------------------------------------*/
/* board-specific PM hooks */
@@ -822,15 +807,10 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp)
return ret;
}
-static struct platform_device *otg_dev;
-
static int isp1301_otg_init(struct isp1301 *isp)
{
u32 l;
- if (!otg_dev)
- return -ENODEV;
-
dump_regs(isp, __func__);
/* some of these values are board-specific... */
l = omap_readl(OTG_SYSCON_2);
@@ -864,58 +844,6 @@ static int isp1301_otg_init(struct isp1301 *isp)
return 0;
}
-static int otg_probe(struct platform_device *dev)
-{
- // struct omap_usb_config *config = dev->platform_data;
-
- otg_dev = dev;
- return 0;
-}
-
-static int otg_remove(struct platform_device *dev)
-{
- otg_dev = NULL;
- return 0;
-}
-
-static struct platform_driver omap_otg_driver = {
- .probe = otg_probe,
- .remove = otg_remove,
- .driver = {
- .owner = THIS_MODULE,
- .name = "omap_otg",
- },
-};
-
-static int otg_bind(struct isp1301 *isp)
-{
- int status;
-
- if (otg_dev)
- return -EBUSY;
-
- status = platform_driver_register(&omap_otg_driver);
- if (status < 0)
- return status;
-
- if (otg_dev)
- status = request_irq(otg_dev->resource[1].start, omap_otg_irq,
- 0, DRIVER_NAME, isp);
- else
- status = -ENODEV;
-
- if (status < 0)
- platform_driver_unregister(&omap_otg_driver);
- return status;
-}
-
-static void otg_unbind(struct isp1301 *isp)
-{
- if (!otg_dev)
- return;
- free_irq(otg_dev->resource[1].start, isp);
-}
-
#else
/* OTG controller isn't clocked */
@@ -1222,7 +1150,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c)
isp1301_clear_bits(isp, ISP1301_INTERRUPT_RISING, ~0);
free_irq(i2c->irq, isp);
#ifdef CONFIG_USB_OTG
- otg_unbind(isp);
+ omap_otg_unbind(isp);
#endif
if (machine_is_omap_h2())
gpio_free(2);
@@ -1555,7 +1483,7 @@ isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
isp1301_clear_bits(isp, ISP1301_INTERRUPT_RISING, ~0);
#ifdef CONFIG_USB_OTG
- status = otg_bind(isp);
+ status = omap_otg_bind(isp, omap_otg_irq);
if (status < 0) {
dev_dbg(&i2c->dev, "can't bind OTG\n");
goto fail;
diff --git a/drivers/usb/otg/omap-otg.c b/drivers/usb/otg/omap-otg.c
new file mode 100644
index 0000000..12e8f13
--- /dev/null
+++ b/drivers/usb/otg/omap-otg.c
@@ -0,0 +1,99 @@
+/*
+ * OMAP OTG driver
+ *
+ * Copyright (C) 2004 Texas Instruments
+ * Copyright (C) 2004 David Brownell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/usb/omap-otg.h>
+#include <linux/platform_device.h>
+
+static void *omap_otg_user;
+static DEFINE_MUTEX(omap_otg_lock);
+static struct platform_device *omap_otg_dev;
+
+static int omap_otg_probe(struct platform_device *dev)
+{
+ int ret;
+
+ mutex_lock(&omap_otg_lock);
+ if (omap_otg_dev) {
+ ret = -EBUSY;
+ } else {
+ omap_otg_dev = dev;
+ ret = 0;
+ }
+ mutex_unlock(&omap_otg_lock);
+
+ return ret;
+}
+
+static int omap_otg_remove(struct platform_device *dev)
+{
+ int ret;
+
+ mutex_lock(&omap_otg_lock);
+ if (omap_otg_user) {
+ ret = -EBUSY;
+ } else {
+ omap_otg_dev = NULL;
+ ret = 0;
+ }
+ mutex_unlock(&omap_otg_lock);
+
+ return ret;
+}
+
+int omap_otg_bind(void *transceiver, irq_handler_t irq_handler)
+{
+ int ret;
+
+ mutex_lock(&omap_otg_lock);
+ if (!omap_otg_dev) {
+ ret = -EPROBE_DEFER;
+ } else if (omap_otg_user) {
+ ret = -EBUSY;
+ } else {
+ ret = request_irq(omap_otg_dev->resource[1].start, irq_handler,
+ 0, "OMAP OTG", transceiver);
+ if (!ret)
+ omap_otg_user = transceiver;
+ }
+ mutex_unlock(&omap_otg_lock);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(omap_otg_bind);
+
+void omap_otg_unbind(void *transceiver)
+{
+ mutex_lock(&omap_otg_lock);
+ BUG_ON(!omap_otg_dev || !omap_otg_user || omap_otg_user != transceiver);
+ free_irq(omap_otg_dev->resource[1].start, transceiver);
+ omap_otg_user = NULL;
+ mutex_unlock(&omap_otg_lock);
+}
+EXPORT_SYMBOL_GPL(omap_otg_unbind);
+
+static struct platform_driver omap_otg_driver = {
+ .probe = omap_otg_probe,
+ .remove = omap_otg_remove,
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "omap_otg",
+ },
+};
+module_platform_driver(omap_otg_driver);
diff --git a/include/linux/usb/omap-otg.h b/include/linux/usb/omap-otg.h
new file mode 100644
index 0000000..efc1cb3
--- /dev/null
+++ b/include/linux/usb/omap-otg.h
@@ -0,0 +1,30 @@
+/*
+ * OMAP OTG driver
+ *
+ * Copyright (C) 2004 Texas Instruments
+ * Copyright (C) 2004 David Brownell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/* bits in OTG_CTRL */
+#define OTG_XCEIV_OUTPUTS \
+ (OTG_ASESSVLD|OTG_BSESSEND|OTG_BSESSVLD|OTG_VBUSVLD|OTG_ID)
+#define OTG_XCEIV_INPUTS \
+ (OTG_PULLDOWN|OTG_PULLUP|OTG_DRV_VBUS|OTG_PD_VBUS|OTG_PU_VBUS|OTG_PU_ID)
+#define OTG_CTRL_BITS \
+ (OTG_A_BUSREQ|OTG_A_SETB_HNPEN|OTG_B_BUSREQ|OTG_B_HNPEN|OTG_BUSDROP)
+ /* and OTG_PULLUP is sometimes written */
+#define OTG_CTRL_MASK \
+ (OTG_DRIVER_SEL|OTG_XCEIV_OUTPUTS|OTG_XCEIV_INPUTS|OTG_CTRL_BITS)
+
+int omap_otg_bind(void *, irq_handler_t);
+void omap_otg_unbind(void *);
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 4/4] USB: OMAP: Tahvo USB transceiver driver
2013-03-07 14:40 [RFC PATCH 0/4] USB: OMAP: Tahvo USB support for 770 Aaro Koskinen
` (2 preceding siblings ...)
[not found] ` <1362667221-30659-1-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
@ 2013-03-07 14:40 ` Aaro Koskinen
2013-03-07 14:54 ` Felipe Balbi
2013-03-07 16:20 ` Tony Lindgren
3 siblings, 2 replies; 11+ messages in thread
From: Aaro Koskinen @ 2013-03-07 14:40 UTC (permalink / raw)
To: linux-usb, linux-omap, Felipe Balbi; +Cc: Tony Lindgren, Aaro Koskinen
Add Tahvo USB transceiver driver.
Based on old code from linux-omap tree. The original driver was written
by Juha Yrjölä, Tony Lindgren, and Timo Teräs.
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
---
drivers/usb/otg/Kconfig | 16 ++
drivers/usb/otg/Makefile | 1 +
drivers/usb/otg/tahvo-usb.c | 643 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 660 insertions(+)
create mode 100644 drivers/usb/otg/tahvo-usb.c
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig
index 12af870..86b5ebe 100644
--- a/drivers/usb/otg/Kconfig
+++ b/drivers/usb/otg/Kconfig
@@ -61,6 +61,22 @@ config USB_ULPI_VIEWPORT
Provides read/write operations to the ULPI phy register set for
controllers with a viewport register (e.g. Chipidea/ARC controllers).
+config TAHVO_USB
+ tristate "Tahvo USB transceiver driver"
+ depends on MFD_RETU && ARCH_OMAP_OTG
+ select OMAP_OTG
+ select USB_OTG_UTILS
+ help
+ Enable this to support USB transceiver on Tahvo. This is used
+ at least on Nokia 770.
+
+config TAHVO_USB_HOST_BY_DEFAULT
+ depends on TAHVO_USB && USB_OTG
+ boolean "Device in USB host mode by default"
+ ---help---
+ Say Y here, if you want the device to enter USB host mode
+ by default on bootup.
+
config TWL4030_USB
tristate "TWL4030 USB Transceiver Driver"
depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS
diff --git a/drivers/usb/otg/Makefile b/drivers/usb/otg/Makefile
index 4e05c6a..31e28ef 100644
--- a/drivers/usb/otg/Makefile
+++ b/drivers/usb/otg/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_USB_OTG_UTILS) += otg.o
obj-$(CONFIG_USB_GPIO_VBUS) += gpio_vbus.o
obj-$(CONFIG_OMAP_OTG) += omap-otg.o
obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o
+obj-$(CONFIG_TAHVO_USB) += tahvo-usb.o
obj-$(CONFIG_TWL4030_USB) += twl4030-usb.o
obj-$(CONFIG_TWL6030_USB) += twl6030-usb.o
obj-$(CONFIG_NOP_USB_XCEIV) += nop-usb-xceiv.o
diff --git a/drivers/usb/otg/tahvo-usb.c b/drivers/usb/otg/tahvo-usb.c
new file mode 100644
index 0000000..3286457
--- /dev/null
+++ b/drivers/usb/otg/tahvo-usb.c
@@ -0,0 +1,643 @@
+/*
+ * Tahvo USB transceiver driver
+ *
+ * Copyright (C) 2005-2006 Nokia Corporation
+ *
+ * Parts copied from drivers/i2c/chips/isp1301_omap.c
+ * Copyright (C) 2004 Texas Instruments
+ * Copyright (C) 2004 David Brownell
+ *
+ * Original driver written by Juha Yrjölä, Tony Lindgren and Timo Teräs.
+ * Modified for Retu/Tahvo MFD by Aaro Koskinen.
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License. See the file "COPYING" in the main directory of this
+ * archive for more details.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/usb.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/usb/otg.h>
+#include <linux/mfd/retu.h>
+#include <linux/usb/gadget.h>
+#include <linux/usb/omap-otg.h>
+#include <linux/platform_device.h>
+
+#include <mach/usb.h>
+
+#define DRIVER_NAME "tahvo-usb"
+
+#define TAHVO_REG_IDSR 0x02
+#define TAHVO_REG_USBR 0x06
+
+#define USBR_SLAVE_CONTROL (1 << 8)
+#define USBR_VPPVIO_SW (1 << 7)
+#define USBR_SPEED (1 << 6)
+#define USBR_REGOUT (1 << 5)
+#define USBR_MASTER_SW2 (1 << 4)
+#define USBR_MASTER_SW1 (1 << 3)
+#define USBR_SLAVE_SW (1 << 2)
+#define USBR_NSUSPEND (1 << 1)
+#define USBR_SEMODE (1 << 0)
+
+#define TAHVO_MODE_HOST 0
+#define TAHVO_MODE_PERIPHERAL 1
+
+#ifdef CONFIG_USB_OTG
+#define TAHVO_MODE(tu) ((tu)->tahvo_mode)
+#elif IS_ENABLED(CONFIG_USB_OMAP)
+#define TAHVO_MODE(tu) TAHVO_MODE_PERIPHERAL
+#else
+#define TAHVO_MODE(tu) TAHVO_MODE_HOST
+#endif
+
+struct tahvo_usb {
+ struct platform_device *pt_dev;
+ struct usb_phy phy;
+ int vbus_state;
+ struct mutex serialize;
+ struct clk *ick;
+ int irq;
+#ifdef CONFIG_USB_OTG
+ int tahvo_mode;
+#endif
+};
+
+/*
+ * ---------------------------------------------------------------------------
+ * OTG related functions
+ *
+ * These should be separated into omap-otg.c driver module, as they are used
+ * by various transceivers. These functions are needed in the UDC-only case
+ * as well. These functions are copied from GPL isp1301_omap.c
+ * ---------------------------------------------------------------------------
+ */
+static irqreturn_t omap_otg_irq(int irq, void *arg)
+{
+ struct tahvo_usb *tu = arg;
+ struct usb_otg *otg = tu->phy.otg;
+ u16 otg_irq;
+
+ otg_irq = omap_readw(OTG_IRQ_SRC);
+ if (otg_irq & OPRT_CHG) {
+ omap_writew(OPRT_CHG, OTG_IRQ_SRC);
+ } else if (otg_irq & B_SRP_TMROUT) {
+ omap_writew(B_SRP_TMROUT, OTG_IRQ_SRC);
+ } else if (otg_irq & B_HNP_FAIL) {
+ omap_writew(B_HNP_FAIL, OTG_IRQ_SRC);
+ } else if (otg_irq & A_SRP_DETECT) {
+ omap_writew(A_SRP_DETECT, OTG_IRQ_SRC);
+ } else if (otg_irq & A_REQ_TMROUT) {
+ omap_writew(A_REQ_TMROUT, OTG_IRQ_SRC);
+ } else if (otg_irq & A_VBUS_ERR) {
+ omap_writew(A_VBUS_ERR, OTG_IRQ_SRC);
+ } else if (otg_irq & DRIVER_SWITCH) {
+#ifdef CONFIG_USB_OTG
+ if ((!(omap_readl(OTG_CTRL) & OTG_DRIVER_SEL)) &&
+ otg->host && tu->phy.state == OTG_STATE_A_HOST) {
+ /* role is host */
+ usb_bus_start_enum(otg->host, otg->host->otg_port);
+ }
+#endif
+ omap_writew(DRIVER_SWITCH, OTG_IRQ_SRC);
+ } else
+ return IRQ_NONE;
+
+ return IRQ_HANDLED;
+}
+
+static int tahvo_otg_init(void)
+{
+ u32 l;
+
+ l = omap_readl(OTG_SYSCON_1);
+ l &= ~OTG_IDLE_EN;
+ omap_writel(l, OTG_SYSCON_1);
+ udelay(100);
+
+ /* some of these values are board-specific... */
+ l = omap_readl(OTG_SYSCON_2);
+ l |= OTG_EN
+ /* for B-device: */
+ | SRP_GPDATA /* 9msec Bdev D+ pulse */
+ | SRP_GPDVBUS /* discharge after VBUS pulse */
+ /* for A-device: */
+ | (0 << 20) /* 200ms nominal A_WAIT_VRISE timer */
+ | SRP_DPW /* detect 167+ns SRP pulses */
+ | SRP_DATA | SRP_VBUS; /* accept both kinds of SRP pulse */
+ omap_writel(l, OTG_SYSCON_2);
+
+ omap_writew(DRIVER_SWITCH | OPRT_CHG | B_SRP_TMROUT | B_HNP_FAIL |
+ A_VBUS_ERR | A_SRP_DETECT | A_REQ_TMROUT, OTG_IRQ_EN);
+ l = omap_readl(OTG_SYSCON_2);
+ l |= OTG_EN;
+ omap_writel(l, OTG_SYSCON_2);
+
+ return 0;
+}
+
+/*
+ * ---------------------------------------------------------------------------
+ * Tahvo related functions
+ *
+ * These are Nokia proprietary code, except for the OTG register settings,
+ * which are copied from isp1301.c
+ * ---------------------------------------------------------------------------
+ */
+static ssize_t vbus_state_show(struct device *device,
+ struct device_attribute *attr, char *buf)
+{
+ struct tahvo_usb *tu = dev_get_drvdata(device);
+ return sprintf(buf, "%d\n", tu->vbus_state);
+}
+static DEVICE_ATTR(vbus_state, 0444, vbus_state_show, NULL);
+
+static void check_vbus_state(struct tahvo_usb *tu)
+{
+ struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent);
+ int reg, prev_state;
+
+ reg = retu_read(rdev, TAHVO_REG_IDSR);
+ if (reg & TAHVO_STAT_VBUS) {
+ u32 l;
+
+ switch (tu->phy.state) {
+ case OTG_STATE_B_IDLE:
+ /* Enable the gadget driver */
+ if (tu->phy.otg->gadget)
+ usb_gadget_vbus_connect(tu->phy.otg->gadget);
+ /*
+ * Set B-session valid and not B-session ended to
+ * indicate Vbus to be ok.
+ */
+ l = omap_readl(OTG_CTRL);
+ l &= ~OTG_BSESSEND;
+ l |= OTG_BSESSVLD;
+ omap_writel(l, OTG_CTRL);
+
+ tu->phy.state = OTG_STATE_B_PERIPHERAL;
+ break;
+ case OTG_STATE_A_IDLE:
+ /*
+ * Session is now valid assuming the USB hub is driving
+ * Vbus.
+ */
+ tu->phy.state = OTG_STATE_A_HOST;
+ break;
+ default:
+ break;
+ }
+ dev_info(&tu->pt_dev->dev, "USB cable connected\n");
+ } else {
+ switch (tu->phy.state) {
+ case OTG_STATE_B_PERIPHERAL:
+ if (tu->phy.otg->gadget)
+ usb_gadget_vbus_disconnect(tu->phy.otg->gadget);
+ tu->phy.state = OTG_STATE_B_IDLE;
+ break;
+ case OTG_STATE_A_HOST:
+ tu->phy.state = OTG_STATE_A_IDLE;
+ break;
+ default:
+ break;
+ }
+ dev_info(&tu->pt_dev->dev, "USB cable disconnected\n");
+ }
+
+ prev_state = tu->vbus_state;
+ tu->vbus_state = reg & TAHVO_STAT_VBUS;
+ if (prev_state != tu->vbus_state)
+ sysfs_notify(&tu->pt_dev->dev.kobj, NULL, "vbus_state");
+}
+
+static void tahvo_usb_become_host(struct tahvo_usb *tu)
+{
+ struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent);
+ u32 l;
+
+ /*
+ * Clear system and transceiver controlled bits also mark the A-session
+ * is always valid.
+ */
+ tahvo_otg_init();
+
+ l = omap_readl(OTG_CTRL);
+ l &= ~(OTG_XCEIV_OUTPUTS | OTG_CTRL_BITS);
+ l |= OTG_ASESSVLD;
+ omap_writel(l, OTG_CTRL);
+
+ /* Power up the transceiver in USB host mode */
+ retu_write(rdev, TAHVO_REG_USBR, USBR_REGOUT | USBR_NSUSPEND |
+ USBR_MASTER_SW2 | USBR_MASTER_SW1);
+ tu->phy.state = OTG_STATE_A_IDLE;
+
+ check_vbus_state(tu);
+}
+
+static void tahvo_usb_stop_host(struct tahvo_usb *tu)
+{
+ tu->phy.state = OTG_STATE_A_IDLE;
+}
+
+static void tahvo_usb_become_peripheral(struct tahvo_usb *tu)
+{
+ struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent);
+ u32 l;
+
+ /*
+ * Clear system and transceiver controlled bits and enable ID to mark
+ * peripheral mode and BSESSEND to mark no Vbus.
+ */
+ tahvo_otg_init();
+ l = omap_readl(OTG_CTRL);
+ l &= ~(OTG_XCEIV_OUTPUTS | OTG_CTRL_BITS | OTG_BSESSVLD);
+ l |= OTG_ID | OTG_BSESSEND;
+ omap_writel(l, OTG_CTRL);
+
+ /* Power up transceiver and set it in USB peripheral mode */
+ retu_write(rdev, TAHVO_REG_USBR, USBR_SLAVE_CONTROL | USBR_REGOUT |
+ USBR_NSUSPEND | USBR_SLAVE_SW);
+ tu->phy.state = OTG_STATE_B_IDLE;
+
+ check_vbus_state(tu);
+}
+
+static void tahvo_usb_stop_peripheral(struct tahvo_usb *tu)
+{
+ u32 l;
+
+ l = omap_readl(OTG_CTRL);
+ l &= ~OTG_BSESSVLD;
+ l |= OTG_BSESSEND;
+ omap_writel(l, OTG_CTRL);
+
+ if (tu->phy.otg->gadget)
+ usb_gadget_vbus_disconnect(tu->phy.otg->gadget);
+ tu->phy.state = OTG_STATE_B_IDLE;
+}
+
+static void tahvo_usb_power_off(struct tahvo_usb *tu)
+{
+ struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent);
+ u32 l;
+ int id;
+
+ /* Disable gadget controller if any */
+ if (tu->phy.otg->gadget)
+ usb_gadget_vbus_disconnect(tu->phy.otg->gadget);
+
+ /* Disable OTG and interrupts */
+ if (TAHVO_MODE(tu) == TAHVO_MODE_PERIPHERAL)
+ id = OTG_ID;
+ else
+ id = 0;
+ l = omap_readl(OTG_CTRL);
+ l &= ~(OTG_XCEIV_OUTPUTS | OTG_CTRL_BITS | OTG_BSESSVLD);
+ l |= id | OTG_BSESSEND;
+ omap_writel(l, OTG_CTRL);
+ omap_writew(0, OTG_IRQ_EN);
+
+ l = omap_readl(OTG_SYSCON_2);
+ l &= ~OTG_EN;
+ omap_writel(l, OTG_SYSCON_2);
+
+ l = omap_readl(OTG_SYSCON_1);
+ l |= OTG_IDLE_EN;
+ omap_writel(l, OTG_SYSCON_1);
+
+ /* Power off transceiver */
+ retu_write(rdev, TAHVO_REG_USBR, 0);
+ tu->phy.state = OTG_STATE_UNDEFINED;
+}
+
+static int tahvo_usb_set_power(struct usb_phy *dev, unsigned mA)
+{
+ struct tahvo_usb *tu = container_of(dev, struct tahvo_usb, phy);
+
+ dev_dbg(&tu->pt_dev->dev, "%s %d mA\n", __func__, mA);
+
+ /* REVISIT: Can Tahvo charge battery from VBUS? */
+
+ return 0;
+}
+
+static int tahvo_usb_set_suspend(struct usb_phy *dev, int suspend)
+{
+ struct tahvo_usb *tu = container_of(dev, struct tahvo_usb, phy);
+ struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent);
+ u16 w;
+
+ dev_dbg(&tu->pt_dev->dev, "%s\n", __func__);
+
+ w = retu_read(rdev, TAHVO_REG_USBR);
+ if (suspend)
+ w &= ~USBR_NSUSPEND;
+ else
+ w |= USBR_NSUSPEND;
+ retu_write(rdev, TAHVO_REG_USBR, w);
+
+ return 0;
+}
+
+static int tahvo_usb_start_srp(struct usb_otg *otg)
+{
+ struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy);
+ u32 otg_ctrl;
+
+ dev_dbg(&tu->pt_dev->dev, "%s\n", __func__);
+
+ if (!otg || tu->phy.state != OTG_STATE_B_IDLE)
+ return -ENODEV;
+
+ otg_ctrl = omap_readl(OTG_CTRL);
+ if (!(otg_ctrl & OTG_BSESSEND))
+ return -EINVAL;
+
+ otg_ctrl |= OTG_B_BUSREQ;
+ otg_ctrl &= ~OTG_A_BUSREQ & OTG_CTRL_BITS;
+ omap_writel(otg_ctrl, OTG_CTRL);
+ tu->phy.state = OTG_STATE_B_SRP_INIT;
+
+ return 0;
+}
+
+static int tahvo_usb_start_hnp(struct usb_otg *otg)
+{
+ struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy);
+
+ dev_dbg(&tu->pt_dev->dev, "%s\n", __func__);
+
+ return -EINVAL;
+}
+
+static int tahvo_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
+{
+ struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy);
+ u32 l;
+
+ dev_dbg(&tu->pt_dev->dev, "%s %p\n", __func__, host);
+
+ if (otg == NULL)
+ return -ENODEV;
+
+#if defined(CONFIG_USB_OTG) || !IS_ENABLED(CONFIG_USB_OMAP)
+
+ mutex_lock(&tu->serialize);
+
+ if (host == NULL) {
+ if (TAHVO_MODE(tu) == TAHVO_MODE_HOST)
+ tahvo_usb_power_off(tu);
+ otg->host = NULL;
+ mutex_unlock(&tu->serialize);
+ return 0;
+ }
+
+ l = omap_readl(OTG_SYSCON_1);
+ l &= ~(OTG_IDLE_EN | HST_IDLE_EN | DEV_IDLE_EN);
+ omap_writel(l, OTG_SYSCON_1);
+
+ if (TAHVO_MODE(tu) == TAHVO_MODE_HOST) {
+ otg->host = NULL;
+ tahvo_usb_become_host(tu);
+ }
+
+ otg->host = host;
+
+ mutex_unlock(&tu->serialize);
+
+ return 0;
+#else
+ /* No host mode configured, so do not allow host controlled to be set */
+ return -EINVAL;
+#endif
+}
+
+static int tahvo_usb_set_peripheral(struct usb_otg *otg,
+ struct usb_gadget *gadget)
+{
+ struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy);
+
+ dev_dbg(&tu->pt_dev->dev, "%s %p\n", __func__, gadget);
+
+ if (!otg)
+ return -ENODEV;
+
+#if defined(CONFIG_USB_OTG) || IS_ENABLED(CONFIG_USB_OMAP)
+
+ mutex_lock(&tu->serialize);
+
+ if (!gadget) {
+ if (TAHVO_MODE(tu) == TAHVO_MODE_PERIPHERAL)
+ tahvo_usb_power_off(tu);
+ tu->phy.otg->gadget = NULL;
+ mutex_unlock(&tu->serialize);
+ return 0;
+ }
+
+ tu->phy.otg->gadget = gadget;
+ if (TAHVO_MODE(tu) == TAHVO_MODE_PERIPHERAL)
+ tahvo_usb_become_peripheral(tu);
+
+ mutex_unlock(&tu->serialize);
+
+ return 0;
+#else
+ /* No gadget mode configured, so do not allow gadget driver to be set */
+ return -EINVAL;
+#endif
+}
+
+static irqreturn_t tahvo_usb_vbus_interrupt(int irq, void *_tu)
+{
+ struct tahvo_usb *tu = _tu;
+
+ check_vbus_state(tu);
+
+ return IRQ_HANDLED;
+}
+
+#ifdef CONFIG_USB_OTG
+static ssize_t otg_mode_show(struct device *device,
+ struct device_attribute *attr, char *buf)
+{
+ struct tahvo_usb *tu = dev_get_drvdata(device);
+
+ switch (tu->tahvo_mode) {
+ case TAHVO_MODE_HOST:
+ return sprintf(buf, "host\n");
+ case TAHVO_MODE_PERIPHERAL:
+ return sprintf(buf, "peripheral\n");
+ }
+
+ return -EINVAL;
+}
+
+static ssize_t otg_mode_store(struct device *device,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct tahvo_usb *tu = dev_get_drvdata(device);
+ int r;
+
+ mutex_lock(&tu->serialize);
+ if (count >= 4 && strncmp(buf, "host", 4) == 0) {
+ if (tu->tahvo_mode == TAHVO_MODE_PERIPHERAL)
+ tahvo_usb_stop_peripheral(tu);
+ tu->tahvo_mode = TAHVO_MODE_HOST;
+ if (tu->phy.otg->host) {
+ dev_info(device, "HOST mode: host controller present\n");
+ tahvo_usb_become_host(tu);
+ } else {
+ dev_info(device, "HOST mode: no host controller, powering off\n");
+ tahvo_usb_power_off(tu);
+ }
+ r = strlen(buf);
+ } else if (count >= 10 && strncmp(buf, "peripheral", 10) == 0) {
+ if (tu->tahvo_mode == TAHVO_MODE_HOST)
+ tahvo_usb_stop_host(tu);
+ tu->tahvo_mode = TAHVO_MODE_PERIPHERAL;
+ if (tu->phy.otg->gadget) {
+ dev_info(device, "PERIPHERAL mode: gadget driver present\n");
+ tahvo_usb_become_peripheral(tu);
+ } else {
+ dev_info(device, "PERIPHERAL mode: no gadget driver, powering off\n");
+ tahvo_usb_power_off(tu);
+ }
+ r = strlen(buf);
+ } else {
+ r = -EINVAL;
+ }
+ mutex_unlock(&tu->serialize);
+
+ return r;
+}
+
+static DEVICE_ATTR(otg_mode, 0644, otg_mode_show, otg_mode_store);
+#endif
+
+static int tahvo_usb_probe(struct platform_device *pdev)
+{
+ struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent);
+ struct tahvo_usb *tu;
+ int ret;
+
+ tu = devm_kzalloc(&pdev->dev, sizeof(*tu), GFP_KERNEL);
+ if (!tu)
+ return -ENOMEM;
+
+ tu->phy.otg = devm_kzalloc(&pdev->dev, sizeof(*tu->phy.otg),
+ GFP_KERNEL);
+ if (!tu->phy.otg)
+ return -ENOMEM;
+
+ tu->pt_dev = pdev;
+#ifdef CONFIG_USB_OTG
+ /* Default mode */
+#ifdef CONFIG_TAHVO_USB_HOST_BY_DEFAULT
+ tu->tahvo_mode = TAHVO_MODE_HOST;
+#else
+ tu->tahvo_mode = TAHVO_MODE_PERIPHERAL;
+#endif
+#endif
+
+ mutex_init(&tu->serialize);
+
+ tu->ick = devm_clk_get(&pdev->dev, "usb_l4_ick");
+ if (!IS_ERR(tu->ick))
+ clk_enable(tu->ick);
+
+ /*
+ * Set initial state, so that we generate kevents only on state changes.
+ */
+ tu->vbus_state = retu_read(rdev, TAHVO_REG_IDSR) & TAHVO_STAT_VBUS;
+
+ tu->irq = platform_get_irq(pdev, 0);
+ ret = request_threaded_irq(tu->irq, NULL, tahvo_usb_vbus_interrupt, 0,
+ "tahvo-vbus", tu);
+ if (ret) {
+ dev_err(&pdev->dev, "could not register tahvo-vbus irq: %d\n",
+ ret);
+ goto err_disable_clk;
+ }
+
+ /* Attributes */
+ ret = device_create_file(&pdev->dev, &dev_attr_vbus_state);
+#ifdef CONFIG_USB_OTG
+ ret |= device_create_file(&pdev->dev, &dev_attr_otg_mode);
+#endif
+ if (ret)
+ dev_err(&pdev->dev, "attribute creation failed: %d\n", ret);
+
+ /* Create OTG interface */
+ tahvo_usb_power_off(tu);
+ tu->phy.state = OTG_STATE_UNDEFINED;
+ tu->phy.label = DRIVER_NAME;
+ tu->phy.set_power = tahvo_usb_set_power;
+ tu->phy.set_suspend = tahvo_usb_set_suspend;
+
+ tu->phy.otg->phy = &tu->phy;
+ tu->phy.otg->set_host = tahvo_usb_set_host;
+ tu->phy.otg->set_peripheral = tahvo_usb_set_peripheral;
+ tu->phy.otg->start_srp = tahvo_usb_start_srp;
+ tu->phy.otg->start_hnp = tahvo_usb_start_hnp;
+
+ ret = usb_add_phy(&tu->phy, USB_PHY_TYPE_USB2);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "cannot register USB transceiver: %d\n",
+ ret);
+ goto err_free_irq;
+ }
+
+ dev_set_drvdata(&pdev->dev, tu);
+
+ omap_otg_bind(tu, omap_otg_irq);
+
+ return 0;
+
+err_free_irq:
+ free_irq(tu->irq, tu);
+err_disable_clk:
+ if (!IS_ERR(tu->ick))
+ clk_disable(tu->ick);
+
+ return ret;
+}
+
+static int tahvo_usb_remove(struct platform_device *pdev)
+{
+ struct tahvo_usb *tu = platform_get_drvdata(pdev);
+
+ omap_otg_unbind(tu);
+ free_irq(tu->irq, tu);
+ usb_remove_phy(&tu->phy);
+ device_remove_file(&pdev->dev, &dev_attr_vbus_state);
+#ifdef CONFIG_USB_OTG
+ device_remove_file(&pdev->dev, &dev_attr_otg_mode);
+#endif
+ if (!IS_ERR(tu->ick))
+ clk_disable(tu->ick);
+
+ return 0;
+}
+
+static struct platform_driver tahvo_usb_driver = {
+ .probe = tahvo_usb_probe,
+ .remove = tahvo_usb_remove,
+ .driver = {
+ .name = "tahvo-usb",
+ },
+};
+module_platform_driver(tahvo_usb_driver);
+
+MODULE_DESCRIPTION("Tahvo USB transceiver driver");
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Juha Yrjölä, Tony Lindgren, and Timo Teräs");
+MODULE_AUTHOR("Aaro Koskinen <aaro.koskinen@iki.fi>");
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 1/4] retu-mfd: support also Tahvo
2013-03-07 14:40 ` [RFC PATCH 1/4] retu-mfd: support also Tahvo Aaro Koskinen
@ 2013-03-07 14:48 ` Felipe Balbi
[not found] ` <1362667221-30659-2-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
1 sibling, 0 replies; 11+ messages in thread
From: Felipe Balbi @ 2013-03-07 14:48 UTC (permalink / raw)
To: Aaro Koskinen
Cc: linux-usb, linux-omap, Felipe Balbi, Tony Lindgren, Samuel Ortiz
[-- Attachment #1: Type: text/plain, Size: 2279 bytes --]
Hi,
On Thu, Mar 07, 2013 at 04:40:18PM +0200, Aaro Koskinen wrote:
> Tahvo is a multi-function device on Nokia 770, implementing USB
> transceiver and charge/battery control.
>
> It's so close to Retu that a single driver can support both.
>
> Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> ---
> drivers/mfd/Kconfig | 6 +--
> drivers/mfd/retu-mfd.c | 95 +++++++++++++++++++++++++++++++++++++++-------
> include/linux/mfd/retu.h | 8 +++-
> 3 files changed, 92 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 671f5b1..0c3bdae 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -1101,13 +1101,13 @@ config MFD_VIPERBOARD
> The drivers do not support all features the board exposes.
>
> config MFD_RETU
> - tristate "Support for Retu multi-function device"
> + tristate "Support for Retu and Tahvo multi-function devices"
> select MFD_CORE
> depends on I2C && GENERIC_HARDIRQS
> select REGMAP_IRQ
> help
> - Retu is a multi-function device found on Nokia Internet Tablets
> - (770, N800 and N810).
> + Retu and Tahvo are multi-function devices found on Nokia
> + Internet Tablets (770, N800 and N810).
>
> config MFD_AS3711
> bool "Support for AS3711"
> diff --git a/drivers/mfd/retu-mfd.c b/drivers/mfd/retu-mfd.c
> index 3ba0486..fa0204b 100644
> --- a/drivers/mfd/retu-mfd.c
> +++ b/drivers/mfd/retu-mfd.c
> @@ -1,5 +1,5 @@
> /*
> - * Retu MFD driver
> + * Retu/Tahvo MFD driver
> *
> * Copyright (C) 2004, 2005 Nokia Corporation
> *
> @@ -29,11 +29,15 @@
> #include <linux/interrupt.h>
> #include <linux/moduleparam.h>
>
> +#define RETU_ID 0
> +#define TAHVO_ID 1
do you really need this ? Why didn't you use the i2c address as the
device ID ?
> @@ -173,9 +233,13 @@ static struct regmap_config retu_config = {
>
> static int retu_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
> {
> + int chip = id->driver_data;
> struct retu_dev *rdev;
> int ret;
>
> + if (chip >= ARRAY_SIZE(retu_data))
> + return -EINVAL;
you can figure this out without using 'chip'. Just use the i2c address.
--
balbi
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 3/4] USB: OMAP: move omap-otg out from isp1301_omap
[not found] ` <1362667221-30659-4-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
@ 2013-03-07 14:51 ` Felipe Balbi
[not found] ` <20130307145158.GE16577-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
0 siblings, 1 reply; 11+ messages in thread
From: Felipe Balbi @ 2013-03-07 14:51 UTC (permalink / raw)
To: Aaro Koskinen
Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
linux-omap-u79uwXL29TY76Z2rM5mHXA, Felipe Balbi, Tony Lindgren
[-- Attachment #1: Type: text/plain, Size: 4423 bytes --]
On Thu, Mar 07, 2013 at 04:40:20PM +0200, Aaro Koskinen wrote:
> omap-otg platform device will be needed also by other transceivers.
> It's not possible to have multiple instances of the driver, so it needs
> to be moved into a separate file so that other drivers can hook into it.
>
> Start this change with a very simplest implementation, much of the
> OMAP OTG code in isp1301 is tightly coupled with isp1301 and cannot be
> trivially moved out, but still this provides a way for other drivers to
> register to OTG interrupt.
>
> Signed-off-by: Aaro Koskinen <aaro.koskinen-X3B1VOXEql0@public.gmane.org>
> ---
> drivers/usb/otg/Kconfig | 5 ++
> drivers/usb/otg/Makefile | 1 +
> drivers/usb/otg/isp1301_omap.c | 78 ++-----------------------------
> drivers/usb/otg/omap-otg.c | 99 ++++++++++++++++++++++++++++++++++++++++
I'm getting rid of drivers/usb/otg/ directory, you'd have to rebase on
my -next branch as soon as I make that immutable.
> include/linux/usb/omap-otg.h | 30 ++++++++++++
> 5 files changed, 138 insertions(+), 75 deletions(-)
> create mode 100644 drivers/usb/otg/omap-otg.c
> create mode 100644 include/linux/usb/omap-otg.h
>
> diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig
> index 37962c9..12af870 100644
> --- a/drivers/usb/otg/Kconfig
> +++ b/drivers/usb/otg/Kconfig
> @@ -27,9 +27,14 @@ config USB_GPIO_VBUS
> optionally control of a D+ pullup GPIO as well as a VBUS
> current limit regulator.
>
> +config OMAP_OTG
> + tristate
> + depends on ARCH_OMAP_OTG
> +
> config ISP1301_OMAP
> tristate "Philips ISP1301 with OMAP OTG"
> depends on I2C && ARCH_OMAP_OTG
> + select OMAP_OTG if USB_OTG
no selects anymore, please :-s
> diff --git a/drivers/usb/otg/Makefile b/drivers/usb/otg/Makefile
> index a844b8d..4e05c6a 100644
> --- a/drivers/usb/otg/Makefile
> +++ b/drivers/usb/otg/Makefile
> @@ -10,6 +10,7 @@ obj-$(CONFIG_USB_OTG_UTILS) += otg.o
>
> # transceiver drivers
> obj-$(CONFIG_USB_GPIO_VBUS) += gpio_vbus.o
> +obj-$(CONFIG_OMAP_OTG) += omap-otg.o
> obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o
> obj-$(CONFIG_TWL4030_USB) += twl4030-usb.o
> obj-$(CONFIG_TWL6030_USB) += twl6030-usb.o
> diff --git a/drivers/usb/otg/isp1301_omap.c b/drivers/usb/otg/isp1301_omap.c
> index af9cb11..5217b7e 100644
> --- a/drivers/usb/otg/isp1301_omap.c
> +++ b/drivers/usb/otg/isp1301_omap.c
ideally isp1301_omap.c wouldn't even exist. isp1301 is a generic
transceiver which has nothing to do with OMAP at all. I'd much rather
see patches fixing up drivers/usb/phy/isp1301.c so that it can be reused
by anyone actually using this transceiver.
> @@ -28,6 +28,7 @@
> #include <linux/gpio.h>
> #include <linux/usb/ch9.h>
> #include <linux/usb/gadget.h>
> +#include <linux/usb/omap-otg.h>
> #include <linux/usb.h>
> #include <linux/usb/otg.h>
> #include <linux/i2c.h>
> @@ -74,22 +75,6 @@ struct isp1301 {
> # define WORK_STOP 7 /* don't resubmit */
> };
>
> -
> -/* bits in OTG_CTRL */
> -
> -#define OTG_XCEIV_OUTPUTS \
> - (OTG_ASESSVLD|OTG_BSESSEND|OTG_BSESSVLD|OTG_VBUSVLD|OTG_ID)
> -#define OTG_XCEIV_INPUTS \
> - (OTG_PULLDOWN|OTG_PULLUP|OTG_DRV_VBUS|OTG_PD_VBUS|OTG_PU_VBUS|OTG_PU_ID)
> -#define OTG_CTRL_BITS \
> - (OTG_A_BUSREQ|OTG_A_SETB_HNPEN|OTG_B_BUSREQ|OTG_B_HNPEN|OTG_BUSDROP)
> - /* and OTG_PULLUP is sometimes written */
> -
> -#define OTG_CTRL_MASK (OTG_DRIVER_SEL| \
> - OTG_XCEIV_OUTPUTS|OTG_XCEIV_INPUTS| \
> - OTG_CTRL_BITS)
> -
> -
> /*-------------------------------------------------------------------------*/
>
> /* board-specific PM hooks */
> @@ -822,15 +807,10 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp)
> return ret;
> }
>
> -static struct platform_device *otg_dev;
> -
> static int isp1301_otg_init(struct isp1301 *isp)
> {
> u32 l;
>
> - if (!otg_dev)
> - return -ENODEV;
> -
> dump_regs(isp, __func__);
> /* some of these values are board-specific... */
> l = omap_readl(OTG_SYSCON_2);
> @@ -864,58 +844,6 @@ static int isp1301_otg_init(struct isp1301 *isp)
> return 0;
> }
>
> -static int otg_probe(struct platform_device *dev)
> -{
> - // struct omap_usb_config *config = dev->platform_data;
> -
> - otg_dev = dev;
> - return 0;
> -}
why is this otg_dev even needed ? Can you refresh my memory ?
--
balbi
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 4/4] USB: OMAP: Tahvo USB transceiver driver
2013-03-07 14:40 ` [RFC PATCH 4/4] USB: OMAP: Tahvo USB transceiver driver Aaro Koskinen
@ 2013-03-07 14:54 ` Felipe Balbi
2013-03-07 16:20 ` Tony Lindgren
1 sibling, 0 replies; 11+ messages in thread
From: Felipe Balbi @ 2013-03-07 14:54 UTC (permalink / raw)
To: Aaro Koskinen; +Cc: linux-usb, linux-omap, Felipe Balbi, Tony Lindgren
[-- Attachment #1: Type: text/plain, Size: 568 bytes --]
On Thu, Mar 07, 2013 at 04:40:21PM +0200, Aaro Koskinen wrote:
> Add Tahvo USB transceiver driver.
>
> Based on old code from linux-omap tree. The original driver was written
> by Juha Yrjölä, Tony Lindgren, and Timo Teräs.
>
> Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
> ---
> drivers/usb/otg/Kconfig | 16 ++
> drivers/usb/otg/Makefile | 1 +
> drivers/usb/otg/tahvo-usb.c | 643 +++++++++++++++++++++++++++++++++++++++++++
let's call this:
drivers/usb/phy/phy-tahvo.c
I'll rename all phy drivers in a bit.
--
balbi
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 4/4] USB: OMAP: Tahvo USB transceiver driver
2013-03-07 14:40 ` [RFC PATCH 4/4] USB: OMAP: Tahvo USB transceiver driver Aaro Koskinen
2013-03-07 14:54 ` Felipe Balbi
@ 2013-03-07 16:20 ` Tony Lindgren
1 sibling, 0 replies; 11+ messages in thread
From: Tony Lindgren @ 2013-03-07 16:20 UTC (permalink / raw)
To: Aaro Koskinen; +Cc: linux-usb, linux-omap, Felipe Balbi
* Aaro Koskinen <aaro.koskinen@iki.fi> [130307 06:44]:
> +#include <mach/usb.h>
We should be getting rid of the plat and mach includes for
drivers for omap1 also, so let's not make it harder by adding
more of it. We should have just the following:
include/linux/platform_data/usb-omap.h this contains just minimal pdata
include/linux/usb/something.h if needed and cannot be local to driver
Regards,
Tony
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 3/4] USB: OMAP: move omap-otg out from isp1301_omap
[not found] ` <20130307145158.GE16577-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
@ 2013-03-07 17:59 ` Aaro Koskinen
0 siblings, 0 replies; 11+ messages in thread
From: Aaro Koskinen @ 2013-03-07 17:59 UTC (permalink / raw)
To: Felipe Balbi
Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
linux-omap-u79uwXL29TY76Z2rM5mHXA, Tony Lindgren
Hi,
On Thu, Mar 07, 2013 at 04:51:59PM +0200, Felipe Balbi wrote:
> why is this otg_dev even needed ? Can you refresh my memory ?
If you want to handle OTG controller interrupt you need it... Though looks
like tahvo does not really need it, and it can be disabled.
A.
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 1/4] retu-mfd: support also Tahvo
[not found] ` <1362667221-30659-2-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
@ 2013-04-08 16:25 ` Samuel Ortiz
0 siblings, 0 replies; 11+ messages in thread
From: Samuel Ortiz @ 2013-04-08 16:25 UTC (permalink / raw)
To: Aaro Koskinen
Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
linux-omap-u79uwXL29TY76Z2rM5mHXA, Felipe Balbi, Tony Lindgren
Hi Aaro,
On Thu, Mar 07, 2013 at 04:40:18PM +0200, Aaro Koskinen wrote:
> Tahvo is a multi-function device on Nokia 770, implementing USB
> transceiver and charge/battery control.
>
> It's so close to Retu that a single driver can support both.
>
> Signed-off-by: Aaro Koskinen <aaro.koskinen-X3B1VOXEql0@public.gmane.org>
> Cc: Samuel Ortiz <sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
> drivers/mfd/Kconfig | 6 +--
> drivers/mfd/retu-mfd.c | 95 +++++++++++++++++++++++++++++++++++++++-------
> include/linux/mfd/retu.h | 8 +++-
> 3 files changed, 92 insertions(+), 17 deletions(-)
Overall the patch looks good, but could you please adress Felipe's comments on
it ?
Cheers,
Samuel.
--
Intel Open Source Technology Centre
http://oss.intel.com/
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2013-04-08 16:25 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-07 14:40 [RFC PATCH 0/4] USB: OMAP: Tahvo USB support for 770 Aaro Koskinen
2013-03-07 14:40 ` [RFC PATCH 1/4] retu-mfd: support also Tahvo Aaro Koskinen
2013-03-07 14:48 ` Felipe Balbi
[not found] ` <1362667221-30659-2-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
2013-04-08 16:25 ` Samuel Ortiz
2013-03-07 14:40 ` [RFC PATCH 2/4] ARM: OMAP1: nokia770: enable Tahvo Aaro Koskinen
[not found] ` <1362667221-30659-1-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
2013-03-07 14:40 ` [RFC PATCH 3/4] USB: OMAP: move omap-otg out from isp1301_omap Aaro Koskinen
[not found] ` <1362667221-30659-4-git-send-email-aaro.koskinen-X3B1VOXEql0@public.gmane.org>
2013-03-07 14:51 ` Felipe Balbi
[not found] ` <20130307145158.GE16577-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2013-03-07 17:59 ` Aaro Koskinen
2013-03-07 14:40 ` [RFC PATCH 4/4] USB: OMAP: Tahvo USB transceiver driver Aaro Koskinen
2013-03-07 14:54 ` Felipe Balbi
2013-03-07 16:20 ` Tony Lindgren
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox