Lines Matching refs:r8a66597
54 static void packet_write(struct r8a66597 *r8a66597, u16 pipenum);
58 static void enable_pipe_irq(struct r8a66597 *r8a66597, u16 pipenum, in enable_pipe_irq() argument
63 tmp = r8a66597_read(r8a66597, INTENB0); in enable_pipe_irq()
64 r8a66597_bclr(r8a66597, BEMPE | NRDYE | BRDYE, INTENB0); in enable_pipe_irq()
65 r8a66597_bset(r8a66597, 1 << pipenum, reg); in enable_pipe_irq()
66 r8a66597_write(r8a66597, tmp, INTENB0); in enable_pipe_irq()
70 static void disable_pipe_irq(struct r8a66597 *r8a66597, u16 pipenum, in disable_pipe_irq() argument
75 tmp = r8a66597_read(r8a66597, INTENB0); in disable_pipe_irq()
76 r8a66597_bclr(r8a66597, BEMPE | NRDYE | BRDYE, INTENB0); in disable_pipe_irq()
77 r8a66597_bclr(r8a66597, 1 << pipenum, reg); in disable_pipe_irq()
78 r8a66597_write(r8a66597, tmp, INTENB0); in disable_pipe_irq()
81 static void set_devadd_reg(struct r8a66597 *r8a66597, u8 r8a66597_address, in set_devadd_reg() argument
88 r8a66597_write(r8a66597, val, devadd_reg); in set_devadd_reg()
91 static int r8a66597_clock_enable(struct r8a66597 *r8a66597) in r8a66597_clock_enable() argument
96 if (r8a66597->pdata->on_chip) { in r8a66597_clock_enable()
97 clk_prepare_enable(r8a66597->clk); in r8a66597_clock_enable()
99 r8a66597_write(r8a66597, SCKE, SYSCFG0); in r8a66597_clock_enable()
100 tmp = r8a66597_read(r8a66597, SYSCFG0); in r8a66597_clock_enable()
106 r8a66597_write(r8a66597, 0x04, 0x02); in r8a66597_clock_enable()
109 r8a66597_write(r8a66597, USBE, SYSCFG0); in r8a66597_clock_enable()
110 tmp = r8a66597_read(r8a66597, SYSCFG0); in r8a66597_clock_enable()
116 r8a66597_bclr(r8a66597, USBE, SYSCFG0); in r8a66597_clock_enable()
117 r8a66597_mdfy(r8a66597, get_xtal_from_pdata(r8a66597->pdata), in r8a66597_clock_enable()
121 r8a66597_bset(r8a66597, XCKE, SYSCFG0); in r8a66597_clock_enable()
124 tmp = r8a66597_read(r8a66597, SYSCFG0); in r8a66597_clock_enable()
135 static void r8a66597_clock_disable(struct r8a66597 *r8a66597) in r8a66597_clock_disable() argument
137 r8a66597_bclr(r8a66597, SCKE, SYSCFG0); in r8a66597_clock_disable()
140 if (r8a66597->pdata->on_chip) { in r8a66597_clock_disable()
141 clk_disable_unprepare(r8a66597->clk); in r8a66597_clock_disable()
143 r8a66597_bclr(r8a66597, PLLC, SYSCFG0); in r8a66597_clock_disable()
144 r8a66597_bclr(r8a66597, XCKE, SYSCFG0); in r8a66597_clock_disable()
145 r8a66597_bclr(r8a66597, USBE, SYSCFG0); in r8a66597_clock_disable()
149 static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port) in r8a66597_enable_port() argument
154 r8a66597_bset(r8a66597, val, get_syscfg_reg(port)); in r8a66597_enable_port()
155 r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port)); in r8a66597_enable_port()
157 r8a66597_write(r8a66597, BURST | CPU_ADR_RD_WR, get_dmacfg_reg(port)); in r8a66597_enable_port()
158 r8a66597_bclr(r8a66597, DTCHE, get_intenb_reg(port)); in r8a66597_enable_port()
159 r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port)); in r8a66597_enable_port()
162 static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port) in r8a66597_disable_port() argument
166 r8a66597_write(r8a66597, 0, get_intenb_reg(port)); in r8a66597_disable_port()
167 r8a66597_write(r8a66597, 0, get_intsts_reg(port)); in r8a66597_disable_port()
169 r8a66597_port_power(r8a66597, port, 0); in r8a66597_disable_port()
172 tmp = r8a66597_read(r8a66597, SOFCFG) & EDGESTS; in r8a66597_disable_port()
177 r8a66597_bclr(r8a66597, val, get_syscfg_reg(port)); in r8a66597_disable_port()
178 r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port)); in r8a66597_disable_port()
181 static int enable_controller(struct r8a66597 *r8a66597) in enable_controller() argument
184 u16 vif = r8a66597->pdata->vif ? LDRV : 0; in enable_controller()
185 u16 irq_sense = r8a66597->irq_sense_low ? INTL : 0; in enable_controller()
186 u16 endian = r8a66597->pdata->endian ? BIGEND : 0; in enable_controller()
188 ret = r8a66597_clock_enable(r8a66597); in enable_controller()
192 r8a66597_bset(r8a66597, vif & LDRV, PINCFG); in enable_controller()
193 r8a66597_bset(r8a66597, USBE, SYSCFG0); in enable_controller()
195 r8a66597_bset(r8a66597, BEMPE | NRDYE | BRDYE, INTENB0); in enable_controller()
196 r8a66597_bset(r8a66597, irq_sense & INTL, SOFCFG); in enable_controller()
197 r8a66597_bset(r8a66597, BRDY0, BRDYENB); in enable_controller()
198 r8a66597_bset(r8a66597, BEMP0, BEMPENB); in enable_controller()
200 r8a66597_bset(r8a66597, endian & BIGEND, CFIFOSEL); in enable_controller()
201 r8a66597_bset(r8a66597, endian & BIGEND, D0FIFOSEL); in enable_controller()
202 r8a66597_bset(r8a66597, endian & BIGEND, D1FIFOSEL); in enable_controller()
203 r8a66597_bset(r8a66597, TRNENSEL, SOFCFG); in enable_controller()
205 r8a66597_bset(r8a66597, SIGNE | SACKE, INTENB1); in enable_controller()
207 for (port = 0; port < r8a66597->max_root_hub; port++) in enable_controller()
208 r8a66597_enable_port(r8a66597, port); in enable_controller()
213 static void disable_controller(struct r8a66597 *r8a66597) in disable_controller() argument
218 r8a66597_write(r8a66597, 0, INTENB0); in disable_controller()
219 r8a66597_write(r8a66597, 0, INTENB1); in disable_controller()
220 r8a66597_write(r8a66597, 0, BRDYENB); in disable_controller()
221 r8a66597_write(r8a66597, 0, BEMPENB); in disable_controller()
222 r8a66597_write(r8a66597, 0, NRDYENB); in disable_controller()
225 r8a66597_write(r8a66597, 0, BRDYSTS); in disable_controller()
226 r8a66597_write(r8a66597, 0, NRDYSTS); in disable_controller()
227 r8a66597_write(r8a66597, 0, BEMPSTS); in disable_controller()
229 for (port = 0; port < r8a66597->max_root_hub; port++) in disable_controller()
230 r8a66597_disable_port(r8a66597, port); in disable_controller()
232 r8a66597_clock_disable(r8a66597); in disable_controller()
235 static int get_parent_r8a66597_address(struct r8a66597 *r8a66597, in get_parent_r8a66597_address() argument
260 static void get_port_number(struct r8a66597 *r8a66597, in get_port_number() argument
265 if (*root_port >= r8a66597->max_root_hub) in get_port_number()
294 static void set_child_connect_map(struct r8a66597 *r8a66597, int address) in set_child_connect_map() argument
299 r8a66597->child_connect_map[idx] |= 1 << (address % 32); in set_child_connect_map()
302 static void put_child_connect_map(struct r8a66597 *r8a66597, int address) in put_child_connect_map() argument
307 r8a66597->child_connect_map[idx] &= ~(1 << (address % 32)); in put_child_connect_map()
339 get_urb_to_r8a66597_dev(struct r8a66597 *r8a66597, struct urb *urb) in get_urb_to_r8a66597_dev() argument
342 return &r8a66597->device0; in get_urb_to_r8a66597_dev()
347 static int make_r8a66597_device(struct r8a66597 *r8a66597, in make_r8a66597_device() argument
365 list_add_tail(&dev->device_list, &r8a66597->child_device); in make_r8a66597_device()
367 get_port_number(r8a66597, urb->dev->devpath, in make_r8a66597_device()
370 r8a66597->root_hub[dev->root_port].dev = dev; in make_r8a66597_device()
372 set_devadd_reg(r8a66597, dev->address, in make_r8a66597_device()
374 get_parent_r8a66597_address(r8a66597, urb->dev), in make_r8a66597_device()
381 static u8 alloc_usb_address(struct r8a66597 *r8a66597, struct urb *urb) in alloc_usb_address() argument
391 dev = get_urb_to_r8a66597_dev(r8a66597, urb); in alloc_usb_address()
396 if (r8a66597->address_map & (1 << addr)) in alloc_usb_address()
400 r8a66597->address_map |= 1 << addr; in alloc_usb_address()
402 if (make_r8a66597_device(r8a66597, urb, addr) < 0) in alloc_usb_address()
410 r8a66597->address_map); in alloc_usb_address()
416 static void free_usb_address(struct r8a66597 *r8a66597, in free_usb_address() argument
427 r8a66597->address_map &= ~(1 << dev->address); in free_usb_address()
439 for (port = 0; port < r8a66597->max_root_hub; port++) { in free_usb_address()
440 if (r8a66597->root_hub[port].dev == dev) { in free_usb_address()
441 r8a66597->root_hub[port].dev = NULL; in free_usb_address()
447 static void r8a66597_reg_wait(struct r8a66597 *r8a66597, unsigned long reg, in r8a66597_reg_wait() argument
454 tmp = r8a66597_read(r8a66597, reg); in r8a66597_reg_wait()
465 static void pipe_start(struct r8a66597 *r8a66597, struct r8a66597_pipe *pipe) in pipe_start() argument
469 tmp = r8a66597_read(r8a66597, pipe->pipectr) & PID; in pipe_start()
471 r8a66597_mdfy(r8a66597, PID_NAK, PID, pipe->pipectr); in pipe_start()
472 r8a66597_mdfy(r8a66597, PID_BUF, PID, pipe->pipectr); in pipe_start()
476 static void pipe_stop(struct r8a66597 *r8a66597, struct r8a66597_pipe *pipe) in pipe_stop() argument
480 tmp = r8a66597_read(r8a66597, pipe->pipectr) & PID; in pipe_stop()
482 r8a66597_mdfy(r8a66597, PID_STALL, PID, pipe->pipectr); in pipe_stop()
483 r8a66597_mdfy(r8a66597, PID_NAK, PID, pipe->pipectr); in pipe_stop()
484 r8a66597_reg_wait(r8a66597, pipe->pipectr, PBUSY, 0); in pipe_stop()
488 static void clear_all_buffer(struct r8a66597 *r8a66597, in clear_all_buffer() argument
496 pipe_stop(r8a66597, pipe); in clear_all_buffer()
497 r8a66597_bset(r8a66597, ACLRM, pipe->pipectr); in clear_all_buffer()
498 tmp = r8a66597_read(r8a66597, pipe->pipectr); in clear_all_buffer()
499 tmp = r8a66597_read(r8a66597, pipe->pipectr); in clear_all_buffer()
500 tmp = r8a66597_read(r8a66597, pipe->pipectr); in clear_all_buffer()
501 r8a66597_bclr(r8a66597, ACLRM, pipe->pipectr); in clear_all_buffer()
505 static void r8a66597_pipe_toggle(struct r8a66597 *r8a66597, in r8a66597_pipe_toggle() argument
509 r8a66597_bset(r8a66597, SQSET, pipe->pipectr); in r8a66597_pipe_toggle()
511 r8a66597_bset(r8a66597, SQCLR, pipe->pipectr); in r8a66597_pipe_toggle()
514 static inline unsigned short mbw_value(struct r8a66597 *r8a66597) in mbw_value() argument
516 if (r8a66597->pdata->on_chip) in mbw_value()
523 static inline void cfifo_change(struct r8a66597 *r8a66597, u16 pipenum) in cfifo_change() argument
525 unsigned short mbw = mbw_value(r8a66597); in cfifo_change()
527 r8a66597_mdfy(r8a66597, mbw | pipenum, mbw | CURPIPE, CFIFOSEL); in cfifo_change()
528 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, pipenum); in cfifo_change()
532 static inline void fifo_change_from_pipe(struct r8a66597 *r8a66597, in fifo_change_from_pipe() argument
535 unsigned short mbw = mbw_value(r8a66597); in fifo_change_from_pipe()
537 cfifo_change(r8a66597, 0); in fifo_change_from_pipe()
538 r8a66597_mdfy(r8a66597, mbw | 0, mbw | CURPIPE, D0FIFOSEL); in fifo_change_from_pipe()
539 r8a66597_mdfy(r8a66597, mbw | 0, mbw | CURPIPE, D1FIFOSEL); in fifo_change_from_pipe()
541 r8a66597_mdfy(r8a66597, mbw | pipe->info.pipenum, mbw | CURPIPE, in fifo_change_from_pipe()
543 r8a66597_reg_wait(r8a66597, pipe->fifosel, CURPIPE, pipe->info.pipenum); in fifo_change_from_pipe()
556 static u16 get_urb_to_r8a66597_addr(struct r8a66597 *r8a66597, struct urb *urb) in get_urb_to_r8a66597_addr() argument
558 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in get_urb_to_r8a66597_addr()
573 static void pipe_toggle_set(struct r8a66597 *r8a66597, in pipe_toggle_set() argument
577 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in pipe_toggle_set()
591 static void pipe_toggle_save(struct r8a66597 *r8a66597, in pipe_toggle_save() argument
595 if (r8a66597_read(r8a66597, pipe->pipectr) & SQMON) in pipe_toggle_save()
596 pipe_toggle_set(r8a66597, pipe, urb, 1); in pipe_toggle_save()
598 pipe_toggle_set(r8a66597, pipe, urb, 0); in pipe_toggle_save()
602 static void pipe_toggle_restore(struct r8a66597 *r8a66597, in pipe_toggle_restore() argument
606 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in pipe_toggle_restore()
613 r8a66597_pipe_toggle(r8a66597, pipe, *toggle & (1 << endpoint)); in pipe_toggle_restore()
617 static void pipe_buffer_setting(struct r8a66597 *r8a66597, in pipe_buffer_setting() argument
625 r8a66597_bset(r8a66597, ACLRM, get_pipectr_addr(info->pipenum)); in pipe_buffer_setting()
626 r8a66597_bclr(r8a66597, ACLRM, get_pipectr_addr(info->pipenum)); in pipe_buffer_setting()
627 r8a66597_write(r8a66597, info->pipenum, PIPESEL); in pipe_buffer_setting()
633 r8a66597_write(r8a66597, val, PIPECFG); in pipe_buffer_setting()
635 r8a66597_write(r8a66597, (info->buf_bsize << 10) | (info->bufnum), in pipe_buffer_setting()
637 r8a66597_write(r8a66597, make_devsel(info->address) | info->maxpacket, in pipe_buffer_setting()
639 r8a66597_write(r8a66597, info->interval, PIPEPERI); in pipe_buffer_setting()
643 static void pipe_setting(struct r8a66597 *r8a66597, struct r8a66597_td *td) in pipe_setting() argument
650 cfifo_change(r8a66597, 0); in pipe_setting()
651 pipe_buffer_setting(r8a66597, info); in pipe_setting()
656 r8a66597_pipe_toggle(r8a66597, td->pipe, 0); in pipe_setting()
657 pipe_toggle_set(r8a66597, td->pipe, urb, 0); in pipe_setting()
658 clear_all_buffer(r8a66597, td->pipe); in pipe_setting()
662 pipe_toggle_restore(r8a66597, td->pipe, urb); in pipe_setting()
667 static u16 get_empty_pipenum(struct r8a66597 *r8a66597, in get_empty_pipenum() argument
704 if (r8a66597->pipe_cnt[min] > r8a66597->pipe_cnt[array[i]]) in get_empty_pipenum()
768 static void enable_r8a66597_pipe_dma(struct r8a66597 *r8a66597, in enable_r8a66597_pipe_dma() argument
775 unsigned short mbw = mbw_value(r8a66597); in enable_r8a66597_pipe_dma()
778 if (r8a66597->pdata->on_chip) in enable_r8a66597_pipe_dma()
783 if ((r8a66597->dma_map & (1 << i)) != 0) in enable_r8a66597_pipe_dma()
793 r8a66597->dma_map |= 1 << i; in enable_r8a66597_pipe_dma()
797 cfifo_change(r8a66597, 0); in enable_r8a66597_pipe_dma()
798 r8a66597_mdfy(r8a66597, mbw | pipe->info.pipenum, in enable_r8a66597_pipe_dma()
801 r8a66597_reg_wait(r8a66597, pipe->fifosel, CURPIPE, in enable_r8a66597_pipe_dma()
803 r8a66597_bset(r8a66597, BCLR, pipe->fifoctr); in enable_r8a66597_pipe_dma()
810 static void enable_r8a66597_pipe(struct r8a66597 *r8a66597, struct urb *urb, in enable_r8a66597_pipe() argument
814 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in enable_r8a66597_pipe()
821 r8a66597->pipe_cnt[pipe->info.pipenum]++; in enable_r8a66597_pipe()
824 enable_r8a66597_pipe_dma(r8a66597, dev, pipe, urb); in enable_r8a66597_pipe()
827 static void r8a66597_urb_done(struct r8a66597 *r8a66597, struct urb *urb, in r8a66597_urb_done() argument
829 __releases(r8a66597->lock) in r8a66597_urb_done()
830 __acquires(r8a66597->lock) in r8a66597_urb_done()
841 usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), urb); in r8a66597_urb_done()
842 spin_unlock(&r8a66597->lock); in r8a66597_urb_done()
843 usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb, status); in r8a66597_urb_done()
844 spin_lock(&r8a66597->lock); in r8a66597_urb_done()
848 static void force_dequeue(struct r8a66597 *r8a66597, u16 pipenum, u16 address) in force_dequeue() argument
852 struct list_head *list = &r8a66597->pipe_queue[pipenum]; in force_dequeue()
866 r8a66597_urb_done(r8a66597, urb, -ENODEV); in force_dequeue()
873 static void disable_r8a66597_pipe_all(struct r8a66597 *r8a66597, in disable_r8a66597_pipe_all() argument
888 force_dequeue(r8a66597, 0, dev->address); in disable_r8a66597_pipe_all()
891 r8a66597->pipe_cnt[pipenum] -= dev->pipe_cnt[pipenum]; in disable_r8a66597_pipe_all()
893 force_dequeue(r8a66597, pipenum, dev->address); in disable_r8a66597_pipe_all()
898 r8a66597->dma_map &= ~(dev->dma_map); in disable_r8a66597_pipe_all()
948 static void init_pipe_info(struct r8a66597 *r8a66597, struct urb *urb, in init_pipe_info() argument
954 info.pipenum = get_empty_pipenum(r8a66597, ep); in init_pipe_info()
955 info.address = get_urb_to_r8a66597_addr(r8a66597, urb); in init_pipe_info()
973 enable_r8a66597_pipe(r8a66597, urb, hep, &info); in init_pipe_info()
976 static void init_pipe_config(struct r8a66597 *r8a66597, struct urb *urb) in init_pipe_config() argument
980 dev = get_urb_to_r8a66597_dev(r8a66597, urb); in init_pipe_config()
984 static void pipe_irq_enable(struct r8a66597 *r8a66597, struct urb *urb, in pipe_irq_enable() argument
988 enable_irq_empty(r8a66597, pipenum); in pipe_irq_enable()
990 enable_irq_ready(r8a66597, pipenum); in pipe_irq_enable()
993 enable_irq_nrdy(r8a66597, pipenum); in pipe_irq_enable()
996 static void pipe_irq_disable(struct r8a66597 *r8a66597, u16 pipenum) in pipe_irq_disable() argument
998 disable_irq_ready(r8a66597, pipenum); in pipe_irq_disable()
999 disable_irq_nrdy(r8a66597, pipenum); in pipe_irq_disable()
1002 static void r8a66597_root_hub_start_polling(struct r8a66597 *r8a66597) in r8a66597_root_hub_start_polling() argument
1004 mod_timer(&r8a66597->rh_timer, in r8a66597_root_hub_start_polling()
1008 static void start_root_hub_sampling(struct r8a66597 *r8a66597, int port, in start_root_hub_sampling() argument
1011 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in start_root_hub_sampling()
1013 rh->old_syssts = r8a66597_read(r8a66597, get_syssts_reg(port)) & LNST; in start_root_hub_sampling()
1021 r8a66597_root_hub_start_polling(r8a66597); in start_root_hub_sampling()
1025 static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port, in r8a66597_check_syssts() argument
1027 __releases(r8a66597->lock) in r8a66597_check_syssts()
1028 __acquires(r8a66597->lock) in r8a66597_check_syssts()
1031 r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port)); in r8a66597_check_syssts()
1032 r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port)); in r8a66597_check_syssts()
1035 r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port)); in r8a66597_check_syssts()
1037 r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port)); in r8a66597_check_syssts()
1039 r8a66597_write(r8a66597, ~DTCH, get_intsts_reg(port)); in r8a66597_check_syssts()
1040 r8a66597_bset(r8a66597, DTCHE, get_intenb_reg(port)); in r8a66597_check_syssts()
1042 if (r8a66597->bus_suspended) in r8a66597_check_syssts()
1043 usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); in r8a66597_check_syssts()
1046 spin_unlock(&r8a66597->lock); in r8a66597_check_syssts()
1047 usb_hcd_poll_rh_status(r8a66597_to_hcd(r8a66597)); in r8a66597_check_syssts()
1048 spin_lock(&r8a66597->lock); in r8a66597_check_syssts()
1052 static void r8a66597_usb_connect(struct r8a66597 *r8a66597, int port) in r8a66597_usb_connect() argument
1054 u16 speed = get_rh_usb_speed(r8a66597, port); in r8a66597_usb_connect()
1055 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_usb_connect()
1068 static void r8a66597_usb_disconnect(struct r8a66597 *r8a66597, int port) in r8a66597_usb_disconnect() argument
1070 struct r8a66597_device *dev = r8a66597->root_hub[port].dev; in r8a66597_usb_disconnect()
1072 disable_r8a66597_pipe_all(r8a66597, dev); in r8a66597_usb_disconnect()
1073 free_usb_address(r8a66597, dev, 0); in r8a66597_usb_disconnect()
1075 start_root_hub_sampling(r8a66597, port, 0); in r8a66597_usb_disconnect()
1079 static void prepare_setup_packet(struct r8a66597 *r8a66597, in prepare_setup_packet() argument
1086 r8a66597_write(r8a66597, make_devsel(td->address) | td->maxpacket, in prepare_setup_packet()
1088 r8a66597_write(r8a66597, ~(SIGN | SACK), INTSTS1); in prepare_setup_packet()
1091 r8a66597_write(r8a66597, le16_to_cpu(p[i]), setup_addr); in prepare_setup_packet()
1094 r8a66597_write(r8a66597, SUREQ, DCPCTR); in prepare_setup_packet()
1098 static void prepare_packet_read(struct r8a66597 *r8a66597, in prepare_packet_read() argument
1104 r8a66597_bclr(r8a66597, R8A66597_DIR, DCPCFG); in prepare_packet_read()
1105 r8a66597_mdfy(r8a66597, 0, ISEL | CURPIPE, CFIFOSEL); in prepare_packet_read()
1106 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0); in prepare_packet_read()
1108 r8a66597_pipe_toggle(r8a66597, td->pipe, 1); in prepare_packet_read()
1109 r8a66597_write(r8a66597, BCLR, CFIFOCTR); in prepare_packet_read()
1111 pipe_irq_disable(r8a66597, td->pipenum); in prepare_packet_read()
1112 pipe_start(r8a66597, td->pipe); in prepare_packet_read()
1113 pipe_irq_enable(r8a66597, urb, td->pipenum); in prepare_packet_read()
1116 pipe_irq_disable(r8a66597, td->pipenum); in prepare_packet_read()
1117 pipe_setting(r8a66597, td); in prepare_packet_read()
1118 pipe_stop(r8a66597, td->pipe); in prepare_packet_read()
1119 r8a66597_write(r8a66597, ~(1 << td->pipenum), BRDYSTS); in prepare_packet_read()
1122 r8a66597_write(r8a66597, TRCLR, in prepare_packet_read()
1124 r8a66597_write(r8a66597, in prepare_packet_read()
1129 r8a66597_bset(r8a66597, TRENB, in prepare_packet_read()
1133 pipe_start(r8a66597, td->pipe); in prepare_packet_read()
1134 pipe_irq_enable(r8a66597, urb, td->pipenum); in prepare_packet_read()
1140 static void prepare_packet_write(struct r8a66597 *r8a66597, in prepare_packet_write() argument
1147 pipe_stop(r8a66597, td->pipe); in prepare_packet_write()
1148 r8a66597_bset(r8a66597, R8A66597_DIR, DCPCFG); in prepare_packet_write()
1149 r8a66597_mdfy(r8a66597, ISEL, ISEL | CURPIPE, CFIFOSEL); in prepare_packet_write()
1150 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0); in prepare_packet_write()
1152 r8a66597_pipe_toggle(r8a66597, td->pipe, 1); in prepare_packet_write()
1153 r8a66597_write(r8a66597, BCLR, CFIFOCTR); in prepare_packet_write()
1157 pipe_setting(r8a66597, td); in prepare_packet_write()
1159 r8a66597_bclr(r8a66597, TRENB, td->pipe->pipetre); in prepare_packet_write()
1161 r8a66597_write(r8a66597, ~(1 << td->pipenum), BRDYSTS); in prepare_packet_write()
1163 fifo_change_from_pipe(r8a66597, td->pipe); in prepare_packet_write()
1164 tmp = r8a66597_read(r8a66597, td->pipe->fifoctr); in prepare_packet_write()
1166 pipe_irq_enable(r8a66597, urb, td->pipenum); in prepare_packet_write()
1168 packet_write(r8a66597, td->pipenum); in prepare_packet_write()
1169 pipe_start(r8a66597, td->pipe); in prepare_packet_write()
1173 static void prepare_status_packet(struct r8a66597 *r8a66597, in prepare_status_packet() argument
1178 r8a66597_pipe_toggle(r8a66597, td->pipe, 1); in prepare_status_packet()
1179 pipe_stop(r8a66597, td->pipe); in prepare_status_packet()
1182 r8a66597_bset(r8a66597, R8A66597_DIR, DCPCFG); in prepare_status_packet()
1183 r8a66597_mdfy(r8a66597, ISEL, ISEL | CURPIPE, CFIFOSEL); in prepare_status_packet()
1184 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0); in prepare_status_packet()
1185 r8a66597_write(r8a66597, ~BEMP0, BEMPSTS); in prepare_status_packet()
1186 r8a66597_write(r8a66597, BCLR | BVAL, CFIFOCTR); in prepare_status_packet()
1187 enable_irq_empty(r8a66597, 0); in prepare_status_packet()
1189 r8a66597_bclr(r8a66597, R8A66597_DIR, DCPCFG); in prepare_status_packet()
1190 r8a66597_mdfy(r8a66597, 0, ISEL | CURPIPE, CFIFOSEL); in prepare_status_packet()
1191 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0); in prepare_status_packet()
1192 r8a66597_write(r8a66597, BCLR, CFIFOCTR); in prepare_status_packet()
1193 enable_irq_ready(r8a66597, 0); in prepare_status_packet()
1195 enable_irq_nrdy(r8a66597, 0); in prepare_status_packet()
1196 pipe_start(r8a66597, td->pipe); in prepare_status_packet()
1209 static int start_transfer(struct r8a66597 *r8a66597, struct r8a66597_td *td) in start_transfer() argument
1217 td->urb->setup_packet[2] = alloc_usb_address(r8a66597, in start_transfer()
1222 prepare_setup_packet(r8a66597, td); in start_transfer()
1225 prepare_packet_read(r8a66597, td); in start_transfer()
1228 prepare_packet_write(r8a66597, td); in start_transfer()
1231 prepare_status_packet(r8a66597, td); in start_transfer()
1257 static void set_td_timer(struct r8a66597 *r8a66597, struct r8a66597_td *td) in set_td_timer() argument
1263 if (!list_empty(&r8a66597->pipe_queue[td->pipenum]) && in set_td_timer()
1265 r8a66597->timeout_map |= 1 << td->pipenum; in set_td_timer()
1276 mod_timer(&r8a66597->td_timer[td->pipenum], in set_td_timer()
1282 static void finish_request(struct r8a66597 *r8a66597, struct r8a66597_td *td, in finish_request() argument
1284 __releases(r8a66597->lock) __acquires(r8a66597->lock) in finish_request()
1287 struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); in finish_request()
1289 r8a66597->timeout_map &= ~(1 << pipenum); in finish_request()
1293 r8a66597->address_map &= ~(1 << urb->setup_packet[2]); in finish_request()
1295 pipe_toggle_save(r8a66597, td->pipe, urb); in finish_request()
1300 if (!list_empty(&r8a66597->pipe_queue[pipenum])) in finish_request()
1307 r8a66597_urb_done(r8a66597, urb, status); in finish_request()
1311 td = r8a66597_get_td(r8a66597, pipenum); in finish_request()
1315 start_transfer(r8a66597, td); in finish_request()
1316 set_td_timer(r8a66597, td); in finish_request()
1320 static void packet_read(struct r8a66597 *r8a66597, u16 pipenum) in packet_read() argument
1325 struct r8a66597_td *td = r8a66597_get_td(r8a66597, pipenum); in packet_read()
1334 fifo_change_from_pipe(r8a66597, td->pipe); in packet_read()
1335 tmp = r8a66597_read(r8a66597, td->pipe->fifoctr); in packet_read()
1337 pipe_stop(r8a66597, td->pipe); in packet_read()
1338 pipe_irq_disable(r8a66597, pipenum); in packet_read()
1340 finish_request(r8a66597, td, pipenum, td->urb, -EPIPE); in packet_read()
1379 pipe_stop(r8a66597, td->pipe); in packet_read()
1380 pipe_irq_disable(r8a66597, pipenum); in packet_read()
1387 r8a66597_write(r8a66597, BCLR, td->pipe->fifoctr); in packet_read()
1389 r8a66597_read_fifo(r8a66597, td->pipe->fifoaddr, in packet_read()
1394 finish_request(r8a66597, td, pipenum, urb, status); in packet_read()
1397 static void packet_write(struct r8a66597 *r8a66597, u16 pipenum) in packet_write() argument
1402 struct r8a66597_td *td = r8a66597_get_td(r8a66597, pipenum); in packet_write()
1409 fifo_change_from_pipe(r8a66597, td->pipe); in packet_write()
1410 tmp = r8a66597_read(r8a66597, td->pipe->fifoctr); in packet_write()
1412 pipe_stop(r8a66597, td->pipe); in packet_write()
1413 pipe_irq_disable(r8a66597, pipenum); in packet_write()
1415 finish_request(r8a66597, td, pipenum, urb, -EPIPE); in packet_write()
1434 r8a66597_write(r8a66597, ~(1 << pipenum), BEMPSTS); in packet_write()
1436 r8a66597_write_fifo(r8a66597, td->pipe, buf, size); in packet_write()
1438 r8a66597_write(r8a66597, BVAL, td->pipe->fifoctr); in packet_write()
1451 disable_irq_ready(r8a66597, pipenum); in packet_write()
1452 enable_irq_empty(r8a66597, pipenum); in packet_write()
1454 enable_irq_nrdy(r8a66597, pipenum); in packet_write()
1456 pipe_irq_enable(r8a66597, urb, pipenum); in packet_write()
1460 static void check_next_phase(struct r8a66597 *r8a66597, int status) in check_next_phase() argument
1462 struct r8a66597_td *td = r8a66597_get_td(r8a66597, 0); in check_next_phase()
1490 finish_request(r8a66597, td, 0, urb, status); in check_next_phase()
1492 start_transfer(r8a66597, td); in check_next_phase()
1495 static int get_urb_error(struct r8a66597 *r8a66597, u16 pipenum) in get_urb_error() argument
1497 struct r8a66597_td *td = r8a66597_get_td(r8a66597, pipenum); in get_urb_error()
1500 u16 pid = r8a66597_read(r8a66597, td->pipe->pipectr) & PID; in get_urb_error()
1510 static void irq_pipe_ready(struct r8a66597 *r8a66597) in irq_pipe_ready() argument
1517 mask = r8a66597_read(r8a66597, BRDYSTS) in irq_pipe_ready()
1518 & r8a66597_read(r8a66597, BRDYENB); in irq_pipe_ready()
1519 r8a66597_write(r8a66597, ~mask, BRDYSTS); in irq_pipe_ready()
1521 td = r8a66597_get_td(r8a66597, 0); in irq_pipe_ready()
1523 packet_read(r8a66597, 0); in irq_pipe_ready()
1525 pipe_irq_disable(r8a66597, 0); in irq_pipe_ready()
1526 check_next_phase(r8a66597, 0); in irq_pipe_ready()
1532 td = r8a66597_get_td(r8a66597, pipenum); in irq_pipe_ready()
1537 packet_read(r8a66597, pipenum); in irq_pipe_ready()
1539 packet_write(r8a66597, pipenum); in irq_pipe_ready()
1544 static void irq_pipe_empty(struct r8a66597 *r8a66597) in irq_pipe_empty() argument
1552 mask = r8a66597_read(r8a66597, BEMPSTS) in irq_pipe_empty()
1553 & r8a66597_read(r8a66597, BEMPENB); in irq_pipe_empty()
1554 r8a66597_write(r8a66597, ~mask, BEMPSTS); in irq_pipe_empty()
1556 cfifo_change(r8a66597, 0); in irq_pipe_empty()
1557 td = r8a66597_get_td(r8a66597, 0); in irq_pipe_empty()
1559 disable_irq_empty(r8a66597, 0); in irq_pipe_empty()
1560 check_next_phase(r8a66597, 0); in irq_pipe_empty()
1567 td = r8a66597_get_td(r8a66597, pipenum); in irq_pipe_empty()
1571 tmp = r8a66597_read(r8a66597, td->pipe->pipectr); in irq_pipe_empty()
1573 disable_irq_empty(r8a66597, pipenum); in irq_pipe_empty()
1574 pipe_irq_disable(r8a66597, pipenum); in irq_pipe_empty()
1575 finish_request(r8a66597, td, pipenum, td->urb, in irq_pipe_empty()
1582 static void irq_pipe_nrdy(struct r8a66597 *r8a66597) in irq_pipe_nrdy() argument
1589 mask = r8a66597_read(r8a66597, NRDYSTS) in irq_pipe_nrdy()
1590 & r8a66597_read(r8a66597, NRDYENB); in irq_pipe_nrdy()
1591 r8a66597_write(r8a66597, ~mask, NRDYSTS); in irq_pipe_nrdy()
1593 cfifo_change(r8a66597, 0); in irq_pipe_nrdy()
1594 status = get_urb_error(r8a66597, 0); in irq_pipe_nrdy()
1595 pipe_irq_disable(r8a66597, 0); in irq_pipe_nrdy()
1596 check_next_phase(r8a66597, status); in irq_pipe_nrdy()
1603 td = r8a66597_get_td(r8a66597, pipenum); in irq_pipe_nrdy()
1607 status = get_urb_error(r8a66597, pipenum); in irq_pipe_nrdy()
1608 pipe_irq_disable(r8a66597, pipenum); in irq_pipe_nrdy()
1609 pipe_stop(r8a66597, td->pipe); in irq_pipe_nrdy()
1610 finish_request(r8a66597, td, pipenum, td->urb, status); in irq_pipe_nrdy()
1617 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_irq() local
1623 spin_lock(&r8a66597->lock); in r8a66597_irq()
1625 intsts0 = r8a66597_read(r8a66597, INTSTS0); in r8a66597_irq()
1626 intsts1 = r8a66597_read(r8a66597, INTSTS1); in r8a66597_irq()
1627 intsts2 = r8a66597_read(r8a66597, INTSTS2); in r8a66597_irq()
1628 intenb0 = r8a66597_read(r8a66597, INTENB0); in r8a66597_irq()
1629 intenb1 = r8a66597_read(r8a66597, INTENB1); in r8a66597_irq()
1630 intenb2 = r8a66597_read(r8a66597, INTENB2); in r8a66597_irq()
1637 r8a66597_write(r8a66597, ~ATTCH, INTSTS2); in r8a66597_irq()
1638 r8a66597_bclr(r8a66597, ATTCHE, INTENB2); in r8a66597_irq()
1641 start_root_hub_sampling(r8a66597, 1, 1); in r8a66597_irq()
1644 r8a66597_write(r8a66597, ~DTCH, INTSTS2); in r8a66597_irq()
1645 r8a66597_bclr(r8a66597, DTCHE, INTENB2); in r8a66597_irq()
1646 r8a66597_usb_disconnect(r8a66597, 1); in r8a66597_irq()
1649 r8a66597_write(r8a66597, ~BCHG, INTSTS2); in r8a66597_irq()
1650 r8a66597_bclr(r8a66597, BCHGE, INTENB2); in r8a66597_irq()
1651 usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); in r8a66597_irq()
1657 r8a66597_write(r8a66597, ~ATTCH, INTSTS1); in r8a66597_irq()
1658 r8a66597_bclr(r8a66597, ATTCHE, INTENB1); in r8a66597_irq()
1661 start_root_hub_sampling(r8a66597, 0, 1); in r8a66597_irq()
1664 r8a66597_write(r8a66597, ~DTCH, INTSTS1); in r8a66597_irq()
1665 r8a66597_bclr(r8a66597, DTCHE, INTENB1); in r8a66597_irq()
1666 r8a66597_usb_disconnect(r8a66597, 0); in r8a66597_irq()
1669 r8a66597_write(r8a66597, ~BCHG, INTSTS1); in r8a66597_irq()
1670 r8a66597_bclr(r8a66597, BCHGE, INTENB1); in r8a66597_irq()
1671 usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); in r8a66597_irq()
1675 r8a66597_write(r8a66597, ~SIGN, INTSTS1); in r8a66597_irq()
1676 status = get_urb_error(r8a66597, 0); in r8a66597_irq()
1677 check_next_phase(r8a66597, status); in r8a66597_irq()
1680 r8a66597_write(r8a66597, ~SACK, INTSTS1); in r8a66597_irq()
1681 check_next_phase(r8a66597, 0); in r8a66597_irq()
1686 irq_pipe_ready(r8a66597); in r8a66597_irq()
1688 irq_pipe_empty(r8a66597); in r8a66597_irq()
1690 irq_pipe_nrdy(r8a66597); in r8a66597_irq()
1693 spin_unlock(&r8a66597->lock); in r8a66597_irq()
1698 static void r8a66597_root_hub_control(struct r8a66597 *r8a66597, int port) in r8a66597_root_hub_control() argument
1701 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_root_hub_control()
1706 tmp = r8a66597_read(r8a66597, dvstctr_reg); in r8a66597_root_hub_control()
1708 r8a66597_mdfy(r8a66597, UACT, USBRST | UACT, in r8a66597_root_hub_control()
1710 r8a66597_root_hub_start_polling(r8a66597); in r8a66597_root_hub_control()
1712 r8a66597_usb_connect(r8a66597, port); in r8a66597_root_hub_control()
1716 r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port)); in r8a66597_root_hub_control()
1717 r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port)); in r8a66597_root_hub_control()
1721 tmp = r8a66597_read(r8a66597, get_syssts_reg(port)) & LNST; in r8a66597_root_hub_control()
1725 r8a66597_check_syssts(r8a66597, port, tmp); in r8a66597_root_hub_control()
1727 r8a66597_root_hub_start_polling(r8a66597); in r8a66597_root_hub_control()
1731 r8a66597_root_hub_start_polling(r8a66597); in r8a66597_root_hub_control()
1738 struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597; in r8a66597_interval_timer() local
1743 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_interval_timer()
1746 if (!(r8a66597->interval_map & (1 << pipenum))) in r8a66597_interval_timer()
1748 if (timer_pending(&r8a66597->interval_timer[pipenum])) in r8a66597_interval_timer()
1751 td = r8a66597_get_td(r8a66597, pipenum); in r8a66597_interval_timer()
1753 start_transfer(r8a66597, td); in r8a66597_interval_timer()
1756 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_interval_timer()
1761 struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597; in r8a66597_td_timer() local
1767 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_td_timer()
1769 if (!(r8a66597->timeout_map & (1 << pipenum))) in r8a66597_td_timer()
1771 if (timer_pending(&r8a66597->td_timer[pipenum])) in r8a66597_td_timer()
1774 td = r8a66597_get_td(r8a66597, pipenum); in r8a66597_td_timer()
1776 r8a66597->timeout_map &= ~(1 << pipenum); in r8a66597_td_timer()
1781 set_td_timer(r8a66597, td); in r8a66597_td_timer()
1786 pipe_stop(r8a66597, pipe); in r8a66597_td_timer()
1791 &r8a66597->pipe_queue[pipenum]); in r8a66597_td_timer()
1792 new_td = r8a66597_get_td(r8a66597, pipenum); in r8a66597_td_timer()
1799 start_transfer(r8a66597, new_td); in r8a66597_td_timer()
1802 r8a66597->timeout_map &= ~(1 << pipenum); in r8a66597_td_timer()
1804 set_td_timer(r8a66597, new_td); in r8a66597_td_timer()
1807 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_td_timer()
1812 struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597; in r8a66597_timer() local
1816 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_timer()
1818 for (port = 0; port < r8a66597->max_root_hub; port++) in r8a66597_timer()
1819 r8a66597_root_hub_control(r8a66597, port); in r8a66597_timer()
1821 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_timer()
1824 static int check_pipe_config(struct r8a66597 *r8a66597, struct urb *urb) in check_pipe_config() argument
1826 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in check_pipe_config()
1837 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_start() local
1840 return enable_controller(r8a66597); in r8a66597_start()
1845 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_stop() local
1847 disable_controller(r8a66597); in r8a66597_stop()
1850 static void set_address_zero(struct r8a66597 *r8a66597, struct urb *urb) in set_address_zero() argument
1856 get_port_number(r8a66597, urb->dev->devpath, in set_address_zero()
1858 set_devadd_reg(r8a66597, 0, in set_address_zero()
1860 get_parent_r8a66597_address(r8a66597, urb->dev), in set_address_zero()
1865 static struct r8a66597_td *r8a66597_make_td(struct r8a66597 *r8a66597, in r8a66597_make_td() argument
1880 td->address = get_urb_to_r8a66597_addr(r8a66597, urb); in r8a66597_make_td()
1899 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_urb_enqueue() local
1904 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_urb_enqueue()
1905 if (!get_urb_to_r8a66597_dev(r8a66597, urb)) { in r8a66597_urb_enqueue()
1923 init_pipe_info(r8a66597, urb, hep, &hep->desc); in r8a66597_urb_enqueue()
1926 if (unlikely(check_pipe_config(r8a66597, urb))) in r8a66597_urb_enqueue()
1927 init_pipe_config(r8a66597, urb); in r8a66597_urb_enqueue()
1929 set_address_zero(r8a66597, urb); in r8a66597_urb_enqueue()
1930 td = r8a66597_make_td(r8a66597, urb, hep); in r8a66597_urb_enqueue()
1935 if (list_empty(&r8a66597->pipe_queue[td->pipenum])) in r8a66597_urb_enqueue()
1937 list_add_tail(&td->queue, &r8a66597->pipe_queue[td->pipenum]); in r8a66597_urb_enqueue()
1942 r8a66597->interval_map |= 1 << td->pipenum; in r8a66597_urb_enqueue()
1943 mod_timer(&r8a66597->interval_timer[td->pipenum], in r8a66597_urb_enqueue()
1947 ret = start_transfer(r8a66597, td); in r8a66597_urb_enqueue()
1954 set_td_timer(r8a66597, td); in r8a66597_urb_enqueue()
1960 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_urb_enqueue()
1967 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_urb_dequeue() local
1972 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_urb_dequeue()
1979 pipe_stop(r8a66597, td->pipe); in r8a66597_urb_dequeue()
1980 pipe_irq_disable(r8a66597, td->pipenum); in r8a66597_urb_dequeue()
1981 disable_irq_empty(r8a66597, td->pipenum); in r8a66597_urb_dequeue()
1982 finish_request(r8a66597, td, td->pipenum, urb, status); in r8a66597_urb_dequeue()
1985 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_urb_dequeue()
1992 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_endpoint_disable() local
2009 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_endpoint_disable()
2010 pipe_stop(r8a66597, pipe); in r8a66597_endpoint_disable()
2011 pipe_irq_disable(r8a66597, pipenum); in r8a66597_endpoint_disable()
2012 disable_irq_empty(r8a66597, pipenum); in r8a66597_endpoint_disable()
2013 td = r8a66597_get_td(r8a66597, pipenum); in r8a66597_endpoint_disable()
2016 finish_request(r8a66597, td, pipenum, urb, -ESHUTDOWN); in r8a66597_endpoint_disable()
2019 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_endpoint_disable()
2024 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_get_frame() local
2025 return r8a66597_read(r8a66597, FRMNUM) & 0x03FF; in r8a66597_get_frame()
2043 static struct r8a66597_device *get_r8a66597_device(struct r8a66597 *r8a66597, in get_r8a66597_device() argument
2047 struct list_head *list = &r8a66597->child_device; in get_r8a66597_device()
2060 static void update_usb_address_map(struct r8a66597 *r8a66597, in update_usb_address_map() argument
2069 diff = r8a66597->child_connect_map[i] ^ map[i]; in update_usb_address_map()
2079 set_child_connect_map(r8a66597, addr); in update_usb_address_map()
2083 spin_lock_irqsave(&r8a66597->lock, flags); in update_usb_address_map()
2084 dev = get_r8a66597_device(r8a66597, addr); in update_usb_address_map()
2085 disable_r8a66597_pipe_all(r8a66597, dev); in update_usb_address_map()
2086 free_usb_address(r8a66597, dev, 0); in update_usb_address_map()
2087 put_child_connect_map(r8a66597, addr); in update_usb_address_map()
2088 spin_unlock_irqrestore(&r8a66597->lock, flags); in update_usb_address_map()
2094 static void r8a66597_check_detect_child(struct r8a66597 *r8a66597, in r8a66597_check_detect_child() argument
2110 update_usb_address_map(r8a66597, bus->root_hub, now_map); in r8a66597_check_detect_child()
2116 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_hub_status_data() local
2120 r8a66597_check_detect_child(r8a66597, hcd); in r8a66597_hub_status_data()
2122 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_hub_status_data()
2126 for (i = 0; i < r8a66597->max_root_hub; i++) { in r8a66597_hub_status_data()
2127 if (r8a66597->root_hub[i].port & 0xffff0000) in r8a66597_hub_status_data()
2131 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_hub_status_data()
2136 static void r8a66597_hub_descriptor(struct r8a66597 *r8a66597, in r8a66597_hub_descriptor() argument
2141 desc->bNbrPorts = r8a66597->max_root_hub; in r8a66597_hub_descriptor()
2147 ((1 << r8a66597->max_root_hub) - 1) << 1; in r8a66597_hub_descriptor()
2154 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_hub_control() local
2157 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_hub_control()
2162 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_hub_control()
2175 if (wIndex > r8a66597->max_root_hub) in r8a66597_hub_control()
2187 r8a66597_port_power(r8a66597, port, 0); in r8a66597_hub_control()
2201 r8a66597_hub_descriptor(r8a66597, in r8a66597_hub_control()
2208 if (wIndex > r8a66597->max_root_hub) in r8a66597_hub_control()
2213 if (wIndex > r8a66597->max_root_hub) in r8a66597_hub_control()
2222 r8a66597_port_power(r8a66597, port, 1); in r8a66597_hub_control()
2230 disable_r8a66597_pipe_all(r8a66597, dev); in r8a66597_hub_control()
2231 free_usb_address(r8a66597, dev, 1); in r8a66597_hub_control()
2233 r8a66597_mdfy(r8a66597, USBRST, USBRST | UACT, in r8a66597_hub_control()
2235 mod_timer(&r8a66597->rh_timer, in r8a66597_hub_control()
2250 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_hub_control()
2257 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_bus_suspend() local
2260 dev_dbg(&r8a66597->device0.udev->dev, "%s\n", __func__); in r8a66597_bus_suspend()
2262 for (port = 0; port < r8a66597->max_root_hub; port++) { in r8a66597_bus_suspend()
2263 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_bus_suspend()
2270 r8a66597_bclr(r8a66597, UACT, dvstctr_reg); /* suspend */ in r8a66597_bus_suspend()
2275 r8a66597_bset(r8a66597, RWUPE, dvstctr_reg); in r8a66597_bus_suspend()
2276 r8a66597_write(r8a66597, ~BCHG, get_intsts_reg(port)); in r8a66597_bus_suspend()
2277 r8a66597_bset(r8a66597, BCHGE, get_intenb_reg(port)); in r8a66597_bus_suspend()
2281 r8a66597->bus_suspended = 1; in r8a66597_bus_suspend()
2288 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_bus_resume() local
2291 dev_dbg(&r8a66597->device0.udev->dev, "%s\n", __func__); in r8a66597_bus_resume()
2293 for (port = 0; port < r8a66597->max_root_hub; port++) { in r8a66597_bus_resume()
2294 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_bus_resume()
2303 r8a66597_mdfy(r8a66597, RESUME, RESUME | UACT, dvstctr_reg); in r8a66597_bus_resume()
2305 r8a66597_mdfy(r8a66597, UACT, RESUME | UACT, dvstctr_reg); in r8a66597_bus_resume()
2318 .hcd_priv_size = sizeof(struct r8a66597),
2353 struct r8a66597 *r8a66597 = dev_get_drvdata(dev); in r8a66597_suspend() local
2358 disable_controller(r8a66597); in r8a66597_suspend()
2360 for (port = 0; port < r8a66597->max_root_hub; port++) { in r8a66597_suspend()
2361 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_suspend()
2371 struct r8a66597 *r8a66597 = dev_get_drvdata(dev); in r8a66597_resume() local
2372 struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); in r8a66597_resume()
2376 enable_controller(r8a66597); in r8a66597_resume()
2396 struct r8a66597 *r8a66597 = platform_get_drvdata(pdev); in r8a66597_remove() local
2397 struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); in r8a66597_remove()
2399 del_timer_sync(&r8a66597->rh_timer); in r8a66597_remove()
2401 iounmap(r8a66597->reg); in r8a66597_remove()
2402 if (r8a66597->pdata->on_chip) in r8a66597_remove()
2403 clk_put(r8a66597->clk); in r8a66597_remove()
2415 struct r8a66597 *r8a66597; in r8a66597_probe() local
2467 r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_probe()
2468 memset(r8a66597, 0, sizeof(struct r8a66597)); in r8a66597_probe()
2469 platform_set_drvdata(pdev, r8a66597); in r8a66597_probe()
2470 r8a66597->pdata = dev_get_platdata(&pdev->dev); in r8a66597_probe()
2471 r8a66597->irq_sense_low = irq_trigger == IRQF_TRIGGER_LOW; in r8a66597_probe()
2473 if (r8a66597->pdata->on_chip) { in r8a66597_probe()
2475 r8a66597->clk = clk_get(&pdev->dev, clk_name); in r8a66597_probe()
2476 if (IS_ERR(r8a66597->clk)) { in r8a66597_probe()
2479 ret = PTR_ERR(r8a66597->clk); in r8a66597_probe()
2482 r8a66597->max_root_hub = 1; in r8a66597_probe()
2484 r8a66597->max_root_hub = 2; in r8a66597_probe()
2486 spin_lock_init(&r8a66597->lock); in r8a66597_probe()
2487 setup_timer(&r8a66597->rh_timer, r8a66597_timer, in r8a66597_probe()
2488 (unsigned long)r8a66597); in r8a66597_probe()
2489 r8a66597->reg = reg; in r8a66597_probe()
2492 ret = r8a66597_clock_enable(r8a66597); in r8a66597_probe()
2495 disable_controller(r8a66597); in r8a66597_probe()
2498 INIT_LIST_HEAD(&r8a66597->pipe_queue[i]); in r8a66597_probe()
2499 setup_timer(&r8a66597->td_timer[i], r8a66597_td_timer, in r8a66597_probe()
2500 (unsigned long)r8a66597); in r8a66597_probe()
2501 setup_timer(&r8a66597->interval_timer[i], in r8a66597_probe()
2503 (unsigned long)r8a66597); in r8a66597_probe()
2505 INIT_LIST_HEAD(&r8a66597->child_device); in r8a66597_probe()
2520 if (r8a66597->pdata->on_chip) in r8a66597_probe()
2521 clk_put(r8a66597->clk); in r8a66597_probe()