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 void vlynq_device_remove(struct device *dev)
347 struct vlynq_driver *drv = to_vlynq_driver(dev->driver);
350 drv->remove(to_vlynq_device(dev));
375 static int __vlynq_try_remote(struct vlynq_device *dev)
379 vlynq_reset(dev);
380 for (i = dev->dev_id ? vlynq_rdiv2 : vlynq_rdiv8; dev->dev_id ?
382 dev->dev_id ? i++ : i--) {
384 if (!vlynq_linked(dev))
387 writel((readl(&dev->remote->control) &
391 &dev->remote->control);
392 writel((readl(&dev->local->control)
396 &dev->local->control);
398 if (vlynq_linked(dev)) {
401 dev_name(&dev->dev), i - vlynq_rdiv1 + 1);
402 dev->divisor = i;
405 vlynq_reset(dev);
419 static int __vlynq_try_local(struct vlynq_device *dev)
423 vlynq_reset(dev);
425 for (i = dev->dev_id ? vlynq_ldiv2 : vlynq_ldiv8; dev->dev_id ?
427 dev->dev_id ? i++ : i--) {
429 writel((readl(&dev->local->control) &
433 &dev->local->control);
435 if (vlynq_linked(dev)) {
438 dev_name(&dev->dev), i - vlynq_ldiv1 + 1);
439 dev->divisor = i;
442 vlynq_reset(dev);
455 static int __vlynq_try_external(struct vlynq_device *dev)
457 vlynq_reset(dev);
458 if (!vlynq_linked(dev))
461 writel((readl(&dev->remote->control) &
463 &dev->remote->control);
465 writel((readl(&dev->local->control) &
467 &dev->local->control);
469 if (vlynq_linked(dev)) {
471 dev_name(&dev->dev));
472 dev->divisor = vlynq_div_external;
479 static int __vlynq_enable_device(struct vlynq_device *dev)
482 struct plat_vlynq_ops *ops = dev->dev.platform_data;
484 result = ops->on(dev);
488 switch (dev->divisor) {
495 if (vlynq_linked(dev) && readl(&dev->remote->control) &
497 if (!__vlynq_try_remote(dev) ||
498 !__vlynq_try_local(dev) ||
499 !__vlynq_try_external(dev))
502 if (!__vlynq_try_external(dev) ||
503 !__vlynq_try_local(dev) ||
504 !__vlynq_try_remote(dev))
517 VLYNQ_CTRL_CLOCK_DIV(dev->divisor -
518 vlynq_ldiv1), &dev->local->control);
519 writel(0, &dev->remote->control);
520 if (vlynq_linked(dev)) {
523 dev_name(&dev->dev),
524 dev->divisor - vlynq_ldiv1 + 1);
536 writel(0, &dev->local->control);
538 VLYNQ_CTRL_CLOCK_DIV(dev->divisor -
539 vlynq_rdiv1), &dev->remote->control);
540 if (vlynq_linked(dev)) {
543 dev_name(&dev->dev),
544 dev->divisor - vlynq_rdiv1 + 1);
550 ops->off(dev);
554 int vlynq_enable_device(struct vlynq_device *dev)
556 struct plat_vlynq_ops *ops = dev->dev.platform_data;
559 result = __vlynq_enable_device(dev);
563 result = vlynq_setup_irq(dev);
565 ops->off(dev);
567 dev->enabled = !result;
573 void vlynq_disable_device(struct vlynq_device *dev)
575 struct plat_vlynq_ops *ops = dev->dev.platform_data;
577 dev->enabled = 0;
578 free_irq(dev->irq, dev);
579 ops->off(dev);
583 int vlynq_set_local_mapping(struct vlynq_device *dev, u32 tx_offset,
588 if (!dev->enabled)
591 writel(tx_offset, &dev->local->tx_offset);
593 writel(mapping[i].offset, &dev->local->rx_mapping[i].offset);
594 writel(mapping[i].size, &dev->local->rx_mapping[i].size);
600 int vlynq_set_remote_mapping(struct vlynq_device *dev, u32 tx_offset,
605 if (!dev->enabled)
608 writel(tx_offset, &dev->remote->tx_offset);
610 writel(mapping[i].offset, &dev->remote->rx_mapping[i].offset);
611 writel(mapping[i].size, &dev->remote->rx_mapping[i].size);
617 int vlynq_set_local_irq(struct vlynq_device *dev, int virq)
619 int irq = dev->irq_start + virq;
620 if (dev->enabled)
623 if ((irq < dev->irq_start) || (irq > dev->irq_end))
626 if (virq == dev->remote_irq)
629 dev->local_irq = virq;
635 int vlynq_set_remote_irq(struct vlynq_device *dev, int virq)
637 int irq = dev->irq_start + virq;
638 if (dev->enabled)
641 if ((irq < dev->irq_start) || (irq > dev->irq_end))
644 if (virq == dev->local_irq)
647 dev->remote_irq = virq;
655 struct vlynq_device *dev;
671 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
672 if (!dev) {
678 dev->id = pdev->id;
679 dev->dev.bus = &vlynq_bus_type;
680 dev->dev.parent = &pdev->dev;
681 dev_set_name(&dev->dev, "vlynq%d", dev->id);
682 dev->dev.platform_data = pdev->dev.platform_data;
683 dev->dev.release = vlynq_device_release;
685 dev->regs_start = regs_res->start;
686 dev->regs_end = regs_res->end;
687 dev->mem_start = mem_res->start;
688 dev->mem_end = mem_res->end;
691 if (!request_mem_region(regs_res->start, len, dev_name(&dev->dev))) {
693 dev_name(&dev->dev));
698 dev->local = ioremap(regs_res->start, len);
699 if (!dev->local) {
701 dev_name(&dev->dev));
706 dev->remote = (struct vlynq_regs *)((void *)dev->local +
709 dev->irq = platform_get_irq_byname(pdev, "irq");
710 dev->irq_start = irq_res->start;
711 dev->irq_end = irq_res->end;
712 dev->local_irq = dev->irq_end - dev->irq_start;
713 dev->remote_irq = dev->local_irq - 1;
715 if (device_register(&dev->dev))
717 platform_set_drvdata(pdev, dev);
720 dev_name(&dev->dev), (void *)dev->regs_start, dev->irq,
721 (void *)dev->mem_start);
723 dev->dev_id = 0;
724 dev->divisor = vlynq_div_auto;
725 result = __vlynq_enable_device(dev);
727 dev->dev_id = readl(&dev->remote->chip);
728 ((struct plat_vlynq_ops *)(dev->dev.platform_data))->off(dev);
730 if (dev->dev_id)
731 printk(KERN_INFO "Found a VLYNQ device: %08x\n", dev->dev_id);
736 iounmap(dev->local);
740 kfree(dev);
746 struct vlynq_device *dev = platform_get_drvdata(pdev);
748 device_unregister(&dev->dev);
749 iounmap(dev->local);
750 release_mem_region(dev->regs_start,
751 dev->regs_end - dev->regs_start + 1);
753 kfree(dev);