]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/3.16.7/usb-pch_udc-usb-gadget-device-support-for-intel-quark-x1000.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.16.7 / usb-pch_udc-usb-gadget-device-support-for-intel-quark-x1000.patch
1 From a68df7066a6f974db6069e0b93c498775660a114 Mon Sep 17 00:00:00 2001
2 From: Bryan O'Donoghue <bryan.odonoghue@intel.com>
3 Date: Mon, 4 Aug 2014 10:22:54 -0700
4 Subject: usb: pch_udc: usb gadget device support for Intel Quark X1000
5
6 From: Bryan O'Donoghue <bryan.odonoghue@intel.com>
7
8 commit a68df7066a6f974db6069e0b93c498775660a114 upstream.
9
10 This patch is to enable the USB gadget device for Intel Quark X1000
11
12 Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@intel.com>
13 Signed-off-by: Bing Niu <bing.niu@intel.com>
14 Signed-off-by: Alvin (Weike) Chen <alvin.chen@intel.com>
15 Signed-off-by: Felipe Balbi <balbi@ti.com>
16 Signed-off-by: Chang Rebecca Swee Fun <rebecca.swee.fun.chang@intel.com>
17 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
18
19 ---
20 drivers/usb/gadget/Kconfig | 3 ++-
21 drivers/usb/gadget/pch_udc.c | 22 +++++++++++++++++++---
22 2 files changed, 21 insertions(+), 4 deletions(-)
23
24 --- a/drivers/usb/gadget/Kconfig
25 +++ b/drivers/usb/gadget/Kconfig
26 @@ -438,7 +438,7 @@ config USB_GOKU
27 gadget drivers to also be dynamically linked.
28
29 config USB_EG20T
30 - tristate "Intel EG20T PCH/LAPIS Semiconductor IOH(ML7213/ML7831) UDC"
31 + tristate "Intel QUARK X1000/EG20T PCH/LAPIS Semiconductor IOH(ML7213/ML7831) UDC"
32 depends on PCI
33 help
34 This is a USB device driver for EG20T PCH.
35 @@ -459,6 +459,7 @@ config USB_EG20T
36 ML7213/ML7831 is companion chip for Intel Atom E6xx series.
37 ML7213/ML7831 is completely compatible for Intel EG20T PCH.
38
39 + This driver can be used with Intel's Quark X1000 SOC platform
40 #
41 # LAST -- dummy/emulated controller
42 #
43 --- a/drivers/usb/gadget/pch_udc.c
44 +++ b/drivers/usb/gadget/pch_udc.c
45 @@ -343,6 +343,7 @@ struct pch_vbus_gpio_data {
46 * @setup_data: Received setup data
47 * @phys_addr: of device memory
48 * @base_addr: for mapped device memory
49 + * @bar: Indicates which PCI BAR for USB regs
50 * @irq: IRQ line for the device
51 * @cfg_data: current cfg, intf, and alt in use
52 * @vbus_gpio: GPIO informaton for detecting VBUS
53 @@ -370,14 +371,17 @@ struct pch_udc_dev {
54 struct usb_ctrlrequest setup_data;
55 unsigned long phys_addr;
56 void __iomem *base_addr;
57 + unsigned bar;
58 unsigned irq;
59 struct pch_udc_cfg_data cfg_data;
60 struct pch_vbus_gpio_data vbus_gpio;
61 };
62 #define to_pch_udc(g) (container_of((g), struct pch_udc_dev, gadget))
63
64 +#define PCH_UDC_PCI_BAR_QUARK_X1000 0
65 #define PCH_UDC_PCI_BAR 1
66 #define PCI_DEVICE_ID_INTEL_EG20T_UDC 0x8808
67 +#define PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC 0x0939
68 #define PCI_VENDOR_ID_ROHM 0x10DB
69 #define PCI_DEVICE_ID_ML7213_IOH_UDC 0x801D
70 #define PCI_DEVICE_ID_ML7831_IOH_UDC 0x8808
71 @@ -3076,7 +3080,7 @@ static void pch_udc_remove(struct pci_de
72 iounmap(dev->base_addr);
73 if (dev->mem_region)
74 release_mem_region(dev->phys_addr,
75 - pci_resource_len(pdev, PCH_UDC_PCI_BAR));
76 + pci_resource_len(pdev, dev->bar));
77 if (dev->active)
78 pci_disable_device(pdev);
79 kfree(dev);
80 @@ -3144,9 +3148,15 @@ static int pch_udc_probe(struct pci_dev
81 dev->active = 1;
82 pci_set_drvdata(pdev, dev);
83
84 + /* Determine BAR based on PCI ID */
85 + if (id->device == PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC)
86 + dev->bar = PCH_UDC_PCI_BAR_QUARK_X1000;
87 + else
88 + dev->bar = PCH_UDC_PCI_BAR;
89 +
90 /* PCI resource allocation */
91 - resource = pci_resource_start(pdev, 1);
92 - len = pci_resource_len(pdev, 1);
93 + resource = pci_resource_start(pdev, dev->bar);
94 + len = pci_resource_len(pdev, dev->bar);
95
96 if (!request_mem_region(resource, len, KBUILD_MODNAME)) {
97 dev_err(&pdev->dev, "%s: pci device used already\n", __func__);
98 @@ -3212,6 +3222,12 @@ finished:
99
100 static const struct pci_device_id pch_udc_pcidev_id[] = {
101 {
102 + PCI_DEVICE(PCI_VENDOR_ID_INTEL,
103 + PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC),
104 + .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe,
105 + .class_mask = 0xffffffff,
106 + },
107 + {
108 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC),
109 .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe,
110 .class_mask = 0xffffffff,