Lines Matching refs:ace
224 u16(*in) (struct ace_device * ace, int reg);
225 void (*out) (struct ace_device * ace, int reg, u16 val);
226 void (*datain) (struct ace_device * ace);
227 void (*dataout) (struct ace_device * ace);
231 static u16 ace_in_8(struct ace_device *ace, int reg) in ace_in_8() argument
233 void __iomem *r = ace->baseaddr + reg; in ace_in_8()
237 static void ace_out_8(struct ace_device *ace, int reg, u16 val) in ace_out_8() argument
239 void __iomem *r = ace->baseaddr + reg; in ace_out_8()
244 static void ace_datain_8(struct ace_device *ace) in ace_datain_8() argument
246 void __iomem *r = ace->baseaddr + 0x40; in ace_datain_8()
247 u8 *dst = ace->data_ptr; in ace_datain_8()
251 ace->data_ptr = dst; in ace_datain_8()
254 static void ace_dataout_8(struct ace_device *ace) in ace_dataout_8() argument
256 void __iomem *r = ace->baseaddr + 0x40; in ace_dataout_8()
257 u8 *src = ace->data_ptr; in ace_dataout_8()
261 ace->data_ptr = src; in ace_dataout_8()
272 static u16 ace_in_be16(struct ace_device *ace, int reg) in ace_in_be16() argument
274 return in_be16(ace->baseaddr + reg); in ace_in_be16()
277 static void ace_out_be16(struct ace_device *ace, int reg, u16 val) in ace_out_be16() argument
279 out_be16(ace->baseaddr + reg, val); in ace_out_be16()
282 static void ace_datain_be16(struct ace_device *ace) in ace_datain_be16() argument
285 u16 *dst = ace->data_ptr; in ace_datain_be16()
287 *dst++ = in_le16(ace->baseaddr + 0x40); in ace_datain_be16()
288 ace->data_ptr = dst; in ace_datain_be16()
291 static void ace_dataout_be16(struct ace_device *ace) in ace_dataout_be16() argument
294 u16 *src = ace->data_ptr; in ace_dataout_be16()
296 out_le16(ace->baseaddr + 0x40, *src++); in ace_dataout_be16()
297 ace->data_ptr = src; in ace_dataout_be16()
301 static u16 ace_in_le16(struct ace_device *ace, int reg) in ace_in_le16() argument
303 return in_le16(ace->baseaddr + reg); in ace_in_le16()
306 static void ace_out_le16(struct ace_device *ace, int reg, u16 val) in ace_out_le16() argument
308 out_le16(ace->baseaddr + reg, val); in ace_out_le16()
311 static void ace_datain_le16(struct ace_device *ace) in ace_datain_le16() argument
314 u16 *dst = ace->data_ptr; in ace_datain_le16()
316 *dst++ = in_be16(ace->baseaddr + 0x40); in ace_datain_le16()
317 ace->data_ptr = dst; in ace_datain_le16()
320 static void ace_dataout_le16(struct ace_device *ace) in ace_dataout_le16() argument
323 u16 *src = ace->data_ptr; in ace_dataout_le16()
325 out_be16(ace->baseaddr + 0x40, *src++); in ace_dataout_le16()
326 ace->data_ptr = src; in ace_dataout_le16()
343 static inline u16 ace_in(struct ace_device *ace, int reg) in ace_in() argument
345 return ace->reg_ops->in(ace, reg); in ace_in()
348 static inline u32 ace_in32(struct ace_device *ace, int reg) in ace_in32() argument
350 return ace_in(ace, reg) | (ace_in(ace, reg + 2) << 16); in ace_in32()
353 static inline void ace_out(struct ace_device *ace, int reg, u16 val) in ace_out() argument
355 ace->reg_ops->out(ace, reg, val); in ace_out()
358 static inline void ace_out32(struct ace_device *ace, int reg, u32 val) in ace_out32() argument
360 ace_out(ace, reg, val); in ace_out32()
361 ace_out(ace, reg + 2, val >> 16); in ace_out32()
393 static void ace_dump_regs(struct ace_device *ace) in ace_dump_regs() argument
395 dev_info(ace->dev, in ace_dump_regs()
399 ace_in32(ace, ACE_CTRL), in ace_dump_regs()
400 ace_in(ace, ACE_SECCNTCMD), in ace_dump_regs()
401 ace_in(ace, ACE_VERSION), in ace_dump_regs()
402 ace_in32(ace, ACE_STATUS), in ace_dump_regs()
403 ace_in32(ace, ACE_MPULBA), in ace_dump_regs()
404 ace_in(ace, ACE_BUSMODE), in ace_dump_regs()
405 ace_in32(ace, ACE_ERROR), in ace_dump_regs()
406 ace_in32(ace, ACE_CFGLBA), ace_in(ace, ACE_FATSTAT)); in ace_dump_regs()
446 static inline void ace_fsm_yield(struct ace_device *ace) in ace_fsm_yield() argument
448 dev_dbg(ace->dev, "ace_fsm_yield()\n"); in ace_fsm_yield()
449 tasklet_schedule(&ace->fsm_tasklet); in ace_fsm_yield()
450 ace->fsm_continue_flag = 0; in ace_fsm_yield()
454 static inline void ace_fsm_yieldirq(struct ace_device *ace) in ace_fsm_yieldirq() argument
456 dev_dbg(ace->dev, "ace_fsm_yieldirq()\n"); in ace_fsm_yieldirq()
458 if (!ace->irq) in ace_fsm_yieldirq()
460 tasklet_schedule(&ace->fsm_tasklet); in ace_fsm_yieldirq()
461 ace->fsm_continue_flag = 0; in ace_fsm_yieldirq()
466 struct ace_device *ace = q->queuedata; in ace_has_next_request() local
468 return !list_empty(&ace->rq_list); in ace_has_next_request()
474 struct ace_device *ace = q->queuedata; in ace_get_next_request() local
477 rq = list_first_entry_or_null(&ace->rq_list, struct request, queuelist); in ace_get_next_request()
486 static void ace_fsm_dostate(struct ace_device *ace) in ace_fsm_dostate() argument
494 dev_dbg(ace->dev, "fsm_state=%i, id_req_count=%i\n", in ace_fsm_dostate()
495 ace->fsm_state, ace->id_req_count); in ace_fsm_dostate()
500 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
502 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
503 ace->media_change = 1; in ace_fsm_dostate()
504 set_capacity(ace->gd, 0); in ace_fsm_dostate()
505 dev_info(ace->dev, "No CF in slot\n"); in ace_fsm_dostate()
508 if (ace->req) { in ace_fsm_dostate()
509 blk_mq_end_request(ace->req, BLK_STS_IOERR); in ace_fsm_dostate()
510 ace->req = NULL; in ace_fsm_dostate()
512 while ((req = ace_get_next_request(ace->queue)) != NULL) in ace_fsm_dostate()
516 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
517 ace->id_result = -EIO; in ace_fsm_dostate()
518 while (ace->id_req_count) { in ace_fsm_dostate()
519 complete(&ace->id_completion); in ace_fsm_dostate()
520 ace->id_req_count--; in ace_fsm_dostate()
524 switch (ace->fsm_state) { in ace_fsm_dostate()
527 if (ace->id_req_count || ace_has_next_request(ace->queue)) { in ace_fsm_dostate()
528 ace->fsm_iter_num++; in ace_fsm_dostate()
529 ace->fsm_state = ACE_FSM_STATE_REQ_LOCK; in ace_fsm_dostate()
530 mod_timer(&ace->stall_timer, jiffies + HZ); in ace_fsm_dostate()
531 if (!timer_pending(&ace->stall_timer)) in ace_fsm_dostate()
532 add_timer(&ace->stall_timer); in ace_fsm_dostate()
535 del_timer(&ace->stall_timer); in ace_fsm_dostate()
536 ace->fsm_continue_flag = 0; in ace_fsm_dostate()
540 if (ace_in(ace, ACE_STATUS) & ACE_STATUS_MPULOCK) { in ace_fsm_dostate()
542 ace->fsm_state = ACE_FSM_STATE_WAIT_CFREADY; in ace_fsm_dostate()
547 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
548 ace_out(ace, ACE_CTRL, val | ACE_CTRL_LOCKREQ); in ace_fsm_dostate()
549 ace->fsm_state = ACE_FSM_STATE_WAIT_LOCK; in ace_fsm_dostate()
553 if (ace_in(ace, ACE_STATUS) & ACE_STATUS_MPULOCK) { in ace_fsm_dostate()
555 ace->fsm_state = ACE_FSM_STATE_WAIT_CFREADY; in ace_fsm_dostate()
560 ace_fsm_yield(ace); in ace_fsm_dostate()
564 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
568 ace_fsm_yield(ace); in ace_fsm_dostate()
573 if (ace->id_req_count) in ace_fsm_dostate()
574 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_PREPARE; in ace_fsm_dostate()
576 ace->fsm_state = ACE_FSM_STATE_REQ_PREPARE; in ace_fsm_dostate()
581 ace->fsm_task = ACE_TASK_IDENTIFY; in ace_fsm_dostate()
582 ace->data_ptr = ace->cf_id; in ace_fsm_dostate()
583 ace->data_count = ACE_BUF_PER_SECTOR; in ace_fsm_dostate()
584 ace_out(ace, ACE_SECCNTCMD, ACE_SECCNTCMD_IDENTIFY); in ace_fsm_dostate()
587 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
588 ace_out(ace, ACE_CTRL, val | ACE_CTRL_CFGRESET); in ace_fsm_dostate()
592 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_TRANSFER; in ace_fsm_dostate()
593 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
598 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
600 dev_dbg(ace->dev, "CFBSY set; t=%i iter=%i dc=%i\n", in ace_fsm_dostate()
601 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
602 ace->data_count); in ace_fsm_dostate()
603 ace_fsm_yield(ace); in ace_fsm_dostate()
607 ace_fsm_yield(ace); in ace_fsm_dostate()
612 ace->reg_ops->datain(ace); in ace_fsm_dostate()
613 ace->data_count--; in ace_fsm_dostate()
616 if (ace->data_count != 0) { in ace_fsm_dostate()
617 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
622 dev_dbg(ace->dev, "identify finished\n"); in ace_fsm_dostate()
623 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_COMPLETE; in ace_fsm_dostate()
627 ace_fix_driveid(ace->cf_id); in ace_fsm_dostate()
628 ace_dump_mem(ace->cf_id, 512); /* Debug: Dump out disk ID */ in ace_fsm_dostate()
630 if (ace->data_result) { in ace_fsm_dostate()
632 ace->media_change = 1; in ace_fsm_dostate()
633 set_capacity(ace->gd, 0); in ace_fsm_dostate()
634 dev_err(ace->dev, "error fetching CF id (%i)\n", in ace_fsm_dostate()
635 ace->data_result); in ace_fsm_dostate()
637 ace->media_change = 0; in ace_fsm_dostate()
640 set_capacity(ace->gd, in ace_fsm_dostate()
641 ata_id_u32(ace->cf_id, ATA_ID_LBA_CAPACITY)); in ace_fsm_dostate()
642 dev_info(ace->dev, "capacity: %i sectors\n", in ace_fsm_dostate()
643 ata_id_u32(ace->cf_id, ATA_ID_LBA_CAPACITY)); in ace_fsm_dostate()
647 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
648 ace->id_result = ace->data_result; in ace_fsm_dostate()
649 while (ace->id_req_count) { in ace_fsm_dostate()
650 complete(&ace->id_completion); in ace_fsm_dostate()
651 ace->id_req_count--; in ace_fsm_dostate()
656 req = ace_get_next_request(ace->queue); in ace_fsm_dostate()
658 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
663 dev_dbg(ace->dev, in ace_fsm_dostate()
669 ace->req = req; in ace_fsm_dostate()
670 ace->data_ptr = bio_data(req->bio); in ace_fsm_dostate()
671 ace->data_count = blk_rq_cur_sectors(req) * ACE_BUF_PER_SECTOR; in ace_fsm_dostate()
672 ace_out32(ace, ACE_MPULBA, blk_rq_pos(req) & 0x0FFFFFFF); in ace_fsm_dostate()
677 dev_dbg(ace->dev, "write data\n"); in ace_fsm_dostate()
678 ace->fsm_task = ACE_TASK_WRITE; in ace_fsm_dostate()
679 ace_out(ace, ACE_SECCNTCMD, in ace_fsm_dostate()
683 dev_dbg(ace->dev, "read data\n"); in ace_fsm_dostate()
684 ace->fsm_task = ACE_TASK_READ; in ace_fsm_dostate()
685 ace_out(ace, ACE_SECCNTCMD, in ace_fsm_dostate()
690 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
691 ace_out(ace, ACE_CTRL, val | ACE_CTRL_CFGRESET); in ace_fsm_dostate()
696 ace->fsm_state = ACE_FSM_STATE_REQ_TRANSFER; in ace_fsm_dostate()
697 if (ace->fsm_task == ACE_TASK_READ) in ace_fsm_dostate()
698 ace_fsm_yieldirq(ace); /* wait for data ready */ in ace_fsm_dostate()
703 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
705 dev_dbg(ace->dev, in ace_fsm_dostate()
707 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
708 blk_rq_cur_sectors(ace->req) * 16, in ace_fsm_dostate()
709 ace->data_count, ace->in_irq); in ace_fsm_dostate()
710 ace_fsm_yield(ace); /* need to poll CFBSY bit */ in ace_fsm_dostate()
714 dev_dbg(ace->dev, in ace_fsm_dostate()
716 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
717 blk_rq_cur_sectors(ace->req) * 16, in ace_fsm_dostate()
718 ace->data_count, ace->in_irq); in ace_fsm_dostate()
719 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
724 if (ace->fsm_task == ACE_TASK_WRITE) in ace_fsm_dostate()
725 ace->reg_ops->dataout(ace); in ace_fsm_dostate()
727 ace->reg_ops->datain(ace); in ace_fsm_dostate()
728 ace->data_count--; in ace_fsm_dostate()
731 if (ace->data_count != 0) { in ace_fsm_dostate()
732 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
737 if (blk_update_request(ace->req, BLK_STS_OK, in ace_fsm_dostate()
738 blk_rq_cur_bytes(ace->req))) { in ace_fsm_dostate()
743 ace->data_ptr = bio_data(ace->req->bio); in ace_fsm_dostate()
744 ace->data_count = blk_rq_cur_sectors(ace->req) * 16; in ace_fsm_dostate()
745 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
749 ace->fsm_state = ACE_FSM_STATE_REQ_COMPLETE; in ace_fsm_dostate()
753 ace->req = NULL; in ace_fsm_dostate()
756 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
760 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
767 struct ace_device *ace = (void *)data; in ace_fsm_tasklet() local
770 spin_lock_irqsave(&ace->lock, flags); in ace_fsm_tasklet()
773 ace->fsm_continue_flag = 1; in ace_fsm_tasklet()
774 while (ace->fsm_continue_flag) in ace_fsm_tasklet()
775 ace_fsm_dostate(ace); in ace_fsm_tasklet()
777 spin_unlock_irqrestore(&ace->lock, flags); in ace_fsm_tasklet()
782 struct ace_device *ace = from_timer(ace, t, stall_timer); in ace_stall_timer() local
785 dev_warn(ace->dev, in ace_stall_timer()
787 ace->fsm_state, ace->fsm_task, ace->fsm_iter_num, in ace_stall_timer()
788 ace->data_count); in ace_stall_timer()
789 spin_lock_irqsave(&ace->lock, flags); in ace_stall_timer()
793 mod_timer(&ace->stall_timer, jiffies + HZ); in ace_stall_timer()
796 ace->fsm_continue_flag = 1; in ace_stall_timer()
797 while (ace->fsm_continue_flag) in ace_stall_timer()
798 ace_fsm_dostate(ace); in ace_stall_timer()
800 spin_unlock_irqrestore(&ace->lock, flags); in ace_stall_timer()
806 static int ace_interrupt_checkstate(struct ace_device *ace) in ace_interrupt_checkstate() argument
808 u32 sreg = ace_in32(ace, ACE_STATUS); in ace_interrupt_checkstate()
809 u16 creg = ace_in(ace, ACE_CTRL); in ace_interrupt_checkstate()
814 dev_err(ace->dev, "transfer failure\n"); in ace_interrupt_checkstate()
815 ace_dump_regs(ace); in ace_interrupt_checkstate()
825 struct ace_device *ace = dev_id; in ace_interrupt() local
828 spin_lock(&ace->lock); in ace_interrupt()
829 ace->in_irq = 1; in ace_interrupt()
832 creg = ace_in(ace, ACE_CTRL); in ace_interrupt()
833 ace_out(ace, ACE_CTRL, creg | ACE_CTRL_RESETIRQ); in ace_interrupt()
834 ace_out(ace, ACE_CTRL, creg); in ace_interrupt()
837 if (ace_interrupt_checkstate(ace)) in ace_interrupt()
838 ace->data_result = -EIO; in ace_interrupt()
840 if (ace->fsm_task == 0) { in ace_interrupt()
841 dev_err(ace->dev, in ace_interrupt()
843 ace_in32(ace, ACE_STATUS), ace_in32(ace, ACE_CTRL), in ace_interrupt()
844 ace_in(ace, ACE_SECCNTCMD)); in ace_interrupt()
845 dev_err(ace->dev, "fsm_task=%i fsm_state=%i data_count=%i\n", in ace_interrupt()
846 ace->fsm_task, ace->fsm_state, ace->data_count); in ace_interrupt()
850 ace->fsm_continue_flag = 1; in ace_interrupt()
851 while (ace->fsm_continue_flag) in ace_interrupt()
852 ace_fsm_dostate(ace); in ace_interrupt()
855 ace->in_irq = 0; in ace_interrupt()
856 spin_unlock(&ace->lock); in ace_interrupt()
867 struct ace_device *ace = hctx->queue->queuedata; in ace_queue_rq() local
875 spin_lock_irq(&ace->lock); in ace_queue_rq()
876 list_add_tail(&req->queuelist, &ace->rq_list); in ace_queue_rq()
877 spin_unlock_irq(&ace->lock); in ace_queue_rq()
879 tasklet_schedule(&ace->fsm_tasklet); in ace_queue_rq()
885 struct ace_device *ace = gd->private_data; in ace_check_events() local
886 dev_dbg(ace->dev, "ace_check_events(): %i\n", ace->media_change); in ace_check_events()
888 return ace->media_change ? DISK_EVENT_MEDIA_CHANGE : 0; in ace_check_events()
893 struct ace_device *ace = gd->private_data; in ace_revalidate_disk() local
896 dev_dbg(ace->dev, "ace_revalidate_disk()\n"); in ace_revalidate_disk()
898 if (ace->media_change) { in ace_revalidate_disk()
899 dev_dbg(ace->dev, "requesting cf id and scheduling tasklet\n"); in ace_revalidate_disk()
901 spin_lock_irqsave(&ace->lock, flags); in ace_revalidate_disk()
902 ace->id_req_count++; in ace_revalidate_disk()
903 spin_unlock_irqrestore(&ace->lock, flags); in ace_revalidate_disk()
905 tasklet_schedule(&ace->fsm_tasklet); in ace_revalidate_disk()
906 wait_for_completion(&ace->id_completion); in ace_revalidate_disk()
909 dev_dbg(ace->dev, "revalidate complete\n"); in ace_revalidate_disk()
910 return ace->id_result; in ace_revalidate_disk()
915 struct ace_device *ace = bdev->bd_disk->private_data; in ace_open() local
918 dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1); in ace_open()
921 spin_lock_irqsave(&ace->lock, flags); in ace_open()
922 ace->users++; in ace_open()
923 spin_unlock_irqrestore(&ace->lock, flags); in ace_open()
933 struct ace_device *ace = disk->private_data; in ace_release() local
937 dev_dbg(ace->dev, "ace_release() users=%i\n", ace->users - 1); in ace_release()
940 spin_lock_irqsave(&ace->lock, flags); in ace_release()
941 ace->users--; in ace_release()
942 if (ace->users == 0) { in ace_release()
943 val = ace_in(ace, ACE_CTRL); in ace_release()
944 ace_out(ace, ACE_CTRL, val & ~ACE_CTRL_LOCKREQ); in ace_release()
946 spin_unlock_irqrestore(&ace->lock, flags); in ace_release()
952 struct ace_device *ace = bdev->bd_disk->private_data; in ace_getgeo() local
953 u16 *cf_id = ace->cf_id; in ace_getgeo()
955 dev_dbg(ace->dev, "ace_getgeo()\n"); in ace_getgeo()
980 static int ace_setup(struct ace_device *ace) in ace_setup() argument
986 dev_dbg(ace->dev, "ace_setup(ace=0x%p)\n", ace); in ace_setup()
987 dev_dbg(ace->dev, "physaddr=0x%llx irq=%i\n", in ace_setup()
988 (unsigned long long)ace->physaddr, ace->irq); in ace_setup()
990 spin_lock_init(&ace->lock); in ace_setup()
991 init_completion(&ace->id_completion); in ace_setup()
992 INIT_LIST_HEAD(&ace->rq_list); in ace_setup()
997 ace->baseaddr = ioremap(ace->physaddr, 0x80); in ace_setup()
998 if (!ace->baseaddr) in ace_setup()
1004 tasklet_init(&ace->fsm_tasklet, ace_fsm_tasklet, (unsigned long)ace); in ace_setup()
1005 timer_setup(&ace->stall_timer, ace_stall_timer, 0); in ace_setup()
1010 ace->queue = blk_mq_init_sq_queue(&ace->tag_set, &ace_mq_ops, 2, in ace_setup()
1012 if (IS_ERR(ace->queue)) { in ace_setup()
1013 rc = PTR_ERR(ace->queue); in ace_setup()
1014 ace->queue = NULL; in ace_setup()
1017 ace->queue->queuedata = ace; in ace_setup()
1019 blk_queue_logical_block_size(ace->queue, 512); in ace_setup()
1020 blk_queue_bounce_limit(ace->queue, BLK_BOUNCE_HIGH); in ace_setup()
1025 ace->gd = alloc_disk(ACE_NUM_MINORS); in ace_setup()
1026 if (!ace->gd) in ace_setup()
1029 ace->gd->major = ace_major; in ace_setup()
1030 ace->gd->first_minor = ace->id * ACE_NUM_MINORS; in ace_setup()
1031 ace->gd->fops = &ace_fops; in ace_setup()
1032 ace->gd->events = DISK_EVENT_MEDIA_CHANGE; in ace_setup()
1033 ace->gd->queue = ace->queue; in ace_setup()
1034 ace->gd->private_data = ace; in ace_setup()
1035 snprintf(ace->gd->disk_name, 32, "xs%c", ace->id + 'a'); in ace_setup()
1038 if (ace->bus_width == ACE_BUS_WIDTH_16) { in ace_setup()
1040 ace_out_le16(ace, ACE_BUSMODE, 0x0101); in ace_setup()
1043 if (ace_in_le16(ace, ACE_BUSMODE) == 0x0001) in ace_setup()
1044 ace->reg_ops = &ace_reg_le16_ops; in ace_setup()
1046 ace->reg_ops = &ace_reg_be16_ops; in ace_setup()
1048 ace_out_8(ace, ACE_BUSMODE, 0x00); in ace_setup()
1049 ace->reg_ops = &ace_reg_8_ops; in ace_setup()
1053 version = ace_in(ace, ACE_VERSION); in ace_setup()
1058 ace_out(ace, ACE_CTRL, ACE_CTRL_FORCECFGMODE | in ace_setup()
1062 if (ace->irq) { in ace_setup()
1063 rc = request_irq(ace->irq, ace_interrupt, 0, "systemace", ace); in ace_setup()
1066 dev_err(ace->dev, "request_irq failed\n"); in ace_setup()
1067 ace->irq = 0; in ace_setup()
1072 val = ace_in(ace, ACE_CTRL); in ace_setup()
1074 ace_out(ace, ACE_CTRL, val); in ace_setup()
1077 dev_info(ace->dev, "Xilinx SystemACE revision %i.%i.%i\n", in ace_setup()
1079 dev_dbg(ace->dev, "physaddr 0x%llx, mapped to 0x%p, irq=%i\n", in ace_setup()
1080 (unsigned long long) ace->physaddr, ace->baseaddr, ace->irq); in ace_setup()
1082 ace->media_change = 1; in ace_setup()
1083 ace_revalidate_disk(ace->gd); in ace_setup()
1086 add_disk(ace->gd); in ace_setup()
1092 ace->gd->queue = NULL; in ace_setup()
1093 put_disk(ace->gd); in ace_setup()
1095 blk_cleanup_queue(ace->queue); in ace_setup()
1096 blk_mq_free_tag_set(&ace->tag_set); in ace_setup()
1098 iounmap(ace->baseaddr); in ace_setup()
1100 dev_info(ace->dev, "xsysace: error initializing device at 0x%llx\n", in ace_setup()
1101 (unsigned long long) ace->physaddr); in ace_setup()
1105 static void ace_teardown(struct ace_device *ace) in ace_teardown() argument
1107 if (ace->gd) { in ace_teardown()
1108 del_gendisk(ace->gd); in ace_teardown()
1109 put_disk(ace->gd); in ace_teardown()
1112 if (ace->queue) { in ace_teardown()
1113 blk_cleanup_queue(ace->queue); in ace_teardown()
1114 blk_mq_free_tag_set(&ace->tag_set); in ace_teardown()
1117 tasklet_kill(&ace->fsm_tasklet); in ace_teardown()
1119 if (ace->irq) in ace_teardown()
1120 free_irq(ace->irq, ace); in ace_teardown()
1122 iounmap(ace->baseaddr); in ace_teardown()
1128 struct ace_device *ace; in ace_alloc() local
1138 ace = kzalloc(sizeof(struct ace_device), GFP_KERNEL); in ace_alloc()
1139 if (!ace) { in ace_alloc()
1144 ace->dev = dev; in ace_alloc()
1145 ace->id = id; in ace_alloc()
1146 ace->physaddr = physaddr; in ace_alloc()
1147 ace->irq = irq; in ace_alloc()
1148 ace->bus_width = bus_width; in ace_alloc()
1151 rc = ace_setup(ace); in ace_alloc()
1155 dev_set_drvdata(dev, ace); in ace_alloc()
1160 kfree(ace); in ace_alloc()
1169 struct ace_device *ace = dev_get_drvdata(dev); in ace_free() local
1172 if (ace) { in ace_free()
1173 ace_teardown(ace); in ace_free()
1175 kfree(ace); in ace_free()