static int __devinit snd_ps3_allocate_irq(void) { int ret; u64 lpar_addr, lpar_size; u64 __iomem *mapped; /* FIXME: move this to device_init (H/W probe) */ /* get irq outlet */ ret = lv1_gpu_device_map(1, &lpar_addr, &lpar_size); if (ret) { pr_info("%s: device map 1 failed %d\n", __func__, ret); return -ENXIO; } mapped = ioremap(lpar_addr, lpar_size); if (!mapped) { pr_info("%s: ioremap 1 failed \n", __func__); return -ENXIO; } the_card.audio_irq_outlet = in_be64(mapped); iounmap(mapped); ret = lv1_gpu_device_unmap(1); if (ret) pr_info("%s: unmap 1 failed\n", __func__); /* irq */ ret = ps3_irq_plug_setup(PS3_BINDING_CPU_ANY, the_card.audio_irq_outlet, &the_card.irq_no); if (ret) { pr_info("%s:ps3_alloc_irq failed (%d)\n", __func__, ret); return ret; } ret = request_irq(the_card.irq_no, snd_ps3_interrupt, IRQF_DISABLED, SND_PS3_DRIVER_NAME, &the_card); if (ret) { pr_info("%s: request_irq failed (%d)\n", __func__, ret); goto cleanup_irq; } return 0; cleanup_irq: ps3_irq_plug_destroy(the_card.irq_no); return ret; };
int ps3_io_irq_setup(enum ps3_cpu_binding cpu, unsigned int interrupt_id, unsigned int *virq) { int result; u64 outlet; result = lv1_construct_io_irq_outlet(interrupt_id, &outlet); if (result) { pr_debug("%s:%d: lv1_construct_io_irq_outlet failed: %s\n", __func__, __LINE__, ps3_result(result)); return result; } result = ps3_irq_plug_setup(cpu, outlet, virq); BUG_ON(result); return result; }
int ps3_event_receive_port_setup(enum ps3_cpu_binding cpu, unsigned int *virq) { int result; u64 outlet; result = lv1_construct_event_receive_port(&outlet); if (result) { pr_debug("%s:%d: lv1_construct_event_receive_port failed: %s\n", __func__, __LINE__, ps3_result(result)); *virq = NO_IRQ; return result; } result = ps3_irq_plug_setup(cpu, outlet, virq); BUG_ON(result); return result; }
int ps3_vuart_irq_setup(enum ps3_cpu_binding cpu, void* virt_addr_bmp, unsigned int *virq) { int result; u64 outlet; u64 lpar_addr; BUG_ON(!is_kernel_addr((u64)virt_addr_bmp)); lpar_addr = ps3_mm_phys_to_lpar(__pa(virt_addr_bmp)); result = lv1_configure_virtual_uart_irq(lpar_addr, &outlet); if (result) { pr_debug("%s:%d: lv1_configure_virtual_uart_irq failed: %s\n", __func__, __LINE__, ps3_result(result)); return result; } result = ps3_irq_plug_setup(cpu, outlet, virq); BUG_ON(result); return result; }