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_yieldpoll(struct ace_device *ace) in ace_fsm_yieldpoll() argument
448 tasklet_schedule(&ace->fsm_tasklet); in ace_fsm_yieldpoll()
449 ace->fsm_continue_flag = 0; in ace_fsm_yieldpoll()
452 static inline void ace_fsm_yield(struct ace_device *ace) in ace_fsm_yield() argument
454 dev_dbg(ace->dev, "%s()\n", __func__); in ace_fsm_yield()
455 ace_fsm_yieldpoll(ace); in ace_fsm_yield()
459 static inline void ace_fsm_yieldirq(struct ace_device *ace) in ace_fsm_yieldirq() argument
461 dev_dbg(ace->dev, "ace_fsm_yieldirq()\n"); in ace_fsm_yieldirq()
463 if (ace->irq > 0) in ace_fsm_yieldirq()
464 ace->fsm_continue_flag = 0; in ace_fsm_yieldirq()
466 ace_fsm_yieldpoll(ace); in ace_fsm_yieldirq()
471 struct ace_device *ace = q->queuedata; in ace_has_next_request() local
473 return !list_empty(&ace->rq_list); in ace_has_next_request()
479 struct ace_device *ace = q->queuedata; in ace_get_next_request() local
482 rq = list_first_entry_or_null(&ace->rq_list, struct request, queuelist); in ace_get_next_request()
491 static void ace_fsm_dostate(struct ace_device *ace) in ace_fsm_dostate() argument
499 dev_dbg(ace->dev, "fsm_state=%i, id_req_count=%i\n", in ace_fsm_dostate()
500 ace->fsm_state, ace->id_req_count); in ace_fsm_dostate()
505 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
507 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
508 ace->media_change = 1; in ace_fsm_dostate()
509 set_capacity(ace->gd, 0); in ace_fsm_dostate()
510 dev_info(ace->dev, "No CF in slot\n"); in ace_fsm_dostate()
513 if (ace->req) { in ace_fsm_dostate()
514 blk_mq_end_request(ace->req, BLK_STS_IOERR); in ace_fsm_dostate()
515 ace->req = NULL; in ace_fsm_dostate()
517 while ((req = ace_get_next_request(ace->queue)) != NULL) in ace_fsm_dostate()
521 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
522 ace->id_result = -EIO; in ace_fsm_dostate()
523 while (ace->id_req_count) { in ace_fsm_dostate()
524 complete(&ace->id_completion); in ace_fsm_dostate()
525 ace->id_req_count--; in ace_fsm_dostate()
529 switch (ace->fsm_state) { in ace_fsm_dostate()
532 if (ace->id_req_count || ace_has_next_request(ace->queue)) { in ace_fsm_dostate()
533 ace->fsm_iter_num++; in ace_fsm_dostate()
534 ace->fsm_state = ACE_FSM_STATE_REQ_LOCK; in ace_fsm_dostate()
535 mod_timer(&ace->stall_timer, jiffies + HZ); in ace_fsm_dostate()
536 if (!timer_pending(&ace->stall_timer)) in ace_fsm_dostate()
537 add_timer(&ace->stall_timer); in ace_fsm_dostate()
540 del_timer(&ace->stall_timer); in ace_fsm_dostate()
541 ace->fsm_continue_flag = 0; in ace_fsm_dostate()
545 if (ace_in(ace, ACE_STATUS) & ACE_STATUS_MPULOCK) { in ace_fsm_dostate()
547 ace->fsm_state = ACE_FSM_STATE_WAIT_CFREADY; in ace_fsm_dostate()
552 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
553 ace_out(ace, ACE_CTRL, val | ACE_CTRL_LOCKREQ); in ace_fsm_dostate()
554 ace->fsm_state = ACE_FSM_STATE_WAIT_LOCK; in ace_fsm_dostate()
558 if (ace_in(ace, ACE_STATUS) & ACE_STATUS_MPULOCK) { in ace_fsm_dostate()
560 ace->fsm_state = ACE_FSM_STATE_WAIT_CFREADY; in ace_fsm_dostate()
565 ace_fsm_yield(ace); in ace_fsm_dostate()
569 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
573 ace_fsm_yield(ace); in ace_fsm_dostate()
578 if (ace->id_req_count) in ace_fsm_dostate()
579 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_PREPARE; in ace_fsm_dostate()
581 ace->fsm_state = ACE_FSM_STATE_REQ_PREPARE; in ace_fsm_dostate()
586 ace->fsm_task = ACE_TASK_IDENTIFY; in ace_fsm_dostate()
587 ace->data_ptr = ace->cf_id; in ace_fsm_dostate()
588 ace->data_count = ACE_BUF_PER_SECTOR; in ace_fsm_dostate()
589 ace_out(ace, ACE_SECCNTCMD, ACE_SECCNTCMD_IDENTIFY); in ace_fsm_dostate()
592 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
593 ace_out(ace, ACE_CTRL, val | ACE_CTRL_CFGRESET); in ace_fsm_dostate()
597 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_TRANSFER; in ace_fsm_dostate()
598 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
603 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
605 dev_dbg(ace->dev, "CFBSY set; t=%i iter=%i dc=%i\n", in ace_fsm_dostate()
606 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
607 ace->data_count); in ace_fsm_dostate()
608 ace_fsm_yield(ace); in ace_fsm_dostate()
612 ace_fsm_yield(ace); in ace_fsm_dostate()
617 ace->reg_ops->datain(ace); in ace_fsm_dostate()
618 ace->data_count--; in ace_fsm_dostate()
621 if (ace->data_count != 0) { in ace_fsm_dostate()
622 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
627 dev_dbg(ace->dev, "identify finished\n"); in ace_fsm_dostate()
628 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_COMPLETE; in ace_fsm_dostate()
632 ace_fix_driveid(ace->cf_id); in ace_fsm_dostate()
633 ace_dump_mem(ace->cf_id, 512); /* Debug: Dump out disk ID */ in ace_fsm_dostate()
635 if (ace->data_result) { in ace_fsm_dostate()
637 ace->media_change = 1; in ace_fsm_dostate()
638 set_capacity(ace->gd, 0); in ace_fsm_dostate()
639 dev_err(ace->dev, "error fetching CF id (%i)\n", in ace_fsm_dostate()
640 ace->data_result); in ace_fsm_dostate()
642 ace->media_change = 0; in ace_fsm_dostate()
645 set_capacity(ace->gd, in ace_fsm_dostate()
646 ata_id_u32(ace->cf_id, ATA_ID_LBA_CAPACITY)); in ace_fsm_dostate()
647 dev_info(ace->dev, "capacity: %i sectors\n", in ace_fsm_dostate()
648 ata_id_u32(ace->cf_id, ATA_ID_LBA_CAPACITY)); in ace_fsm_dostate()
652 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
653 ace->id_result = ace->data_result; in ace_fsm_dostate()
654 while (ace->id_req_count) { in ace_fsm_dostate()
655 complete(&ace->id_completion); in ace_fsm_dostate()
656 ace->id_req_count--; in ace_fsm_dostate()
661 req = ace_get_next_request(ace->queue); in ace_fsm_dostate()
663 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
668 dev_dbg(ace->dev, in ace_fsm_dostate()
674 ace->req = req; in ace_fsm_dostate()
675 ace->data_ptr = bio_data(req->bio); in ace_fsm_dostate()
676 ace->data_count = blk_rq_cur_sectors(req) * ACE_BUF_PER_SECTOR; in ace_fsm_dostate()
677 ace_out32(ace, ACE_MPULBA, blk_rq_pos(req) & 0x0FFFFFFF); in ace_fsm_dostate()
682 dev_dbg(ace->dev, "write data\n"); in ace_fsm_dostate()
683 ace->fsm_task = ACE_TASK_WRITE; in ace_fsm_dostate()
684 ace_out(ace, ACE_SECCNTCMD, in ace_fsm_dostate()
688 dev_dbg(ace->dev, "read data\n"); in ace_fsm_dostate()
689 ace->fsm_task = ACE_TASK_READ; in ace_fsm_dostate()
690 ace_out(ace, ACE_SECCNTCMD, in ace_fsm_dostate()
695 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
696 ace_out(ace, ACE_CTRL, val | ACE_CTRL_CFGRESET); in ace_fsm_dostate()
701 ace->fsm_state = ACE_FSM_STATE_REQ_TRANSFER; in ace_fsm_dostate()
702 if (ace->fsm_task == ACE_TASK_READ) in ace_fsm_dostate()
703 ace_fsm_yieldirq(ace); /* wait for data ready */ in ace_fsm_dostate()
708 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
710 dev_dbg(ace->dev, in ace_fsm_dostate()
712 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
713 blk_rq_cur_sectors(ace->req) * 16, in ace_fsm_dostate()
714 ace->data_count, ace->in_irq); in ace_fsm_dostate()
715 ace_fsm_yield(ace); /* need to poll CFBSY bit */ in ace_fsm_dostate()
719 dev_dbg(ace->dev, in ace_fsm_dostate()
721 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
722 blk_rq_cur_sectors(ace->req) * 16, in ace_fsm_dostate()
723 ace->data_count, ace->in_irq); in ace_fsm_dostate()
724 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
729 if (ace->fsm_task == ACE_TASK_WRITE) in ace_fsm_dostate()
730 ace->reg_ops->dataout(ace); in ace_fsm_dostate()
732 ace->reg_ops->datain(ace); in ace_fsm_dostate()
733 ace->data_count--; in ace_fsm_dostate()
736 if (ace->data_count != 0) { in ace_fsm_dostate()
737 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
742 if (blk_update_request(ace->req, BLK_STS_OK, in ace_fsm_dostate()
743 blk_rq_cur_bytes(ace->req))) { in ace_fsm_dostate()
748 ace->data_ptr = bio_data(ace->req->bio); in ace_fsm_dostate()
749 ace->data_count = blk_rq_cur_sectors(ace->req) * 16; in ace_fsm_dostate()
750 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
754 ace->fsm_state = ACE_FSM_STATE_REQ_COMPLETE; in ace_fsm_dostate()
758 ace->req = NULL; in ace_fsm_dostate()
761 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
765 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
772 struct ace_device *ace = (void *)data; in ace_fsm_tasklet() local
775 spin_lock_irqsave(&ace->lock, flags); in ace_fsm_tasklet()
778 ace->fsm_continue_flag = 1; in ace_fsm_tasklet()
779 while (ace->fsm_continue_flag) in ace_fsm_tasklet()
780 ace_fsm_dostate(ace); in ace_fsm_tasklet()
782 spin_unlock_irqrestore(&ace->lock, flags); in ace_fsm_tasklet()
787 struct ace_device *ace = from_timer(ace, t, stall_timer); in ace_stall_timer() local
790 dev_warn(ace->dev, in ace_stall_timer()
792 ace->fsm_state, ace->fsm_task, ace->fsm_iter_num, in ace_stall_timer()
793 ace->data_count); in ace_stall_timer()
794 spin_lock_irqsave(&ace->lock, flags); in ace_stall_timer()
798 mod_timer(&ace->stall_timer, jiffies + HZ); in ace_stall_timer()
801 ace->fsm_continue_flag = 1; in ace_stall_timer()
802 while (ace->fsm_continue_flag) in ace_stall_timer()
803 ace_fsm_dostate(ace); in ace_stall_timer()
805 spin_unlock_irqrestore(&ace->lock, flags); in ace_stall_timer()
811 static int ace_interrupt_checkstate(struct ace_device *ace) in ace_interrupt_checkstate() argument
813 u32 sreg = ace_in32(ace, ACE_STATUS); in ace_interrupt_checkstate()
814 u16 creg = ace_in(ace, ACE_CTRL); in ace_interrupt_checkstate()
819 dev_err(ace->dev, "transfer failure\n"); in ace_interrupt_checkstate()
820 ace_dump_regs(ace); in ace_interrupt_checkstate()
830 struct ace_device *ace = dev_id; in ace_interrupt() local
833 spin_lock(&ace->lock); in ace_interrupt()
834 ace->in_irq = 1; in ace_interrupt()
837 creg = ace_in(ace, ACE_CTRL); in ace_interrupt()
838 ace_out(ace, ACE_CTRL, creg | ACE_CTRL_RESETIRQ); in ace_interrupt()
839 ace_out(ace, ACE_CTRL, creg); in ace_interrupt()
842 if (ace_interrupt_checkstate(ace)) in ace_interrupt()
843 ace->data_result = -EIO; in ace_interrupt()
845 if (ace->fsm_task == 0) { in ace_interrupt()
846 dev_err(ace->dev, in ace_interrupt()
848 ace_in32(ace, ACE_STATUS), ace_in32(ace, ACE_CTRL), in ace_interrupt()
849 ace_in(ace, ACE_SECCNTCMD)); in ace_interrupt()
850 dev_err(ace->dev, "fsm_task=%i fsm_state=%i data_count=%i\n", in ace_interrupt()
851 ace->fsm_task, ace->fsm_state, ace->data_count); in ace_interrupt()
855 ace->fsm_continue_flag = 1; in ace_interrupt()
856 while (ace->fsm_continue_flag) in ace_interrupt()
857 ace_fsm_dostate(ace); in ace_interrupt()
860 ace->in_irq = 0; in ace_interrupt()
861 spin_unlock(&ace->lock); in ace_interrupt()
872 struct ace_device *ace = hctx->queue->queuedata; in ace_queue_rq() local
880 spin_lock_irq(&ace->lock); in ace_queue_rq()
881 list_add_tail(&req->queuelist, &ace->rq_list); in ace_queue_rq()
882 spin_unlock_irq(&ace->lock); in ace_queue_rq()
884 tasklet_schedule(&ace->fsm_tasklet); in ace_queue_rq()
890 struct ace_device *ace = gd->private_data; in ace_check_events() local
891 dev_dbg(ace->dev, "ace_check_events(): %i\n", ace->media_change); in ace_check_events()
893 return ace->media_change ? DISK_EVENT_MEDIA_CHANGE : 0; in ace_check_events()
896 static void ace_media_changed(struct ace_device *ace) in ace_media_changed() argument
900 dev_dbg(ace->dev, "requesting cf id and scheduling tasklet\n"); in ace_media_changed()
902 spin_lock_irqsave(&ace->lock, flags); in ace_media_changed()
903 ace->id_req_count++; in ace_media_changed()
904 spin_unlock_irqrestore(&ace->lock, flags); in ace_media_changed()
906 tasklet_schedule(&ace->fsm_tasklet); in ace_media_changed()
907 wait_for_completion(&ace->id_completion); in ace_media_changed()
909 dev_dbg(ace->dev, "revalidate complete\n"); in ace_media_changed()
914 struct ace_device *ace = bdev->bd_disk->private_data; in ace_open() local
917 dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1); in ace_open()
920 spin_lock_irqsave(&ace->lock, flags); in ace_open()
921 ace->users++; in ace_open()
922 spin_unlock_irqrestore(&ace->lock, flags); in ace_open()
924 if (bdev_check_media_change(bdev) && ace->media_change) in ace_open()
925 ace_media_changed(ace); 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()
979 static int ace_setup(struct ace_device *ace) in ace_setup() argument
985 dev_dbg(ace->dev, "ace_setup(ace=0x%p)\n", ace); in ace_setup()
986 dev_dbg(ace->dev, "physaddr=0x%llx irq=%i\n", in ace_setup()
987 (unsigned long long)ace->physaddr, ace->irq); in ace_setup()
989 spin_lock_init(&ace->lock); in ace_setup()
990 init_completion(&ace->id_completion); in ace_setup()
991 INIT_LIST_HEAD(&ace->rq_list); in ace_setup()
996 ace->baseaddr = ioremap(ace->physaddr, 0x80); in ace_setup()
997 if (!ace->baseaddr) in ace_setup()
1003 tasklet_init(&ace->fsm_tasklet, ace_fsm_tasklet, (unsigned long)ace); in ace_setup()
1004 timer_setup(&ace->stall_timer, ace_stall_timer, 0); in ace_setup()
1009 ace->queue = blk_mq_init_sq_queue(&ace->tag_set, &ace_mq_ops, 2, in ace_setup()
1011 if (IS_ERR(ace->queue)) { in ace_setup()
1012 rc = PTR_ERR(ace->queue); in ace_setup()
1013 ace->queue = NULL; in ace_setup()
1016 ace->queue->queuedata = ace; in ace_setup()
1018 blk_queue_logical_block_size(ace->queue, 512); in ace_setup()
1019 blk_queue_bounce_limit(ace->queue, BLK_BOUNCE_HIGH); in ace_setup()
1024 ace->gd = alloc_disk(ACE_NUM_MINORS); in ace_setup()
1025 if (!ace->gd) in ace_setup()
1028 ace->gd->major = ace_major; in ace_setup()
1029 ace->gd->first_minor = ace->id * ACE_NUM_MINORS; in ace_setup()
1030 ace->gd->fops = &ace_fops; in ace_setup()
1031 ace->gd->events = DISK_EVENT_MEDIA_CHANGE; in ace_setup()
1032 ace->gd->queue = ace->queue; in ace_setup()
1033 ace->gd->private_data = ace; in ace_setup()
1034 snprintf(ace->gd->disk_name, 32, "xs%c", ace->id + 'a'); in ace_setup()
1037 if (ace->bus_width == ACE_BUS_WIDTH_16) { in ace_setup()
1039 ace_out_le16(ace, ACE_BUSMODE, 0x0101); in ace_setup()
1042 if (ace_in_le16(ace, ACE_BUSMODE) == 0x0001) in ace_setup()
1043 ace->reg_ops = &ace_reg_le16_ops; in ace_setup()
1045 ace->reg_ops = &ace_reg_be16_ops; in ace_setup()
1047 ace_out_8(ace, ACE_BUSMODE, 0x00); in ace_setup()
1048 ace->reg_ops = &ace_reg_8_ops; in ace_setup()
1052 version = ace_in(ace, ACE_VERSION); in ace_setup()
1057 ace_out(ace, ACE_CTRL, ACE_CTRL_FORCECFGMODE | in ace_setup()
1061 if (ace->irq > 0) { in ace_setup()
1062 rc = request_irq(ace->irq, ace_interrupt, 0, "systemace", ace); in ace_setup()
1065 dev_err(ace->dev, "request_irq failed\n"); in ace_setup()
1066 ace->irq = rc; in ace_setup()
1071 val = ace_in(ace, ACE_CTRL); in ace_setup()
1073 ace_out(ace, ACE_CTRL, val); in ace_setup()
1076 dev_info(ace->dev, "Xilinx SystemACE revision %i.%i.%i\n", in ace_setup()
1078 dev_dbg(ace->dev, "physaddr 0x%llx, mapped to 0x%p, irq=%i\n", in ace_setup()
1079 (unsigned long long) ace->physaddr, ace->baseaddr, ace->irq); in ace_setup()
1081 ace->media_change = 1; in ace_setup()
1082 ace_media_changed(ace); in ace_setup()
1085 add_disk(ace->gd); in ace_setup()
1091 ace->gd->queue = NULL; in ace_setup()
1092 put_disk(ace->gd); in ace_setup()
1094 blk_cleanup_queue(ace->queue); in ace_setup()
1095 blk_mq_free_tag_set(&ace->tag_set); in ace_setup()
1097 iounmap(ace->baseaddr); in ace_setup()
1099 dev_info(ace->dev, "xsysace: error initializing device at 0x%llx\n", in ace_setup()
1100 (unsigned long long) ace->physaddr); in ace_setup()
1104 static void ace_teardown(struct ace_device *ace) in ace_teardown() argument
1106 if (ace->gd) { in ace_teardown()
1107 del_gendisk(ace->gd); in ace_teardown()
1108 put_disk(ace->gd); in ace_teardown()
1111 if (ace->queue) { in ace_teardown()
1112 blk_cleanup_queue(ace->queue); in ace_teardown()
1113 blk_mq_free_tag_set(&ace->tag_set); in ace_teardown()
1116 tasklet_kill(&ace->fsm_tasklet); in ace_teardown()
1118 if (ace->irq > 0) in ace_teardown()
1119 free_irq(ace->irq, ace); in ace_teardown()
1121 iounmap(ace->baseaddr); in ace_teardown()
1127 struct ace_device *ace; in ace_alloc() local
1132 ace = kzalloc(sizeof(struct ace_device), GFP_KERNEL); in ace_alloc()
1133 if (!ace) { in ace_alloc()
1138 ace->dev = dev; in ace_alloc()
1139 ace->id = id; in ace_alloc()
1140 ace->physaddr = physaddr; in ace_alloc()
1141 ace->irq = irq; in ace_alloc()
1142 ace->bus_width = bus_width; in ace_alloc()
1145 rc = ace_setup(ace); in ace_alloc()
1149 dev_set_drvdata(dev, ace); in ace_alloc()
1154 kfree(ace); in ace_alloc()
1162 struct ace_device *ace = dev_get_drvdata(dev); in ace_free() local
1165 if (ace) { in ace_free()
1166 ace_teardown(ace); in ace_free()
1168 kfree(ace); in ace_free()