Lines Matching refs:m66592
20 #include "m66592-udc.h"
34 static void disable_controller(struct m66592 *m66592);
44 static inline u16 get_usb_speed(struct m66592 *m66592)
46 return (m66592_read(m66592, M66592_DVSTCTR) & M66592_RHST);
49 static void enable_pipe_irq(struct m66592 *m66592, u16 pipenum,
54 tmp = m66592_read(m66592, M66592_INTENB0);
55 m66592_bclr(m66592, M66592_BEMPE | M66592_NRDYE | M66592_BRDYE,
57 m66592_bset(m66592, (1 << pipenum), reg);
58 m66592_write(m66592, tmp, M66592_INTENB0);
61 static void disable_pipe_irq(struct m66592 *m66592, u16 pipenum,
66 tmp = m66592_read(m66592, M66592_INTENB0);
67 m66592_bclr(m66592, M66592_BEMPE | M66592_NRDYE | M66592_BRDYE,
69 m66592_bclr(m66592, (1 << pipenum), reg);
70 m66592_write(m66592, tmp, M66592_INTENB0);
73 static void m66592_usb_connect(struct m66592 *m66592)
75 m66592_bset(m66592, M66592_CTRE, M66592_INTENB0);
76 m66592_bset(m66592, M66592_WDST | M66592_RDST | M66592_CMPL,
78 m66592_bset(m66592, M66592_BEMPE | M66592_BRDYE, M66592_INTENB0);
80 m66592_bset(m66592, M66592_DPRPU, M66592_SYSCFG);
83 static void m66592_usb_disconnect(struct m66592 *m66592)
84 __releases(m66592->lock)
85 __acquires(m66592->lock)
87 m66592_bclr(m66592, M66592_CTRE, M66592_INTENB0);
88 m66592_bclr(m66592, M66592_WDST | M66592_RDST | M66592_CMPL,
90 m66592_bclr(m66592, M66592_BEMPE | M66592_BRDYE, M66592_INTENB0);
91 m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG);
93 m66592->gadget.speed = USB_SPEED_UNKNOWN;
94 spin_unlock(&m66592->lock);
95 m66592->driver->disconnect(&m66592->gadget);
96 spin_lock(&m66592->lock);
98 disable_controller(m66592);
99 INIT_LIST_HEAD(&m66592->ep[0].queue);
102 static inline u16 control_reg_get_pid(struct m66592 *m66592, u16 pipenum)
108 pid = m66592_read(m66592, M66592_DCPCTR) & M66592_PID;
111 pid = m66592_read(m66592, offset) & M66592_PID;
118 static inline void control_reg_set_pid(struct m66592 *m66592, u16 pipenum,
124 m66592_mdfy(m66592, pid, M66592_PID, M66592_DCPCTR);
127 m66592_mdfy(m66592, pid, M66592_PID, offset);
132 static inline void pipe_start(struct m66592 *m66592, u16 pipenum)
134 control_reg_set_pid(m66592, pipenum, M66592_PID_BUF);
137 static inline void pipe_stop(struct m66592 *m66592, u16 pipenum)
139 control_reg_set_pid(m66592, pipenum, M66592_PID_NAK);
142 static inline void pipe_stall(struct m66592 *m66592, u16 pipenum)
144 control_reg_set_pid(m66592, pipenum, M66592_PID_STALL);
147 static inline u16 control_reg_get(struct m66592 *m66592, u16 pipenum)
153 ret = m66592_read(m66592, M66592_DCPCTR);
156 ret = m66592_read(m66592, offset);
163 static inline void control_reg_sqclr(struct m66592 *m66592, u16 pipenum)
167 pipe_stop(m66592, pipenum);
170 m66592_bset(m66592, M66592_SQCLR, M66592_DCPCTR);
173 m66592_bset(m66592, M66592_SQCLR, offset);
178 static inline int get_buffer_size(struct m66592 *m66592, u16 pipenum)
184 tmp = m66592_read(m66592, M66592_DCPCFG);
188 tmp = m66592_read(m66592, M66592_DCPMAXP);
192 m66592_write(m66592, pipenum, M66592_PIPESEL);
193 tmp = m66592_read(m66592, M66592_PIPECFG);
195 tmp = m66592_read(m66592, M66592_PIPEBUF);
198 tmp = m66592_read(m66592, M66592_PIPEMAXP);
206 static inline void pipe_change(struct m66592 *m66592, u16 pipenum)
208 struct m66592_ep *ep = m66592->pipenum2ep[pipenum];
214 m66592_mdfy(m66592, pipenum, M66592_CURPIPE, ep->fifosel);
218 if (m66592->pdata->on_chip)
223 m66592_bset(m66592, mbw, ep->fifosel);
226 static int pipe_buffer_setting(struct m66592 *m66592,
235 m66592_write(m66592, info->pipe, M66592_PIPESEL);
267 pr_err("m66592 pipe memory is insufficient\n");
271 m66592_write(m66592, pipecfg, M66592_PIPECFG);
272 m66592_write(m66592, (buf_bsize << 10) | (bufnum), M66592_PIPEBUF);
273 m66592_write(m66592, info->maxpacket, M66592_PIPEMAXP);
276 m66592_write(m66592, info->interval, M66592_PIPEPERI);
281 static void pipe_buffer_release(struct m66592 *m66592,
288 m66592->bulk--;
290 m66592->interrupt--;
292 m66592->isochronous--;
294 m66592->bulk--;
302 struct m66592 *m66592 = ep->m66592;
305 m66592_mdfy(m66592, 0, M66592_CURPIPE, ep->fifosel);
307 m66592_write(m66592, M66592_ACLRM, ep->pipectr);
308 m66592_write(m66592, 0, ep->pipectr);
309 m66592_write(m66592, M66592_SQCLR, ep->pipectr);
311 m66592_mdfy(m66592, ep->pipenum, M66592_CURPIPE, ep->fifosel);
315 if (m66592->pdata->on_chip)
320 m66592_bset(m66592, mbw, ep->fifosel);
324 static void m66592_ep_setting(struct m66592 *m66592, struct m66592_ep *ep,
329 if (m66592->num_dma == 0) {
330 m66592->num_dma++;
336 } else if (!m66592->pdata->on_chip && m66592->num_dma == 1) {
337 m66592->num_dma++;
361 m66592->pipenum2ep[pipenum] = ep;
362 m66592->epaddr2ep[desc->bEndpointAddress&USB_ENDPOINT_NUMBER_MASK] = ep;
368 struct m66592 *m66592 = ep->m66592;
375 m66592->num_dma--;
384 struct m66592 *m66592 = ep->m66592;
396 if (m66592->bulk >= M66592_MAX_NUM_BULK) {
397 if (m66592->isochronous >= M66592_MAX_NUM_ISOC) {
402 + m66592->isochronous;
403 counter = &m66592->isochronous;
406 info.pipe = M66592_BASE_PIPENUM_BULK + m66592->bulk;
407 counter = &m66592->bulk;
413 if (m66592->interrupt >= M66592_MAX_NUM_INT) {
417 info.pipe = M66592_BASE_PIPENUM_INT + m66592->interrupt;
419 counter = &m66592->interrupt;
422 if (m66592->isochronous >= M66592_MAX_NUM_ISOC) {
426 info.pipe = M66592_BASE_PIPENUM_ISOC + m66592->isochronous;
428 counter = &m66592->isochronous;
444 ret = pipe_buffer_setting(m66592, &info);
451 if ((counter == &m66592->isochronous) && info.type == M66592_BULK)
452 m66592->bulk++;
454 m66592_ep_setting(m66592, ep, desc, info.pipe, dma);
462 struct m66592 *m66592 = ep->m66592;
467 pipe_buffer_release(m66592, &info);
474 static void pipe_irq_enable(struct m66592 *m66592, u16 pipenum)
476 enable_irq_ready(m66592, pipenum);
477 enable_irq_nrdy(m66592, pipenum);
480 static void pipe_irq_disable(struct m66592 *m66592, u16 pipenum)
482 disable_irq_ready(m66592, pipenum);
483 disable_irq_nrdy(m66592, pipenum);
487 static void control_end(struct m66592 *m66592, unsigned ccpl)
489 m66592->ep[0].internal_ccpl = ccpl;
490 pipe_start(m66592, 0);
491 m66592_bset(m66592, M66592_CCPL, M66592_DCPCTR);
496 struct m66592 *m66592 = ep->m66592;
498 pipe_change(m66592, ep->pipenum);
499 m66592_mdfy(m66592, M66592_ISEL | M66592_PIPE0,
502 m66592_write(m66592, M66592_BCLR, ep->fifoctr);
504 m66592_bset(m66592, M66592_BVAL, ep->fifoctr);
505 pipe_start(m66592, 0);
508 m66592_write(m66592, ~M66592_BEMP0, M66592_BEMPSTS);
515 struct m66592 *m66592 = ep->m66592;
518 pipe_change(m66592, ep->pipenum);
519 disable_irq_empty(m66592, ep->pipenum);
520 pipe_start(m66592, ep->pipenum);
522 tmp = m66592_read(m66592, ep->fifoctr);
524 pipe_irq_enable(m66592, ep->pipenum);
531 struct m66592 *m66592 = ep->m66592;
535 m66592_mdfy(m66592, M66592_PIPE0,
538 m66592_write(m66592, M66592_BCLR, ep->fifoctr);
539 pipe_start(m66592, pipenum);
540 pipe_irq_enable(m66592, pipenum);
543 m66592_bset(m66592, M66592_TRCLR, ep->fifosel);
544 pipe_change(m66592, pipenum);
545 m66592_bset(m66592, M66592_TRENB, ep->fifosel);
546 m66592_write(m66592,
551 pipe_start(m66592, pipenum); /* trigger once */
552 pipe_irq_enable(m66592, pipenum);
568 ctsq = m66592_read(ep->m66592, M66592_INTSTS0) & M66592_CTSQ;
579 control_end(ep->m66592, 0);
587 static void init_controller(struct m66592 *m66592)
591 if (m66592->pdata->on_chip) {
592 if (m66592->pdata->endian)
597 m66592_bset(m66592, M66592_HSE, M66592_SYSCFG); /* High spd */
598 m66592_bclr(m66592, M66592_USBE, M66592_SYSCFG);
599 m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG);
600 m66592_bset(m66592, M66592_USBE, M66592_SYSCFG);
603 m66592_bset(m66592, 0x8000, M66592_DVSTCTR);
604 m66592_bset(m66592, 0x1000, M66592_TESTMODE);
605 m66592_bclr(m66592, 0x8000, M66592_DVSTCTR);
607 m66592_bset(m66592, M66592_INTL, M66592_INTENB1);
609 m66592_write(m66592, 0, M66592_CFBCFG);
610 m66592_write(m66592, 0, M66592_D0FBCFG);
611 m66592_bset(m66592, endian, M66592_CFBCFG);
612 m66592_bset(m66592, endian, M66592_D0FBCFG);
616 if (m66592->pdata->endian)
621 if (m66592->pdata->vif)
626 switch (m66592->pdata->xtal) {
637 pr_warn("m66592-udc: xtal configuration error\n");
641 switch (m66592->irq_trigger) {
649 pr_warn("m66592-udc: irq trigger config error\n");
653 m66592_bset(m66592,
656 m66592_bset(m66592, M66592_HSE, M66592_SYSCFG); /* High spd */
657 m66592_mdfy(m66592, clock & M66592_XTAL, M66592_XTAL,
659 m66592_bclr(m66592, M66592_USBE, M66592_SYSCFG);
660 m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG);
661 m66592_bset(m66592, M66592_USBE, M66592_SYSCFG);
663 m66592_bset(m66592, M66592_XCKE, M66592_SYSCFG);
667 m66592_bset(m66592, M66592_RCKE | M66592_PLLC, M66592_SYSCFG);
671 m66592_bset(m66592, M66592_SCKE, M66592_SYSCFG);
673 m66592_bset(m66592, irq_sense & M66592_INTL, M66592_INTENB1);
674 m66592_write(m66592, M66592_BURST | M66592_CPU_ADR_RD_WR,
679 static void disable_controller(struct m66592 *m66592)
681 m66592_bclr(m66592, M66592_UTST, M66592_TESTMODE);
682 if (!m66592->pdata->on_chip) {
683 m66592_bclr(m66592, M66592_SCKE, M66592_SYSCFG);
685 m66592_bclr(m66592, M66592_PLLC, M66592_SYSCFG);
687 m66592_bclr(m66592, M66592_RCKE, M66592_SYSCFG);
689 m66592_bclr(m66592, M66592_XCKE, M66592_SYSCFG);
693 static void m66592_start_xclock(struct m66592 *m66592)
697 if (!m66592->pdata->on_chip) {
698 tmp = m66592_read(m66592, M66592_SYSCFG);
700 m66592_bset(m66592, M66592_XCKE, M66592_SYSCFG);
707 __releases(m66592->lock)
708 __acquires(m66592->lock)
720 if (ep->m66592->gadget.speed == USB_SPEED_UNKNOWN)
728 spin_unlock(&ep->m66592->lock);
730 spin_lock(&ep->m66592->lock);
747 struct m66592 *m66592 = ep->m66592;
749 pipe_change(m66592, pipenum);
750 m66592_bset(m66592, M66592_ISEL, ep->fifosel);
754 tmp = m66592_read(m66592, ep->fifoctr);
764 bufsize = get_buffer_size(m66592, pipenum);
771 m66592_write_fifo(m66592, ep, buf, size);
773 m66592_bset(m66592, M66592_BVAL, ep->fifoctr);
783 disable_irq_ready(m66592, pipenum);
784 disable_irq_empty(m66592, pipenum);
786 disable_irq_ready(m66592, pipenum);
787 enable_irq_empty(m66592, pipenum);
789 pipe_start(m66592, pipenum);
799 struct m66592 *m66592 = ep->m66592;
801 pipe_change(m66592, pipenum);
802 tmp = m66592_read(m66592, ep->fifoctr);
804 pipe_stop(m66592, pipenum);
805 pipe_irq_disable(m66592, pipenum);
811 bufsize = get_buffer_size(m66592, pipenum);
817 m66592_write_fifo(m66592, ep, buf, size);
822 m66592_bset(m66592, M66592_BVAL, ep->fifoctr);
831 disable_irq_ready(m66592, pipenum);
832 enable_irq_empty(m66592, pipenum);
834 disable_irq_empty(m66592, pipenum);
835 pipe_irq_enable(m66592, pipenum);
846 struct m66592 *m66592 = ep->m66592;
849 pipe_change(m66592, pipenum);
850 tmp = m66592_read(m66592, ep->fifoctr);
853 pipe_stop(m66592, pipenum);
854 pipe_irq_disable(m66592, pipenum);
861 bufsize = get_buffer_size(m66592, pipenum);
877 pipe_stop(m66592, pipenum);
878 pipe_irq_disable(m66592, pipenum);
885 m66592_write(m66592, M66592_BCLR, ep->fifoctr);
887 m66592_read_fifo(m66592, ep->fifoaddr, buf, size);
894 static void irq_pipe_ready(struct m66592 *m66592, u16 status, u16 enb)
902 m66592_write(m66592, ~M66592_BRDY0, M66592_BRDYSTS);
903 m66592_mdfy(m66592, M66592_PIPE0, M66592_CURPIPE,
906 ep = &m66592->ep[0];
913 m66592_write(m66592, ~check, M66592_BRDYSTS);
914 ep = m66592->pipenum2ep[pipenum];
926 static void irq_pipe_empty(struct m66592 *m66592, u16 status, u16 enb)
935 m66592_write(m66592, ~M66592_BEMP0, M66592_BEMPSTS);
937 ep = &m66592->ep[0];
944 m66592_write(m66592, ~check, M66592_BEMPSTS);
945 tmp = control_reg_get(m66592, pipenum);
947 disable_irq_empty(m66592, pipenum);
948 pipe_irq_disable(m66592, pipenum);
949 pipe_stop(m66592, pipenum);
950 ep = m66592->pipenum2ep[pipenum];
962 static void get_status(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
963 __releases(m66592->lock)
964 __acquires(m66592->lock)
979 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
980 pid = control_reg_get_pid(m66592, ep->pipenum);
987 pipe_stall(m66592, 0);
991 m66592->ep0_data = cpu_to_le16(status);
992 m66592->ep0_req->buf = &m66592->ep0_data;
993 m66592->ep0_req->length = 2;
995 spin_unlock(&m66592->lock);
996 m66592_queue(m66592->gadget.ep0, m66592->ep0_req, GFP_KERNEL);
997 spin_lock(&m66592->lock);
1000 static void clear_feature(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
1004 control_end(m66592, 1);
1007 control_end(m66592, 1);
1014 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
1015 pipe_stop(m66592, ep->pipenum);
1016 control_reg_sqclr(m66592, ep->pipenum);
1018 control_end(m66592, 1);
1028 pipe_start(m66592, ep->pipenum);
1032 pipe_stall(m66592, 0);
1037 static void set_feature(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
1046 control_end(m66592, 1);
1049 tmp = m66592_read(m66592, M66592_INTSTS0) &
1055 m66592_bset(m66592,
1060 pipe_stall(m66592, 0);
1065 control_end(m66592, 1);
1071 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
1072 pipe_stall(m66592, ep->pipenum);
1074 control_end(m66592, 1);
1078 pipe_stall(m66592, 0);
1084 static int setup_packet(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
1091 m66592_write(m66592, ~M66592_VALID, M66592_INTSTS0);
1094 p[i] = m66592_read(m66592, offset + i*2);
1100 get_status(m66592, ctrl);
1103 clear_feature(m66592, ctrl);
1106 set_feature(m66592, ctrl);
1117 static void m66592_update_usb_speed(struct m66592 *m66592)
1119 u16 speed = get_usb_speed(m66592);
1123 m66592->gadget.speed = USB_SPEED_HIGH;
1126 m66592->gadget.speed = USB_SPEED_FULL;
1129 m66592->gadget.speed = USB_SPEED_UNKNOWN;
1134 static void irq_device_state(struct m66592 *m66592)
1138 dvsq = m66592_read(m66592, M66592_INTSTS0) & M66592_DVSQ;
1139 m66592_write(m66592, ~M66592_DVST, M66592_INTSTS0);
1142 usb_gadget_udc_reset(&m66592->gadget, m66592->driver);
1143 m66592_update_usb_speed(m66592);
1145 if (m66592->old_dvsq == M66592_DS_CNFG && dvsq != M66592_DS_CNFG)
1146 m66592_update_usb_speed(m66592);
1148 && m66592->gadget.speed == USB_SPEED_UNKNOWN)
1149 m66592_update_usb_speed(m66592);
1151 m66592->old_dvsq = dvsq;
1154 static void irq_control_stage(struct m66592 *m66592)
1155 __releases(m66592->lock)
1156 __acquires(m66592->lock)
1161 ctsq = m66592_read(m66592, M66592_INTSTS0) & M66592_CTSQ;
1162 m66592_write(m66592, ~M66592_CTRT, M66592_INTSTS0);
1168 ep = &m66592->ep[0];
1177 if (setup_packet(m66592, &ctrl)) {
1178 spin_unlock(&m66592->lock);
1179 if (m66592->driver->setup(&m66592->gadget, &ctrl) < 0)
1180 pipe_stall(m66592, 0);
1181 spin_lock(&m66592->lock);
1186 control_end(m66592, 0);
1196 struct m66592 *m66592 = _m66592;
1202 spin_lock(&m66592->lock);
1204 intsts0 = m66592_read(m66592, M66592_INTSTS0);
1205 intenb0 = m66592_read(m66592, M66592_INTENB0);
1207 if (m66592->pdata->on_chip && !intsts0 && !intenb0) {
1213 m66592_start_xclock(m66592);
1214 intsts0 = m66592_read(m66592, M66592_INTSTS0);
1215 intenb0 = m66592_read(m66592, M66592_INTENB0);
1218 savepipe = m66592_read(m66592, M66592_CFIFOSEL);
1222 u16 brdysts = m66592_read(m66592, M66592_BRDYSTS);
1223 u16 bempsts = m66592_read(m66592, M66592_BEMPSTS);
1224 u16 brdyenb = m66592_read(m66592, M66592_BRDYENB);
1225 u16 bempenb = m66592_read(m66592, M66592_BEMPENB);
1228 m66592_write(m66592, 0xffff & ~M66592_VBINT,
1230 m66592_start_xclock(m66592);
1233 m66592->old_vbus = m66592_read(m66592, M66592_INTSTS0)
1235 m66592->scount = M66592_MAX_SAMPLING;
1237 mod_timer(&m66592->timer,
1241 irq_device_state(m66592);
1245 irq_pipe_ready(m66592, brdysts, brdyenb);
1249 irq_pipe_empty(m66592, bempsts, bempenb);
1253 irq_control_stage(m66592);
1256 m66592_write(m66592, savepipe, M66592_CFIFOSEL);
1258 spin_unlock(&m66592->lock);
1264 struct m66592 *m66592 = from_timer(m66592, t, timer);
1268 spin_lock_irqsave(&m66592->lock, flags);
1269 tmp = m66592_read(m66592, M66592_SYSCFG);
1271 m66592_bset(m66592, M66592_RCKE | M66592_PLLC, M66592_SYSCFG);
1273 m66592_bset(m66592, M66592_SCKE, M66592_SYSCFG);
1275 if (m66592->scount > 0) {
1276 tmp = m66592_read(m66592, M66592_INTSTS0) & M66592_VBSTS;
1277 if (tmp == m66592->old_vbus) {
1278 m66592->scount--;
1279 if (m66592->scount == 0) {
1281 m66592_usb_connect(m66592);
1283 m66592_usb_disconnect(m66592);
1285 mod_timer(&m66592->timer,
1289 m66592->scount = M66592_MAX_SAMPLING;
1290 m66592->old_vbus = tmp;
1291 mod_timer(&m66592->timer,
1295 spin_unlock_irqrestore(&m66592->lock, flags);
1319 spin_lock_irqsave(&ep->m66592->lock, flags);
1321 spin_unlock_irqrestore(&ep->m66592->lock, flags);
1324 pipe_irq_disable(ep->m66592, ep->pipenum);
1361 if (ep->m66592->gadget.speed == USB_SPEED_UNKNOWN)
1364 spin_lock_irqsave(&ep->m66592->lock, flags);
1380 spin_unlock_irqrestore(&ep->m66592->lock, flags);
1394 spin_lock_irqsave(&ep->m66592->lock, flags);
1397 spin_unlock_irqrestore(&ep->m66592->lock, flags);
1408 spin_lock_irqsave(&ep->m66592->lock, flags);
1413 pipe_stall(ep->m66592, ep->pipenum);
1416 pipe_stop(ep->m66592, ep->pipenum);
1418 spin_unlock_irqrestore(&ep->m66592->lock, flags);
1428 spin_lock_irqsave(&ep->m66592->lock, flags);
1430 pipe_stop(ep->m66592, ep->pipenum);
1431 m66592_bclr(ep->m66592, M66592_BCLR, ep->fifoctr);
1433 spin_unlock_irqrestore(&ep->m66592->lock, flags);
1454 struct m66592 *m66592 = to_m66592(g);
1457 m66592->driver = driver;
1459 m66592_bset(m66592, M66592_VBSE | M66592_URST, M66592_INTENB0);
1460 if (m66592_read(m66592, M66592_INTSTS0) & M66592_VBSTS) {
1461 m66592_start_xclock(m66592);
1463 m66592->old_vbus = m66592_read(m66592,
1465 m66592->scount = M66592_MAX_SAMPLING;
1466 mod_timer(&m66592->timer, jiffies + msecs_to_jiffies(50));
1474 struct m66592 *m66592 = to_m66592(g);
1476 m66592_bclr(m66592, M66592_VBSE | M66592_URST, M66592_INTENB0);
1478 init_controller(m66592);
1479 disable_controller(m66592);
1481 m66592->driver = NULL;
1489 struct m66592 *m66592 = gadget_to_m66592(_gadget);
1490 return m66592_read(m66592, M66592_FRMNUM) & 0x03FF;
1495 struct m66592 *m66592 = gadget_to_m66592(gadget);
1498 spin_lock_irqsave(&m66592->lock, flags);
1500 m66592_bset(m66592, M66592_DPRPU, M66592_SYSCFG);
1502 m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG);
1503 spin_unlock_irqrestore(&m66592->lock, flags);
1517 struct m66592 *m66592 = platform_get_drvdata(pdev);
1519 usb_del_gadget_udc(&m66592->gadget);
1521 timer_shutdown_sync(&m66592->timer);
1522 iounmap(m66592->reg);
1523 free_irq(platform_get_irq(pdev, 0), m66592);
1524 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
1525 if (m66592->pdata->on_chip) {
1526 clk_disable(m66592->clk);
1527 clk_put(m66592->clk);
1529 kfree(m66592);
1540 struct m66592 *m66592 = NULL;
1574 m66592 = kzalloc(sizeof(struct m66592), GFP_KERNEL);
1575 if (m66592 == NULL) {
1580 m66592->pdata = dev_get_platdata(&pdev->dev);
1581 m66592->irq_trigger = ires->flags & IRQF_TRIGGER_MASK;
1583 spin_lock_init(&m66592->lock);
1584 platform_set_drvdata(pdev, m66592);
1586 m66592->gadget.ops = &m66592_gadget_ops;
1587 m66592->gadget.max_speed = USB_SPEED_HIGH;
1588 m66592->gadget.name = udc_name;
1590 timer_setup(&m66592->timer, m66592_timer, 0);
1591 m66592->reg = reg;
1594 udc_name, m66592);
1600 if (m66592->pdata->on_chip) {
1602 m66592->clk = clk_get(&pdev->dev, clk_name);
1603 if (IS_ERR(m66592->clk)) {
1606 ret = PTR_ERR(m66592->clk);
1609 clk_enable(m66592->clk);
1612 INIT_LIST_HEAD(&m66592->gadget.ep_list);
1613 m66592->gadget.ep0 = &m66592->ep[0].ep;
1614 INIT_LIST_HEAD(&m66592->gadget.ep0->ep_list);
1616 struct m66592_ep *ep = &m66592->ep[i];
1619 INIT_LIST_HEAD(&m66592->ep[i].ep.ep_list);
1620 list_add_tail(&m66592->ep[i].ep.ep_list,
1621 &m66592->gadget.ep_list);
1623 ep->m66592 = m66592;
1640 usb_ep_set_maxpacket_limit(&m66592->ep[0].ep, 64);
1641 m66592->ep[0].pipenum = 0;
1642 m66592->ep[0].fifoaddr = M66592_CFIFO;
1643 m66592->ep[0].fifosel = M66592_CFIFOSEL;
1644 m66592->ep[0].fifoctr = M66592_CFIFOCTR;
1645 m66592->ep[0].fifotrn = 0;
1646 m66592->ep[0].pipectr = get_pipectr_addr(0);
1647 m66592->pipenum2ep[0] = &m66592->ep[0];
1648 m66592->epaddr2ep[0] = &m66592->ep[0];
1650 m66592->ep0_req = m66592_alloc_request(&m66592->ep[0].ep, GFP_KERNEL);
1651 if (m66592->ep0_req == NULL) {
1655 m66592->ep0_req->complete = nop_completion;
1657 init_controller(m66592);
1659 ret = usb_add_gadget_udc(&pdev->dev, &m66592->gadget);
1667 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
1668 m66592->ep0_req = NULL;
1670 if (m66592->pdata->on_chip) {
1671 clk_disable(m66592->clk);
1672 clk_put(m66592->clk);
1675 free_irq(ires->start, m66592);
1677 if (m66592) {
1678 if (m66592->ep0_req)
1679 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
1680 kfree(m66592);