Lines Matching refs:dev
81 static void vlynq_dump_regs(struct vlynq_device *dev) in vlynq_dump_regs() argument
86 dev->local, dev->remote); in vlynq_dump_regs()
89 i + 1, ((u32 *)dev->local)[i]); in vlynq_dump_regs()
91 i + 1, ((u32 *)dev->remote)[i]); in vlynq_dump_regs()
109 static int vlynq_linked(struct vlynq_device *dev) in vlynq_linked() argument
114 if (readl(&dev->local->status) & VLYNQ_STATUS_LINK) in vlynq_linked()
122 static void vlynq_reset(struct vlynq_device *dev) in vlynq_reset() argument
124 writel(readl(&dev->local->control) | VLYNQ_CTRL_RESET, in vlynq_reset()
125 &dev->local->control); in vlynq_reset()
131 writel(readl(&dev->local->control) & ~VLYNQ_CTRL_RESET, in vlynq_reset()
132 &dev->local->control); in vlynq_reset()
140 struct vlynq_device *dev = irq_data_get_irq_chip_data(d); in vlynq_irq_unmask() local
144 BUG_ON(!dev); in vlynq_irq_unmask()
145 virq = d->irq - dev->irq_start; in vlynq_irq_unmask()
146 val = readl(&dev->remote->int_device[virq >> 2]); in vlynq_irq_unmask()
148 writel(val, &dev->remote->int_device[virq >> 2]); in vlynq_irq_unmask()
153 struct vlynq_device *dev = irq_data_get_irq_chip_data(d); in vlynq_irq_mask() local
157 BUG_ON(!dev); in vlynq_irq_mask()
158 virq = d->irq - dev->irq_start; in vlynq_irq_mask()
159 val = readl(&dev->remote->int_device[virq >> 2]); in vlynq_irq_mask()
161 writel(val, &dev->remote->int_device[virq >> 2]); in vlynq_irq_mask()
166 struct vlynq_device *dev = irq_data_get_irq_chip_data(d); in vlynq_irq_type() local
170 BUG_ON(!dev); in vlynq_irq_type()
171 virq = d->irq - dev->irq_start; in vlynq_irq_type()
172 val = readl(&dev->remote->int_device[virq >> 2]); in vlynq_irq_type()
191 writel(val, &dev->remote->int_device[virq >> 2]); in vlynq_irq_type()
197 struct vlynq_device *dev = irq_data_get_irq_chip_data(d); in vlynq_local_ack() local
198 u32 status = readl(&dev->local->status); in vlynq_local_ack()
201 dev_name(&dev->dev), status); in vlynq_local_ack()
202 writel(status, &dev->local->status); in vlynq_local_ack()
207 struct vlynq_device *dev = irq_data_get_irq_chip_data(d); in vlynq_remote_ack() local
208 u32 status = readl(&dev->remote->status); in vlynq_remote_ack()
211 dev_name(&dev->dev), status); in vlynq_remote_ack()
212 writel(status, &dev->remote->status); in vlynq_remote_ack()
217 struct vlynq_device *dev = dev_id; in vlynq_irq() local
221 status = readl(&dev->local->int_status); in vlynq_irq()
222 writel(status, &dev->local->int_status); in vlynq_irq()
229 do_IRQ(dev->irq_start + virq); in vlynq_irq()
258 static int vlynq_setup_irq(struct vlynq_device *dev) in vlynq_setup_irq() argument
263 if (dev->local_irq == dev->remote_irq) { in vlynq_setup_irq()
266 dev_name(&dev->dev)); in vlynq_setup_irq()
271 writel(readl(&dev->local->status), &dev->local->status); in vlynq_setup_irq()
272 writel(readl(&dev->remote->status), &dev->remote->status); in vlynq_setup_irq()
275 val = VLYNQ_CTRL_INT_VECTOR(dev->local_irq); in vlynq_setup_irq()
278 val |= readl(&dev->local->control); in vlynq_setup_irq()
279 writel(VLYNQ_INT_OFFSET, &dev->local->int_ptr); in vlynq_setup_irq()
280 writel(val, &dev->local->control); in vlynq_setup_irq()
282 val = VLYNQ_CTRL_INT_VECTOR(dev->remote_irq); in vlynq_setup_irq()
284 val |= readl(&dev->remote->control); in vlynq_setup_irq()
285 writel(VLYNQ_INT_OFFSET, &dev->remote->int_ptr); in vlynq_setup_irq()
286 writel(val, &dev->remote->int_ptr); in vlynq_setup_irq()
287 writel(val, &dev->remote->control); in vlynq_setup_irq()
289 for (i = dev->irq_start; i <= dev->irq_end; i++) { in vlynq_setup_irq()
290 virq = i - dev->irq_start; in vlynq_setup_irq()
291 if (virq == dev->local_irq) { in vlynq_setup_irq()
294 irq_set_chip_data(i, dev); in vlynq_setup_irq()
295 } else if (virq == dev->remote_irq) { in vlynq_setup_irq()
298 irq_set_chip_data(i, dev); in vlynq_setup_irq()
302 irq_set_chip_data(i, dev); in vlynq_setup_irq()
303 writel(0, &dev->remote->int_device[virq >> 2]); in vlynq_setup_irq()
307 if (request_irq(dev->irq, vlynq_irq, IRQF_SHARED, "vlynq", dev)) { in vlynq_setup_irq()
309 dev_name(&dev->dev)); in vlynq_setup_irq()
316 static void vlynq_device_release(struct device *dev) in vlynq_device_release() argument
318 struct vlynq_device *vdev = to_vlynq_device(dev); in vlynq_device_release()
322 static int vlynq_device_match(struct device *dev, in vlynq_device_match() argument
325 struct vlynq_device *vdev = to_vlynq_device(dev); in vlynq_device_match()
344 static int vlynq_device_probe(struct device *dev) in vlynq_device_probe() argument
346 struct vlynq_device *vdev = to_vlynq_device(dev); in vlynq_device_probe()
347 struct vlynq_driver *drv = to_vlynq_driver(dev->driver); in vlynq_device_probe()
354 put_device(dev); in vlynq_device_probe()
358 static int vlynq_device_remove(struct device *dev) in vlynq_device_remove() argument
360 struct vlynq_driver *drv = to_vlynq_driver(dev->driver); in vlynq_device_remove()
363 drv->remove(to_vlynq_device(dev)); in vlynq_device_remove()
390 static int __vlynq_try_remote(struct vlynq_device *dev) in __vlynq_try_remote() argument
394 vlynq_reset(dev); in __vlynq_try_remote()
395 for (i = dev->dev_id ? vlynq_rdiv2 : vlynq_rdiv8; dev->dev_id ? in __vlynq_try_remote()
397 dev->dev_id ? i++ : i--) { in __vlynq_try_remote()
399 if (!vlynq_linked(dev)) in __vlynq_try_remote()
402 writel((readl(&dev->remote->control) & in __vlynq_try_remote()
406 &dev->remote->control); in __vlynq_try_remote()
407 writel((readl(&dev->local->control) in __vlynq_try_remote()
411 &dev->local->control); in __vlynq_try_remote()
413 if (vlynq_linked(dev)) { in __vlynq_try_remote()
416 dev_name(&dev->dev), i - vlynq_rdiv1 + 1); in __vlynq_try_remote()
417 dev->divisor = i; in __vlynq_try_remote()
420 vlynq_reset(dev); in __vlynq_try_remote()
434 static int __vlynq_try_local(struct vlynq_device *dev) in __vlynq_try_local() argument
438 vlynq_reset(dev); in __vlynq_try_local()
440 for (i = dev->dev_id ? vlynq_ldiv2 : vlynq_ldiv8; dev->dev_id ? in __vlynq_try_local()
442 dev->dev_id ? i++ : i--) { in __vlynq_try_local()
444 writel((readl(&dev->local->control) & in __vlynq_try_local()
448 &dev->local->control); in __vlynq_try_local()
450 if (vlynq_linked(dev)) { in __vlynq_try_local()
453 dev_name(&dev->dev), i - vlynq_ldiv1 + 1); in __vlynq_try_local()
454 dev->divisor = i; in __vlynq_try_local()
457 vlynq_reset(dev); in __vlynq_try_local()
470 static int __vlynq_try_external(struct vlynq_device *dev) in __vlynq_try_external() argument
472 vlynq_reset(dev); in __vlynq_try_external()
473 if (!vlynq_linked(dev)) in __vlynq_try_external()
476 writel((readl(&dev->remote->control) & in __vlynq_try_external()
478 &dev->remote->control); in __vlynq_try_external()
480 writel((readl(&dev->local->control) & in __vlynq_try_external()
482 &dev->local->control); in __vlynq_try_external()
484 if (vlynq_linked(dev)) { in __vlynq_try_external()
486 dev_name(&dev->dev)); in __vlynq_try_external()
487 dev->divisor = vlynq_div_external; in __vlynq_try_external()
494 static int __vlynq_enable_device(struct vlynq_device *dev) in __vlynq_enable_device() argument
497 struct plat_vlynq_ops *ops = dev->dev.platform_data; in __vlynq_enable_device()
499 result = ops->on(dev); in __vlynq_enable_device()
503 switch (dev->divisor) { in __vlynq_enable_device()
510 if (vlynq_linked(dev) && readl(&dev->remote->control) & in __vlynq_enable_device()
512 if (!__vlynq_try_remote(dev) || in __vlynq_enable_device()
513 !__vlynq_try_local(dev) || in __vlynq_enable_device()
514 !__vlynq_try_external(dev)) in __vlynq_enable_device()
517 if (!__vlynq_try_external(dev) || in __vlynq_enable_device()
518 !__vlynq_try_local(dev) || in __vlynq_enable_device()
519 !__vlynq_try_remote(dev)) in __vlynq_enable_device()
532 VLYNQ_CTRL_CLOCK_DIV(dev->divisor - in __vlynq_enable_device()
533 vlynq_ldiv1), &dev->local->control); in __vlynq_enable_device()
534 writel(0, &dev->remote->control); in __vlynq_enable_device()
535 if (vlynq_linked(dev)) { in __vlynq_enable_device()
538 dev_name(&dev->dev), in __vlynq_enable_device()
539 dev->divisor - vlynq_ldiv1 + 1); in __vlynq_enable_device()
551 writel(0, &dev->local->control); in __vlynq_enable_device()
553 VLYNQ_CTRL_CLOCK_DIV(dev->divisor - in __vlynq_enable_device()
554 vlynq_rdiv1), &dev->remote->control); in __vlynq_enable_device()
555 if (vlynq_linked(dev)) { in __vlynq_enable_device()
558 dev_name(&dev->dev), in __vlynq_enable_device()
559 dev->divisor - vlynq_rdiv1 + 1); in __vlynq_enable_device()
565 ops->off(dev); in __vlynq_enable_device()
569 int vlynq_enable_device(struct vlynq_device *dev) in vlynq_enable_device() argument
571 struct plat_vlynq_ops *ops = dev->dev.platform_data; in vlynq_enable_device()
574 result = __vlynq_enable_device(dev); in vlynq_enable_device()
578 result = vlynq_setup_irq(dev); in vlynq_enable_device()
580 ops->off(dev); in vlynq_enable_device()
582 dev->enabled = !result; in vlynq_enable_device()
588 void vlynq_disable_device(struct vlynq_device *dev) in vlynq_disable_device() argument
590 struct plat_vlynq_ops *ops = dev->dev.platform_data; in vlynq_disable_device()
592 dev->enabled = 0; in vlynq_disable_device()
593 free_irq(dev->irq, dev); in vlynq_disable_device()
594 ops->off(dev); in vlynq_disable_device()
598 int vlynq_set_local_mapping(struct vlynq_device *dev, u32 tx_offset, in vlynq_set_local_mapping() argument
603 if (!dev->enabled) in vlynq_set_local_mapping()
606 writel(tx_offset, &dev->local->tx_offset); in vlynq_set_local_mapping()
608 writel(mapping[i].offset, &dev->local->rx_mapping[i].offset); in vlynq_set_local_mapping()
609 writel(mapping[i].size, &dev->local->rx_mapping[i].size); in vlynq_set_local_mapping()
615 int vlynq_set_remote_mapping(struct vlynq_device *dev, u32 tx_offset, in vlynq_set_remote_mapping() argument
620 if (!dev->enabled) in vlynq_set_remote_mapping()
623 writel(tx_offset, &dev->remote->tx_offset); in vlynq_set_remote_mapping()
625 writel(mapping[i].offset, &dev->remote->rx_mapping[i].offset); in vlynq_set_remote_mapping()
626 writel(mapping[i].size, &dev->remote->rx_mapping[i].size); in vlynq_set_remote_mapping()
632 int vlynq_set_local_irq(struct vlynq_device *dev, int virq) in vlynq_set_local_irq() argument
634 int irq = dev->irq_start + virq; in vlynq_set_local_irq()
635 if (dev->enabled) in vlynq_set_local_irq()
638 if ((irq < dev->irq_start) || (irq > dev->irq_end)) in vlynq_set_local_irq()
641 if (virq == dev->remote_irq) in vlynq_set_local_irq()
644 dev->local_irq = virq; in vlynq_set_local_irq()
650 int vlynq_set_remote_irq(struct vlynq_device *dev, int virq) in vlynq_set_remote_irq() argument
652 int irq = dev->irq_start + virq; in vlynq_set_remote_irq()
653 if (dev->enabled) in vlynq_set_remote_irq()
656 if ((irq < dev->irq_start) || (irq > dev->irq_end)) in vlynq_set_remote_irq()
659 if (virq == dev->local_irq) in vlynq_set_remote_irq()
662 dev->remote_irq = virq; in vlynq_set_remote_irq()
670 struct vlynq_device *dev; in vlynq_probe() local
686 dev = kzalloc(sizeof(*dev), GFP_KERNEL); in vlynq_probe()
687 if (!dev) { in vlynq_probe()
693 dev->id = pdev->id; in vlynq_probe()
694 dev->dev.bus = &vlynq_bus_type; in vlynq_probe()
695 dev->dev.parent = &pdev->dev; in vlynq_probe()
696 dev_set_name(&dev->dev, "vlynq%d", dev->id); in vlynq_probe()
697 dev->dev.platform_data = pdev->dev.platform_data; in vlynq_probe()
698 dev->dev.release = vlynq_device_release; in vlynq_probe()
700 dev->regs_start = regs_res->start; in vlynq_probe()
701 dev->regs_end = regs_res->end; in vlynq_probe()
702 dev->mem_start = mem_res->start; in vlynq_probe()
703 dev->mem_end = mem_res->end; in vlynq_probe()
706 if (!request_mem_region(regs_res->start, len, dev_name(&dev->dev))) { in vlynq_probe()
708 dev_name(&dev->dev)); in vlynq_probe()
713 dev->local = ioremap(regs_res->start, len); in vlynq_probe()
714 if (!dev->local) { in vlynq_probe()
716 dev_name(&dev->dev)); in vlynq_probe()
721 dev->remote = (struct vlynq_regs *)((void *)dev->local + in vlynq_probe()
724 dev->irq = platform_get_irq_byname(pdev, "irq"); in vlynq_probe()
725 dev->irq_start = irq_res->start; in vlynq_probe()
726 dev->irq_end = irq_res->end; in vlynq_probe()
727 dev->local_irq = dev->irq_end - dev->irq_start; in vlynq_probe()
728 dev->remote_irq = dev->local_irq - 1; in vlynq_probe()
730 if (device_register(&dev->dev)) in vlynq_probe()
732 platform_set_drvdata(pdev, dev); in vlynq_probe()
735 dev_name(&dev->dev), (void *)dev->regs_start, dev->irq, in vlynq_probe()
736 (void *)dev->mem_start); in vlynq_probe()
738 dev->dev_id = 0; in vlynq_probe()
739 dev->divisor = vlynq_div_auto; in vlynq_probe()
740 result = __vlynq_enable_device(dev); in vlynq_probe()
742 dev->dev_id = readl(&dev->remote->chip); in vlynq_probe()
743 ((struct plat_vlynq_ops *)(dev->dev.platform_data))->off(dev); in vlynq_probe()
745 if (dev->dev_id) in vlynq_probe()
746 printk(KERN_INFO "Found a VLYNQ device: %08x\n", dev->dev_id); in vlynq_probe()
751 iounmap(dev->local); in vlynq_probe()
755 kfree(dev); in vlynq_probe()
761 struct vlynq_device *dev = platform_get_drvdata(pdev); in vlynq_remove() local
763 device_unregister(&dev->dev); in vlynq_remove()
764 iounmap(dev->local); in vlynq_remove()
765 release_mem_region(dev->regs_start, in vlynq_remove()
766 dev->regs_end - dev->regs_start + 1); in vlynq_remove()
768 kfree(dev); in vlynq_remove()