hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/usb/gadget/udc/atmel_usba_udc.c
....@@ -18,6 +18,7 @@
1818 #include <linux/platform_device.h>
1919 #include <linux/regmap.h>
2020 #include <linux/ctype.h>
21
+#include <linux/usb.h>
2122 #include <linux/usb/ch9.h>
2223 #include <linux/usb/gadget.h>
2324 #include <linux/delay.h>
....@@ -88,7 +89,7 @@
8889 size_t len, remaining, actual = 0;
8990 char tmpbuf[38];
9091
91
- if (!access_ok(VERIFY_WRITE, buf, nbytes))
92
+ if (!access_ok(buf, nbytes))
9293 return -EFAULT;
9394
9495 inode_lock(file_inode(file));
....@@ -184,7 +185,7 @@
184185 return 0;
185186 }
186187
187
-const struct file_operations queue_dbg_fops = {
188
+static const struct file_operations queue_dbg_fops = {
188189 .owner = THIS_MODULE,
189190 .open = queue_dbg_open,
190191 .llseek = no_llseek,
....@@ -192,7 +193,7 @@
192193 .release = queue_dbg_release,
193194 };
194195
195
-const struct file_operations regs_dbg_fops = {
196
+static const struct file_operations regs_dbg_fops = {
196197 .owner = THIS_MODULE,
197198 .open = regs_dbg_open,
198199 .llseek = generic_file_llseek,
....@@ -226,7 +227,7 @@
226227 struct dentry *root;
227228 struct resource *regs_resource;
228229
229
- root = debugfs_create_dir(udc->gadget.name, NULL);
230
+ root = debugfs_create_dir(udc->gadget.name, usb_debug_root);
230231 udc->debugfs_root = root;
231232
232233 regs_resource = platform_get_resource(udc->pdev, IORESOURCE_MEM,
....@@ -327,6 +328,7 @@
327328 switch (fifo_mode) {
328329 default:
329330 fifo_mode = 0;
331
+ fallthrough;
330332 case 0:
331333 udc->fifo_cfg = NULL;
332334 n = 0;
....@@ -358,8 +360,20 @@
358360 return udc->int_enb_cache;
359361 }
360362
361
-static inline void usba_int_enb_set(struct usba_udc *udc, u32 val)
363
+static inline void usba_int_enb_set(struct usba_udc *udc, u32 mask)
362364 {
365
+ u32 val;
366
+
367
+ val = udc->int_enb_cache | mask;
368
+ usba_writel(udc, INT_ENB, val);
369
+ udc->int_enb_cache = val;
370
+}
371
+
372
+static inline void usba_int_enb_clear(struct usba_udc *udc, u32 mask)
373
+{
374
+ u32 val;
375
+
376
+ val = udc->int_enb_cache & ~mask;
363377 usba_writel(udc, INT_ENB, val);
364378 udc->int_enb_cache = val;
365379 }
....@@ -631,14 +645,12 @@
631645 if (ep->can_dma) {
632646 u32 ctrl;
633647
634
- usba_int_enb_set(udc, usba_int_enb_get(udc) |
635
- USBA_BF(EPT_INT, 1 << ep->index) |
648
+ usba_int_enb_set(udc, USBA_BF(EPT_INT, 1 << ep->index) |
636649 USBA_BF(DMA_INT, 1 << ep->index));
637650 ctrl = USBA_AUTO_VALID | USBA_INTDIS_DMA;
638651 usba_ep_writel(ep, CTL_ENB, ctrl);
639652 } else {
640
- usba_int_enb_set(udc, usba_int_enb_get(udc) |
641
- USBA_BF(EPT_INT, 1 << ep->index));
653
+ usba_int_enb_set(udc, USBA_BF(EPT_INT, 1 << ep->index));
642654 }
643655
644656 spin_unlock_irqrestore(&udc->lock, flags);
....@@ -664,13 +676,7 @@
664676
665677 if (!ep->ep.desc) {
666678 spin_unlock_irqrestore(&udc->lock, flags);
667
- /* REVISIT because this driver disables endpoints in
668
- * reset_all_endpoints() before calling disconnect(),
669
- * most gadget drivers would trigger this non-error ...
670
- */
671
- if (udc->gadget.speed != USB_SPEED_UNKNOWN)
672
- DBG(DBG_ERR, "ep_disable: %s not enabled\n",
673
- ep->ep.name);
679
+ DBG(DBG_ERR, "ep_disable: %s not enabled\n", ep->ep.name);
674680 return -EINVAL;
675681 }
676682 ep->ep.desc = NULL;
....@@ -682,8 +688,7 @@
682688 usba_dma_readl(ep, STATUS);
683689 }
684690 usba_ep_writel(ep, CTL_DIS, USBA_EPT_ENABLE);
685
- usba_int_enb_set(udc, usba_int_enb_get(udc) &
686
- ~USBA_BF(EPT_INT, 1 << ep->index));
691
+ usba_int_enb_clear(udc, USBA_BF(EPT_INT, 1 << ep->index));
687692
688693 request_complete_list(ep, &req_list, -ESHUTDOWN);
689694
....@@ -1023,6 +1028,7 @@
10231028 return 0;
10241029 }
10251030
1031
+static int atmel_usba_pullup(struct usb_gadget *gadget, int is_on);
10261032 static int atmel_usba_start(struct usb_gadget *gadget,
10271033 struct usb_gadget_driver *driver);
10281034 static int atmel_usba_stop(struct usb_gadget *gadget);
....@@ -1050,16 +1056,19 @@
10501056
10511057 switch (usb_endpoint_type(desc)) {
10521058 case USB_ENDPOINT_XFER_CONTROL:
1059
+ ep->nr_banks = 1;
10531060 break;
10541061
10551062 case USB_ENDPOINT_XFER_ISOC:
10561063 ep->fifo_size = 1024;
1057
- ep->nr_banks = 2;
1064
+ if (ep->udc->ep_prealloc)
1065
+ ep->nr_banks = 2;
10581066 break;
10591067
10601068 case USB_ENDPOINT_XFER_BULK:
10611069 ep->fifo_size = 512;
1062
- ep->nr_banks = 1;
1070
+ if (ep->udc->ep_prealloc)
1071
+ ep->nr_banks = 1;
10631072 break;
10641073
10651074 case USB_ENDPOINT_XFER_INT:
....@@ -1069,7 +1078,8 @@
10691078 else
10701079 ep->fifo_size =
10711080 roundup_pow_of_two(le16_to_cpu(desc->wMaxPacketSize));
1072
- ep->nr_banks = 1;
1081
+ if (ep->udc->ep_prealloc)
1082
+ ep->nr_banks = 1;
10731083 break;
10741084 }
10751085
....@@ -1085,8 +1095,6 @@
10851095 USBA_BF(EPT_SIZE, fls(ep->fifo_size - 1) - 3);
10861096
10871097 ep->ept_cfg |= USBA_BF(BK_NUMBER, ep->nr_banks);
1088
-
1089
- ep->udc->configured_ep++;
10901098 }
10911099
10921100 return _ep;
....@@ -1096,6 +1104,7 @@
10961104 .get_frame = usba_udc_get_frame,
10971105 .wakeup = usba_udc_wakeup,
10981106 .set_selfpowered = usba_udc_set_selfpowered,
1107
+ .pullup = atmel_usba_pullup,
10991108 .udc_start = atmel_usba_start,
11001109 .udc_stop = atmel_usba_stop,
11011110 .match_ep = atmel_usba_match_ep,
....@@ -1111,7 +1120,7 @@
11111120 .bInterval = 1,
11121121 };
11131122
1114
-static struct usb_gadget usba_gadget_template = {
1123
+static const struct usb_gadget usba_gadget_template = {
11151124 .ops = &usba_udc_ops,
11161125 .max_speed = USB_SPEED_HIGH,
11171126 .name = "atmel_usba_udc",
....@@ -1696,6 +1705,9 @@
16961705 }
16971706 }
16981707
1708
+static int start_clock(struct usba_udc *udc);
1709
+static void stop_clock(struct usba_udc *udc);
1710
+
16991711 static irqreturn_t usba_udc_irq(int irq, void *devid)
17001712 {
17011713 struct usba_udc *udc = devid;
....@@ -1710,10 +1722,13 @@
17101722 DBG(DBG_INT, "irq, status=%#08x\n", status);
17111723
17121724 if (status & USBA_DET_SUSPEND) {
1725
+ usba_writel(udc, INT_CLR, USBA_DET_SUSPEND|USBA_WAKE_UP);
1726
+ usba_int_enb_set(udc, USBA_WAKE_UP);
1727
+ usba_int_enb_clear(udc, USBA_DET_SUSPEND);
1728
+ udc->suspended = true;
17131729 toggle_bias(udc, 0);
1714
- usba_writel(udc, INT_CLR, USBA_DET_SUSPEND);
1715
- usba_int_enb_set(udc, int_enb | USBA_WAKE_UP);
17161730 udc->bias_pulse_needed = true;
1731
+ stop_clock(udc);
17171732 DBG(DBG_BUS, "Suspend detected\n");
17181733 if (udc->gadget.speed != USB_SPEED_UNKNOWN
17191734 && udc->driver && udc->driver->suspend) {
....@@ -1724,14 +1739,17 @@
17241739 }
17251740
17261741 if (status & USBA_WAKE_UP) {
1742
+ start_clock(udc);
17271743 toggle_bias(udc, 1);
17281744 usba_writel(udc, INT_CLR, USBA_WAKE_UP);
1729
- usba_int_enb_set(udc, int_enb & ~USBA_WAKE_UP);
17301745 DBG(DBG_BUS, "Wake Up CPU detected\n");
17311746 }
17321747
17331748 if (status & USBA_END_OF_RESUME) {
1749
+ udc->suspended = false;
17341750 usba_writel(udc, INT_CLR, USBA_END_OF_RESUME);
1751
+ usba_int_enb_clear(udc, USBA_WAKE_UP);
1752
+ usba_int_enb_set(udc, USBA_DET_SUSPEND);
17351753 generate_bias_pulse(udc);
17361754 DBG(DBG_BUS, "Resume detected\n");
17371755 if (udc->gadget.speed != USB_SPEED_UNKNOWN
....@@ -1746,6 +1764,8 @@
17461764 if (dma_status) {
17471765 int i;
17481766
1767
+ usba_int_enb_set(udc, USBA_DET_SUSPEND);
1768
+
17491769 for (i = 1; i <= USBA_NR_DMAS; i++)
17501770 if (dma_status & (1 << i))
17511771 usba_dma_irq(udc, &udc->usba_ep[i]);
....@@ -1754,6 +1774,8 @@
17541774 ep_status = USBA_BFEXT(EPT_INT, status);
17551775 if (ep_status) {
17561776 int i;
1777
+
1778
+ usba_int_enb_set(udc, USBA_DET_SUSPEND);
17571779
17581780 for (i = 0; i < udc->num_ep; i++)
17591781 if (ep_status & (1 << i)) {
....@@ -1766,9 +1788,11 @@
17661788
17671789 if (status & USBA_END_OF_RESET) {
17681790 struct usba_ep *ep0, *ep;
1769
- int i, n;
1791
+ int i;
17701792
1771
- usba_writel(udc, INT_CLR, USBA_END_OF_RESET);
1793
+ usba_writel(udc, INT_CLR,
1794
+ USBA_END_OF_RESET|USBA_END_OF_RESUME
1795
+ |USBA_DET_SUSPEND|USBA_WAKE_UP);
17721796 generate_bias_pulse(udc);
17731797 reset_all_endpoints(udc);
17741798
....@@ -1795,7 +1819,12 @@
17951819 | USBA_BF(BK_NUMBER, USBA_BK_NUMBER_ONE)));
17961820 usba_ep_writel(ep0, CTL_ENB,
17971821 USBA_EPT_ENABLE | USBA_RX_SETUP);
1798
- usba_int_enb_set(udc, int_enb | USBA_BF(EPT_INT, 1) |
1822
+
1823
+ /* If we get reset while suspended... */
1824
+ udc->suspended = false;
1825
+ usba_int_enb_clear(udc, USBA_WAKE_UP);
1826
+
1827
+ usba_int_enb_set(udc, USBA_BF(EPT_INT, 1) |
17991828 USBA_DET_SUSPEND | USBA_END_OF_RESUME);
18001829
18011830 /*
....@@ -1807,13 +1836,14 @@
18071836 "ODD: EP0 configuration is invalid!\n");
18081837
18091838 /* Preallocate other endpoints */
1810
- n = fifo_mode ? udc->num_ep : udc->configured_ep;
1811
- for (i = 1; i < n; i++) {
1839
+ for (i = 1; i < udc->num_ep; i++) {
18121840 ep = &udc->usba_ep[i];
1813
- usba_ep_writel(ep, CFG, ep->ept_cfg);
1814
- if (!(usba_ep_readl(ep, CFG) & USBA_EPT_MAPPED))
1815
- dev_err(&udc->pdev->dev,
1816
- "ODD: EP%d configuration is invalid!\n", i);
1841
+ if (ep->ep.claimed) {
1842
+ usba_ep_writel(ep, CFG, ep->ept_cfg);
1843
+ if (!(usba_ep_readl(ep, CFG) & USBA_EPT_MAPPED))
1844
+ dev_err(&udc->pdev->dev,
1845
+ "ODD: EP%d configuration is invalid!\n", i);
1846
+ }
18171847 }
18181848 }
18191849
....@@ -1828,6 +1858,8 @@
18281858
18291859 if (udc->clocked)
18301860 return 0;
1861
+
1862
+ pm_stay_awake(&udc->pdev->dev);
18311863
18321864 ret = clk_prepare_enable(udc->pclk);
18331865 if (ret)
....@@ -1851,6 +1883,8 @@
18511883 clk_disable_unprepare(udc->pclk);
18521884
18531885 udc->clocked = false;
1886
+
1887
+ pm_relax(&udc->pdev->dev);
18541888 }
18551889
18561890 static int usba_start(struct usba_udc *udc)
....@@ -1862,9 +1896,19 @@
18621896 if (ret)
18631897 return ret;
18641898
1899
+ if (udc->suspended)
1900
+ return 0;
1901
+
18651902 spin_lock_irqsave(&udc->lock, flags);
18661903 toggle_bias(udc, 1);
18671904 usba_writel(udc, CTRL, USBA_ENABLE_MASK);
1905
+ /* Clear all requested and pending interrupts... */
1906
+ usba_writel(udc, INT_ENB, 0);
1907
+ udc->int_enb_cache = 0;
1908
+ usba_writel(udc, INT_CLR,
1909
+ USBA_END_OF_RESET|USBA_END_OF_RESUME
1910
+ |USBA_DET_SUSPEND|USBA_WAKE_UP);
1911
+ /* ...and enable just 'reset' IRQ to get us started */
18681912 usba_int_enb_set(udc, USBA_END_OF_RESET);
18691913 spin_unlock_irqrestore(&udc->lock, flags);
18701914
....@@ -1874,6 +1918,9 @@
18741918 static void usba_stop(struct usba_udc *udc)
18751919 {
18761920 unsigned long flags;
1921
+
1922
+ if (udc->suspended)
1923
+ return;
18771924
18781925 spin_lock_irqsave(&udc->lock, flags);
18791926 udc->gadget.speed = USB_SPEED_UNKNOWN;
....@@ -1902,16 +1949,35 @@
19021949 if (vbus) {
19031950 usba_start(udc);
19041951 } else {
1905
- usba_stop(udc);
1906
-
1952
+ udc->suspended = false;
19071953 if (udc->driver->disconnect)
19081954 udc->driver->disconnect(&udc->gadget);
1955
+
1956
+ usba_stop(udc);
19091957 }
19101958 udc->vbus_prev = vbus;
19111959 }
19121960
19131961 mutex_unlock(&udc->vbus_mutex);
19141962 return IRQ_HANDLED;
1963
+}
1964
+
1965
+static int atmel_usba_pullup(struct usb_gadget *gadget, int is_on)
1966
+{
1967
+ struct usba_udc *udc = container_of(gadget, struct usba_udc, gadget);
1968
+ unsigned long flags;
1969
+ u32 ctrl;
1970
+
1971
+ spin_lock_irqsave(&udc->lock, flags);
1972
+ ctrl = usba_readl(udc, CTRL);
1973
+ if (is_on)
1974
+ ctrl &= ~USBA_DETACH;
1975
+ else
1976
+ ctrl |= USBA_DETACH;
1977
+ usba_writel(udc, CTRL, ctrl);
1978
+ spin_unlock_irqrestore(&udc->lock, flags);
1979
+
1980
+ return 0;
19151981 }
19161982
19171983 static int atmel_usba_start(struct usb_gadget *gadget,
....@@ -1962,9 +2028,7 @@
19622028 if (udc->vbus_pin)
19632029 disable_irq(gpiod_to_irq(udc->vbus_pin));
19642030
1965
- if (fifo_mode == 0)
1966
- udc->configured_ep = 1;
1967
-
2031
+ udc->suspended = false;
19682032 usba_stop(udc);
19692033
19702034 udc->driver = NULL;
....@@ -1993,38 +2057,106 @@
19932057 .pulse_bias = at91sam9g45_pulse_bias,
19942058 };
19952059
2060
+static const struct usba_ep_config ep_config_sam9[] __initconst = {
2061
+ { .nr_banks = 1 }, /* ep 0 */
2062
+ { .nr_banks = 2, .can_dma = 1, .can_isoc = 1 }, /* ep 1 */
2063
+ { .nr_banks = 2, .can_dma = 1, .can_isoc = 1 }, /* ep 2 */
2064
+ { .nr_banks = 3, .can_dma = 1 }, /* ep 3 */
2065
+ { .nr_banks = 3, .can_dma = 1 }, /* ep 4 */
2066
+ { .nr_banks = 3, .can_dma = 1, .can_isoc = 1 }, /* ep 5 */
2067
+ { .nr_banks = 3, .can_dma = 1, .can_isoc = 1 }, /* ep 6 */
2068
+};
2069
+
2070
+static const struct usba_ep_config ep_config_sama5[] __initconst = {
2071
+ { .nr_banks = 1 }, /* ep 0 */
2072
+ { .nr_banks = 3, .can_dma = 1, .can_isoc = 1 }, /* ep 1 */
2073
+ { .nr_banks = 3, .can_dma = 1, .can_isoc = 1 }, /* ep 2 */
2074
+ { .nr_banks = 2, .can_dma = 1, .can_isoc = 1 }, /* ep 3 */
2075
+ { .nr_banks = 2, .can_dma = 1, .can_isoc = 1 }, /* ep 4 */
2076
+ { .nr_banks = 2, .can_dma = 1, .can_isoc = 1 }, /* ep 5 */
2077
+ { .nr_banks = 2, .can_dma = 1, .can_isoc = 1 }, /* ep 6 */
2078
+ { .nr_banks = 2, .can_dma = 1, .can_isoc = 1 }, /* ep 7 */
2079
+ { .nr_banks = 2, .can_isoc = 1 }, /* ep 8 */
2080
+ { .nr_banks = 2, .can_isoc = 1 }, /* ep 9 */
2081
+ { .nr_banks = 2, .can_isoc = 1 }, /* ep 10 */
2082
+ { .nr_banks = 2, .can_isoc = 1 }, /* ep 11 */
2083
+ { .nr_banks = 2, .can_isoc = 1 }, /* ep 12 */
2084
+ { .nr_banks = 2, .can_isoc = 1 }, /* ep 13 */
2085
+ { .nr_banks = 2, .can_isoc = 1 }, /* ep 14 */
2086
+ { .nr_banks = 2, .can_isoc = 1 }, /* ep 15 */
2087
+};
2088
+
2089
+static const struct usba_udc_config udc_at91sam9rl_cfg = {
2090
+ .errata = &at91sam9rl_errata,
2091
+ .config = ep_config_sam9,
2092
+ .num_ep = ARRAY_SIZE(ep_config_sam9),
2093
+ .ep_prealloc = true,
2094
+};
2095
+
2096
+static const struct usba_udc_config udc_at91sam9g45_cfg = {
2097
+ .errata = &at91sam9g45_errata,
2098
+ .config = ep_config_sam9,
2099
+ .num_ep = ARRAY_SIZE(ep_config_sam9),
2100
+ .ep_prealloc = true,
2101
+};
2102
+
2103
+static const struct usba_udc_config udc_sama5d3_cfg = {
2104
+ .config = ep_config_sama5,
2105
+ .num_ep = ARRAY_SIZE(ep_config_sama5),
2106
+ .ep_prealloc = true,
2107
+};
2108
+
2109
+static const struct usba_udc_config udc_sam9x60_cfg = {
2110
+ .num_ep = ARRAY_SIZE(ep_config_sam9),
2111
+ .config = ep_config_sam9,
2112
+ .ep_prealloc = false,
2113
+};
2114
+
19962115 static const struct of_device_id atmel_udc_dt_ids[] = {
1997
- { .compatible = "atmel,at91sam9rl-udc", .data = &at91sam9rl_errata },
1998
- { .compatible = "atmel,at91sam9g45-udc", .data = &at91sam9g45_errata },
1999
- { .compatible = "atmel,sama5d3-udc" },
2116
+ { .compatible = "atmel,at91sam9rl-udc", .data = &udc_at91sam9rl_cfg },
2117
+ { .compatible = "atmel,at91sam9g45-udc", .data = &udc_at91sam9g45_cfg },
2118
+ { .compatible = "atmel,sama5d3-udc", .data = &udc_sama5d3_cfg },
2119
+ { .compatible = "microchip,sam9x60-udc", .data = &udc_sam9x60_cfg },
20002120 { /* sentinel */ }
20012121 };
20022122
20032123 MODULE_DEVICE_TABLE(of, atmel_udc_dt_ids);
20042124
2125
+static const struct of_device_id atmel_pmc_dt_ids[] = {
2126
+ { .compatible = "atmel,at91sam9g45-pmc" },
2127
+ { .compatible = "atmel,at91sam9rl-pmc" },
2128
+ { .compatible = "atmel,at91sam9x5-pmc" },
2129
+ { /* sentinel */ }
2130
+};
2131
+
20052132 static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev,
20062133 struct usba_udc *udc)
20072134 {
2008
- u32 val;
2009
- const char *name;
20102135 struct device_node *np = pdev->dev.of_node;
20112136 const struct of_device_id *match;
20122137 struct device_node *pp;
20132138 int i, ret;
20142139 struct usba_ep *eps, *ep;
2140
+ const struct usba_udc_config *udc_config;
20152141
20162142 match = of_match_node(atmel_udc_dt_ids, np);
20172143 if (!match)
20182144 return ERR_PTR(-EINVAL);
20192145
2020
- udc->errata = match->data;
2021
- udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9g45-pmc");
2022
- if (IS_ERR(udc->pmc))
2023
- udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9rl-pmc");
2024
- if (IS_ERR(udc->pmc))
2025
- udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9x5-pmc");
2026
- if (udc->errata && IS_ERR(udc->pmc))
2027
- return ERR_CAST(udc->pmc);
2146
+ udc_config = match->data;
2147
+ udc->ep_prealloc = udc_config->ep_prealloc;
2148
+ udc->errata = udc_config->errata;
2149
+ if (udc->errata) {
2150
+ pp = of_find_matching_node_and_match(NULL, atmel_pmc_dt_ids,
2151
+ NULL);
2152
+ if (!pp)
2153
+ return ERR_PTR(-ENODEV);
2154
+
2155
+ udc->pmc = syscon_node_to_regmap(pp);
2156
+ of_node_put(pp);
2157
+ if (IS_ERR(udc->pmc))
2158
+ return ERR_CAST(udc->pmc);
2159
+ }
20282160
20292161 udc->num_ep = 0;
20302162
....@@ -2032,10 +2164,7 @@
20322164 GPIOD_IN);
20332165
20342166 if (fifo_mode == 0) {
2035
- pp = NULL;
2036
- while ((pp = of_get_next_child(np, pp)))
2037
- udc->num_ep++;
2038
- udc->configured_ep = 1;
2167
+ udc->num_ep = udc_config->num_ep;
20392168 } else {
20402169 udc->num_ep = usba_config_fifo_table(udc);
20412170 }
....@@ -2049,60 +2178,40 @@
20492178
20502179 INIT_LIST_HEAD(&eps[0].ep.ep_list);
20512180
2052
- pp = NULL;
20532181 i = 0;
2054
- while ((pp = of_get_next_child(np, pp)) && i < udc->num_ep) {
2182
+ while (i < udc->num_ep) {
2183
+ const struct usba_ep_config *ep_cfg = &udc_config->config[i];
2184
+
20552185 ep = &eps[i];
20562186
2057
- ret = of_property_read_u32(pp, "reg", &val);
2058
- if (ret) {
2059
- dev_err(&pdev->dev, "of_probe: reg error(%d)\n", ret);
2060
- goto err;
2061
- }
2062
- ep->index = fifo_mode ? udc->fifo_cfg[i].hw_ep_num : val;
2187
+ ep->index = fifo_mode ? udc->fifo_cfg[i].hw_ep_num : i;
20632188
2064
- ret = of_property_read_u32(pp, "atmel,fifo-size", &val);
2065
- if (ret) {
2066
- dev_err(&pdev->dev, "of_probe: fifo-size error(%d)\n", ret);
2067
- goto err;
2068
- }
2189
+ /* Only the first EP is 64 bytes */
2190
+ if (ep->index == 0)
2191
+ ep->fifo_size = 64;
2192
+ else
2193
+ ep->fifo_size = 1024;
2194
+
20692195 if (fifo_mode) {
2070
- if (val < udc->fifo_cfg[i].fifo_size) {
2196
+ if (ep->fifo_size < udc->fifo_cfg[i].fifo_size)
20712197 dev_warn(&pdev->dev,
2072
- "Using max fifo-size value from DT\n");
2073
- ep->fifo_size = val;
2074
- } else {
2198
+ "Using default max fifo-size value\n");
2199
+ else
20752200 ep->fifo_size = udc->fifo_cfg[i].fifo_size;
2076
- }
2077
- } else {
2078
- ep->fifo_size = val;
20792201 }
20802202
2081
- ret = of_property_read_u32(pp, "atmel,nb-banks", &val);
2082
- if (ret) {
2083
- dev_err(&pdev->dev, "of_probe: nb-banks error(%d)\n", ret);
2084
- goto err;
2085
- }
2203
+ ep->nr_banks = ep_cfg->nr_banks;
20862204 if (fifo_mode) {
2087
- if (val < udc->fifo_cfg[i].nr_banks) {
2205
+ if (ep->nr_banks < udc->fifo_cfg[i].nr_banks)
20882206 dev_warn(&pdev->dev,
2089
- "Using max nb-banks value from DT\n");
2090
- ep->nr_banks = val;
2091
- } else {
2207
+ "Using default max nb-banks value\n");
2208
+ else
20922209 ep->nr_banks = udc->fifo_cfg[i].nr_banks;
2093
- }
2094
- } else {
2095
- ep->nr_banks = val;
20962210 }
20972211
2098
- ep->can_dma = of_property_read_bool(pp, "atmel,can-dma");
2099
- ep->can_isoc = of_property_read_bool(pp, "atmel,can-isoc");
2212
+ ep->can_dma = ep_cfg->can_dma;
2213
+ ep->can_isoc = ep_cfg->can_isoc;
21002214
2101
- ret = of_property_read_string(pp, "name", &name);
2102
- if (ret) {
2103
- dev_err(&pdev->dev, "of_probe: name error(%d)\n", ret);
2104
- goto err;
2105
- }
21062215 sprintf(ep->name, "ep%d", ep->index);
21072216 ep->ep.name = ep->name;
21082217
....@@ -2284,6 +2393,7 @@
22842393 mutex_lock(&udc->vbus_mutex);
22852394
22862395 if (!device_may_wakeup(dev)) {
2396
+ udc->suspended = false;
22872397 usba_stop(udc);
22882398 goto out;
22892399 }
....@@ -2293,9 +2403,12 @@
22932403 * to request vbus irq, assuming always on.
22942404 */
22952405 if (udc->vbus_pin) {
2406
+ /* FIXME: right to stop here...??? */
22962407 usba_stop(udc);
22972408 enable_irq_wake(gpiod_to_irq(udc->vbus_pin));
22982409 }
2410
+
2411
+ enable_irq_wake(udc->irq);
22992412
23002413 out:
23012414 mutex_unlock(&udc->vbus_mutex);
....@@ -2310,8 +2423,12 @@
23102423 if (!udc->driver)
23112424 return 0;
23122425
2313
- if (device_may_wakeup(dev) && udc->vbus_pin)
2314
- disable_irq_wake(gpiod_to_irq(udc->vbus_pin));
2426
+ if (device_may_wakeup(dev)) {
2427
+ if (udc->vbus_pin)
2428
+ disable_irq_wake(gpiod_to_irq(udc->vbus_pin));
2429
+
2430
+ disable_irq_wake(udc->irq);
2431
+ }
23152432
23162433 /* If Vbus is present, enable the controller and wait for reset */
23172434 mutex_lock(&udc->vbus_mutex);