Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: otg: Add ulpi viewport access ops

Add generic access ops for controllers with a ulpi viewport register
(e.g. Chipidea/ARC based controllers).

Signed-off-by: Benoit Goby <benoit@android.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Benoit Goby and committed by
Greg Kroah-Hartman
ee398ba9 d0781383

+93
+7
drivers/usb/otg/Kconfig
··· 49 49 Enable this to support ULPI connected USB OTG transceivers which 50 50 are likely found on embedded boards. 51 51 52 + config USB_ULPI_VIEWPORT 53 + bool 54 + depends on USB_ULPI 55 + help 56 + Provides read/write operations to the ULPI phy register set for 57 + controllers with a viewport register (e.g. Chipidea/ARC controllers). 58 + 52 59 config TWL4030_USB 53 60 tristate "TWL4030 USB Transceiver Driver" 54 61 depends on TWL4030_CORE && REGULATOR_TWL4030
+1
drivers/usb/otg/Makefile
··· 16 16 obj-$(CONFIG_USB_LANGWELL_OTG) += langwell_otg.o 17 17 obj-$(CONFIG_NOP_USB_XCEIV) += nop-usb-xceiv.o 18 18 obj-$(CONFIG_USB_ULPI) += ulpi.o 19 + obj-$(CONFIG_USB_ULPI_VIEWPORT) += ulpi_viewport.o 19 20 obj-$(CONFIG_USB_MSM_OTG) += msm_otg.o 20 21 obj-$(CONFIG_AB8500_USB) += ab8500-usb.o
+80
drivers/usb/otg/ulpi_viewport.c
··· 1 + /* 2 + * Copyright (C) 2011 Google, Inc. 3 + * 4 + * This software is licensed under the terms of the GNU General Public 5 + * License version 2, as published by the Free Software Foundation, and 6 + * may be copied, distributed, and modified under those terms. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + */ 14 + 15 + #include <linux/kernel.h> 16 + #include <linux/usb.h> 17 + #include <linux/io.h> 18 + #include <linux/usb/otg.h> 19 + #include <linux/usb/ulpi.h> 20 + 21 + #define ULPI_VIEW_WAKEUP (1 << 31) 22 + #define ULPI_VIEW_RUN (1 << 30) 23 + #define ULPI_VIEW_WRITE (1 << 29) 24 + #define ULPI_VIEW_READ (0 << 29) 25 + #define ULPI_VIEW_ADDR(x) (((x) & 0xff) << 16) 26 + #define ULPI_VIEW_DATA_READ(x) (((x) >> 8) & 0xff) 27 + #define ULPI_VIEW_DATA_WRITE(x) ((x) & 0xff) 28 + 29 + static int ulpi_viewport_wait(void __iomem *view, u32 mask) 30 + { 31 + unsigned long usec = 2000; 32 + 33 + while (usec--) { 34 + if (!(readl(view) & mask)) 35 + return 0; 36 + 37 + udelay(1); 38 + }; 39 + 40 + return -ETIMEDOUT; 41 + } 42 + 43 + static int ulpi_viewport_read(struct otg_transceiver *otg, u32 reg) 44 + { 45 + int ret; 46 + void __iomem *view = otg->io_priv; 47 + 48 + writel(ULPI_VIEW_WAKEUP | ULPI_VIEW_WRITE, view); 49 + ret = ulpi_viewport_wait(view, ULPI_VIEW_WAKEUP); 50 + if (ret) 51 + return ret; 52 + 53 + writel(ULPI_VIEW_RUN | ULPI_VIEW_READ | ULPI_VIEW_ADDR(reg), view); 54 + ret = ulpi_viewport_wait(view, ULPI_VIEW_RUN); 55 + if (ret) 56 + return ret; 57 + 58 + return ULPI_VIEW_DATA_READ(readl(view)); 59 + } 60 + 61 + static int ulpi_viewport_write(struct otg_transceiver *otg, u32 val, u32 reg) 62 + { 63 + int ret; 64 + void __iomem *view = otg->io_priv; 65 + 66 + writel(ULPI_VIEW_WAKEUP | ULPI_VIEW_WRITE, view); 67 + ret = ulpi_viewport_wait(view, ULPI_VIEW_WAKEUP); 68 + if (ret) 69 + return ret; 70 + 71 + writel(ULPI_VIEW_RUN | ULPI_VIEW_WRITE | ULPI_VIEW_DATA_WRITE(val) | 72 + ULPI_VIEW_ADDR(reg), view); 73 + 74 + return ulpi_viewport_wait(view, ULPI_VIEW_RUN); 75 + } 76 + 77 + struct otg_io_access_ops ulpi_viewport_access_ops = { 78 + .read = ulpi_viewport_read, 79 + .write = ulpi_viewport_write, 80 + };
+5
include/linux/usb/ulpi.h
··· 184 184 struct otg_transceiver *otg_ulpi_create(struct otg_io_access_ops *ops, 185 185 unsigned int flags); 186 186 187 + #ifdef CONFIG_USB_ULPI_VIEWPORT 188 + /* access ops for controllers with a viewport register */ 189 + extern struct otg_io_access_ops ulpi_viewport_access_ops; 190 + #endif 191 + 187 192 #endif /* __LINUX_USB_ULPI_H */