Lines Matching refs:dev

34 static inline uint8_t r852_read_reg(struct r852_device *dev, int address)  in r852_read_reg()  argument
36 uint8_t reg = readb(dev->mmio + address); in r852_read_reg()
41 static inline void r852_write_reg(struct r852_device *dev, in r852_write_reg() argument
44 writeb(value, dev->mmio + address); in r852_write_reg()
50 static inline uint32_t r852_read_reg_dword(struct r852_device *dev, int address) in r852_read_reg_dword() argument
52 uint32_t reg = le32_to_cpu(readl(dev->mmio + address)); in r852_read_reg_dword()
57 static inline void r852_write_reg_dword(struct r852_device *dev, in r852_write_reg_dword() argument
60 writel(cpu_to_le32(value), dev->mmio + address); in r852_write_reg_dword()
73 static void r852_dma_test(struct r852_device *dev) in r852_dma_test() argument
75 dev->dma_usable = (r852_read_reg(dev, R852_DMA_CAP) & in r852_dma_test()
78 if (!dev->dma_usable) in r852_dma_test()
83 dev->dma_usable = 0; in r852_dma_test()
91 static void r852_dma_enable(struct r852_device *dev) in r852_dma_enable() argument
96 dma_reg = r852_read_reg_dword(dev, R852_DMA_SETTINGS); in r852_dma_enable()
99 if (dev->dma_dir) in r852_dma_enable()
102 if (dev->dma_state == DMA_INTERNAL) { in r852_dma_enable()
106 r852_write_reg_dword(dev, R852_DMA_ADDR, in r852_dma_enable()
107 cpu_to_le32(dev->phys_bounce_buffer)); in r852_dma_enable()
110 r852_write_reg_dword(dev, R852_DMA_ADDR, in r852_dma_enable()
111 cpu_to_le32(dev->phys_dma_addr)); in r852_dma_enable()
115 r852_read_reg_dword(dev, R852_DMA_ADDR); in r852_dma_enable()
117 r852_write_reg_dword(dev, R852_DMA_SETTINGS, dma_reg); in r852_dma_enable()
120 dma_irq_reg = r852_read_reg_dword(dev, R852_DMA_IRQ_ENABLE); in r852_dma_enable()
121 r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE, in r852_dma_enable()
132 static void r852_dma_done(struct r852_device *dev, int error) in r852_dma_done() argument
134 WARN_ON(dev->dma_stage == 0); in r852_dma_done()
136 r852_write_reg_dword(dev, R852_DMA_IRQ_STA, in r852_dma_done()
137 r852_read_reg_dword(dev, R852_DMA_IRQ_STA)); in r852_dma_done()
139 r852_write_reg_dword(dev, R852_DMA_SETTINGS, 0); in r852_dma_done()
140 r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE, 0); in r852_dma_done()
143 r852_write_reg_dword(dev, R852_DMA_ADDR, in r852_dma_done()
144 cpu_to_le32(dev->phys_bounce_buffer)); in r852_dma_done()
145 r852_read_reg_dword(dev, R852_DMA_ADDR); in r852_dma_done()
147 dev->dma_error = error; in r852_dma_done()
148 dev->dma_stage = 0; in r852_dma_done()
150 if (dev->phys_dma_addr && dev->phys_dma_addr != dev->phys_bounce_buffer) in r852_dma_done()
151 pci_unmap_single(dev->pci_dev, dev->phys_dma_addr, R852_DMA_LEN, in r852_dma_done()
152 dev->dma_dir ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); in r852_dma_done()
158 static int r852_dma_wait(struct r852_device *dev) in r852_dma_wait() argument
160 long timeout = wait_for_completion_timeout(&dev->dma_done, in r852_dma_wait()
173 static void r852_do_dma(struct r852_device *dev, uint8_t *buf, int do_read) in r852_do_dma() argument
179 dev->dma_error = 0; in r852_do_dma()
182 dev->dma_dir = do_read; in r852_do_dma()
183 dev->dma_stage = 1; in r852_do_dma()
184 reinit_completion(&dev->dma_done); in r852_do_dma()
190 dev->dma_state = do_read ? DMA_INTERNAL : DMA_MEMORY; in r852_do_dma()
197 dev->phys_dma_addr = pci_map_single(dev->pci_dev, (void *)buf, in r852_do_dma()
201 if (pci_dma_mapping_error(dev->pci_dev, dev->phys_dma_addr)) in r852_do_dma()
207 dev->phys_dma_addr = dev->phys_bounce_buffer; in r852_do_dma()
209 memcpy(dev->bounce_buffer, buf, R852_DMA_LEN); in r852_do_dma()
213 spin_lock_irqsave(&dev->irqlock, flags); in r852_do_dma()
214 r852_dma_enable(dev); in r852_do_dma()
215 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_do_dma()
218 error = r852_dma_wait(dev); in r852_do_dma()
221 r852_dma_done(dev, error); in r852_do_dma()
226 memcpy((void *)buf, dev->bounce_buffer, R852_DMA_LEN); in r852_do_dma()
234 struct r852_device *dev = r852_get_dev(mtd); in r852_write_buf() local
238 if (dev->card_unstable) in r852_write_buf()
242 if (len == R852_DMA_LEN && dev->dma_usable) { in r852_write_buf()
243 r852_do_dma(dev, (uint8_t *)buf, 0); in r852_write_buf()
250 r852_write_reg_dword(dev, R852_DATALINE, reg); in r852_write_buf()
258 r852_write_reg(dev, R852_DATALINE, *buf++); in r852_write_buf()
268 struct r852_device *dev = r852_get_dev(mtd); in r852_read_buf() local
271 if (dev->card_unstable) { in r852_read_buf()
279 if (len == R852_DMA_LEN && dev->dma_usable) { in r852_read_buf()
280 r852_do_dma(dev, buf, 1); in r852_read_buf()
287 reg = r852_read_reg_dword(dev, R852_DATALINE); in r852_read_buf()
297 *buf++ = r852_read_reg(dev, R852_DATALINE); in r852_read_buf()
305 struct r852_device *dev = r852_get_dev(mtd); in r852_read_byte() local
308 if (dev->card_unstable) in r852_read_byte()
311 return r852_read_reg(dev, R852_DATALINE); in r852_read_byte()
319 struct r852_device *dev = r852_get_dev(mtd); in r852_cmdctl() local
321 if (dev->card_unstable) in r852_cmdctl()
326 dev->ctlreg &= ~(R852_CTL_DATA | R852_CTL_COMMAND | in r852_cmdctl()
330 dev->ctlreg |= R852_CTL_DATA; in r852_cmdctl()
333 dev->ctlreg |= R852_CTL_COMMAND; in r852_cmdctl()
336 dev->ctlreg |= (R852_CTL_CARDENABLE | R852_CTL_ON); in r852_cmdctl()
338 dev->ctlreg &= ~R852_CTL_WRITE; in r852_cmdctl()
342 dev->ctlreg |= R852_CTL_WRITE; in r852_cmdctl()
344 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_cmdctl()
349 if (dat == NAND_CMD_SEQIN && (dev->ctlreg & R852_CTL_COMMAND)) { in r852_cmdctl()
350 dev->ctlreg |= R852_CTL_WRITE; in r852_cmdctl()
351 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_cmdctl()
355 r852_write_reg(dev, R852_DATALINE, dat); in r852_cmdctl()
364 struct r852_device *dev = chip->priv; in r852_wait() local
380 if (dev->dma_error) { in r852_wait()
382 dev->dma_error = 0; in r852_wait()
393 struct r852_device *dev = r852_get_dev(mtd); in r852_ready() local
394 return !(r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_BUSY); in r852_ready()
404 struct r852_device *dev = r852_get_dev(mtd); in r852_ecc_hwctl() local
406 if (dev->card_unstable) in r852_ecc_hwctl()
413 dev->ctlreg |= R852_CTL_ECC_ENABLE; in r852_ecc_hwctl()
416 r852_write_reg(dev, R852_CTL, in r852_ecc_hwctl()
417 dev->ctlreg | R852_CTL_ECC_ACCESS); in r852_ecc_hwctl()
419 r852_read_reg_dword(dev, R852_DATALINE); in r852_ecc_hwctl()
420 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_ecc_hwctl()
425 dev->ctlreg &= ~R852_CTL_ECC_ENABLE; in r852_ecc_hwctl()
426 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_ecc_hwctl()
437 struct r852_device *dev = r852_get_dev(mtd); in r852_ecc_calculate() local
441 if (dev->card_unstable) in r852_ecc_calculate()
444 dev->ctlreg &= ~R852_CTL_ECC_ENABLE; in r852_ecc_calculate()
445 r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS); in r852_ecc_calculate()
447 ecc1 = r852_read_reg_dword(dev, R852_DATALINE); in r852_ecc_calculate()
448 ecc2 = r852_read_reg_dword(dev, R852_DATALINE); in r852_ecc_calculate()
458 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_ecc_calculate()
473 struct r852_device *dev = r852_get_dev(mtd); in r852_ecc_correct() local
475 if (dev->card_unstable) in r852_ecc_correct()
478 if (dev->dma_error) { in r852_ecc_correct()
479 dev->dma_error = 0; in r852_ecc_correct()
483 r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS); in r852_ecc_correct()
484 ecc_reg = r852_read_reg_dword(dev, R852_DATALINE); in r852_ecc_correct()
485 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_ecc_correct()
534 static void r852_engine_enable(struct r852_device *dev) in r852_engine_enable() argument
536 if (r852_read_reg_dword(dev, R852_HW) & R852_HW_UNKNOWN) { in r852_engine_enable()
537 r852_write_reg(dev, R852_CTL, R852_CTL_RESET | R852_CTL_ON); in r852_engine_enable()
538 r852_write_reg_dword(dev, R852_HW, R852_HW_ENABLED); in r852_engine_enable()
540 r852_write_reg_dword(dev, R852_HW, R852_HW_ENABLED); in r852_engine_enable()
541 r852_write_reg(dev, R852_CTL, R852_CTL_RESET | R852_CTL_ON); in r852_engine_enable()
544 r852_write_reg(dev, R852_CTL, 0); in r852_engine_enable()
552 static void r852_engine_disable(struct r852_device *dev) in r852_engine_disable() argument
554 r852_write_reg_dword(dev, R852_HW, 0); in r852_engine_disable()
555 r852_write_reg(dev, R852_CTL, R852_CTL_RESET); in r852_engine_disable()
562 static void r852_card_update_present(struct r852_device *dev) in r852_card_update_present() argument
567 spin_lock_irqsave(&dev->irqlock, flags); in r852_card_update_present()
568 reg = r852_read_reg(dev, R852_CARD_STA); in r852_card_update_present()
569 dev->card_detected = !!(reg & R852_CARD_STA_PRESENT); in r852_card_update_present()
570 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_card_update_present()
577 static void r852_update_card_detect(struct r852_device *dev) in r852_update_card_detect() argument
579 int card_detect_reg = r852_read_reg(dev, R852_CARD_IRQ_ENABLE); in r852_update_card_detect()
580 dev->card_unstable = 0; in r852_update_card_detect()
585 card_detect_reg |= dev->card_detected ? in r852_update_card_detect()
588 r852_write_reg(dev, R852_CARD_IRQ_ENABLE, card_detect_reg); in r852_update_card_detect()
594 struct mtd_info *mtd = container_of(sys_dev, struct mtd_info, dev); in r852_media_type_show()
595 struct r852_device *dev = r852_get_dev(mtd); in r852_media_type_show() local
596 char *data = dev->sm ? "smartmedia" : "xd"; in r852_media_type_show()
606 static void r852_update_media_status(struct r852_device *dev) in r852_update_media_status() argument
612 spin_lock_irqsave(&dev->irqlock, flags); in r852_update_media_status()
613 if (!dev->card_detected) { in r852_update_media_status()
615 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_update_media_status()
619 readonly = r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_RO; in r852_update_media_status()
620 reg = r852_read_reg(dev, R852_DMA_CAP); in r852_update_media_status()
621 dev->sm = (reg & (R852_DMA1 | R852_DMA2)) && (reg & R852_SMBIT); in r852_update_media_status()
624 dev->sm ? "SmartMedia" : "xD", in r852_update_media_status()
627 dev->readonly = readonly; in r852_update_media_status()
628 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_update_media_status()
635 static int r852_register_nand_device(struct r852_device *dev) in r852_register_nand_device() argument
637 dev->mtd = kzalloc(sizeof(struct mtd_info), GFP_KERNEL); in r852_register_nand_device()
639 if (!dev->mtd) in r852_register_nand_device()
642 WARN_ON(dev->card_registred); in r852_register_nand_device()
644 dev->mtd->priv = dev->chip; in r852_register_nand_device()
645 dev->mtd->dev.parent = &dev->pci_dev->dev; in r852_register_nand_device()
647 if (dev->readonly) in r852_register_nand_device()
648 dev->chip->options |= NAND_ROM; in r852_register_nand_device()
650 r852_engine_enable(dev); in r852_register_nand_device()
652 if (sm_register_device(dev->mtd, dev->sm)) in r852_register_nand_device()
655 if (device_create_file(&dev->mtd->dev, &dev_attr_media_type)) { in r852_register_nand_device()
660 dev->card_registred = 1; in r852_register_nand_device()
663 nand_release(dev->mtd); in r852_register_nand_device()
665 kfree(dev->mtd); in r852_register_nand_device()
668 dev->card_detected = 0; in r852_register_nand_device()
676 static void r852_unregister_nand_device(struct r852_device *dev) in r852_unregister_nand_device() argument
678 if (!dev->card_registred) in r852_unregister_nand_device()
681 device_remove_file(&dev->mtd->dev, &dev_attr_media_type); in r852_unregister_nand_device()
682 nand_release(dev->mtd); in r852_unregister_nand_device()
683 r852_engine_disable(dev); in r852_unregister_nand_device()
684 dev->card_registred = 0; in r852_unregister_nand_device()
685 kfree(dev->mtd); in r852_unregister_nand_device()
686 dev->mtd = NULL; in r852_unregister_nand_device()
692 struct r852_device *dev = in r852_card_detect_work() local
695 r852_card_update_present(dev); in r852_card_detect_work()
696 r852_update_card_detect(dev); in r852_card_detect_work()
697 dev->card_unstable = 0; in r852_card_detect_work()
700 if (dev->card_detected == dev->card_registred) in r852_card_detect_work()
704 r852_update_media_status(dev); in r852_card_detect_work()
707 if (dev->card_detected) in r852_card_detect_work()
708 r852_register_nand_device(dev); in r852_card_detect_work()
710 r852_unregister_nand_device(dev); in r852_card_detect_work()
712 r852_update_card_detect(dev); in r852_card_detect_work()
716 static void r852_disable_irqs(struct r852_device *dev) in r852_disable_irqs() argument
719 reg = r852_read_reg(dev, R852_CARD_IRQ_ENABLE); in r852_disable_irqs()
720 r852_write_reg(dev, R852_CARD_IRQ_ENABLE, reg & ~R852_CARD_IRQ_MASK); in r852_disable_irqs()
722 reg = r852_read_reg_dword(dev, R852_DMA_IRQ_ENABLE); in r852_disable_irqs()
723 r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE, in r852_disable_irqs()
726 r852_write_reg(dev, R852_CARD_IRQ_STA, R852_CARD_IRQ_MASK); in r852_disable_irqs()
727 r852_write_reg_dword(dev, R852_DMA_IRQ_STA, R852_DMA_IRQ_MASK); in r852_disable_irqs()
733 struct r852_device *dev = (struct r852_device *)data; in r852_irq() local
739 spin_lock_irqsave(&dev->irqlock, flags); in r852_irq()
742 card_status = r852_read_reg(dev, R852_CARD_IRQ_STA); in r852_irq()
743 r852_write_reg(dev, R852_CARD_IRQ_STA, card_status); in r852_irq()
748 dev->card_detected = !!(card_status & R852_CARD_IRQ_INSERT); in r852_irq()
752 WARN_ON(dev->card_unstable); in r852_irq()
756 r852_disable_irqs(dev); in r852_irq()
758 if (dev->card_unstable) in r852_irq()
762 dev->card_unstable = 1; in r852_irq()
763 queue_delayed_work(dev->card_workqueue, in r852_irq()
764 &dev->card_detect_work, msecs_to_jiffies(100)); in r852_irq()
770 dma_status = r852_read_reg_dword(dev, R852_DMA_IRQ_STA); in r852_irq()
771 r852_write_reg_dword(dev, R852_DMA_IRQ_STA, dma_status); in r852_irq()
779 r852_dma_done(dev, -EIO); in r852_irq()
780 complete(&dev->dma_done); in r852_irq()
785 WARN_ON_ONCE(dev->dma_stage == 0); in r852_irq()
787 if (dev->dma_stage == 0) in r852_irq()
791 if (dev->dma_state == DMA_INTERNAL && in r852_irq()
794 dev->dma_state = DMA_MEMORY; in r852_irq()
795 dev->dma_stage++; in r852_irq()
799 if (dev->dma_state == DMA_MEMORY && in r852_irq()
801 dev->dma_state = DMA_INTERNAL; in r852_irq()
802 dev->dma_stage++; in r852_irq()
806 if (dev->dma_stage == 2) in r852_irq()
807 r852_dma_enable(dev); in r852_irq()
810 if (dev->dma_stage == 3) { in r852_irq()
811 r852_dma_done(dev, 0); in r852_irq()
812 complete(&dev->dma_done); in r852_irq()
825 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_irq()
833 struct r852_device *dev; in r852_probe() local
883 dev = kzalloc(sizeof(struct r852_device), GFP_KERNEL); in r852_probe()
885 if (!dev) in r852_probe()
888 chip->priv = dev; in r852_probe()
889 dev->chip = chip; in r852_probe()
890 dev->pci_dev = pci_dev; in r852_probe()
891 pci_set_drvdata(pci_dev, dev); in r852_probe()
893 dev->bounce_buffer = pci_alloc_consistent(pci_dev, R852_DMA_LEN, in r852_probe()
894 &dev->phys_bounce_buffer); in r852_probe()
896 if (!dev->bounce_buffer) in r852_probe()
901 dev->mmio = pci_ioremap_bar(pci_dev, 0); in r852_probe()
903 if (!dev->mmio) in r852_probe()
907 dev->tmp_buffer = kzalloc(SM_SECTOR_SIZE, GFP_KERNEL); in r852_probe()
909 if (!dev->tmp_buffer) in r852_probe()
912 init_completion(&dev->dma_done); in r852_probe()
914 dev->card_workqueue = create_freezable_workqueue(DRV_NAME); in r852_probe()
916 if (!dev->card_workqueue) in r852_probe()
919 INIT_DELAYED_WORK(&dev->card_detect_work, r852_card_detect_work); in r852_probe()
922 r852_engine_disable(dev); in r852_probe()
923 r852_disable_irqs(dev); in r852_probe()
925 r852_dma_test(dev); in r852_probe()
927 dev->irq = pci_dev->irq; in r852_probe()
928 spin_lock_init(&dev->irqlock); in r852_probe()
930 dev->card_detected = 0; in r852_probe()
931 r852_card_update_present(dev); in r852_probe()
936 DRV_NAME, dev)) in r852_probe()
940 queue_delayed_work(dev->card_workqueue, in r852_probe()
941 &dev->card_detect_work, 0); in r852_probe()
948 destroy_workqueue(dev->card_workqueue); in r852_probe()
950 kfree(dev->tmp_buffer); in r852_probe()
952 pci_iounmap(pci_dev, dev->mmio); in r852_probe()
955 dev->bounce_buffer, dev->phys_bounce_buffer); in r852_probe()
957 kfree(dev); in r852_probe()
971 struct r852_device *dev = pci_get_drvdata(pci_dev); in r852_remove() local
975 cancel_delayed_work_sync(&dev->card_detect_work); in r852_remove()
976 destroy_workqueue(dev->card_workqueue); in r852_remove()
979 r852_unregister_nand_device(dev); in r852_remove()
982 r852_disable_irqs(dev); in r852_remove()
983 synchronize_irq(dev->irq); in r852_remove()
984 free_irq(dev->irq, dev); in r852_remove()
987 kfree(dev->tmp_buffer); in r852_remove()
988 pci_iounmap(pci_dev, dev->mmio); in r852_remove()
990 dev->bounce_buffer, dev->phys_bounce_buffer); in r852_remove()
992 kfree(dev->chip); in r852_remove()
993 kfree(dev); in r852_remove()
1002 struct r852_device *dev = pci_get_drvdata(pci_dev); in r852_shutdown() local
1004 cancel_delayed_work_sync(&dev->card_detect_work); in r852_shutdown()
1005 r852_disable_irqs(dev); in r852_shutdown()
1006 synchronize_irq(dev->irq); in r852_shutdown()
1013 struct r852_device *dev = pci_get_drvdata(to_pci_dev(device)); in r852_suspend() local
1015 if (dev->ctlreg & R852_CTL_CARDENABLE) in r852_suspend()
1019 cancel_delayed_work_sync(&dev->card_detect_work); in r852_suspend()
1022 r852_disable_irqs(dev); in r852_suspend()
1023 r852_engine_disable(dev); in r852_suspend()
1028 dev->card_unstable = 0; in r852_suspend()
1034 struct r852_device *dev = pci_get_drvdata(to_pci_dev(device)); in r852_resume() local
1036 r852_disable_irqs(dev); in r852_resume()
1037 r852_card_update_present(dev); in r852_resume()
1038 r852_engine_disable(dev); in r852_resume()
1042 if (dev->card_detected != dev->card_registred) { in r852_resume()
1044 dev->card_detected ? "added" : "removed"); in r852_resume()
1046 queue_delayed_work(dev->card_workqueue, in r852_resume()
1047 &dev->card_detect_work, msecs_to_jiffies(1000)); in r852_resume()
1052 if (dev->card_registred) { in r852_resume()
1053 r852_engine_enable(dev); in r852_resume()
1054 dev->chip->select_chip(dev->mtd, 0); in r852_resume()
1055 dev->chip->cmdfunc(dev->mtd, NAND_CMD_RESET, -1, -1); in r852_resume()
1056 dev->chip->select_chip(dev->mtd, -1); in r852_resume()
1060 r852_update_card_detect(dev); in r852_resume()