Lines Matching refs:ace

225 	u16(*in) (struct ace_device * ace, int reg);
226 void (*out) (struct ace_device * ace, int reg, u16 val);
227 void (*datain) (struct ace_device * ace);
228 void (*dataout) (struct ace_device * ace);
232 static u16 ace_in_8(struct ace_device *ace, int reg) in ace_in_8() argument
234 void __iomem *r = ace->baseaddr + reg; in ace_in_8()
238 static void ace_out_8(struct ace_device *ace, int reg, u16 val) in ace_out_8() argument
240 void __iomem *r = ace->baseaddr + reg; in ace_out_8()
245 static void ace_datain_8(struct ace_device *ace) in ace_datain_8() argument
247 void __iomem *r = ace->baseaddr + 0x40; in ace_datain_8()
248 u8 *dst = ace->data_ptr; in ace_datain_8()
252 ace->data_ptr = dst; in ace_datain_8()
255 static void ace_dataout_8(struct ace_device *ace) in ace_dataout_8() argument
257 void __iomem *r = ace->baseaddr + 0x40; in ace_dataout_8()
258 u8 *src = ace->data_ptr; in ace_dataout_8()
262 ace->data_ptr = src; in ace_dataout_8()
273 static u16 ace_in_be16(struct ace_device *ace, int reg) in ace_in_be16() argument
275 return in_be16(ace->baseaddr + reg); in ace_in_be16()
278 static void ace_out_be16(struct ace_device *ace, int reg, u16 val) in ace_out_be16() argument
280 out_be16(ace->baseaddr + reg, val); in ace_out_be16()
283 static void ace_datain_be16(struct ace_device *ace) in ace_datain_be16() argument
286 u16 *dst = ace->data_ptr; in ace_datain_be16()
288 *dst++ = in_le16(ace->baseaddr + 0x40); in ace_datain_be16()
289 ace->data_ptr = dst; in ace_datain_be16()
292 static void ace_dataout_be16(struct ace_device *ace) in ace_dataout_be16() argument
295 u16 *src = ace->data_ptr; in ace_dataout_be16()
297 out_le16(ace->baseaddr + 0x40, *src++); in ace_dataout_be16()
298 ace->data_ptr = src; in ace_dataout_be16()
302 static u16 ace_in_le16(struct ace_device *ace, int reg) in ace_in_le16() argument
304 return in_le16(ace->baseaddr + reg); in ace_in_le16()
307 static void ace_out_le16(struct ace_device *ace, int reg, u16 val) in ace_out_le16() argument
309 out_le16(ace->baseaddr + reg, val); in ace_out_le16()
312 static void ace_datain_le16(struct ace_device *ace) in ace_datain_le16() argument
315 u16 *dst = ace->data_ptr; in ace_datain_le16()
317 *dst++ = in_be16(ace->baseaddr + 0x40); in ace_datain_le16()
318 ace->data_ptr = dst; in ace_datain_le16()
321 static void ace_dataout_le16(struct ace_device *ace) in ace_dataout_le16() argument
324 u16 *src = ace->data_ptr; in ace_dataout_le16()
326 out_be16(ace->baseaddr + 0x40, *src++); in ace_dataout_le16()
327 ace->data_ptr = src; in ace_dataout_le16()
344 static inline u16 ace_in(struct ace_device *ace, int reg) in ace_in() argument
346 return ace->reg_ops->in(ace, reg); in ace_in()
349 static inline u32 ace_in32(struct ace_device *ace, int reg) in ace_in32() argument
351 return ace_in(ace, reg) | (ace_in(ace, reg + 2) << 16); in ace_in32()
354 static inline void ace_out(struct ace_device *ace, int reg, u16 val) in ace_out() argument
356 ace->reg_ops->out(ace, reg, val); in ace_out()
359 static inline void ace_out32(struct ace_device *ace, int reg, u32 val) in ace_out32() argument
361 ace_out(ace, reg, val); in ace_out32()
362 ace_out(ace, reg + 2, val >> 16); in ace_out32()
394 static void ace_dump_regs(struct ace_device *ace) in ace_dump_regs() argument
396 dev_info(ace->dev, in ace_dump_regs()
400 ace_in32(ace, ACE_CTRL), in ace_dump_regs()
401 ace_in(ace, ACE_SECCNTCMD), in ace_dump_regs()
402 ace_in(ace, ACE_VERSION), in ace_dump_regs()
403 ace_in32(ace, ACE_STATUS), in ace_dump_regs()
404 ace_in32(ace, ACE_MPULBA), in ace_dump_regs()
405 ace_in(ace, ACE_BUSMODE), in ace_dump_regs()
406 ace_in32(ace, ACE_ERROR), in ace_dump_regs()
407 ace_in32(ace, ACE_CFGLBA), ace_in(ace, ACE_FATSTAT)); in ace_dump_regs()
447 static inline void ace_fsm_yield(struct ace_device *ace) in ace_fsm_yield() argument
449 dev_dbg(ace->dev, "ace_fsm_yield()\n"); in ace_fsm_yield()
450 tasklet_schedule(&ace->fsm_tasklet); in ace_fsm_yield()
451 ace->fsm_continue_flag = 0; in ace_fsm_yield()
455 static inline void ace_fsm_yieldirq(struct ace_device *ace) in ace_fsm_yieldirq() argument
457 dev_dbg(ace->dev, "ace_fsm_yieldirq()\n"); in ace_fsm_yieldirq()
459 if (!ace->irq) in ace_fsm_yieldirq()
461 tasklet_schedule(&ace->fsm_tasklet); in ace_fsm_yieldirq()
462 ace->fsm_continue_flag = 0; in ace_fsm_yieldirq()
479 static void ace_fsm_dostate(struct ace_device *ace) in ace_fsm_dostate() argument
487 dev_dbg(ace->dev, "fsm_state=%i, id_req_count=%i\n", in ace_fsm_dostate()
488 ace->fsm_state, ace->id_req_count); in ace_fsm_dostate()
493 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
495 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
496 ace->media_change = 1; in ace_fsm_dostate()
497 set_capacity(ace->gd, 0); in ace_fsm_dostate()
498 dev_info(ace->dev, "No CF in slot\n"); in ace_fsm_dostate()
501 if (ace->req) { in ace_fsm_dostate()
502 __blk_end_request_all(ace->req, -EIO); in ace_fsm_dostate()
503 ace->req = NULL; in ace_fsm_dostate()
505 while ((req = blk_fetch_request(ace->queue)) != NULL) in ace_fsm_dostate()
509 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
510 ace->id_result = -EIO; in ace_fsm_dostate()
511 while (ace->id_req_count) { in ace_fsm_dostate()
512 complete(&ace->id_completion); in ace_fsm_dostate()
513 ace->id_req_count--; in ace_fsm_dostate()
517 switch (ace->fsm_state) { in ace_fsm_dostate()
520 if (ace->id_req_count || ace_get_next_request(ace->queue)) { in ace_fsm_dostate()
521 ace->fsm_iter_num++; in ace_fsm_dostate()
522 ace->fsm_state = ACE_FSM_STATE_REQ_LOCK; in ace_fsm_dostate()
523 mod_timer(&ace->stall_timer, jiffies + HZ); in ace_fsm_dostate()
524 if (!timer_pending(&ace->stall_timer)) in ace_fsm_dostate()
525 add_timer(&ace->stall_timer); in ace_fsm_dostate()
528 del_timer(&ace->stall_timer); in ace_fsm_dostate()
529 ace->fsm_continue_flag = 0; in ace_fsm_dostate()
533 if (ace_in(ace, ACE_STATUS) & ACE_STATUS_MPULOCK) { in ace_fsm_dostate()
535 ace->fsm_state = ACE_FSM_STATE_WAIT_CFREADY; in ace_fsm_dostate()
540 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
541 ace_out(ace, ACE_CTRL, val | ACE_CTRL_LOCKREQ); in ace_fsm_dostate()
542 ace->fsm_state = ACE_FSM_STATE_WAIT_LOCK; in ace_fsm_dostate()
546 if (ace_in(ace, ACE_STATUS) & ACE_STATUS_MPULOCK) { in ace_fsm_dostate()
548 ace->fsm_state = ACE_FSM_STATE_WAIT_CFREADY; in ace_fsm_dostate()
553 ace_fsm_yield(ace); in ace_fsm_dostate()
557 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
561 ace_fsm_yield(ace); in ace_fsm_dostate()
566 if (ace->id_req_count) in ace_fsm_dostate()
567 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_PREPARE; in ace_fsm_dostate()
569 ace->fsm_state = ACE_FSM_STATE_REQ_PREPARE; in ace_fsm_dostate()
574 ace->fsm_task = ACE_TASK_IDENTIFY; in ace_fsm_dostate()
575 ace->data_ptr = ace->cf_id; in ace_fsm_dostate()
576 ace->data_count = ACE_BUF_PER_SECTOR; in ace_fsm_dostate()
577 ace_out(ace, ACE_SECCNTCMD, ACE_SECCNTCMD_IDENTIFY); in ace_fsm_dostate()
580 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
581 ace_out(ace, ACE_CTRL, val | ACE_CTRL_CFGRESET); in ace_fsm_dostate()
585 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_TRANSFER; in ace_fsm_dostate()
586 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
591 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
593 dev_dbg(ace->dev, "CFBSY set; t=%i iter=%i dc=%i\n", in ace_fsm_dostate()
594 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
595 ace->data_count); in ace_fsm_dostate()
596 ace_fsm_yield(ace); in ace_fsm_dostate()
600 ace_fsm_yield(ace); in ace_fsm_dostate()
605 ace->reg_ops->datain(ace); in ace_fsm_dostate()
606 ace->data_count--; in ace_fsm_dostate()
609 if (ace->data_count != 0) { in ace_fsm_dostate()
610 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
615 dev_dbg(ace->dev, "identify finished\n"); in ace_fsm_dostate()
616 ace->fsm_state = ACE_FSM_STATE_IDENTIFY_COMPLETE; in ace_fsm_dostate()
620 ace_fix_driveid(ace->cf_id); in ace_fsm_dostate()
621 ace_dump_mem(ace->cf_id, 512); /* Debug: Dump out disk ID */ in ace_fsm_dostate()
623 if (ace->data_result) { in ace_fsm_dostate()
625 ace->media_change = 1; in ace_fsm_dostate()
626 set_capacity(ace->gd, 0); in ace_fsm_dostate()
627 dev_err(ace->dev, "error fetching CF id (%i)\n", in ace_fsm_dostate()
628 ace->data_result); in ace_fsm_dostate()
630 ace->media_change = 0; in ace_fsm_dostate()
633 set_capacity(ace->gd, in ace_fsm_dostate()
634 ata_id_u32(ace->cf_id, ATA_ID_LBA_CAPACITY)); in ace_fsm_dostate()
635 dev_info(ace->dev, "capacity: %i sectors\n", in ace_fsm_dostate()
636 ata_id_u32(ace->cf_id, ATA_ID_LBA_CAPACITY)); in ace_fsm_dostate()
640 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
641 ace->id_result = ace->data_result; in ace_fsm_dostate()
642 while (ace->id_req_count) { in ace_fsm_dostate()
643 complete(&ace->id_completion); in ace_fsm_dostate()
644 ace->id_req_count--; in ace_fsm_dostate()
649 req = ace_get_next_request(ace->queue); in ace_fsm_dostate()
651 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
657 dev_dbg(ace->dev, in ace_fsm_dostate()
663 ace->req = req; in ace_fsm_dostate()
664 ace->data_ptr = bio_data(req->bio); in ace_fsm_dostate()
665 ace->data_count = blk_rq_cur_sectors(req) * ACE_BUF_PER_SECTOR; in ace_fsm_dostate()
666 ace_out32(ace, ACE_MPULBA, blk_rq_pos(req) & 0x0FFFFFFF); in ace_fsm_dostate()
671 dev_dbg(ace->dev, "write data\n"); in ace_fsm_dostate()
672 ace->fsm_task = ACE_TASK_WRITE; in ace_fsm_dostate()
673 ace_out(ace, ACE_SECCNTCMD, in ace_fsm_dostate()
677 dev_dbg(ace->dev, "read data\n"); in ace_fsm_dostate()
678 ace->fsm_task = ACE_TASK_READ; in ace_fsm_dostate()
679 ace_out(ace, ACE_SECCNTCMD, in ace_fsm_dostate()
684 val = ace_in(ace, ACE_CTRL); in ace_fsm_dostate()
685 ace_out(ace, ACE_CTRL, val | ACE_CTRL_CFGRESET); in ace_fsm_dostate()
690 ace->fsm_state = ACE_FSM_STATE_REQ_TRANSFER; in ace_fsm_dostate()
691 if (ace->fsm_task == ACE_TASK_READ) in ace_fsm_dostate()
692 ace_fsm_yieldirq(ace); /* wait for data ready */ in ace_fsm_dostate()
697 status = ace_in32(ace, ACE_STATUS); in ace_fsm_dostate()
699 dev_dbg(ace->dev, in ace_fsm_dostate()
701 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
702 blk_rq_cur_sectors(ace->req) * 16, in ace_fsm_dostate()
703 ace->data_count, ace->in_irq); in ace_fsm_dostate()
704 ace_fsm_yield(ace); /* need to poll CFBSY bit */ in ace_fsm_dostate()
708 dev_dbg(ace->dev, in ace_fsm_dostate()
710 ace->fsm_task, ace->fsm_iter_num, in ace_fsm_dostate()
711 blk_rq_cur_sectors(ace->req) * 16, in ace_fsm_dostate()
712 ace->data_count, ace->in_irq); in ace_fsm_dostate()
713 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
718 if (ace->fsm_task == ACE_TASK_WRITE) in ace_fsm_dostate()
719 ace->reg_ops->dataout(ace); in ace_fsm_dostate()
721 ace->reg_ops->datain(ace); in ace_fsm_dostate()
722 ace->data_count--; in ace_fsm_dostate()
725 if (ace->data_count != 0) { in ace_fsm_dostate()
726 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
731 if (__blk_end_request_cur(ace->req, 0)) { in ace_fsm_dostate()
736 ace->data_ptr = bio_data(ace->req->bio); in ace_fsm_dostate()
737 ace->data_count = blk_rq_cur_sectors(ace->req) * 16; in ace_fsm_dostate()
738 ace_fsm_yieldirq(ace); in ace_fsm_dostate()
742 ace->fsm_state = ACE_FSM_STATE_REQ_COMPLETE; in ace_fsm_dostate()
746 ace->req = NULL; in ace_fsm_dostate()
749 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
753 ace->fsm_state = ACE_FSM_STATE_IDLE; in ace_fsm_dostate()
760 struct ace_device *ace = (void *)data; in ace_fsm_tasklet() local
763 spin_lock_irqsave(&ace->lock, flags); in ace_fsm_tasklet()
766 ace->fsm_continue_flag = 1; in ace_fsm_tasklet()
767 while (ace->fsm_continue_flag) in ace_fsm_tasklet()
768 ace_fsm_dostate(ace); in ace_fsm_tasklet()
770 spin_unlock_irqrestore(&ace->lock, flags); in ace_fsm_tasklet()
775 struct ace_device *ace = (void *)data; in ace_stall_timer() local
778 dev_warn(ace->dev, in ace_stall_timer()
780 ace->fsm_state, ace->fsm_task, ace->fsm_iter_num, in ace_stall_timer()
781 ace->data_count); in ace_stall_timer()
782 spin_lock_irqsave(&ace->lock, flags); in ace_stall_timer()
786 mod_timer(&ace->stall_timer, jiffies + HZ); in ace_stall_timer()
789 ace->fsm_continue_flag = 1; in ace_stall_timer()
790 while (ace->fsm_continue_flag) in ace_stall_timer()
791 ace_fsm_dostate(ace); in ace_stall_timer()
793 spin_unlock_irqrestore(&ace->lock, flags); in ace_stall_timer()
799 static int ace_interrupt_checkstate(struct ace_device *ace) in ace_interrupt_checkstate() argument
801 u32 sreg = ace_in32(ace, ACE_STATUS); in ace_interrupt_checkstate()
802 u16 creg = ace_in(ace, ACE_CTRL); in ace_interrupt_checkstate()
807 dev_err(ace->dev, "transfer failure\n"); in ace_interrupt_checkstate()
808 ace_dump_regs(ace); in ace_interrupt_checkstate()
818 struct ace_device *ace = dev_id; in ace_interrupt() local
821 spin_lock(&ace->lock); in ace_interrupt()
822 ace->in_irq = 1; in ace_interrupt()
825 creg = ace_in(ace, ACE_CTRL); in ace_interrupt()
826 ace_out(ace, ACE_CTRL, creg | ACE_CTRL_RESETIRQ); in ace_interrupt()
827 ace_out(ace, ACE_CTRL, creg); in ace_interrupt()
830 if (ace_interrupt_checkstate(ace)) in ace_interrupt()
831 ace->data_result = -EIO; in ace_interrupt()
833 if (ace->fsm_task == 0) { in ace_interrupt()
834 dev_err(ace->dev, in ace_interrupt()
836 ace_in32(ace, ACE_STATUS), ace_in32(ace, ACE_CTRL), in ace_interrupt()
837 ace_in(ace, ACE_SECCNTCMD)); in ace_interrupt()
838 dev_err(ace->dev, "fsm_task=%i fsm_state=%i data_count=%i\n", in ace_interrupt()
839 ace->fsm_task, ace->fsm_state, ace->data_count); in ace_interrupt()
843 ace->fsm_continue_flag = 1; in ace_interrupt()
844 while (ace->fsm_continue_flag) in ace_interrupt()
845 ace_fsm_dostate(ace); in ace_interrupt()
848 ace->in_irq = 0; in ace_interrupt()
849 spin_unlock(&ace->lock); in ace_interrupt()
860 struct ace_device *ace; in ace_request() local
865 ace = req->rq_disk->private_data; in ace_request()
866 tasklet_schedule(&ace->fsm_tasklet); in ace_request()
872 struct ace_device *ace = gd->private_data; in ace_check_events() local
873 dev_dbg(ace->dev, "ace_check_events(): %i\n", ace->media_change); in ace_check_events()
875 return ace->media_change ? DISK_EVENT_MEDIA_CHANGE : 0; in ace_check_events()
880 struct ace_device *ace = gd->private_data; in ace_revalidate_disk() local
883 dev_dbg(ace->dev, "ace_revalidate_disk()\n"); in ace_revalidate_disk()
885 if (ace->media_change) { in ace_revalidate_disk()
886 dev_dbg(ace->dev, "requesting cf id and scheduling tasklet\n"); in ace_revalidate_disk()
888 spin_lock_irqsave(&ace->lock, flags); in ace_revalidate_disk()
889 ace->id_req_count++; in ace_revalidate_disk()
890 spin_unlock_irqrestore(&ace->lock, flags); in ace_revalidate_disk()
892 tasklet_schedule(&ace->fsm_tasklet); in ace_revalidate_disk()
893 wait_for_completion(&ace->id_completion); in ace_revalidate_disk()
896 dev_dbg(ace->dev, "revalidate complete\n"); in ace_revalidate_disk()
897 return ace->id_result; in ace_revalidate_disk()
902 struct ace_device *ace = bdev->bd_disk->private_data; in ace_open() local
905 dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1); in ace_open()
908 spin_lock_irqsave(&ace->lock, flags); in ace_open()
909 ace->users++; in ace_open()
910 spin_unlock_irqrestore(&ace->lock, flags); in ace_open()
920 struct ace_device *ace = disk->private_data; in ace_release() local
924 dev_dbg(ace->dev, "ace_release() users=%i\n", ace->users - 1); in ace_release()
927 spin_lock_irqsave(&ace->lock, flags); in ace_release()
928 ace->users--; in ace_release()
929 if (ace->users == 0) { in ace_release()
930 val = ace_in(ace, ACE_CTRL); in ace_release()
931 ace_out(ace, ACE_CTRL, val & ~ACE_CTRL_LOCKREQ); in ace_release()
933 spin_unlock_irqrestore(&ace->lock, flags); in ace_release()
939 struct ace_device *ace = bdev->bd_disk->private_data; in ace_getgeo() local
940 u16 *cf_id = ace->cf_id; in ace_getgeo()
942 dev_dbg(ace->dev, "ace_getgeo()\n"); in ace_getgeo()
963 static int ace_setup(struct ace_device *ace) in ace_setup() argument
969 dev_dbg(ace->dev, "ace_setup(ace=0x%p)\n", ace); in ace_setup()
970 dev_dbg(ace->dev, "physaddr=0x%llx irq=%i\n", in ace_setup()
971 (unsigned long long)ace->physaddr, ace->irq); in ace_setup()
973 spin_lock_init(&ace->lock); in ace_setup()
974 init_completion(&ace->id_completion); in ace_setup()
979 ace->baseaddr = ioremap(ace->physaddr, 0x80); in ace_setup()
980 if (!ace->baseaddr) in ace_setup()
986 tasklet_init(&ace->fsm_tasklet, ace_fsm_tasklet, (unsigned long)ace); in ace_setup()
987 setup_timer(&ace->stall_timer, ace_stall_timer, (unsigned long)ace); in ace_setup()
992 ace->queue = blk_init_queue(ace_request, &ace->lock); in ace_setup()
993 if (ace->queue == NULL) in ace_setup()
995 blk_queue_logical_block_size(ace->queue, 512); in ace_setup()
1000 ace->gd = alloc_disk(ACE_NUM_MINORS); in ace_setup()
1001 if (!ace->gd) in ace_setup()
1004 ace->gd->major = ace_major; in ace_setup()
1005 ace->gd->first_minor = ace->id * ACE_NUM_MINORS; in ace_setup()
1006 ace->gd->fops = &ace_fops; in ace_setup()
1007 ace->gd->queue = ace->queue; in ace_setup()
1008 ace->gd->private_data = ace; in ace_setup()
1009 snprintf(ace->gd->disk_name, 32, "xs%c", ace->id + 'a'); in ace_setup()
1012 if (ace->bus_width == ACE_BUS_WIDTH_16) { in ace_setup()
1014 ace_out_le16(ace, ACE_BUSMODE, 0x0101); in ace_setup()
1017 if (ace_in_le16(ace, ACE_BUSMODE) == 0x0001) in ace_setup()
1018 ace->reg_ops = &ace_reg_le16_ops; in ace_setup()
1020 ace->reg_ops = &ace_reg_be16_ops; in ace_setup()
1022 ace_out_8(ace, ACE_BUSMODE, 0x00); in ace_setup()
1023 ace->reg_ops = &ace_reg_8_ops; in ace_setup()
1027 version = ace_in(ace, ACE_VERSION); in ace_setup()
1032 ace_out(ace, ACE_CTRL, ACE_CTRL_FORCECFGMODE | in ace_setup()
1036 if (ace->irq) { in ace_setup()
1037 rc = request_irq(ace->irq, ace_interrupt, 0, "systemace", ace); in ace_setup()
1040 dev_err(ace->dev, "request_irq failed\n"); in ace_setup()
1041 ace->irq = 0; in ace_setup()
1046 val = ace_in(ace, ACE_CTRL); in ace_setup()
1048 ace_out(ace, ACE_CTRL, val); in ace_setup()
1051 dev_info(ace->dev, "Xilinx SystemACE revision %i.%i.%i\n", in ace_setup()
1053 dev_dbg(ace->dev, "physaddr 0x%llx, mapped to 0x%p, irq=%i\n", in ace_setup()
1054 (unsigned long long) ace->physaddr, ace->baseaddr, ace->irq); in ace_setup()
1056 ace->media_change = 1; in ace_setup()
1057 ace_revalidate_disk(ace->gd); in ace_setup()
1060 add_disk(ace->gd); in ace_setup()
1065 put_disk(ace->gd); in ace_setup()
1067 blk_cleanup_queue(ace->queue); in ace_setup()
1069 iounmap(ace->baseaddr); in ace_setup()
1071 dev_info(ace->dev, "xsysace: error initializing device at 0x%llx\n", in ace_setup()
1072 (unsigned long long) ace->physaddr); in ace_setup()
1076 static void ace_teardown(struct ace_device *ace) in ace_teardown() argument
1078 if (ace->gd) { in ace_teardown()
1079 del_gendisk(ace->gd); in ace_teardown()
1080 put_disk(ace->gd); in ace_teardown()
1083 if (ace->queue) in ace_teardown()
1084 blk_cleanup_queue(ace->queue); in ace_teardown()
1086 tasklet_kill(&ace->fsm_tasklet); in ace_teardown()
1088 if (ace->irq) in ace_teardown()
1089 free_irq(ace->irq, ace); in ace_teardown()
1091 iounmap(ace->baseaddr); in ace_teardown()
1097 struct ace_device *ace; in ace_alloc() local
1107 ace = kzalloc(sizeof(struct ace_device), GFP_KERNEL); in ace_alloc()
1108 if (!ace) { in ace_alloc()
1113 ace->dev = dev; in ace_alloc()
1114 ace->id = id; in ace_alloc()
1115 ace->physaddr = physaddr; in ace_alloc()
1116 ace->irq = irq; in ace_alloc()
1117 ace->bus_width = bus_width; in ace_alloc()
1120 rc = ace_setup(ace); in ace_alloc()
1124 dev_set_drvdata(dev, ace); in ace_alloc()
1129 kfree(ace); in ace_alloc()
1138 struct ace_device *ace = dev_get_drvdata(dev); in ace_free() local
1141 if (ace) { in ace_free()
1142 ace_teardown(ace); in ace_free()
1144 kfree(ace); in ace_free()