diff options
author | Chunfeng Yun <chunfeng.yun@mediatek.com> | 2016-10-19 10:28:25 +0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-10-27 17:02:41 +0200 |
commit | b3f4e727c1ecec36e628e89298349d9c51a32aac (patch) | |
tree | da0c650a5d8d0de961c517a53c1b561f0dab77b8 /drivers/usb/mtu3/mtu3_core.c | |
parent | a29de31b9ed37ebc905fe8580506b93f28701e67 (diff) | |
download | linux-b3f4e727c1ecec36e628e89298349d9c51a32aac.tar.gz linux-b3f4e727c1ecec36e628e89298349d9c51a32aac.tar.bz2 linux-b3f4e727c1ecec36e628e89298349d9c51a32aac.zip |
usb: mtu3: host only mode support
supports host only mode and the code is ported from
host/xhci-mtk.c
IPPC register shared between host and device is moved
into common glue layer.
Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/mtu3/mtu3_core.c')
-rw-r--r-- | drivers/usb/mtu3/mtu3_core.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c index f9817ad53e3c..2eef9727312c 100644 --- a/drivers/usb/mtu3/mtu3_core.c +++ b/drivers/usb/mtu3/mtu3_core.c @@ -116,7 +116,7 @@ static int mtu3_device_enable(struct mtu3 *mtu) SSUSB_U2_PORT_HOST_SEL)); mtu3_setbits(ibase, SSUSB_U2_CTRL(0), SSUSB_U2_PORT_OTG_SEL); - return ssusb_check_clocks(mtu, check_clk); + return ssusb_check_clocks(mtu->ssusb, check_clk); } static void mtu3_device_disable(struct mtu3 *mtu) @@ -765,11 +765,38 @@ static void mtu3_hw_exit(struct mtu3 *mtu) /*-------------------------------------------------------------------------*/ -int ssusb_gadget_init(struct mtu3 *mtu) +int ssusb_gadget_init(struct ssusb_mtk *ssusb) { - struct device *dev = mtu->dev; - int ret; + struct device *dev = ssusb->dev; + struct platform_device *pdev = to_platform_device(dev); + struct mtu3 *mtu = NULL; + struct resource *res; + int ret = -ENOMEM; + + mtu = devm_kzalloc(dev, sizeof(struct mtu3), GFP_KERNEL); + if (mtu == NULL) + return -ENOMEM; + + mtu->irq = platform_get_irq(pdev, 0); + if (mtu->irq <= 0) { + dev_err(dev, "fail to get irq number\n"); + return -ENODEV; + } + dev_info(dev, "irq %d\n", mtu->irq); + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mac"); + mtu->mac_base = devm_ioremap_resource(dev, res); + if (IS_ERR(mtu->mac_base)) { + dev_err(dev, "error mapping memory for dev mac\n"); + return PTR_ERR(mtu->mac_base); + } + + spin_lock_init(&mtu->lock); + mtu->dev = dev; + mtu->ippc_base = ssusb->ippc_base; + ssusb->mac_base = mtu->mac_base; + ssusb->u3d = mtu; + mtu->ssusb = ssusb; mtu->max_speed = usb_get_maximum_speed(dev); /* check the max_speed parameter */ @@ -820,14 +847,17 @@ gadget_err: irq_err: mtu3_hw_exit(mtu); + ssusb->u3d = NULL; dev_err(dev, " %s() fail...\n", __func__); return ret; } -void ssusb_gadget_exit(struct mtu3 *mtu) +void ssusb_gadget_exit(struct ssusb_mtk *ssusb) { + struct mtu3 *mtu = ssusb->u3d; + mtu3_gadget_cleanup(mtu); - device_init_wakeup(mtu->dev, false); + device_init_wakeup(ssusb->dev, false); mtu3_hw_exit(mtu); } |