Lines Matching refs:r8a66597

41 static void packet_write(struct r8a66597 *r8a66597, u16 pipenum);
45 static void enable_pipe_irq(struct r8a66597 *r8a66597, u16 pipenum, in enable_pipe_irq() argument
50 tmp = r8a66597_read(r8a66597, INTENB0); in enable_pipe_irq()
51 r8a66597_bclr(r8a66597, BEMPE | NRDYE | BRDYE, INTENB0); in enable_pipe_irq()
52 r8a66597_bset(r8a66597, 1 << pipenum, reg); in enable_pipe_irq()
53 r8a66597_write(r8a66597, tmp, INTENB0); in enable_pipe_irq()
57 static void disable_pipe_irq(struct r8a66597 *r8a66597, u16 pipenum, in disable_pipe_irq() argument
62 tmp = r8a66597_read(r8a66597, INTENB0); in disable_pipe_irq()
63 r8a66597_bclr(r8a66597, BEMPE | NRDYE | BRDYE, INTENB0); in disable_pipe_irq()
64 r8a66597_bclr(r8a66597, 1 << pipenum, reg); in disable_pipe_irq()
65 r8a66597_write(r8a66597, tmp, INTENB0); in disable_pipe_irq()
68 static void set_devadd_reg(struct r8a66597 *r8a66597, u8 r8a66597_address, in set_devadd_reg() argument
75 r8a66597_write(r8a66597, val, devadd_reg); in set_devadd_reg()
78 static int r8a66597_clock_enable(struct r8a66597 *r8a66597) in r8a66597_clock_enable() argument
83 if (r8a66597->pdata->on_chip) { in r8a66597_clock_enable()
84 clk_prepare_enable(r8a66597->clk); in r8a66597_clock_enable()
86 r8a66597_write(r8a66597, SCKE, SYSCFG0); in r8a66597_clock_enable()
87 tmp = r8a66597_read(r8a66597, SYSCFG0); in r8a66597_clock_enable()
93 r8a66597_write(r8a66597, 0x04, 0x02); in r8a66597_clock_enable()
96 r8a66597_write(r8a66597, USBE, SYSCFG0); in r8a66597_clock_enable()
97 tmp = r8a66597_read(r8a66597, SYSCFG0); in r8a66597_clock_enable()
103 r8a66597_bclr(r8a66597, USBE, SYSCFG0); in r8a66597_clock_enable()
104 r8a66597_mdfy(r8a66597, get_xtal_from_pdata(r8a66597->pdata), in r8a66597_clock_enable()
108 r8a66597_bset(r8a66597, XCKE, SYSCFG0); in r8a66597_clock_enable()
111 tmp = r8a66597_read(r8a66597, SYSCFG0); in r8a66597_clock_enable()
122 static void r8a66597_clock_disable(struct r8a66597 *r8a66597) in r8a66597_clock_disable() argument
124 r8a66597_bclr(r8a66597, SCKE, SYSCFG0); in r8a66597_clock_disable()
127 if (r8a66597->pdata->on_chip) { in r8a66597_clock_disable()
128 clk_disable_unprepare(r8a66597->clk); in r8a66597_clock_disable()
130 r8a66597_bclr(r8a66597, PLLC, SYSCFG0); in r8a66597_clock_disable()
131 r8a66597_bclr(r8a66597, XCKE, SYSCFG0); in r8a66597_clock_disable()
132 r8a66597_bclr(r8a66597, USBE, SYSCFG0); in r8a66597_clock_disable()
136 static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port) in r8a66597_enable_port() argument
141 r8a66597_bset(r8a66597, val, get_syscfg_reg(port)); in r8a66597_enable_port()
142 r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port)); in r8a66597_enable_port()
144 r8a66597_write(r8a66597, BURST | CPU_ADR_RD_WR, get_dmacfg_reg(port)); in r8a66597_enable_port()
145 r8a66597_bclr(r8a66597, DTCHE, get_intenb_reg(port)); in r8a66597_enable_port()
146 r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port)); in r8a66597_enable_port()
149 static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port) in r8a66597_disable_port() argument
153 r8a66597_write(r8a66597, 0, get_intenb_reg(port)); in r8a66597_disable_port()
154 r8a66597_write(r8a66597, 0, get_intsts_reg(port)); in r8a66597_disable_port()
156 r8a66597_port_power(r8a66597, port, 0); in r8a66597_disable_port()
159 tmp = r8a66597_read(r8a66597, SOFCFG) & EDGESTS; in r8a66597_disable_port()
164 r8a66597_bclr(r8a66597, val, get_syscfg_reg(port)); in r8a66597_disable_port()
165 r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port)); in r8a66597_disable_port()
168 static int enable_controller(struct r8a66597 *r8a66597) in enable_controller() argument
171 u16 vif = r8a66597->pdata->vif ? LDRV : 0; in enable_controller()
172 u16 irq_sense = r8a66597->irq_sense_low ? INTL : 0; in enable_controller()
173 u16 endian = r8a66597->pdata->endian ? BIGEND : 0; in enable_controller()
175 ret = r8a66597_clock_enable(r8a66597); in enable_controller()
179 r8a66597_bset(r8a66597, vif & LDRV, PINCFG); in enable_controller()
180 r8a66597_bset(r8a66597, USBE, SYSCFG0); in enable_controller()
182 r8a66597_bset(r8a66597, BEMPE | NRDYE | BRDYE, INTENB0); in enable_controller()
183 r8a66597_bset(r8a66597, irq_sense & INTL, SOFCFG); in enable_controller()
184 r8a66597_bset(r8a66597, BRDY0, BRDYENB); in enable_controller()
185 r8a66597_bset(r8a66597, BEMP0, BEMPENB); in enable_controller()
187 r8a66597_bset(r8a66597, endian & BIGEND, CFIFOSEL); in enable_controller()
188 r8a66597_bset(r8a66597, endian & BIGEND, D0FIFOSEL); in enable_controller()
189 r8a66597_bset(r8a66597, endian & BIGEND, D1FIFOSEL); in enable_controller()
190 r8a66597_bset(r8a66597, TRNENSEL, SOFCFG); in enable_controller()
192 r8a66597_bset(r8a66597, SIGNE | SACKE, INTENB1); in enable_controller()
194 for (port = 0; port < r8a66597->max_root_hub; port++) in enable_controller()
195 r8a66597_enable_port(r8a66597, port); in enable_controller()
200 static void disable_controller(struct r8a66597 *r8a66597) in disable_controller() argument
205 r8a66597_write(r8a66597, 0, INTENB0); in disable_controller()
206 r8a66597_write(r8a66597, 0, INTENB1); in disable_controller()
207 r8a66597_write(r8a66597, 0, BRDYENB); in disable_controller()
208 r8a66597_write(r8a66597, 0, BEMPENB); in disable_controller()
209 r8a66597_write(r8a66597, 0, NRDYENB); in disable_controller()
212 r8a66597_write(r8a66597, 0, BRDYSTS); in disable_controller()
213 r8a66597_write(r8a66597, 0, NRDYSTS); in disable_controller()
214 r8a66597_write(r8a66597, 0, BEMPSTS); in disable_controller()
216 for (port = 0; port < r8a66597->max_root_hub; port++) in disable_controller()
217 r8a66597_disable_port(r8a66597, port); in disable_controller()
219 r8a66597_clock_disable(r8a66597); in disable_controller()
222 static int get_parent_r8a66597_address(struct r8a66597 *r8a66597, in get_parent_r8a66597_address() argument
247 static void get_port_number(struct r8a66597 *r8a66597, in get_port_number() argument
252 if (*root_port >= r8a66597->max_root_hub) in get_port_number()
281 static void set_child_connect_map(struct r8a66597 *r8a66597, int address) in set_child_connect_map() argument
286 r8a66597->child_connect_map[idx] |= 1 << (address % 32); in set_child_connect_map()
289 static void put_child_connect_map(struct r8a66597 *r8a66597, int address) in put_child_connect_map() argument
294 r8a66597->child_connect_map[idx] &= ~(1 << (address % 32)); in put_child_connect_map()
326 get_urb_to_r8a66597_dev(struct r8a66597 *r8a66597, struct urb *urb) in get_urb_to_r8a66597_dev() argument
329 return &r8a66597->device0; in get_urb_to_r8a66597_dev()
334 static int make_r8a66597_device(struct r8a66597 *r8a66597, in make_r8a66597_device() argument
352 list_add_tail(&dev->device_list, &r8a66597->child_device); in make_r8a66597_device()
354 get_port_number(r8a66597, urb->dev->devpath, in make_r8a66597_device()
357 r8a66597->root_hub[dev->root_port].dev = dev; in make_r8a66597_device()
359 set_devadd_reg(r8a66597, dev->address, in make_r8a66597_device()
361 get_parent_r8a66597_address(r8a66597, urb->dev), in make_r8a66597_device()
368 static u8 alloc_usb_address(struct r8a66597 *r8a66597, struct urb *urb) in alloc_usb_address() argument
378 dev = get_urb_to_r8a66597_dev(r8a66597, urb); in alloc_usb_address()
383 if (r8a66597->address_map & (1 << addr)) in alloc_usb_address()
387 r8a66597->address_map |= 1 << addr; in alloc_usb_address()
389 if (make_r8a66597_device(r8a66597, urb, addr) < 0) in alloc_usb_address()
397 r8a66597->address_map); in alloc_usb_address()
403 static void free_usb_address(struct r8a66597 *r8a66597, in free_usb_address() argument
414 r8a66597->address_map &= ~(1 << dev->address); in free_usb_address()
426 for (port = 0; port < r8a66597->max_root_hub; port++) { in free_usb_address()
427 if (r8a66597->root_hub[port].dev == dev) { in free_usb_address()
428 r8a66597->root_hub[port].dev = NULL; in free_usb_address()
434 static void r8a66597_reg_wait(struct r8a66597 *r8a66597, unsigned long reg, in r8a66597_reg_wait() argument
441 tmp = r8a66597_read(r8a66597, reg); in r8a66597_reg_wait()
452 static void pipe_start(struct r8a66597 *r8a66597, struct r8a66597_pipe *pipe) in pipe_start() argument
456 tmp = r8a66597_read(r8a66597, pipe->pipectr) & PID; in pipe_start()
458 r8a66597_mdfy(r8a66597, PID_NAK, PID, pipe->pipectr); in pipe_start()
459 r8a66597_mdfy(r8a66597, PID_BUF, PID, pipe->pipectr); in pipe_start()
463 static void pipe_stop(struct r8a66597 *r8a66597, struct r8a66597_pipe *pipe) in pipe_stop() argument
467 tmp = r8a66597_read(r8a66597, pipe->pipectr) & PID; in pipe_stop()
469 r8a66597_mdfy(r8a66597, PID_STALL, PID, pipe->pipectr); in pipe_stop()
470 r8a66597_mdfy(r8a66597, PID_NAK, PID, pipe->pipectr); in pipe_stop()
471 r8a66597_reg_wait(r8a66597, pipe->pipectr, PBUSY, 0); in pipe_stop()
475 static void clear_all_buffer(struct r8a66597 *r8a66597, in clear_all_buffer() argument
481 pipe_stop(r8a66597, pipe); in clear_all_buffer()
482 r8a66597_bset(r8a66597, ACLRM, pipe->pipectr); in clear_all_buffer()
483 r8a66597_read(r8a66597, pipe->pipectr); in clear_all_buffer()
484 r8a66597_read(r8a66597, pipe->pipectr); in clear_all_buffer()
485 r8a66597_read(r8a66597, pipe->pipectr); in clear_all_buffer()
486 r8a66597_bclr(r8a66597, ACLRM, pipe->pipectr); in clear_all_buffer()
490 static void r8a66597_pipe_toggle(struct r8a66597 *r8a66597, in r8a66597_pipe_toggle() argument
494 r8a66597_bset(r8a66597, SQSET, pipe->pipectr); in r8a66597_pipe_toggle()
496 r8a66597_bset(r8a66597, SQCLR, pipe->pipectr); in r8a66597_pipe_toggle()
499 static inline unsigned short mbw_value(struct r8a66597 *r8a66597) in mbw_value() argument
501 if (r8a66597->pdata->on_chip) in mbw_value()
508 static inline void cfifo_change(struct r8a66597 *r8a66597, u16 pipenum) in cfifo_change() argument
510 unsigned short mbw = mbw_value(r8a66597); in cfifo_change()
512 r8a66597_mdfy(r8a66597, mbw | pipenum, mbw | CURPIPE, CFIFOSEL); in cfifo_change()
513 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, pipenum); in cfifo_change()
517 static inline void fifo_change_from_pipe(struct r8a66597 *r8a66597, in fifo_change_from_pipe() argument
520 unsigned short mbw = mbw_value(r8a66597); in fifo_change_from_pipe()
522 cfifo_change(r8a66597, 0); in fifo_change_from_pipe()
523 r8a66597_mdfy(r8a66597, mbw | 0, mbw | CURPIPE, D0FIFOSEL); in fifo_change_from_pipe()
524 r8a66597_mdfy(r8a66597, mbw | 0, mbw | CURPIPE, D1FIFOSEL); in fifo_change_from_pipe()
526 r8a66597_mdfy(r8a66597, mbw | pipe->info.pipenum, mbw | CURPIPE, in fifo_change_from_pipe()
528 r8a66597_reg_wait(r8a66597, pipe->fifosel, CURPIPE, pipe->info.pipenum); in fifo_change_from_pipe()
541 static u16 get_urb_to_r8a66597_addr(struct r8a66597 *r8a66597, struct urb *urb) in get_urb_to_r8a66597_addr() argument
543 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in get_urb_to_r8a66597_addr()
558 static void pipe_toggle_set(struct r8a66597 *r8a66597, in pipe_toggle_set() argument
562 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in pipe_toggle_set()
576 static void pipe_toggle_save(struct r8a66597 *r8a66597, in pipe_toggle_save() argument
580 if (r8a66597_read(r8a66597, pipe->pipectr) & SQMON) in pipe_toggle_save()
581 pipe_toggle_set(r8a66597, pipe, urb, 1); in pipe_toggle_save()
583 pipe_toggle_set(r8a66597, pipe, urb, 0); in pipe_toggle_save()
587 static void pipe_toggle_restore(struct r8a66597 *r8a66597, in pipe_toggle_restore() argument
591 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in pipe_toggle_restore()
598 r8a66597_pipe_toggle(r8a66597, pipe, *toggle & (1 << endpoint)); in pipe_toggle_restore()
602 static void pipe_buffer_setting(struct r8a66597 *r8a66597, in pipe_buffer_setting() argument
610 r8a66597_bset(r8a66597, ACLRM, get_pipectr_addr(info->pipenum)); in pipe_buffer_setting()
611 r8a66597_bclr(r8a66597, ACLRM, get_pipectr_addr(info->pipenum)); in pipe_buffer_setting()
612 r8a66597_write(r8a66597, info->pipenum, PIPESEL); in pipe_buffer_setting()
618 r8a66597_write(r8a66597, val, PIPECFG); in pipe_buffer_setting()
620 r8a66597_write(r8a66597, (info->buf_bsize << 10) | (info->bufnum), in pipe_buffer_setting()
622 r8a66597_write(r8a66597, make_devsel(info->address) | info->maxpacket, in pipe_buffer_setting()
624 r8a66597_write(r8a66597, info->interval, PIPEPERI); in pipe_buffer_setting()
628 static void pipe_setting(struct r8a66597 *r8a66597, struct r8a66597_td *td) in pipe_setting() argument
635 cfifo_change(r8a66597, 0); in pipe_setting()
636 pipe_buffer_setting(r8a66597, info); in pipe_setting()
641 r8a66597_pipe_toggle(r8a66597, td->pipe, 0); in pipe_setting()
642 pipe_toggle_set(r8a66597, td->pipe, urb, 0); in pipe_setting()
643 clear_all_buffer(r8a66597, td->pipe); in pipe_setting()
647 pipe_toggle_restore(r8a66597, td->pipe, urb); in pipe_setting()
652 static u16 get_empty_pipenum(struct r8a66597 *r8a66597, in get_empty_pipenum() argument
689 if (r8a66597->pipe_cnt[min] > r8a66597->pipe_cnt[array[i]]) in get_empty_pipenum()
753 static void enable_r8a66597_pipe_dma(struct r8a66597 *r8a66597, in enable_r8a66597_pipe_dma() argument
760 unsigned short mbw = mbw_value(r8a66597); in enable_r8a66597_pipe_dma()
763 if (r8a66597->pdata->on_chip) in enable_r8a66597_pipe_dma()
768 if ((r8a66597->dma_map & (1 << i)) != 0) in enable_r8a66597_pipe_dma()
778 r8a66597->dma_map |= 1 << i; in enable_r8a66597_pipe_dma()
782 cfifo_change(r8a66597, 0); in enable_r8a66597_pipe_dma()
783 r8a66597_mdfy(r8a66597, mbw | pipe->info.pipenum, in enable_r8a66597_pipe_dma()
786 r8a66597_reg_wait(r8a66597, pipe->fifosel, CURPIPE, in enable_r8a66597_pipe_dma()
788 r8a66597_bset(r8a66597, BCLR, pipe->fifoctr); in enable_r8a66597_pipe_dma()
795 static void enable_r8a66597_pipe(struct r8a66597 *r8a66597, struct urb *urb, in enable_r8a66597_pipe() argument
799 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in enable_r8a66597_pipe()
806 r8a66597->pipe_cnt[pipe->info.pipenum]++; in enable_r8a66597_pipe()
809 enable_r8a66597_pipe_dma(r8a66597, dev, pipe, urb); in enable_r8a66597_pipe()
812 static void r8a66597_urb_done(struct r8a66597 *r8a66597, struct urb *urb, in r8a66597_urb_done() argument
814 __releases(r8a66597->lock) in r8a66597_urb_done()
815 __acquires(r8a66597->lock) in r8a66597_urb_done()
826 usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), urb); in r8a66597_urb_done()
827 spin_unlock(&r8a66597->lock); in r8a66597_urb_done()
828 usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb, status); in r8a66597_urb_done()
829 spin_lock(&r8a66597->lock); in r8a66597_urb_done()
833 static void force_dequeue(struct r8a66597 *r8a66597, u16 pipenum, u16 address) in force_dequeue() argument
837 struct list_head *list = &r8a66597->pipe_queue[pipenum]; in force_dequeue()
851 r8a66597_urb_done(r8a66597, urb, -ENODEV); in force_dequeue()
858 static void disable_r8a66597_pipe_all(struct r8a66597 *r8a66597, in disable_r8a66597_pipe_all() argument
873 force_dequeue(r8a66597, 0, dev->address); in disable_r8a66597_pipe_all()
876 r8a66597->pipe_cnt[pipenum] -= dev->pipe_cnt[pipenum]; in disable_r8a66597_pipe_all()
878 force_dequeue(r8a66597, pipenum, dev->address); in disable_r8a66597_pipe_all()
883 r8a66597->dma_map &= ~(dev->dma_map); in disable_r8a66597_pipe_all()
933 static void init_pipe_info(struct r8a66597 *r8a66597, struct urb *urb, in init_pipe_info() argument
939 info.pipenum = get_empty_pipenum(r8a66597, ep); in init_pipe_info()
940 info.address = get_urb_to_r8a66597_addr(r8a66597, urb); in init_pipe_info()
958 enable_r8a66597_pipe(r8a66597, urb, hep, &info); in init_pipe_info()
961 static void init_pipe_config(struct r8a66597 *r8a66597, struct urb *urb) in init_pipe_config() argument
965 dev = get_urb_to_r8a66597_dev(r8a66597, urb); in init_pipe_config()
969 static void pipe_irq_enable(struct r8a66597 *r8a66597, struct urb *urb, in pipe_irq_enable() argument
973 enable_irq_empty(r8a66597, pipenum); in pipe_irq_enable()
975 enable_irq_ready(r8a66597, pipenum); in pipe_irq_enable()
978 enable_irq_nrdy(r8a66597, pipenum); in pipe_irq_enable()
981 static void pipe_irq_disable(struct r8a66597 *r8a66597, u16 pipenum) in pipe_irq_disable() argument
983 disable_irq_ready(r8a66597, pipenum); in pipe_irq_disable()
984 disable_irq_nrdy(r8a66597, pipenum); in pipe_irq_disable()
987 static void r8a66597_root_hub_start_polling(struct r8a66597 *r8a66597) in r8a66597_root_hub_start_polling() argument
989 mod_timer(&r8a66597->rh_timer, in r8a66597_root_hub_start_polling()
993 static void start_root_hub_sampling(struct r8a66597 *r8a66597, int port, in start_root_hub_sampling() argument
996 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in start_root_hub_sampling()
998 rh->old_syssts = r8a66597_read(r8a66597, get_syssts_reg(port)) & LNST; in start_root_hub_sampling()
1006 r8a66597_root_hub_start_polling(r8a66597); in start_root_hub_sampling()
1010 static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port, in r8a66597_check_syssts() argument
1012 __releases(r8a66597->lock) in r8a66597_check_syssts()
1013 __acquires(r8a66597->lock) in r8a66597_check_syssts()
1016 r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port)); in r8a66597_check_syssts()
1017 r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port)); in r8a66597_check_syssts()
1020 r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port)); in r8a66597_check_syssts()
1022 r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port)); in r8a66597_check_syssts()
1024 r8a66597_write(r8a66597, ~DTCH, get_intsts_reg(port)); in r8a66597_check_syssts()
1025 r8a66597_bset(r8a66597, DTCHE, get_intenb_reg(port)); in r8a66597_check_syssts()
1027 if (r8a66597->bus_suspended) in r8a66597_check_syssts()
1028 usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); in r8a66597_check_syssts()
1031 spin_unlock(&r8a66597->lock); in r8a66597_check_syssts()
1032 usb_hcd_poll_rh_status(r8a66597_to_hcd(r8a66597)); in r8a66597_check_syssts()
1033 spin_lock(&r8a66597->lock); in r8a66597_check_syssts()
1037 static void r8a66597_usb_connect(struct r8a66597 *r8a66597, int port) in r8a66597_usb_connect() argument
1039 u16 speed = get_rh_usb_speed(r8a66597, port); in r8a66597_usb_connect()
1040 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_usb_connect()
1053 static void r8a66597_usb_disconnect(struct r8a66597 *r8a66597, int port) in r8a66597_usb_disconnect() argument
1055 struct r8a66597_device *dev = r8a66597->root_hub[port].dev; in r8a66597_usb_disconnect()
1057 disable_r8a66597_pipe_all(r8a66597, dev); in r8a66597_usb_disconnect()
1058 free_usb_address(r8a66597, dev, 0); in r8a66597_usb_disconnect()
1060 start_root_hub_sampling(r8a66597, port, 0); in r8a66597_usb_disconnect()
1064 static void prepare_setup_packet(struct r8a66597 *r8a66597, in prepare_setup_packet() argument
1071 r8a66597_write(r8a66597, make_devsel(td->address) | td->maxpacket, in prepare_setup_packet()
1073 r8a66597_write(r8a66597, ~(SIGN | SACK), INTSTS1); in prepare_setup_packet()
1076 r8a66597_write(r8a66597, le16_to_cpu(p[i]), setup_addr); in prepare_setup_packet()
1079 r8a66597_write(r8a66597, SUREQ, DCPCTR); in prepare_setup_packet()
1083 static void prepare_packet_read(struct r8a66597 *r8a66597, in prepare_packet_read() argument
1089 r8a66597_bclr(r8a66597, R8A66597_DIR, DCPCFG); in prepare_packet_read()
1090 r8a66597_mdfy(r8a66597, 0, ISEL | CURPIPE, CFIFOSEL); in prepare_packet_read()
1091 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0); in prepare_packet_read()
1093 r8a66597_pipe_toggle(r8a66597, td->pipe, 1); in prepare_packet_read()
1094 r8a66597_write(r8a66597, BCLR, CFIFOCTR); in prepare_packet_read()
1096 pipe_irq_disable(r8a66597, td->pipenum); in prepare_packet_read()
1097 pipe_start(r8a66597, td->pipe); in prepare_packet_read()
1098 pipe_irq_enable(r8a66597, urb, td->pipenum); in prepare_packet_read()
1101 pipe_irq_disable(r8a66597, td->pipenum); in prepare_packet_read()
1102 pipe_setting(r8a66597, td); in prepare_packet_read()
1103 pipe_stop(r8a66597, td->pipe); in prepare_packet_read()
1104 r8a66597_write(r8a66597, ~(1 << td->pipenum), BRDYSTS); in prepare_packet_read()
1107 r8a66597_write(r8a66597, TRCLR, in prepare_packet_read()
1109 r8a66597_write(r8a66597, in prepare_packet_read()
1114 r8a66597_bset(r8a66597, TRENB, in prepare_packet_read()
1118 pipe_start(r8a66597, td->pipe); in prepare_packet_read()
1119 pipe_irq_enable(r8a66597, urb, td->pipenum); in prepare_packet_read()
1125 static void prepare_packet_write(struct r8a66597 *r8a66597, in prepare_packet_write() argument
1132 pipe_stop(r8a66597, td->pipe); in prepare_packet_write()
1133 r8a66597_bset(r8a66597, R8A66597_DIR, DCPCFG); in prepare_packet_write()
1134 r8a66597_mdfy(r8a66597, ISEL, ISEL | CURPIPE, CFIFOSEL); in prepare_packet_write()
1135 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0); in prepare_packet_write()
1137 r8a66597_pipe_toggle(r8a66597, td->pipe, 1); in prepare_packet_write()
1138 r8a66597_write(r8a66597, BCLR, CFIFOCTR); in prepare_packet_write()
1142 pipe_setting(r8a66597, td); in prepare_packet_write()
1144 r8a66597_bclr(r8a66597, TRENB, td->pipe->pipetre); in prepare_packet_write()
1146 r8a66597_write(r8a66597, ~(1 << td->pipenum), BRDYSTS); in prepare_packet_write()
1148 fifo_change_from_pipe(r8a66597, td->pipe); in prepare_packet_write()
1149 tmp = r8a66597_read(r8a66597, td->pipe->fifoctr); in prepare_packet_write()
1151 pipe_irq_enable(r8a66597, urb, td->pipenum); in prepare_packet_write()
1153 packet_write(r8a66597, td->pipenum); in prepare_packet_write()
1154 pipe_start(r8a66597, td->pipe); in prepare_packet_write()
1158 static void prepare_status_packet(struct r8a66597 *r8a66597, in prepare_status_packet() argument
1163 r8a66597_pipe_toggle(r8a66597, td->pipe, 1); in prepare_status_packet()
1164 pipe_stop(r8a66597, td->pipe); in prepare_status_packet()
1167 r8a66597_bset(r8a66597, R8A66597_DIR, DCPCFG); in prepare_status_packet()
1168 r8a66597_mdfy(r8a66597, ISEL, ISEL | CURPIPE, CFIFOSEL); in prepare_status_packet()
1169 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0); in prepare_status_packet()
1170 r8a66597_write(r8a66597, ~BEMP0, BEMPSTS); in prepare_status_packet()
1171 r8a66597_write(r8a66597, BCLR | BVAL, CFIFOCTR); in prepare_status_packet()
1172 enable_irq_empty(r8a66597, 0); in prepare_status_packet()
1174 r8a66597_bclr(r8a66597, R8A66597_DIR, DCPCFG); in prepare_status_packet()
1175 r8a66597_mdfy(r8a66597, 0, ISEL | CURPIPE, CFIFOSEL); in prepare_status_packet()
1176 r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0); in prepare_status_packet()
1177 r8a66597_write(r8a66597, BCLR, CFIFOCTR); in prepare_status_packet()
1178 enable_irq_ready(r8a66597, 0); in prepare_status_packet()
1180 enable_irq_nrdy(r8a66597, 0); in prepare_status_packet()
1181 pipe_start(r8a66597, td->pipe); in prepare_status_packet()
1194 static int start_transfer(struct r8a66597 *r8a66597, struct r8a66597_td *td) in start_transfer() argument
1202 td->urb->setup_packet[2] = alloc_usb_address(r8a66597, in start_transfer()
1207 prepare_setup_packet(r8a66597, td); in start_transfer()
1210 prepare_packet_read(r8a66597, td); in start_transfer()
1213 prepare_packet_write(r8a66597, td); in start_transfer()
1216 prepare_status_packet(r8a66597, td); in start_transfer()
1242 static void set_td_timer(struct r8a66597 *r8a66597, struct r8a66597_td *td) in set_td_timer() argument
1248 if (!list_empty(&r8a66597->pipe_queue[td->pipenum]) && in set_td_timer()
1250 r8a66597->timeout_map |= 1 << td->pipenum; in set_td_timer()
1261 mod_timer(&r8a66597->timers[td->pipenum].td, in set_td_timer()
1267 static void finish_request(struct r8a66597 *r8a66597, struct r8a66597_td *td, in finish_request() argument
1269 __releases(r8a66597->lock) __acquires(r8a66597->lock) in finish_request()
1272 struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); in finish_request()
1274 r8a66597->timeout_map &= ~(1 << pipenum); in finish_request()
1278 r8a66597->address_map &= ~(1 << urb->setup_packet[2]); in finish_request()
1280 pipe_toggle_save(r8a66597, td->pipe, urb); in finish_request()
1285 if (!list_empty(&r8a66597->pipe_queue[pipenum])) in finish_request()
1292 r8a66597_urb_done(r8a66597, urb, status); in finish_request()
1296 td = r8a66597_get_td(r8a66597, pipenum); in finish_request()
1300 start_transfer(r8a66597, td); in finish_request()
1301 set_td_timer(r8a66597, td); in finish_request()
1305 static void packet_read(struct r8a66597 *r8a66597, u16 pipenum) in packet_read() argument
1310 struct r8a66597_td *td = r8a66597_get_td(r8a66597, pipenum); in packet_read()
1319 fifo_change_from_pipe(r8a66597, td->pipe); in packet_read()
1320 tmp = r8a66597_read(r8a66597, td->pipe->fifoctr); in packet_read()
1322 pipe_stop(r8a66597, td->pipe); in packet_read()
1323 pipe_irq_disable(r8a66597, pipenum); in packet_read()
1325 finish_request(r8a66597, td, pipenum, td->urb, -EPIPE); in packet_read()
1364 pipe_stop(r8a66597, td->pipe); in packet_read()
1365 pipe_irq_disable(r8a66597, pipenum); in packet_read()
1372 r8a66597_write(r8a66597, BCLR, td->pipe->fifoctr); in packet_read()
1374 r8a66597_read_fifo(r8a66597, td->pipe->fifoaddr, in packet_read()
1379 finish_request(r8a66597, td, pipenum, urb, status); in packet_read()
1382 static void packet_write(struct r8a66597 *r8a66597, u16 pipenum) in packet_write() argument
1387 struct r8a66597_td *td = r8a66597_get_td(r8a66597, pipenum); in packet_write()
1394 fifo_change_from_pipe(r8a66597, td->pipe); in packet_write()
1395 tmp = r8a66597_read(r8a66597, td->pipe->fifoctr); in packet_write()
1397 pipe_stop(r8a66597, td->pipe); in packet_write()
1398 pipe_irq_disable(r8a66597, pipenum); in packet_write()
1400 finish_request(r8a66597, td, pipenum, urb, -EPIPE); in packet_write()
1419 r8a66597_write(r8a66597, ~(1 << pipenum), BEMPSTS); in packet_write()
1421 r8a66597_write_fifo(r8a66597, td->pipe, buf, size); in packet_write()
1423 r8a66597_write(r8a66597, BVAL, td->pipe->fifoctr); in packet_write()
1436 disable_irq_ready(r8a66597, pipenum); in packet_write()
1437 enable_irq_empty(r8a66597, pipenum); in packet_write()
1439 enable_irq_nrdy(r8a66597, pipenum); in packet_write()
1441 pipe_irq_enable(r8a66597, urb, pipenum); in packet_write()
1445 static void check_next_phase(struct r8a66597 *r8a66597, int status) in check_next_phase() argument
1447 struct r8a66597_td *td = r8a66597_get_td(r8a66597, 0); in check_next_phase()
1475 finish_request(r8a66597, td, 0, urb, status); in check_next_phase()
1477 start_transfer(r8a66597, td); in check_next_phase()
1480 static int get_urb_error(struct r8a66597 *r8a66597, u16 pipenum) in get_urb_error() argument
1482 struct r8a66597_td *td = r8a66597_get_td(r8a66597, pipenum); in get_urb_error()
1485 u16 pid = r8a66597_read(r8a66597, td->pipe->pipectr) & PID; in get_urb_error()
1495 static void irq_pipe_ready(struct r8a66597 *r8a66597) in irq_pipe_ready() argument
1502 mask = r8a66597_read(r8a66597, BRDYSTS) in irq_pipe_ready()
1503 & r8a66597_read(r8a66597, BRDYENB); in irq_pipe_ready()
1504 r8a66597_write(r8a66597, ~mask, BRDYSTS); in irq_pipe_ready()
1506 td = r8a66597_get_td(r8a66597, 0); in irq_pipe_ready()
1508 packet_read(r8a66597, 0); in irq_pipe_ready()
1510 pipe_irq_disable(r8a66597, 0); in irq_pipe_ready()
1511 check_next_phase(r8a66597, 0); in irq_pipe_ready()
1517 td = r8a66597_get_td(r8a66597, pipenum); in irq_pipe_ready()
1522 packet_read(r8a66597, pipenum); in irq_pipe_ready()
1524 packet_write(r8a66597, pipenum); in irq_pipe_ready()
1529 static void irq_pipe_empty(struct r8a66597 *r8a66597) in irq_pipe_empty() argument
1537 mask = r8a66597_read(r8a66597, BEMPSTS) in irq_pipe_empty()
1538 & r8a66597_read(r8a66597, BEMPENB); in irq_pipe_empty()
1539 r8a66597_write(r8a66597, ~mask, BEMPSTS); in irq_pipe_empty()
1541 cfifo_change(r8a66597, 0); in irq_pipe_empty()
1542 td = r8a66597_get_td(r8a66597, 0); in irq_pipe_empty()
1544 disable_irq_empty(r8a66597, 0); in irq_pipe_empty()
1545 check_next_phase(r8a66597, 0); in irq_pipe_empty()
1552 td = r8a66597_get_td(r8a66597, pipenum); in irq_pipe_empty()
1556 tmp = r8a66597_read(r8a66597, td->pipe->pipectr); in irq_pipe_empty()
1558 disable_irq_empty(r8a66597, pipenum); in irq_pipe_empty()
1559 pipe_irq_disable(r8a66597, pipenum); in irq_pipe_empty()
1560 finish_request(r8a66597, td, pipenum, td->urb, in irq_pipe_empty()
1567 static void irq_pipe_nrdy(struct r8a66597 *r8a66597) in irq_pipe_nrdy() argument
1574 mask = r8a66597_read(r8a66597, NRDYSTS) in irq_pipe_nrdy()
1575 & r8a66597_read(r8a66597, NRDYENB); in irq_pipe_nrdy()
1576 r8a66597_write(r8a66597, ~mask, NRDYSTS); in irq_pipe_nrdy()
1578 cfifo_change(r8a66597, 0); in irq_pipe_nrdy()
1579 status = get_urb_error(r8a66597, 0); in irq_pipe_nrdy()
1580 pipe_irq_disable(r8a66597, 0); in irq_pipe_nrdy()
1581 check_next_phase(r8a66597, status); in irq_pipe_nrdy()
1588 td = r8a66597_get_td(r8a66597, pipenum); in irq_pipe_nrdy()
1592 status = get_urb_error(r8a66597, pipenum); in irq_pipe_nrdy()
1593 pipe_irq_disable(r8a66597, pipenum); in irq_pipe_nrdy()
1594 pipe_stop(r8a66597, td->pipe); in irq_pipe_nrdy()
1595 finish_request(r8a66597, td, pipenum, td->urb, status); in irq_pipe_nrdy()
1602 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_irq() local
1608 spin_lock(&r8a66597->lock); in r8a66597_irq()
1610 intsts0 = r8a66597_read(r8a66597, INTSTS0); in r8a66597_irq()
1611 intsts1 = r8a66597_read(r8a66597, INTSTS1); in r8a66597_irq()
1612 intsts2 = r8a66597_read(r8a66597, INTSTS2); in r8a66597_irq()
1613 intenb0 = r8a66597_read(r8a66597, INTENB0); in r8a66597_irq()
1614 intenb1 = r8a66597_read(r8a66597, INTENB1); in r8a66597_irq()
1615 intenb2 = r8a66597_read(r8a66597, INTENB2); in r8a66597_irq()
1622 r8a66597_write(r8a66597, ~ATTCH, INTSTS2); in r8a66597_irq()
1623 r8a66597_bclr(r8a66597, ATTCHE, INTENB2); in r8a66597_irq()
1626 start_root_hub_sampling(r8a66597, 1, 1); in r8a66597_irq()
1629 r8a66597_write(r8a66597, ~DTCH, INTSTS2); in r8a66597_irq()
1630 r8a66597_bclr(r8a66597, DTCHE, INTENB2); in r8a66597_irq()
1631 r8a66597_usb_disconnect(r8a66597, 1); in r8a66597_irq()
1634 r8a66597_write(r8a66597, ~BCHG, INTSTS2); in r8a66597_irq()
1635 r8a66597_bclr(r8a66597, BCHGE, INTENB2); in r8a66597_irq()
1636 usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); in r8a66597_irq()
1642 r8a66597_write(r8a66597, ~ATTCH, INTSTS1); in r8a66597_irq()
1643 r8a66597_bclr(r8a66597, ATTCHE, INTENB1); in r8a66597_irq()
1646 start_root_hub_sampling(r8a66597, 0, 1); in r8a66597_irq()
1649 r8a66597_write(r8a66597, ~DTCH, INTSTS1); in r8a66597_irq()
1650 r8a66597_bclr(r8a66597, DTCHE, INTENB1); in r8a66597_irq()
1651 r8a66597_usb_disconnect(r8a66597, 0); in r8a66597_irq()
1654 r8a66597_write(r8a66597, ~BCHG, INTSTS1); in r8a66597_irq()
1655 r8a66597_bclr(r8a66597, BCHGE, INTENB1); in r8a66597_irq()
1656 usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); in r8a66597_irq()
1660 r8a66597_write(r8a66597, ~SIGN, INTSTS1); in r8a66597_irq()
1661 status = get_urb_error(r8a66597, 0); in r8a66597_irq()
1662 check_next_phase(r8a66597, status); in r8a66597_irq()
1665 r8a66597_write(r8a66597, ~SACK, INTSTS1); in r8a66597_irq()
1666 check_next_phase(r8a66597, 0); in r8a66597_irq()
1671 irq_pipe_ready(r8a66597); in r8a66597_irq()
1673 irq_pipe_empty(r8a66597); in r8a66597_irq()
1675 irq_pipe_nrdy(r8a66597); in r8a66597_irq()
1678 spin_unlock(&r8a66597->lock); in r8a66597_irq()
1683 static void r8a66597_root_hub_control(struct r8a66597 *r8a66597, int port) in r8a66597_root_hub_control() argument
1686 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_root_hub_control()
1691 tmp = r8a66597_read(r8a66597, dvstctr_reg); in r8a66597_root_hub_control()
1693 r8a66597_mdfy(r8a66597, UACT, USBRST | UACT, in r8a66597_root_hub_control()
1695 r8a66597_root_hub_start_polling(r8a66597); in r8a66597_root_hub_control()
1697 r8a66597_usb_connect(r8a66597, port); in r8a66597_root_hub_control()
1701 r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port)); in r8a66597_root_hub_control()
1702 r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port)); in r8a66597_root_hub_control()
1706 tmp = r8a66597_read(r8a66597, get_syssts_reg(port)) & LNST; in r8a66597_root_hub_control()
1710 r8a66597_check_syssts(r8a66597, port, tmp); in r8a66597_root_hub_control()
1712 r8a66597_root_hub_start_polling(r8a66597); in r8a66597_root_hub_control()
1716 r8a66597_root_hub_start_polling(r8a66597); in r8a66597_root_hub_control()
1724 struct r8a66597 *r8a66597 = timers->r8a66597; in r8a66597_interval_timer() local
1729 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_interval_timer()
1732 if (!(r8a66597->interval_map & (1 << pipenum))) in r8a66597_interval_timer()
1734 if (timer_pending(&r8a66597->timers[pipenum].interval)) in r8a66597_interval_timer()
1737 td = r8a66597_get_td(r8a66597, pipenum); in r8a66597_interval_timer()
1739 start_transfer(r8a66597, td); in r8a66597_interval_timer()
1742 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_interval_timer()
1748 struct r8a66597 *r8a66597 = timers->r8a66597; in r8a66597_td_timer() local
1754 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_td_timer()
1756 if (!(r8a66597->timeout_map & (1 << pipenum))) in r8a66597_td_timer()
1758 if (timer_pending(&r8a66597->timers[pipenum].td)) in r8a66597_td_timer()
1761 td = r8a66597_get_td(r8a66597, pipenum); in r8a66597_td_timer()
1763 r8a66597->timeout_map &= ~(1 << pipenum); in r8a66597_td_timer()
1768 set_td_timer(r8a66597, td); in r8a66597_td_timer()
1773 pipe_stop(r8a66597, pipe); in r8a66597_td_timer()
1779 &r8a66597->pipe_queue[pipenum]); in r8a66597_td_timer()
1780 new_td = r8a66597_get_td(r8a66597, pipenum); in r8a66597_td_timer()
1788 start_transfer(r8a66597, new_td); in r8a66597_td_timer()
1791 r8a66597->timeout_map &= ~(1 << pipenum); in r8a66597_td_timer()
1793 set_td_timer(r8a66597, new_td); in r8a66597_td_timer()
1796 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_td_timer()
1801 struct r8a66597 *r8a66597 = from_timer(r8a66597, t, rh_timer); in r8a66597_timer() local
1805 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_timer()
1807 for (port = 0; port < r8a66597->max_root_hub; port++) in r8a66597_timer()
1808 r8a66597_root_hub_control(r8a66597, port); in r8a66597_timer()
1810 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_timer()
1813 static int check_pipe_config(struct r8a66597 *r8a66597, struct urb *urb) in check_pipe_config() argument
1815 struct r8a66597_device *dev = get_urb_to_r8a66597_dev(r8a66597, urb); in check_pipe_config()
1826 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_start() local
1829 return enable_controller(r8a66597); in r8a66597_start()
1834 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_stop() local
1836 disable_controller(r8a66597); in r8a66597_stop()
1839 static void set_address_zero(struct r8a66597 *r8a66597, struct urb *urb) in set_address_zero() argument
1845 get_port_number(r8a66597, urb->dev->devpath, in set_address_zero()
1847 set_devadd_reg(r8a66597, 0, in set_address_zero()
1849 get_parent_r8a66597_address(r8a66597, urb->dev), in set_address_zero()
1854 static struct r8a66597_td *r8a66597_make_td(struct r8a66597 *r8a66597, in r8a66597_make_td() argument
1869 td->address = get_urb_to_r8a66597_addr(r8a66597, urb); in r8a66597_make_td()
1888 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_urb_enqueue() local
1893 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_urb_enqueue()
1894 if (!get_urb_to_r8a66597_dev(r8a66597, urb)) { in r8a66597_urb_enqueue()
1912 init_pipe_info(r8a66597, urb, hep, &hep->desc); in r8a66597_urb_enqueue()
1915 if (unlikely(check_pipe_config(r8a66597, urb))) in r8a66597_urb_enqueue()
1916 init_pipe_config(r8a66597, urb); in r8a66597_urb_enqueue()
1918 set_address_zero(r8a66597, urb); in r8a66597_urb_enqueue()
1919 td = r8a66597_make_td(r8a66597, urb, hep); in r8a66597_urb_enqueue()
1924 if (list_empty(&r8a66597->pipe_queue[td->pipenum])) in r8a66597_urb_enqueue()
1926 list_add_tail(&td->queue, &r8a66597->pipe_queue[td->pipenum]); in r8a66597_urb_enqueue()
1931 r8a66597->interval_map |= 1 << td->pipenum; in r8a66597_urb_enqueue()
1932 mod_timer(&r8a66597->timers[td->pipenum].interval, in r8a66597_urb_enqueue()
1936 ret = start_transfer(r8a66597, td); in r8a66597_urb_enqueue()
1943 set_td_timer(r8a66597, td); in r8a66597_urb_enqueue()
1949 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_urb_enqueue()
1956 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_urb_dequeue() local
1961 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_urb_dequeue()
1968 pipe_stop(r8a66597, td->pipe); in r8a66597_urb_dequeue()
1969 pipe_irq_disable(r8a66597, td->pipenum); in r8a66597_urb_dequeue()
1970 disable_irq_empty(r8a66597, td->pipenum); in r8a66597_urb_dequeue()
1971 finish_request(r8a66597, td, td->pipenum, urb, status); in r8a66597_urb_dequeue()
1974 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_urb_dequeue()
1980 __acquires(r8a66597->lock) in r8a66597_endpoint_disable()
1981 __releases(r8a66597->lock) in r8a66597_endpoint_disable()
1983 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_endpoint_disable() local
1994 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_endpoint_disable()
1998 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_endpoint_disable()
2002 pipe_stop(r8a66597, pipe); in r8a66597_endpoint_disable()
2003 pipe_irq_disable(r8a66597, pipenum); in r8a66597_endpoint_disable()
2004 disable_irq_empty(r8a66597, pipenum); in r8a66597_endpoint_disable()
2005 td = r8a66597_get_td(r8a66597, pipenum); in r8a66597_endpoint_disable()
2008 finish_request(r8a66597, td, pipenum, urb, -ESHUTDOWN); in r8a66597_endpoint_disable()
2011 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_endpoint_disable()
2016 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_get_frame() local
2017 return r8a66597_read(r8a66597, FRMNUM) & 0x03FF; in r8a66597_get_frame()
2035 static struct r8a66597_device *get_r8a66597_device(struct r8a66597 *r8a66597, in get_r8a66597_device() argument
2039 struct list_head *list = &r8a66597->child_device; in get_r8a66597_device()
2052 static void update_usb_address_map(struct r8a66597 *r8a66597, in update_usb_address_map() argument
2061 diff = r8a66597->child_connect_map[i] ^ map[i]; in update_usb_address_map()
2071 set_child_connect_map(r8a66597, addr); in update_usb_address_map()
2075 spin_lock_irqsave(&r8a66597->lock, flags); in update_usb_address_map()
2076 dev = get_r8a66597_device(r8a66597, addr); in update_usb_address_map()
2077 disable_r8a66597_pipe_all(r8a66597, dev); in update_usb_address_map()
2078 free_usb_address(r8a66597, dev, 0); in update_usb_address_map()
2079 put_child_connect_map(r8a66597, addr); in update_usb_address_map()
2080 spin_unlock_irqrestore(&r8a66597->lock, flags); in update_usb_address_map()
2086 static void r8a66597_check_detect_child(struct r8a66597 *r8a66597, in r8a66597_check_detect_child() argument
2098 update_usb_address_map(r8a66597, bus->root_hub, now_map); in r8a66597_check_detect_child()
2105 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_hub_status_data() local
2109 r8a66597_check_detect_child(r8a66597, hcd); in r8a66597_hub_status_data()
2111 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_hub_status_data()
2115 for (i = 0; i < r8a66597->max_root_hub; i++) { in r8a66597_hub_status_data()
2116 if (r8a66597->root_hub[i].port & 0xffff0000) in r8a66597_hub_status_data()
2120 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_hub_status_data()
2125 static void r8a66597_hub_descriptor(struct r8a66597 *r8a66597, in r8a66597_hub_descriptor() argument
2130 desc->bNbrPorts = r8a66597->max_root_hub; in r8a66597_hub_descriptor()
2136 ((1 << r8a66597->max_root_hub) - 1) << 1; in r8a66597_hub_descriptor()
2143 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_hub_control() local
2146 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_hub_control()
2151 spin_lock_irqsave(&r8a66597->lock, flags); in r8a66597_hub_control()
2164 if (wIndex > r8a66597->max_root_hub) in r8a66597_hub_control()
2176 r8a66597_port_power(r8a66597, port, 0); in r8a66597_hub_control()
2190 r8a66597_hub_descriptor(r8a66597, in r8a66597_hub_control()
2197 if (wIndex > r8a66597->max_root_hub) in r8a66597_hub_control()
2202 if (wIndex > r8a66597->max_root_hub) in r8a66597_hub_control()
2211 r8a66597_port_power(r8a66597, port, 1); in r8a66597_hub_control()
2219 disable_r8a66597_pipe_all(r8a66597, dev); in r8a66597_hub_control()
2220 free_usb_address(r8a66597, dev, 1); in r8a66597_hub_control()
2222 r8a66597_mdfy(r8a66597, USBRST, USBRST | UACT, in r8a66597_hub_control()
2224 mod_timer(&r8a66597->rh_timer, in r8a66597_hub_control()
2239 spin_unlock_irqrestore(&r8a66597->lock, flags); in r8a66597_hub_control()
2246 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_bus_suspend() local
2249 dev_dbg(&r8a66597->device0.udev->dev, "%s\n", __func__); in r8a66597_bus_suspend()
2251 for (port = 0; port < r8a66597->max_root_hub; port++) { in r8a66597_bus_suspend()
2252 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_bus_suspend()
2259 r8a66597_bclr(r8a66597, UACT, dvstctr_reg); /* suspend */ in r8a66597_bus_suspend()
2264 r8a66597_bset(r8a66597, RWUPE, dvstctr_reg); in r8a66597_bus_suspend()
2265 r8a66597_write(r8a66597, ~BCHG, get_intsts_reg(port)); in r8a66597_bus_suspend()
2266 r8a66597_bset(r8a66597, BCHGE, get_intenb_reg(port)); in r8a66597_bus_suspend()
2270 r8a66597->bus_suspended = 1; in r8a66597_bus_suspend()
2277 struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_bus_resume() local
2280 dev_dbg(&r8a66597->device0.udev->dev, "%s\n", __func__); in r8a66597_bus_resume()
2282 for (port = 0; port < r8a66597->max_root_hub; port++) { in r8a66597_bus_resume()
2283 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_bus_resume()
2292 r8a66597_mdfy(r8a66597, RESUME, RESUME | UACT, dvstctr_reg); in r8a66597_bus_resume()
2294 r8a66597_mdfy(r8a66597, UACT, RESUME | UACT, dvstctr_reg); in r8a66597_bus_resume()
2307 .hcd_priv_size = sizeof(struct r8a66597),
2342 struct r8a66597 *r8a66597 = dev_get_drvdata(dev); in r8a66597_suspend() local
2347 disable_controller(r8a66597); in r8a66597_suspend()
2349 for (port = 0; port < r8a66597->max_root_hub; port++) { in r8a66597_suspend()
2350 struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; in r8a66597_suspend()
2360 struct r8a66597 *r8a66597 = dev_get_drvdata(dev); in r8a66597_resume() local
2361 struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); in r8a66597_resume()
2365 enable_controller(r8a66597); in r8a66597_resume()
2385 struct r8a66597 *r8a66597 = platform_get_drvdata(pdev); in r8a66597_remove() local
2386 struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); in r8a66597_remove()
2388 del_timer_sync(&r8a66597->rh_timer); in r8a66597_remove()
2390 iounmap(r8a66597->reg); in r8a66597_remove()
2391 if (r8a66597->pdata->on_chip) in r8a66597_remove()
2392 clk_put(r8a66597->clk); in r8a66597_remove()
2404 struct r8a66597 *r8a66597; in r8a66597_probe() local
2450 r8a66597 = hcd_to_r8a66597(hcd); in r8a66597_probe()
2451 memset(r8a66597, 0, sizeof(struct r8a66597)); in r8a66597_probe()
2452 platform_set_drvdata(pdev, r8a66597); in r8a66597_probe()
2453 r8a66597->pdata = dev_get_platdata(&pdev->dev); in r8a66597_probe()
2454 r8a66597->irq_sense_low = irq_trigger == IRQF_TRIGGER_LOW; in r8a66597_probe()
2456 if (r8a66597->pdata->on_chip) { in r8a66597_probe()
2458 r8a66597->clk = clk_get(&pdev->dev, clk_name); in r8a66597_probe()
2459 if (IS_ERR(r8a66597->clk)) { in r8a66597_probe()
2462 ret = PTR_ERR(r8a66597->clk); in r8a66597_probe()
2465 r8a66597->max_root_hub = 1; in r8a66597_probe()
2467 r8a66597->max_root_hub = 2; in r8a66597_probe()
2469 spin_lock_init(&r8a66597->lock); in r8a66597_probe()
2470 timer_setup(&r8a66597->rh_timer, r8a66597_timer, 0); in r8a66597_probe()
2471 r8a66597->reg = reg; in r8a66597_probe()
2474 ret = r8a66597_clock_enable(r8a66597); in r8a66597_probe()
2477 disable_controller(r8a66597); in r8a66597_probe()
2480 INIT_LIST_HEAD(&r8a66597->pipe_queue[i]); in r8a66597_probe()
2481 r8a66597->timers[i].r8a66597 = r8a66597; in r8a66597_probe()
2482 timer_setup(&r8a66597->timers[i].td, r8a66597_td_timer, 0); in r8a66597_probe()
2483 timer_setup(&r8a66597->timers[i].interval, in r8a66597_probe()
2486 INIT_LIST_HEAD(&r8a66597->child_device); in r8a66597_probe()
2501 if (r8a66597->pdata->on_chip) in r8a66597_probe()
2502 clk_put(r8a66597->clk); in r8a66597_probe()