Lines Matching refs:m66592

37 static void disable_controller(struct m66592 *m66592);
47 static inline u16 get_usb_speed(struct m66592 *m66592) in get_usb_speed() argument
49 return (m66592_read(m66592, M66592_DVSTCTR) & M66592_RHST); in get_usb_speed()
52 static void enable_pipe_irq(struct m66592 *m66592, u16 pipenum, in enable_pipe_irq() argument
57 tmp = m66592_read(m66592, M66592_INTENB0); in enable_pipe_irq()
58 m66592_bclr(m66592, M66592_BEMPE | M66592_NRDYE | M66592_BRDYE, in enable_pipe_irq()
60 m66592_bset(m66592, (1 << pipenum), reg); in enable_pipe_irq()
61 m66592_write(m66592, tmp, M66592_INTENB0); in enable_pipe_irq()
64 static void disable_pipe_irq(struct m66592 *m66592, u16 pipenum, in disable_pipe_irq() argument
69 tmp = m66592_read(m66592, M66592_INTENB0); in disable_pipe_irq()
70 m66592_bclr(m66592, M66592_BEMPE | M66592_NRDYE | M66592_BRDYE, in disable_pipe_irq()
72 m66592_bclr(m66592, (1 << pipenum), reg); in disable_pipe_irq()
73 m66592_write(m66592, tmp, M66592_INTENB0); in disable_pipe_irq()
76 static void m66592_usb_connect(struct m66592 *m66592) in m66592_usb_connect() argument
78 m66592_bset(m66592, M66592_CTRE, M66592_INTENB0); in m66592_usb_connect()
79 m66592_bset(m66592, M66592_WDST | M66592_RDST | M66592_CMPL, in m66592_usb_connect()
81 m66592_bset(m66592, M66592_BEMPE | M66592_BRDYE, M66592_INTENB0); in m66592_usb_connect()
83 m66592_bset(m66592, M66592_DPRPU, M66592_SYSCFG); in m66592_usb_connect()
86 static void m66592_usb_disconnect(struct m66592 *m66592) in m66592_usb_disconnect() argument
87 __releases(m66592->lock) in m66592_usb_disconnect()
88 __acquires(m66592->lock) in m66592_usb_disconnect()
90 m66592_bclr(m66592, M66592_CTRE, M66592_INTENB0); in m66592_usb_disconnect()
91 m66592_bclr(m66592, M66592_WDST | M66592_RDST | M66592_CMPL, in m66592_usb_disconnect()
93 m66592_bclr(m66592, M66592_BEMPE | M66592_BRDYE, M66592_INTENB0); in m66592_usb_disconnect()
94 m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG); in m66592_usb_disconnect()
96 m66592->gadget.speed = USB_SPEED_UNKNOWN; in m66592_usb_disconnect()
97 spin_unlock(&m66592->lock); in m66592_usb_disconnect()
98 m66592->driver->disconnect(&m66592->gadget); in m66592_usb_disconnect()
99 spin_lock(&m66592->lock); in m66592_usb_disconnect()
101 disable_controller(m66592); in m66592_usb_disconnect()
102 INIT_LIST_HEAD(&m66592->ep[0].queue); in m66592_usb_disconnect()
105 static inline u16 control_reg_get_pid(struct m66592 *m66592, u16 pipenum) in control_reg_get_pid() argument
111 pid = m66592_read(m66592, M66592_DCPCTR) & M66592_PID; in control_reg_get_pid()
114 pid = m66592_read(m66592, offset) & M66592_PID; in control_reg_get_pid()
121 static inline void control_reg_set_pid(struct m66592 *m66592, u16 pipenum, in control_reg_set_pid() argument
127 m66592_mdfy(m66592, pid, M66592_PID, M66592_DCPCTR); in control_reg_set_pid()
130 m66592_mdfy(m66592, pid, M66592_PID, offset); in control_reg_set_pid()
135 static inline void pipe_start(struct m66592 *m66592, u16 pipenum) in pipe_start() argument
137 control_reg_set_pid(m66592, pipenum, M66592_PID_BUF); in pipe_start()
140 static inline void pipe_stop(struct m66592 *m66592, u16 pipenum) in pipe_stop() argument
142 control_reg_set_pid(m66592, pipenum, M66592_PID_NAK); in pipe_stop()
145 static inline void pipe_stall(struct m66592 *m66592, u16 pipenum) in pipe_stall() argument
147 control_reg_set_pid(m66592, pipenum, M66592_PID_STALL); in pipe_stall()
150 static inline u16 control_reg_get(struct m66592 *m66592, u16 pipenum) in control_reg_get() argument
156 ret = m66592_read(m66592, M66592_DCPCTR); in control_reg_get()
159 ret = m66592_read(m66592, offset); in control_reg_get()
166 static inline void control_reg_sqclr(struct m66592 *m66592, u16 pipenum) in control_reg_sqclr() argument
170 pipe_stop(m66592, pipenum); in control_reg_sqclr()
173 m66592_bset(m66592, M66592_SQCLR, M66592_DCPCTR); in control_reg_sqclr()
176 m66592_bset(m66592, M66592_SQCLR, offset); in control_reg_sqclr()
181 static inline int get_buffer_size(struct m66592 *m66592, u16 pipenum) in get_buffer_size() argument
187 tmp = m66592_read(m66592, M66592_DCPCFG); in get_buffer_size()
191 tmp = m66592_read(m66592, M66592_DCPMAXP); in get_buffer_size()
195 m66592_write(m66592, pipenum, M66592_PIPESEL); in get_buffer_size()
196 tmp = m66592_read(m66592, M66592_PIPECFG); in get_buffer_size()
198 tmp = m66592_read(m66592, M66592_PIPEBUF); in get_buffer_size()
201 tmp = m66592_read(m66592, M66592_PIPEMAXP); in get_buffer_size()
209 static inline void pipe_change(struct m66592 *m66592, u16 pipenum) in pipe_change() argument
211 struct m66592_ep *ep = m66592->pipenum2ep[pipenum]; in pipe_change()
217 m66592_mdfy(m66592, pipenum, M66592_CURPIPE, ep->fifosel); in pipe_change()
221 if (m66592->pdata->on_chip) in pipe_change()
226 m66592_bset(m66592, mbw, ep->fifosel); in pipe_change()
229 static int pipe_buffer_setting(struct m66592 *m66592, in pipe_buffer_setting() argument
238 m66592_write(m66592, info->pipe, M66592_PIPESEL); in pipe_buffer_setting()
274 m66592_write(m66592, pipecfg, M66592_PIPECFG); in pipe_buffer_setting()
275 m66592_write(m66592, (buf_bsize << 10) | (bufnum), M66592_PIPEBUF); in pipe_buffer_setting()
276 m66592_write(m66592, info->maxpacket, M66592_PIPEMAXP); in pipe_buffer_setting()
279 m66592_write(m66592, info->interval, M66592_PIPEPERI); in pipe_buffer_setting()
284 static void pipe_buffer_release(struct m66592 *m66592, in pipe_buffer_release() argument
291 m66592->bulk--; in pipe_buffer_release()
293 m66592->interrupt--; in pipe_buffer_release()
295 m66592->isochronous--; in pipe_buffer_release()
297 m66592->bulk--; in pipe_buffer_release()
305 struct m66592 *m66592 = ep->m66592; in pipe_initialize() local
308 m66592_mdfy(m66592, 0, M66592_CURPIPE, ep->fifosel); in pipe_initialize()
310 m66592_write(m66592, M66592_ACLRM, ep->pipectr); in pipe_initialize()
311 m66592_write(m66592, 0, ep->pipectr); in pipe_initialize()
312 m66592_write(m66592, M66592_SQCLR, ep->pipectr); in pipe_initialize()
314 m66592_mdfy(m66592, ep->pipenum, M66592_CURPIPE, ep->fifosel); in pipe_initialize()
318 if (m66592->pdata->on_chip) in pipe_initialize()
323 m66592_bset(m66592, mbw, ep->fifosel); in pipe_initialize()
327 static void m66592_ep_setting(struct m66592 *m66592, struct m66592_ep *ep, in m66592_ep_setting() argument
332 if (m66592->num_dma == 0) { in m66592_ep_setting()
333 m66592->num_dma++; in m66592_ep_setting()
339 } else if (!m66592->pdata->on_chip && m66592->num_dma == 1) { in m66592_ep_setting()
340 m66592->num_dma++; in m66592_ep_setting()
364 m66592->pipenum2ep[pipenum] = ep; in m66592_ep_setting()
365 m66592->epaddr2ep[desc->bEndpointAddress&USB_ENDPOINT_NUMBER_MASK] = ep; in m66592_ep_setting()
371 struct m66592 *m66592 = ep->m66592; in m66592_ep_release() local
378 m66592->num_dma--; in m66592_ep_release()
387 struct m66592 *m66592 = ep->m66592; in alloc_pipe_config() local
399 if (m66592->bulk >= M66592_MAX_NUM_BULK) { in alloc_pipe_config()
400 if (m66592->isochronous >= M66592_MAX_NUM_ISOC) { in alloc_pipe_config()
405 + m66592->isochronous; in alloc_pipe_config()
406 counter = &m66592->isochronous; in alloc_pipe_config()
409 info.pipe = M66592_BASE_PIPENUM_BULK + m66592->bulk; in alloc_pipe_config()
410 counter = &m66592->bulk; in alloc_pipe_config()
416 if (m66592->interrupt >= M66592_MAX_NUM_INT) { in alloc_pipe_config()
420 info.pipe = M66592_BASE_PIPENUM_INT + m66592->interrupt; in alloc_pipe_config()
422 counter = &m66592->interrupt; in alloc_pipe_config()
425 if (m66592->isochronous >= M66592_MAX_NUM_ISOC) { in alloc_pipe_config()
429 info.pipe = M66592_BASE_PIPENUM_ISOC + m66592->isochronous; in alloc_pipe_config()
431 counter = &m66592->isochronous; in alloc_pipe_config()
447 ret = pipe_buffer_setting(m66592, &info); in alloc_pipe_config()
454 if ((counter == &m66592->isochronous) && info.type == M66592_BULK) in alloc_pipe_config()
455 m66592->bulk++; in alloc_pipe_config()
457 m66592_ep_setting(m66592, ep, desc, info.pipe, dma); in alloc_pipe_config()
465 struct m66592 *m66592 = ep->m66592; in free_pipe_config() local
470 pipe_buffer_release(m66592, &info); in free_pipe_config()
477 static void pipe_irq_enable(struct m66592 *m66592, u16 pipenum) in pipe_irq_enable() argument
479 enable_irq_ready(m66592, pipenum); in pipe_irq_enable()
480 enable_irq_nrdy(m66592, pipenum); in pipe_irq_enable()
483 static void pipe_irq_disable(struct m66592 *m66592, u16 pipenum) in pipe_irq_disable() argument
485 disable_irq_ready(m66592, pipenum); in pipe_irq_disable()
486 disable_irq_nrdy(m66592, pipenum); in pipe_irq_disable()
490 static void control_end(struct m66592 *m66592, unsigned ccpl) in control_end() argument
492 m66592->ep[0].internal_ccpl = ccpl; in control_end()
493 pipe_start(m66592, 0); in control_end()
494 m66592_bset(m66592, M66592_CCPL, M66592_DCPCTR); in control_end()
499 struct m66592 *m66592 = ep->m66592; in start_ep0_write() local
501 pipe_change(m66592, ep->pipenum); in start_ep0_write()
502 m66592_mdfy(m66592, M66592_ISEL | M66592_PIPE0, in start_ep0_write()
505 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in start_ep0_write()
507 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in start_ep0_write()
508 pipe_start(m66592, 0); in start_ep0_write()
511 m66592_write(m66592, ~M66592_BEMP0, M66592_BEMPSTS); in start_ep0_write()
518 struct m66592 *m66592 = ep->m66592; in start_packet_write() local
521 pipe_change(m66592, ep->pipenum); in start_packet_write()
522 disable_irq_empty(m66592, ep->pipenum); in start_packet_write()
523 pipe_start(m66592, ep->pipenum); in start_packet_write()
525 tmp = m66592_read(m66592, ep->fifoctr); in start_packet_write()
527 pipe_irq_enable(m66592, ep->pipenum); in start_packet_write()
534 struct m66592 *m66592 = ep->m66592; in start_packet_read() local
538 m66592_mdfy(m66592, M66592_PIPE0, in start_packet_read()
541 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in start_packet_read()
542 pipe_start(m66592, pipenum); in start_packet_read()
543 pipe_irq_enable(m66592, pipenum); in start_packet_read()
546 m66592_bset(m66592, M66592_TRCLR, ep->fifosel); in start_packet_read()
547 pipe_change(m66592, pipenum); in start_packet_read()
548 m66592_bset(m66592, M66592_TRENB, ep->fifosel); in start_packet_read()
549 m66592_write(m66592, in start_packet_read()
554 pipe_start(m66592, pipenum); /* trigger once */ in start_packet_read()
555 pipe_irq_enable(m66592, pipenum); in start_packet_read()
571 ctsq = m66592_read(ep->m66592, M66592_INTSTS0) & M66592_CTSQ; in start_ep0()
582 control_end(ep->m66592, 0); in start_ep0()
590 static void init_controller(struct m66592 *m66592) in init_controller() argument
594 if (m66592->pdata->on_chip) { in init_controller()
595 if (m66592->pdata->endian) in init_controller()
600 m66592_bset(m66592, M66592_HSE, M66592_SYSCFG); /* High spd */ in init_controller()
601 m66592_bclr(m66592, M66592_USBE, M66592_SYSCFG); in init_controller()
602 m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG); in init_controller()
603 m66592_bset(m66592, M66592_USBE, M66592_SYSCFG); in init_controller()
606 m66592_bset(m66592, 0x8000, M66592_DVSTCTR); in init_controller()
607 m66592_bset(m66592, 0x1000, M66592_TESTMODE); in init_controller()
608 m66592_bclr(m66592, 0x8000, M66592_DVSTCTR); in init_controller()
610 m66592_bset(m66592, M66592_INTL, M66592_INTENB1); in init_controller()
612 m66592_write(m66592, 0, M66592_CFBCFG); in init_controller()
613 m66592_write(m66592, 0, M66592_D0FBCFG); in init_controller()
614 m66592_bset(m66592, endian, M66592_CFBCFG); in init_controller()
615 m66592_bset(m66592, endian, M66592_D0FBCFG); in init_controller()
619 if (m66592->pdata->endian) in init_controller()
624 if (m66592->pdata->vif) in init_controller()
629 switch (m66592->pdata->xtal) { in init_controller()
644 switch (m66592->irq_trigger) { in init_controller()
656 m66592_bset(m66592, in init_controller()
659 m66592_bset(m66592, M66592_HSE, M66592_SYSCFG); /* High spd */ in init_controller()
660 m66592_mdfy(m66592, clock & M66592_XTAL, M66592_XTAL, in init_controller()
662 m66592_bclr(m66592, M66592_USBE, M66592_SYSCFG); in init_controller()
663 m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG); in init_controller()
664 m66592_bset(m66592, M66592_USBE, M66592_SYSCFG); in init_controller()
666 m66592_bset(m66592, M66592_XCKE, M66592_SYSCFG); in init_controller()
670 m66592_bset(m66592, M66592_RCKE | M66592_PLLC, M66592_SYSCFG); in init_controller()
674 m66592_bset(m66592, M66592_SCKE, M66592_SYSCFG); in init_controller()
676 m66592_bset(m66592, irq_sense & M66592_INTL, M66592_INTENB1); in init_controller()
677 m66592_write(m66592, M66592_BURST | M66592_CPU_ADR_RD_WR, in init_controller()
682 static void disable_controller(struct m66592 *m66592) in disable_controller() argument
684 m66592_bclr(m66592, M66592_UTST, M66592_TESTMODE); in disable_controller()
685 if (!m66592->pdata->on_chip) { in disable_controller()
686 m66592_bclr(m66592, M66592_SCKE, M66592_SYSCFG); in disable_controller()
688 m66592_bclr(m66592, M66592_PLLC, M66592_SYSCFG); in disable_controller()
690 m66592_bclr(m66592, M66592_RCKE, M66592_SYSCFG); in disable_controller()
692 m66592_bclr(m66592, M66592_XCKE, M66592_SYSCFG); in disable_controller()
696 static void m66592_start_xclock(struct m66592 *m66592) in m66592_start_xclock() argument
700 if (!m66592->pdata->on_chip) { in m66592_start_xclock()
701 tmp = m66592_read(m66592, M66592_SYSCFG); in m66592_start_xclock()
703 m66592_bset(m66592, M66592_XCKE, M66592_SYSCFG); in m66592_start_xclock()
710 __releases(m66592->lock) in transfer_complete()
711 __acquires(m66592->lock) in transfer_complete()
723 if (ep->m66592->gadget.speed == USB_SPEED_UNKNOWN) in transfer_complete()
731 spin_unlock(&ep->m66592->lock); in transfer_complete()
733 spin_lock(&ep->m66592->lock); in transfer_complete()
750 struct m66592 *m66592 = ep->m66592; in irq_ep0_write() local
752 pipe_change(m66592, pipenum); in irq_ep0_write()
753 m66592_bset(m66592, M66592_ISEL, ep->fifosel); in irq_ep0_write()
757 tmp = m66592_read(m66592, ep->fifoctr); in irq_ep0_write()
767 bufsize = get_buffer_size(m66592, pipenum); in irq_ep0_write()
774 m66592_write_fifo(m66592, ep, buf, size); in irq_ep0_write()
776 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in irq_ep0_write()
786 disable_irq_ready(m66592, pipenum); in irq_ep0_write()
787 disable_irq_empty(m66592, pipenum); in irq_ep0_write()
789 disable_irq_ready(m66592, pipenum); in irq_ep0_write()
790 enable_irq_empty(m66592, pipenum); in irq_ep0_write()
792 pipe_start(m66592, pipenum); in irq_ep0_write()
802 struct m66592 *m66592 = ep->m66592; in irq_packet_write() local
804 pipe_change(m66592, pipenum); in irq_packet_write()
805 tmp = m66592_read(m66592, ep->fifoctr); in irq_packet_write()
807 pipe_stop(m66592, pipenum); in irq_packet_write()
808 pipe_irq_disable(m66592, pipenum); in irq_packet_write()
814 bufsize = get_buffer_size(m66592, pipenum); in irq_packet_write()
820 m66592_write_fifo(m66592, ep, buf, size); in irq_packet_write()
825 m66592_bset(m66592, M66592_BVAL, ep->fifoctr); in irq_packet_write()
834 disable_irq_ready(m66592, pipenum); in irq_packet_write()
835 enable_irq_empty(m66592, pipenum); in irq_packet_write()
837 disable_irq_empty(m66592, pipenum); in irq_packet_write()
838 pipe_irq_enable(m66592, pipenum); in irq_packet_write()
849 struct m66592 *m66592 = ep->m66592; in irq_packet_read() local
852 pipe_change(m66592, pipenum); in irq_packet_read()
853 tmp = m66592_read(m66592, ep->fifoctr); in irq_packet_read()
856 pipe_stop(m66592, pipenum); in irq_packet_read()
857 pipe_irq_disable(m66592, pipenum); in irq_packet_read()
864 bufsize = get_buffer_size(m66592, pipenum); in irq_packet_read()
880 pipe_stop(m66592, pipenum); in irq_packet_read()
881 pipe_irq_disable(m66592, pipenum); in irq_packet_read()
888 m66592_write(m66592, M66592_BCLR, ep->fifoctr); in irq_packet_read()
890 m66592_read_fifo(m66592, ep->fifoaddr, buf, size); in irq_packet_read()
897 static void irq_pipe_ready(struct m66592 *m66592, u16 status, u16 enb) in irq_pipe_ready() argument
905 m66592_write(m66592, ~M66592_BRDY0, M66592_BRDYSTS); in irq_pipe_ready()
906 m66592_mdfy(m66592, M66592_PIPE0, M66592_CURPIPE, in irq_pipe_ready()
909 ep = &m66592->ep[0]; in irq_pipe_ready()
916 m66592_write(m66592, ~check, M66592_BRDYSTS); in irq_pipe_ready()
917 ep = m66592->pipenum2ep[pipenum]; in irq_pipe_ready()
929 static void irq_pipe_empty(struct m66592 *m66592, u16 status, u16 enb) in irq_pipe_empty() argument
938 m66592_write(m66592, ~M66592_BEMP0, M66592_BEMPSTS); in irq_pipe_empty()
940 ep = &m66592->ep[0]; in irq_pipe_empty()
947 m66592_write(m66592, ~check, M66592_BEMPSTS); in irq_pipe_empty()
948 tmp = control_reg_get(m66592, pipenum); in irq_pipe_empty()
950 disable_irq_empty(m66592, pipenum); in irq_pipe_empty()
951 pipe_irq_disable(m66592, pipenum); in irq_pipe_empty()
952 pipe_stop(m66592, pipenum); in irq_pipe_empty()
953 ep = m66592->pipenum2ep[pipenum]; in irq_pipe_empty()
965 static void get_status(struct m66592 *m66592, struct usb_ctrlrequest *ctrl) in get_status() argument
966 __releases(m66592->lock) in get_status()
967 __acquires(m66592->lock) in get_status()
982 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in get_status()
983 pid = control_reg_get_pid(m66592, ep->pipenum); in get_status()
990 pipe_stall(m66592, 0); in get_status()
994 m66592->ep0_data = cpu_to_le16(status); in get_status()
995 m66592->ep0_req->buf = &m66592->ep0_data; in get_status()
996 m66592->ep0_req->length = 2; in get_status()
998 spin_unlock(&m66592->lock); in get_status()
999 m66592_queue(m66592->gadget.ep0, m66592->ep0_req, GFP_KERNEL); in get_status()
1000 spin_lock(&m66592->lock); in get_status()
1003 static void clear_feature(struct m66592 *m66592, struct usb_ctrlrequest *ctrl) in clear_feature() argument
1007 control_end(m66592, 1); in clear_feature()
1010 control_end(m66592, 1); in clear_feature()
1017 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in clear_feature()
1018 pipe_stop(m66592, ep->pipenum); in clear_feature()
1019 control_reg_sqclr(m66592, ep->pipenum); in clear_feature()
1021 control_end(m66592, 1); in clear_feature()
1031 pipe_start(m66592, ep->pipenum); in clear_feature()
1035 pipe_stall(m66592, 0); in clear_feature()
1040 static void set_feature(struct m66592 *m66592, struct usb_ctrlrequest *ctrl) in set_feature() argument
1049 control_end(m66592, 1); in set_feature()
1052 tmp = m66592_read(m66592, M66592_INTSTS0) & in set_feature()
1058 m66592_bset(m66592, in set_feature()
1063 pipe_stall(m66592, 0); in set_feature()
1068 control_end(m66592, 1); in set_feature()
1074 ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK]; in set_feature()
1075 pipe_stall(m66592, ep->pipenum); in set_feature()
1077 control_end(m66592, 1); in set_feature()
1081 pipe_stall(m66592, 0); in set_feature()
1087 static int setup_packet(struct m66592 *m66592, struct usb_ctrlrequest *ctrl) in setup_packet() argument
1094 m66592_write(m66592, ~M66592_VALID, M66592_INTSTS0); in setup_packet()
1097 p[i] = m66592_read(m66592, offset + i*2); in setup_packet()
1103 get_status(m66592, ctrl); in setup_packet()
1106 clear_feature(m66592, ctrl); in setup_packet()
1109 set_feature(m66592, ctrl); in setup_packet()
1120 static void m66592_update_usb_speed(struct m66592 *m66592) in m66592_update_usb_speed() argument
1122 u16 speed = get_usb_speed(m66592); in m66592_update_usb_speed()
1126 m66592->gadget.speed = USB_SPEED_HIGH; in m66592_update_usb_speed()
1129 m66592->gadget.speed = USB_SPEED_FULL; in m66592_update_usb_speed()
1132 m66592->gadget.speed = USB_SPEED_UNKNOWN; in m66592_update_usb_speed()
1137 static void irq_device_state(struct m66592 *m66592) in irq_device_state() argument
1141 dvsq = m66592_read(m66592, M66592_INTSTS0) & M66592_DVSQ; in irq_device_state()
1142 m66592_write(m66592, ~M66592_DVST, M66592_INTSTS0); in irq_device_state()
1145 usb_gadget_udc_reset(&m66592->gadget, m66592->driver); in irq_device_state()
1146 m66592_update_usb_speed(m66592); in irq_device_state()
1148 if (m66592->old_dvsq == M66592_DS_CNFG && dvsq != M66592_DS_CNFG) in irq_device_state()
1149 m66592_update_usb_speed(m66592); in irq_device_state()
1151 && m66592->gadget.speed == USB_SPEED_UNKNOWN) in irq_device_state()
1152 m66592_update_usb_speed(m66592); in irq_device_state()
1154 m66592->old_dvsq = dvsq; in irq_device_state()
1157 static void irq_control_stage(struct m66592 *m66592) in irq_control_stage() argument
1158 __releases(m66592->lock) in irq_control_stage()
1159 __acquires(m66592->lock) in irq_control_stage()
1164 ctsq = m66592_read(m66592, M66592_INTSTS0) & M66592_CTSQ; in irq_control_stage()
1165 m66592_write(m66592, ~M66592_CTRT, M66592_INTSTS0); in irq_control_stage()
1171 ep = &m66592->ep[0]; in irq_control_stage()
1180 if (setup_packet(m66592, &ctrl)) { in irq_control_stage()
1181 spin_unlock(&m66592->lock); in irq_control_stage()
1182 if (m66592->driver->setup(&m66592->gadget, &ctrl) < 0) in irq_control_stage()
1183 pipe_stall(m66592, 0); in irq_control_stage()
1184 spin_lock(&m66592->lock); in irq_control_stage()
1189 control_end(m66592, 0); in irq_control_stage()
1199 struct m66592 *m66592 = _m66592; in m66592_irq() local
1207 spin_lock(&m66592->lock); in m66592_irq()
1209 intsts0 = m66592_read(m66592, M66592_INTSTS0); in m66592_irq()
1210 intenb0 = m66592_read(m66592, M66592_INTENB0); in m66592_irq()
1212 if (m66592->pdata->on_chip && !intsts0 && !intenb0) { in m66592_irq()
1218 m66592_start_xclock(m66592); in m66592_irq()
1219 intsts0 = m66592_read(m66592, M66592_INTSTS0); in m66592_irq()
1220 intenb0 = m66592_read(m66592, M66592_INTENB0); in m66592_irq()
1223 savepipe = m66592_read(m66592, M66592_CFIFOSEL); in m66592_irq()
1227 brdysts = m66592_read(m66592, M66592_BRDYSTS); in m66592_irq()
1228 nrdysts = m66592_read(m66592, M66592_NRDYSTS); in m66592_irq()
1229 bempsts = m66592_read(m66592, M66592_BEMPSTS); in m66592_irq()
1230 brdyenb = m66592_read(m66592, M66592_BRDYENB); in m66592_irq()
1231 nrdyenb = m66592_read(m66592, M66592_NRDYENB); in m66592_irq()
1232 bempenb = m66592_read(m66592, M66592_BEMPENB); in m66592_irq()
1235 m66592_write(m66592, 0xffff & ~M66592_VBINT, in m66592_irq()
1237 m66592_start_xclock(m66592); in m66592_irq()
1240 m66592->old_vbus = m66592_read(m66592, M66592_INTSTS0) in m66592_irq()
1242 m66592->scount = M66592_MAX_SAMPLING; in m66592_irq()
1244 mod_timer(&m66592->timer, in m66592_irq()
1248 irq_device_state(m66592); in m66592_irq()
1252 irq_pipe_ready(m66592, brdysts, brdyenb); in m66592_irq()
1256 irq_pipe_empty(m66592, bempsts, bempenb); in m66592_irq()
1260 irq_control_stage(m66592); in m66592_irq()
1263 m66592_write(m66592, savepipe, M66592_CFIFOSEL); in m66592_irq()
1265 spin_unlock(&m66592->lock); in m66592_irq()
1271 struct m66592 *m66592 = (struct m66592 *)_m66592; in m66592_timer() local
1275 spin_lock_irqsave(&m66592->lock, flags); in m66592_timer()
1276 tmp = m66592_read(m66592, M66592_SYSCFG); in m66592_timer()
1278 m66592_bset(m66592, M66592_RCKE | M66592_PLLC, M66592_SYSCFG); in m66592_timer()
1280 m66592_bset(m66592, M66592_SCKE, M66592_SYSCFG); in m66592_timer()
1282 if (m66592->scount > 0) { in m66592_timer()
1283 tmp = m66592_read(m66592, M66592_INTSTS0) & M66592_VBSTS; in m66592_timer()
1284 if (tmp == m66592->old_vbus) { in m66592_timer()
1285 m66592->scount--; in m66592_timer()
1286 if (m66592->scount == 0) { in m66592_timer()
1288 m66592_usb_connect(m66592); in m66592_timer()
1290 m66592_usb_disconnect(m66592); in m66592_timer()
1292 mod_timer(&m66592->timer, in m66592_timer()
1296 m66592->scount = M66592_MAX_SAMPLING; in m66592_timer()
1297 m66592->old_vbus = tmp; in m66592_timer()
1298 mod_timer(&m66592->timer, in m66592_timer()
1302 spin_unlock_irqrestore(&m66592->lock, flags); in m66592_timer()
1326 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_disable()
1328 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_disable()
1331 pipe_irq_disable(ep->m66592, ep->pipenum); in m66592_disable()
1368 if (ep->m66592->gadget.speed == USB_SPEED_UNKNOWN) in m66592_queue()
1371 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_queue()
1387 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_queue()
1401 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_dequeue()
1404 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_dequeue()
1419 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_set_halt()
1426 pipe_stall(ep->m66592, ep->pipenum); in m66592_set_halt()
1429 pipe_stop(ep->m66592, ep->pipenum); in m66592_set_halt()
1433 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_set_halt()
1443 spin_lock_irqsave(&ep->m66592->lock, flags); in m66592_fifo_flush()
1445 pipe_stop(ep->m66592, ep->pipenum); in m66592_fifo_flush()
1446 m66592_bclr(ep->m66592, M66592_BCLR, ep->fifoctr); in m66592_fifo_flush()
1448 spin_unlock_irqrestore(&ep->m66592->lock, flags); in m66592_fifo_flush()
1469 struct m66592 *m66592 = to_m66592(g); in m66592_udc_start() local
1473 m66592->driver = driver; in m66592_udc_start()
1475 m66592_bset(m66592, M66592_VBSE | M66592_URST, M66592_INTENB0); in m66592_udc_start()
1476 if (m66592_read(m66592, M66592_INTSTS0) & M66592_VBSTS) { in m66592_udc_start()
1477 m66592_start_xclock(m66592); in m66592_udc_start()
1479 m66592->old_vbus = m66592_read(m66592, in m66592_udc_start()
1481 m66592->scount = M66592_MAX_SAMPLING; in m66592_udc_start()
1482 mod_timer(&m66592->timer, jiffies + msecs_to_jiffies(50)); in m66592_udc_start()
1490 struct m66592 *m66592 = to_m66592(g); in m66592_udc_stop() local
1492 m66592_bclr(m66592, M66592_VBSE | M66592_URST, M66592_INTENB0); in m66592_udc_stop()
1494 init_controller(m66592); in m66592_udc_stop()
1495 disable_controller(m66592); in m66592_udc_stop()
1497 m66592->driver = NULL; in m66592_udc_stop()
1505 struct m66592 *m66592 = gadget_to_m66592(_gadget); in m66592_get_frame() local
1506 return m66592_read(m66592, M66592_FRMNUM) & 0x03FF; in m66592_get_frame()
1511 struct m66592 *m66592 = gadget_to_m66592(gadget); in m66592_pullup() local
1514 spin_lock_irqsave(&m66592->lock, flags); in m66592_pullup()
1516 m66592_bset(m66592, M66592_DPRPU, M66592_SYSCFG); in m66592_pullup()
1518 m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG); in m66592_pullup()
1519 spin_unlock_irqrestore(&m66592->lock, flags); in m66592_pullup()
1533 struct m66592 *m66592 = platform_get_drvdata(pdev); in m66592_remove() local
1535 usb_del_gadget_udc(&m66592->gadget); in m66592_remove()
1537 del_timer_sync(&m66592->timer); in m66592_remove()
1538 iounmap(m66592->reg); in m66592_remove()
1539 free_irq(platform_get_irq(pdev, 0), m66592); in m66592_remove()
1540 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_remove()
1541 if (m66592->pdata->on_chip) { in m66592_remove()
1542 clk_disable(m66592->clk); in m66592_remove()
1543 clk_put(m66592->clk); in m66592_remove()
1545 kfree(m66592); in m66592_remove()
1557 struct m66592 *m66592 = NULL; in m66592_probe() local
1591 m66592 = kzalloc(sizeof(struct m66592), GFP_KERNEL); in m66592_probe()
1592 if (m66592 == NULL) { in m66592_probe()
1597 m66592->pdata = dev_get_platdata(&pdev->dev); in m66592_probe()
1598 m66592->irq_trigger = ires->flags & IRQF_TRIGGER_MASK; in m66592_probe()
1600 spin_lock_init(&m66592->lock); in m66592_probe()
1601 platform_set_drvdata(pdev, m66592); in m66592_probe()
1603 m66592->gadget.ops = &m66592_gadget_ops; in m66592_probe()
1604 m66592->gadget.max_speed = USB_SPEED_HIGH; in m66592_probe()
1605 m66592->gadget.name = udc_name; in m66592_probe()
1607 init_timer(&m66592->timer); in m66592_probe()
1608 m66592->timer.function = m66592_timer; in m66592_probe()
1609 m66592->timer.data = (unsigned long)m66592; in m66592_probe()
1610 m66592->reg = reg; in m66592_probe()
1613 udc_name, m66592); in m66592_probe()
1619 if (m66592->pdata->on_chip) { in m66592_probe()
1621 m66592->clk = clk_get(&pdev->dev, clk_name); in m66592_probe()
1622 if (IS_ERR(m66592->clk)) { in m66592_probe()
1625 ret = PTR_ERR(m66592->clk); in m66592_probe()
1628 clk_enable(m66592->clk); in m66592_probe()
1631 INIT_LIST_HEAD(&m66592->gadget.ep_list); in m66592_probe()
1632 m66592->gadget.ep0 = &m66592->ep[0].ep; in m66592_probe()
1633 INIT_LIST_HEAD(&m66592->gadget.ep0->ep_list); in m66592_probe()
1635 struct m66592_ep *ep = &m66592->ep[i]; in m66592_probe()
1638 INIT_LIST_HEAD(&m66592->ep[i].ep.ep_list); in m66592_probe()
1639 list_add_tail(&m66592->ep[i].ep.ep_list, in m66592_probe()
1640 &m66592->gadget.ep_list); in m66592_probe()
1642 ep->m66592 = m66592; in m66592_probe()
1659 usb_ep_set_maxpacket_limit(&m66592->ep[0].ep, 64); in m66592_probe()
1660 m66592->ep[0].pipenum = 0; in m66592_probe()
1661 m66592->ep[0].fifoaddr = M66592_CFIFO; in m66592_probe()
1662 m66592->ep[0].fifosel = M66592_CFIFOSEL; in m66592_probe()
1663 m66592->ep[0].fifoctr = M66592_CFIFOCTR; in m66592_probe()
1664 m66592->ep[0].fifotrn = 0; in m66592_probe()
1665 m66592->ep[0].pipectr = get_pipectr_addr(0); in m66592_probe()
1666 m66592->pipenum2ep[0] = &m66592->ep[0]; in m66592_probe()
1667 m66592->epaddr2ep[0] = &m66592->ep[0]; in m66592_probe()
1669 m66592->ep0_req = m66592_alloc_request(&m66592->ep[0].ep, GFP_KERNEL); in m66592_probe()
1670 if (m66592->ep0_req == NULL) { in m66592_probe()
1674 m66592->ep0_req->complete = nop_completion; in m66592_probe()
1676 init_controller(m66592); in m66592_probe()
1678 ret = usb_add_gadget_udc(&pdev->dev, &m66592->gadget); in m66592_probe()
1686 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_probe()
1689 if (m66592->pdata->on_chip) { in m66592_probe()
1690 clk_disable(m66592->clk); in m66592_probe()
1691 clk_put(m66592->clk); in m66592_probe()
1694 free_irq(ires->start, m66592); in m66592_probe()
1696 if (m66592) { in m66592_probe()
1697 if (m66592->ep0_req) in m66592_probe()
1698 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); in m66592_probe()
1699 kfree(m66592); in m66592_probe()