Lines Matching refs:dev
68 static void vlynq_dump_regs(struct vlynq_device *dev)
73 dev->local, dev->remote);
76 i + 1, ((u32 *)dev->local)[i]);
78 i + 1, ((u32 *)dev->remote)[i]);
96 static int vlynq_linked(struct vlynq_device *dev)
101 if (readl(&dev->local->status) & VLYNQ_STATUS_LINK)
109 static void vlynq_reset(struct vlynq_device *dev)
111 writel(readl(&dev->local->control) | VLYNQ_CTRL_RESET,
112 &dev->local->control);
118 writel(readl(&dev->local->control) & ~VLYNQ_CTRL_RESET,
119 &dev->local->control);
127 struct vlynq_device *dev = irq_data_get_irq_chip_data(d);
131 BUG_ON(!dev);
132 virq = d->irq - dev->irq_start;
133 val = readl(&dev->remote->int_device[virq >> 2]);
135 writel(val, &dev->remote->int_device[virq >> 2]);
140 struct vlynq_device *dev = irq_data_get_irq_chip_data(d);
144 BUG_ON(!dev);
145 virq = d->irq - dev->irq_start;
146 val = readl(&dev->remote->int_device[virq >> 2]);
148 writel(val, &dev->remote->int_device[virq >> 2]);
153 struct vlynq_device *dev = irq_data_get_irq_chip_data(d);
157 BUG_ON(!dev);
158 virq = d->irq - dev->irq_start;
159 val = readl(&dev->remote->int_device[virq >> 2]);
178 writel(val, &dev->remote->int_device[virq >> 2]);
184 struct vlynq_device *dev = irq_data_get_irq_chip_data(d);
185 u32 status = readl(&dev->local->status);
188 dev_name(&dev->dev), status);
189 writel(status, &dev->local->status);
194 struct vlynq_device *dev = irq_data_get_irq_chip_data(d);
195 u32 status = readl(&dev->remote->status);
198 dev_name(&dev->dev), status);
199 writel(status, &dev->remote->status);
204 struct vlynq_device *dev = dev_id;
208 status = readl(&dev->local->int_status);
209 writel(status, &dev->local->int_status);
216 do_IRQ(dev->irq_start + virq);
245 static int vlynq_setup_irq(struct vlynq_device *dev)
250 if (dev->local_irq == dev->remote_irq) {
253 dev_name(&dev->dev));
258 writel(readl(&dev->local->status), &dev->local->status);
259 writel(readl(&dev->remote->status), &dev->remote->status);
262 val = VLYNQ_CTRL_INT_VECTOR(dev->local_irq);
265 val |= readl(&dev->local->control);
266 writel(VLYNQ_INT_OFFSET, &dev->local->int_ptr);
267 writel(val, &dev->local->control);
269 val = VLYNQ_CTRL_INT_VECTOR(dev->remote_irq);
271 val |= readl(&dev->remote->control);
272 writel(VLYNQ_INT_OFFSET, &dev->remote->int_ptr);
273 writel(val, &dev->remote->int_ptr);
274 writel(val, &dev->remote->control);
276 for (i = dev->irq_start; i <= dev->irq_end; i++) {
277 virq = i - dev->irq_start;
278 if (virq == dev->local_irq) {
281 irq_set_chip_data(i, dev);
282 } else if (virq == dev->remote_irq) {
285 irq_set_chip_data(i, dev);
289 irq_set_chip_data(i, dev);
290 writel(0, &dev->remote->int_device[virq >> 2]);
294 if (request_irq(dev->irq, vlynq_irq, IRQF_SHARED, "vlynq", dev)) {
296 dev_name(&dev->dev));
303 static void vlynq_device_release(struct device *dev)
305 struct vlynq_device *vdev = to_vlynq_device(dev);
309 static int vlynq_device_match(struct device *dev,
312 struct vlynq_device *vdev = to_vlynq_device(dev);
331 static int vlynq_device_probe(struct device *dev)
333 struct vlynq_device *vdev = to_vlynq_device(dev);
334 struct vlynq_driver *drv = to_vlynq_driver(dev->driver);
341 put_device(dev);
345 static int vlynq_device_remove(struct device *dev)
347 struct vlynq_driver *drv = to_vlynq_driver(dev->driver);
350 drv->remove(to_vlynq_device(dev));
377 static int __vlynq_try_remote(struct vlynq_device *dev)
381 vlynq_reset(dev);
382 for (i = dev->dev_id ? vlynq_rdiv2 : vlynq_rdiv8; dev->dev_id ?
384 dev->dev_id ? i++ : i--) {
386 if (!vlynq_linked(dev))
389 writel((readl(&dev->remote->control) &
393 &dev->remote->control);
394 writel((readl(&dev->local->control)
398 &dev->local->control);
400 if (vlynq_linked(dev)) {
403 dev_name(&dev->dev), i - vlynq_rdiv1 + 1);
404 dev->divisor = i;
407 vlynq_reset(dev);
421 static int __vlynq_try_local(struct vlynq_device *dev)
425 vlynq_reset(dev);
427 for (i = dev->dev_id ? vlynq_ldiv2 : vlynq_ldiv8; dev->dev_id ?
429 dev->dev_id ? i++ : i--) {
431 writel((readl(&dev->local->control) &
435 &dev->local->control);
437 if (vlynq_linked(dev)) {
440 dev_name(&dev->dev), i - vlynq_ldiv1 + 1);
441 dev->divisor = i;
444 vlynq_reset(dev);
457 static int __vlynq_try_external(struct vlynq_device *dev)
459 vlynq_reset(dev);
460 if (!vlynq_linked(dev))
463 writel((readl(&dev->remote->control) &
465 &dev->remote->control);
467 writel((readl(&dev->local->control) &
469 &dev->local->control);
471 if (vlynq_linked(dev)) {
473 dev_name(&dev->dev));
474 dev->divisor = vlynq_div_external;
481 static int __vlynq_enable_device(struct vlynq_device *dev)
484 struct plat_vlynq_ops *ops = dev->dev.platform_data;
486 result = ops->on(dev);
490 switch (dev->divisor) {
497 if (vlynq_linked(dev) && readl(&dev->remote->control) &
499 if (!__vlynq_try_remote(dev) ||
500 !__vlynq_try_local(dev) ||
501 !__vlynq_try_external(dev))
504 if (!__vlynq_try_external(dev) ||
505 !__vlynq_try_local(dev) ||
506 !__vlynq_try_remote(dev))
519 VLYNQ_CTRL_CLOCK_DIV(dev->divisor -
520 vlynq_ldiv1), &dev->local->control);
521 writel(0, &dev->remote->control);
522 if (vlynq_linked(dev)) {
525 dev_name(&dev->dev),
526 dev->divisor - vlynq_ldiv1 + 1);
538 writel(0, &dev->local->control);
540 VLYNQ_CTRL_CLOCK_DIV(dev->divisor -
541 vlynq_rdiv1), &dev->remote->control);
542 if (vlynq_linked(dev)) {
545 dev_name(&dev->dev),
546 dev->divisor - vlynq_rdiv1 + 1);
552 ops->off(dev);
556 int vlynq_enable_device(struct vlynq_device *dev)
558 struct plat_vlynq_ops *ops = dev->dev.platform_data;
561 result = __vlynq_enable_device(dev);
565 result = vlynq_setup_irq(dev);
567 ops->off(dev);
569 dev->enabled = !result;
575 void vlynq_disable_device(struct vlynq_device *dev)
577 struct plat_vlynq_ops *ops = dev->dev.platform_data;
579 dev->enabled = 0;
580 free_irq(dev->irq, dev);
581 ops->off(dev);
585 int vlynq_set_local_mapping(struct vlynq_device *dev, u32 tx_offset,
590 if (!dev->enabled)
593 writel(tx_offset, &dev->local->tx_offset);
595 writel(mapping[i].offset, &dev->local->rx_mapping[i].offset);
596 writel(mapping[i].size, &dev->local->rx_mapping[i].size);
602 int vlynq_set_remote_mapping(struct vlynq_device *dev, u32 tx_offset,
607 if (!dev->enabled)
610 writel(tx_offset, &dev->remote->tx_offset);
612 writel(mapping[i].offset, &dev->remote->rx_mapping[i].offset);
613 writel(mapping[i].size, &dev->remote->rx_mapping[i].size);
619 int vlynq_set_local_irq(struct vlynq_device *dev, int virq)
621 int irq = dev->irq_start + virq;
622 if (dev->enabled)
625 if ((irq < dev->irq_start) || (irq > dev->irq_end))
628 if (virq == dev->remote_irq)
631 dev->local_irq = virq;
637 int vlynq_set_remote_irq(struct vlynq_device *dev, int virq)
639 int irq = dev->irq_start + virq;
640 if (dev->enabled)
643 if ((irq < dev->irq_start) || (irq > dev->irq_end))
646 if (virq == dev->local_irq)
649 dev->remote_irq = virq;
657 struct vlynq_device *dev;
673 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
674 if (!dev) {
680 dev->id = pdev->id;
681 dev->dev.bus = &vlynq_bus_type;
682 dev->dev.parent = &pdev->dev;
683 dev_set_name(&dev->dev, "vlynq%d", dev->id);
684 dev->dev.platform_data = pdev->dev.platform_data;
685 dev->dev.release = vlynq_device_release;
687 dev->regs_start = regs_res->start;
688 dev->regs_end = regs_res->end;
689 dev->mem_start = mem_res->start;
690 dev->mem_end = mem_res->end;
693 if (!request_mem_region(regs_res->start, len, dev_name(&dev->dev))) {
695 dev_name(&dev->dev));
700 dev->local = ioremap(regs_res->start, len);
701 if (!dev->local) {
703 dev_name(&dev->dev));
708 dev->remote = (struct vlynq_regs *)((void *)dev->local +
711 dev->irq = platform_get_irq_byname(pdev, "irq");
712 dev->irq_start = irq_res->start;
713 dev->irq_end = irq_res->end;
714 dev->local_irq = dev->irq_end - dev->irq_start;
715 dev->remote_irq = dev->local_irq - 1;
717 if (device_register(&dev->dev))
719 platform_set_drvdata(pdev, dev);
722 dev_name(&dev->dev), (void *)dev->regs_start, dev->irq,
723 (void *)dev->mem_start);
725 dev->dev_id = 0;
726 dev->divisor = vlynq_div_auto;
727 result = __vlynq_enable_device(dev);
729 dev->dev_id = readl(&dev->remote->chip);
730 ((struct plat_vlynq_ops *)(dev->dev.platform_data))->off(dev);
732 if (dev->dev_id)
733 printk(KERN_INFO "Found a VLYNQ device: %08x\n", dev->dev_id);
738 iounmap(dev->local);
742 kfree(dev);
748 struct vlynq_device *dev = platform_get_drvdata(pdev);
750 device_unregister(&dev->dev);
751 iounmap(dev->local);
752 release_mem_region(dev->regs_start,
753 dev->regs_end - dev->regs_start + 1);
755 kfree(dev);