From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754890AbbIWNJk (ORCPT ); Wed, 23 Sep 2015 09:09:40 -0400 Received: from mail-bn1bon0073.outbound.protection.outlook.com ([157.56.111.73]:64880 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754368AbbIWNJh (ORCPT ); Wed, 23 Sep 2015 09:09:37 -0400 X-Greylist: delayed 903 seconds by postgrey-1.27 at vger.kernel.org; Wed, 23 Sep 2015 09:09:36 EDT Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=xilinx.com; From: Subbaraya Sundeep Bhatta To: , , , CC: , , , , "Subbaraya Sundeep Bhatta" Subject: [RFC PATCH 2/2] usb: phy: Add platform driver support for ULPI PHYs Date: Wed, 23 Sep 2015 18:24:33 +0530 Message-ID: <1443012873-13757-1-git-send-email-sbhatta@xilinx.com> X-Mailer: git-send-email 2.1.2 X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.0.0.1202-21832.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD050;1:O3AReKItI/wGLkNRtY0DyxGfayfzs2rt2K4lDcSDqHkzD+Tnt2ZO6qmtJWxmE+MQ6ufCxpwx5Eqp208tDkl+rvcRGp8zIQqvDY6/S/8uid+WLgDDuk1D2DBG9XUe6nH6zfcSahOaFfY2VTgzp+B0cXFDfhZfHJiHnOKVfUu5g8zunmrfmaA65NhM8NIq/o5OS1/RxMvw3Z9iAuUnSsvAOEYPxfLcw62wtXBIjukvEzMu6UzYITv063avkuOdNCW8wermn4eY74Y0quCw3lqZZl1H8/qRE9nk8MrQ2o9C7LE9v784Z7HzCM9lK15Wx0bexH+MTmJa29N4NrStPybuhvswraKfE9HTF5bS6jsxYuKJf/vSSk/Gjpnthmfk6Kibkp6RVMyH5K1I62Poy9UdEw== X-Forefront-Antispam-Report: CIP:149.199.60.100;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(438002)(199003)(189002)(92566002)(47776003)(575784001)(5007970100001)(19580405001)(48376002)(36756003)(6806005)(5003940100001)(77156002)(63266004)(11100500001)(64706001)(229853001)(42186005)(33646002)(46386002)(107886002)(45336002)(5001960100002)(46102003)(50986999)(5001920100001)(62966003)(86362001)(189998001)(4001540100001)(5001770100001)(2201001)(52956003)(106466001)(81156007)(103686003)(5001860100001)(87936001)(36386004)(50466002)(50226001)(5001830100001)(19580395003)(7059030)(2004002)(107986001)(5001870100001)(217873001)(4001430100001)(90966001);DIR:OUT;SFP:1101;SCL:1;SRVR:BL2FFO11HUB005;H:xsj-pvapsmtpgw02;FPR:;SPF:Pass;PTR:unknown-60-100.xilinx.com,xapps1.xilinx.com;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11HUB005;2:6K8kFpsFfW2Hpij3BRXc4Q0rRub8podxsfjsj+qPsFMWL6DSg5tNOGjVVzTyCZg8/qFEntB8S0TR7jq+E+Yfqo9Mas+yK40P9sp6tW2aTsKGzIQ40dyeuh4aRCzzqQaWaAT3CYH4KGrookipEEOpYX4p4tac/aODldnJhPvkvdE=;3:fzwfqjJFxHSk+0wcN76FUJb1uNscb9Q1o8WXYpnpbReKRDinMO1ClNaWv1v2LMLwMD/pRrAPSjLWbFl5GBKA67RjZpw8jCQ/t+vd3bkziqVSqmRiGwKZadHC2+9aPauy7B9ChmpBZ4en95hTDnnkv6mNOspAwIUWEd8QfSIs0SxkIRcfcSVmW0qd6PupzVZNAM4n9R8v62CpekJEFnPESAGyr1Poc7fra2m7vFj6TTDiw3Ye9PImQIA+6ThN3LE+nC8aVWzkmOJP8mRYQuZmng==;25:jBkHz3VcGw9abVcv+NaOJVY1J/e9/ozUgmhMKqSdapTe+2zBKkrzB/vBDVnz4dwJpUrpjgF+AUDzWEApaFty2bPbxZ1iY+nIDBfREQJqU2OCWt3eIvMVg4Ps+7R8AQf+/dncJJ8CTemRK/GCGVSX49JLmBh869GjoTyXR5ylCZwvEhKQ8uukjYtoNyI4T2/NbYT84RRpf2+momNz0hXnr8GX+N8xneBiXEmiCvxLh2+LH4MNqikRTAiVGsChC7cU7b6Mhv4zyg8ZOm5xNjIb6w== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(8251501001);SRVR:BL2FFO11HUB005; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11HUB005;20:Iy6CoJh5VuS5BNIRZzdzr+U21WaIPdc8TmfbGHbSAJp+MUm8LTNlvQpEr0xlGy6ZGmm4y/VdZgXvURGuMTFj23ZyGrnLFX5FA3vdt3/OEyLaN8rAROYBCA5xdHYks4ScucMPPH7hzNJCsNBnBaFNPnw6rky+me9epskK3bwr5qXEvi2ljQSMq3LJ70RGRs5Omsw9BiFjkMgxR3epMjoz19ygcS7Wuq8uykniJILQ1gG3k0G8crO93mPMJrOPOIlwLBy8K+bU64C4k/TqCXOgopWPy4yHG6vPRFU6kOgPp1GfEOkrDilJgKvl7uBLKgPheNZDifibBp+YuvbSQ3OCOn+bQ4vmIseZsCiXqbnekEqJ9TzH2EyolzgjztMgnCZHfRKyZEdBgMN6TfN426eYruUQbPTmpV1uKgdf4eZLGfy9jqjvQRP0FH3uffEcXVL1txyZgRCOZi4susnOEzI4PxkXM3M8HSw6CwU9SFnJBEVnq9LuzT9CnMVvsQFMRhJr;4:BHGx4UrzX38BRVZnBLJUsExdrbM27AS4eMubFtNHUsdlDAj6JE2a1fpC0UkmDqcWgzTaLrhK/deE1eG1WF0babKyxhKJ+RH3viIEPKaGwfjfi8kFV5vgmanu2odUBlcLG5rXDR4EPqN+9DSDGzctzCmlcn43Vy3H8VV/SEY37DVsW2YhX+M00PQ5MF0IqhfcBuDps1p4bYwGzjYqFSqdgf3YfoC6UMLroXQevwtKvsiqh1GkXRf6PhzEdvi4si0Htp56jPk5zWLp7y1r9SsB5UE/Xsvu1XUwZzfk1qiZLceru+ld26r8lFUjZjUITk4bngj8ypsY21XH35FCKvewjHLMZsikg3CyGXoYcz4V0lM= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(8121501046)(5005006)(3002001);SRVR:BL2FFO11HUB005;BCL:0;PCL:0;RULEID:;SRVR:BL2FFO11HUB005; X-Forefront-PRVS: 07083FF734 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BL2FFO11HUB005;23:kRAiOGfFZ7kN9Cdz0FGZ4FFBjCLaMJff+LlJkKVA?= =?us-ascii?Q?Xb3Mu73esgHkGsJqo3efo2XUAQ9nKDjn7YAg9JRySNyw2lX6NzxbcMAaqVbU?= =?us-ascii?Q?QN0ZOYi+sNiRac2qFHqzvonVuNMRK+Z9fs3OWUeqc52ADn0EyqX9h1ulbRAS?= =?us-ascii?Q?SsaelzYYErnmEfavNkHmQE4Dehib+zwNEkGhU4/PaDdTUv6kSauyjI5IuOL4?= =?us-ascii?Q?qhSGfd0XWC60X5TAzmbXiMpeDwHzowHPkFHC0EpJdem7E76R6A+f5sHYGkkU?= =?us-ascii?Q?FOLzMhKTgnEGhW4zI1DcIwd7eGY4tjMQasSuhAox98+R+3Faup81tXOFT3aA?= =?us-ascii?Q?QwINvZtuCG6GWujjAXWyCyGXlLzznk8E97iTsrQdR9umskv1RetP0k6OOgh5?= =?us-ascii?Q?jLmx5gik17pU9gO2b7j0BhiRlaCTJcDsQds/avz4Isybh33r43QVjBwCI9cx?= =?us-ascii?Q?ljafp4pTHHz7oqA9PgYFy7x/ACyo5rifIg5NYPBIUfyiSX7oUc00jGu0uzXx?= =?us-ascii?Q?IeU6Y+sOjkvVnTnuN5U9RI8kCL45P8nFCbDK1Ub4WaUUG/a5pvY+H2t41UOC?= =?us-ascii?Q?jFbx5R0GfGjfEnVkf8HHilCk53I1G9jeIrcvlMkeCYTeFvHyhXIe0s1hphH8?= =?us-ascii?Q?bLcjh/h92dDyJB8ZiWUDZqAtvKLtTmFnuBHrLzXrbw5FgHkrGcogsMKnTiX7?= =?us-ascii?Q?q6Hj+sQZKIENUxwlNG0fJkfszr5afZUrh18l2e0KcBMKmrMc3YZ5xRsjst/U?= =?us-ascii?Q?t47k1IRZrpxAwgJ+2zjdoxvYjj+49vdBws5UoxlwhTb72eyQ9h/1FXJPk3GX?= =?us-ascii?Q?ibTXvK+7zKuHw7K8l3LQFT29lfXS2o1KW45/2pywakmiTpEDPbVPU34Q5L/a?= =?us-ascii?Q?Vokh1KYkC1WNP0YBXfHw/o2lbaynBvbYsqUvy3NEJcUnfNM3edw9RUEWm2Rt?= =?us-ascii?Q?uOGitrBpx9st6NIun+GEHh0BXgFp6um6HmBe8/MniLEy7bbYu1sHs6aMYbBu?= =?us-ascii?Q?OflmCA8F6HtH5muWJeOXKiGcql4s5EXkSo577znJMPn00wWxkPjcqGIH3ta9?= =?us-ascii?Q?L6RijuL7uaLBVPgT5fIpAEZT3yQ0cQT8aL+vRITuOUvBsrvobqL2dnSGE/7P?= =?us-ascii?Q?F8RFFz2oL55oYTLj79vsIWfjbBll/gFEso6OBVlZzNbVl1JtlbZOINslTj/C?= =?us-ascii?Q?jU7MaEV/pWjLI4cM3QU2ls8mMiV808/Y+Duus0iqORWU9r232S7F4NyY/rE9?= =?us-ascii?Q?RL8/339POreExxY4a15txRSElYqCsZw6pGV0P8lme3YvQqRCFOrFuAeysbmf?= =?us-ascii?Q?wk/ZCA/3izPsVH6IZ+2UJe8lxCveG3jR94g2qpvKPMuxLJmEu4rXbYc7HV9d?= =?us-ascii?Q?1bHEs/60hNbVpzm6qU1Bhiz12BMUuMBPholualikw/+VeP7c?= X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11HUB005;5:RM0jMOrKoJujz+Rsk0R0UJ/VOV2Pzfuyx/8gp0NueXHbsSeGHU+HHuONUez2XBc7IRBNF243Evxnue1FePrkliJQXvNgZOVMDtlSgex44IXzs492k0iuIFF2WDjoClCrdEgJZHpHcWeFwfYXExz5rg==;24:1m1LXk6f14umgIoVADZ2EpdebjqQwFWcXWaGocqHrO+34OOB/jze+gV3ZHk2cUPkOQ+zJ1SVFdCse5XfQUNkaAYysPGZ4L9iVgyPFxMuYas= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Sep 2015 12:54:51.5883 (UTC) X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.100];Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL2FFO11HUB005 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Based on board design USB controller needs explicit software access to ULPI PHY for controlling VBUS. This patch adds platform driver support for generic ULPI PHYs and provides a USB2 PHY device to controllers. Signed-off-by: Subbaraya Sundeep Bhatta --- drivers/usb/phy/Kconfig | 12 +++ drivers/usb/phy/Makefile | 1 + drivers/usb/phy/phy-platform-ulpi.c | 143 +++++++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+), 0 deletions(-) create mode 100644 drivers/usb/phy/phy-platform-ulpi.c diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index 7d3beee..2956ad4 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig @@ -201,6 +201,18 @@ config USB_RCAR_PHY To compile this driver as a module, choose M here: the module will be called phy-rcar-usb. +config USB_PLATFORM_ULPI_PHY + tristate "Platform driver support for ULPI PHYs" + depends on ARCH_ZYNQ || COMPILE_TEST + select USB_PHY + select USB_ULPI_VIEWPORT + help + Say Y here to add support for the Platform driver for ULPI PHYs. + This adds platform driver support for all generic ULPI PHYs and is + typically used if usb controller driver needs explicit access to PHY. + + To compile this driver as a module, choose M here. + config USB_ULPI bool "Generic ULPI Transceiver Driver" depends on ARM || ARM64 diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile index 19c0dcc..8431b6b 100644 --- a/drivers/usb/phy/Makefile +++ b/drivers/usb/phy/Makefile @@ -24,6 +24,7 @@ obj-$(CONFIG_USB_QCOM_8X16_PHY) += phy-qcom-8x16-usb.o obj-$(CONFIG_USB_MV_OTG) += phy-mv-usb.o obj-$(CONFIG_USB_MXS_PHY) += phy-mxs-usb.o obj-$(CONFIG_USB_RCAR_PHY) += phy-rcar-usb.o +obj-$(CONFIG_USB_PLATFORM_ULPI_PHY) += phy-platform-ulpi.o obj-$(CONFIG_USB_ULPI) += phy-ulpi.o obj-$(CONFIG_USB_ULPI_VIEWPORT) += phy-ulpi-viewport.o obj-$(CONFIG_KEYSTONE_USB_PHY) += phy-keystone.o diff --git a/drivers/usb/phy/phy-platform-ulpi.c b/drivers/usb/phy/phy-platform-ulpi.c new file mode 100644 index 0000000..fb89363 --- /dev/null +++ b/drivers/usb/phy/phy-platform-ulpi.c @@ -0,0 +1,143 @@ +/* + * Platform driver for generic ULPI PHYs. + * + * Copyright (C) 2015 Xilinx, Inc. + * + * Author: Subbaraya Sundeep + * + * 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. + */ + +#include +#include +#include +#include +#include +#include + +/** + * struct ulpi_phy - The ULPI PHY + * @usb_phy: pointer to usb phy + * @regs: base address of USB controller to which PHY is connected + * @vp_offset: ulpi viewport register offset of USB controller + * @flags: initial required settings of PHY + */ + +struct ulpi_phy { + struct usb_phy *usb_phy; + void __iomem *regs; + unsigned int vp_offset; + unsigned int flags; +}; + +/** + * usbphy_set_vbus - Sets VBUS by writing to PHY. + * @phy: pointer to PHY + * @on: 1 - turn on VBUS + * 0 - turn off VBUS + * Return: 0 for success and error value on failure + */ +static int usbphy_set_vbus(struct usb_phy *phy, int on) +{ + unsigned int flags = usb_phy_io_read(phy, ULPI_OTG_CTRL); + + flags &= ~(ULPI_OTG_CTRL_DRVVBUS | ULPI_OTG_CTRL_DRVVBUS_EXT); + + if (on) { + if (phy->flags & ULPI_OTG_DRVVBUS) + flags |= ULPI_OTG_CTRL_DRVVBUS; + + if (phy->flags & ULPI_OTG_DRVVBUS_EXT) + flags |= ULPI_OTG_CTRL_DRVVBUS_EXT; + } + + return usb_phy_io_write(phy, flags, ULPI_OTG_CTRL); +} + +/** + * ulpi_phy_probe - The device probe function for driver initialization. + * @pdev: pointer to the platform device structure. + * + * Return: 0 for success and error value on failure + */ +static int ulpi_phy_probe(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node; + struct resource *res; + struct ulpi_phy *uphy; + bool flag; + int ret; + + uphy = devm_kzalloc(&pdev->dev, sizeof(*uphy), GFP_KERNEL); + if (!uphy) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + uphy->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res)); + if (IS_ERR(uphy->regs)) + return PTR_ERR(uphy->regs); + + ret = of_property_read_u32(np, "view-port", &uphy->vp_offset); + if (IS_ERR(uphy->regs)) { + dev_err(&pdev->dev, "view-port register not specified\n"); + return PTR_ERR(uphy->regs); + } + + flag = of_property_read_bool(np, "drv-vbus"); + if (flag) + uphy->flags |= ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT; + + uphy->usb_phy = otg_ulpi_create(&ulpi_viewport_access_ops, uphy->flags); + + uphy->usb_phy->set_vbus = usbphy_set_vbus; + + uphy->usb_phy->dev = &pdev->dev; + + uphy->usb_phy->io_priv = uphy->regs + uphy->vp_offset; + + ret = usb_add_phy_dev(uphy->usb_phy); + if (ret < 0) + return ret; + + return 0; +} + +/** + * ulpi_phy_remove - Releases the resources allocated during the initialization. + * @pdev: pointer to the platform device structure. + * + * Return: 0 always + */ +static int ulpi_phy_remove(struct platform_device *pdev) +{ + struct ulpi_phy *uphy = platform_get_drvdata(pdev); + + usb_remove_phy(uphy->usb_phy); + + return 0; +} + +/* Match table for of_platform binding */ +static const struct of_device_id ulpi_phy_table[] = { + { .compatible = "ulpi-phy" }, + { /* end of list */}, +}; +MODULE_DEVICE_TABLE(of, ulpi_phy_table); + +static struct platform_driver ulpi_phy_driver = { + .probe = ulpi_phy_probe, + .remove = ulpi_phy_remove, + .driver = { + .name = "ulpi-platform-phy", + .of_match_table = of_match_ptr(ulpi_phy_table), + }, +}; +module_platform_driver(ulpi_phy_driver); + +MODULE_DESCRIPTION("ULPI PHY platform driver"); +MODULE_AUTHOR("Xilinx, Inc"); +MODULE_LICENSE("GPL v2"); -- 1.7.1