Commit b1eeb38e authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Paul Mackerras

[POWERPC] ps3: add interrupt alloc for outlets

PS3 interrupt core update:
  - Add ps3_alloc_irq() and ps3_free_irq(), to allocate a virtual interrupt
    number for an interrupt outlet, which is needed by the PS3 GPU frame
    buffer device and audio drivers
Signed-off-by: default avatarGeert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Signed-off-by: default avatarGeoff Levand <geoffrey.levand@am.sony.com>
Acked-by: default avatarArnd Bergmann <arnd.bergmann@de.ibm.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 861be32c
...@@ -85,7 +85,7 @@ struct ps3_private { ...@@ -85,7 +85,7 @@ struct ps3_private {
static DEFINE_PER_CPU(struct ps3_private, ps3_private); static DEFINE_PER_CPU(struct ps3_private, ps3_private);
static int ps3_connect_irq(enum ps3_cpu_binding cpu, unsigned long outlet, int ps3_alloc_irq(enum ps3_cpu_binding cpu, unsigned long outlet,
unsigned int *virq) unsigned int *virq)
{ {
int result; int result;
...@@ -138,8 +138,9 @@ static int ps3_connect_irq(enum ps3_cpu_binding cpu, unsigned long outlet, ...@@ -138,8 +138,9 @@ static int ps3_connect_irq(enum ps3_cpu_binding cpu, unsigned long outlet,
fail_create: fail_create:
return result; return result;
} }
EXPORT_SYMBOL_GPL(ps3_alloc_irq);
static void ps3_disconnect_irq(unsigned int virq) int ps3_free_irq(unsigned int virq)
{ {
int result; int result;
const struct ps3_private *pd = get_irq_chip_data(virq); const struct ps3_private *pd = get_irq_chip_data(virq);
...@@ -155,7 +156,9 @@ static void ps3_disconnect_irq(unsigned int virq) ...@@ -155,7 +156,9 @@ static void ps3_disconnect_irq(unsigned int virq)
set_irq_chip_data(virq, NULL); set_irq_chip_data(virq, NULL);
irq_dispose_mapping(virq); irq_dispose_mapping(virq);
return result;
} }
EXPORT_SYMBOL_GPL(ps3_free_irq);
/** /**
* ps3_alloc_io_irq - Assign a virq to a system bus device. * ps3_alloc_io_irq - Assign a virq to a system bus device.
...@@ -182,7 +185,7 @@ int ps3_alloc_io_irq(enum ps3_cpu_binding cpu, unsigned int interrupt_id, ...@@ -182,7 +185,7 @@ int ps3_alloc_io_irq(enum ps3_cpu_binding cpu, unsigned int interrupt_id,
return result; return result;
} }
result = ps3_connect_irq(cpu, outlet, virq); result = ps3_alloc_irq(cpu, outlet, virq);
BUG_ON(result); BUG_ON(result);
return result; return result;
...@@ -198,7 +201,7 @@ int ps3_free_io_irq(unsigned int virq) ...@@ -198,7 +201,7 @@ int ps3_free_io_irq(unsigned int virq)
pr_debug("%s:%d: lv1_destruct_io_irq_outlet failed: %s\n", pr_debug("%s:%d: lv1_destruct_io_irq_outlet failed: %s\n",
__func__, __LINE__, ps3_result(result)); __func__, __LINE__, ps3_result(result));
ps3_disconnect_irq(virq); ps3_free_irq(virq);
return result; return result;
} }
...@@ -228,7 +231,7 @@ int ps3_alloc_event_irq(enum ps3_cpu_binding cpu, unsigned int *virq) ...@@ -228,7 +231,7 @@ int ps3_alloc_event_irq(enum ps3_cpu_binding cpu, unsigned int *virq)
return result; return result;
} }
result = ps3_connect_irq(cpu, outlet, virq); result = ps3_alloc_irq(cpu, outlet, virq);
BUG_ON(result); BUG_ON(result);
return result; return result;
...@@ -246,7 +249,7 @@ int ps3_free_event_irq(unsigned int virq) ...@@ -246,7 +249,7 @@ int ps3_free_event_irq(unsigned int virq)
pr_debug("%s:%d: lv1_destruct_event_receive_port failed: %s\n", pr_debug("%s:%d: lv1_destruct_event_receive_port failed: %s\n",
__func__, __LINE__, ps3_result(result)); __func__, __LINE__, ps3_result(result));
ps3_disconnect_irq(virq); ps3_free_irq(virq);
pr_debug(" <- %s:%d\n", __func__, __LINE__); pr_debug(" <- %s:%d\n", __func__, __LINE__);
return result; return result;
...@@ -350,7 +353,7 @@ int ps3_alloc_vuart_irq(enum ps3_cpu_binding cpu, void* virt_addr_bmp, ...@@ -350,7 +353,7 @@ int ps3_alloc_vuart_irq(enum ps3_cpu_binding cpu, void* virt_addr_bmp,
return result; return result;
} }
result = ps3_connect_irq(cpu, outlet, virq); result = ps3_alloc_irq(cpu, outlet, virq);
BUG_ON(result); BUG_ON(result);
return result; return result;
...@@ -368,7 +371,7 @@ int ps3_free_vuart_irq(unsigned int virq) ...@@ -368,7 +371,7 @@ int ps3_free_vuart_irq(unsigned int virq)
return result; return result;
} }
ps3_disconnect_irq(virq); ps3_free_irq(virq);
return result; return result;
} }
...@@ -399,7 +402,7 @@ int ps3_alloc_spe_irq(enum ps3_cpu_binding cpu, unsigned long spe_id, ...@@ -399,7 +402,7 @@ int ps3_alloc_spe_irq(enum ps3_cpu_binding cpu, unsigned long spe_id,
return result; return result;
} }
result = ps3_connect_irq(cpu, outlet, virq); result = ps3_alloc_irq(cpu, outlet, virq);
BUG_ON(result); BUG_ON(result);
return result; return result;
...@@ -407,10 +410,11 @@ int ps3_alloc_spe_irq(enum ps3_cpu_binding cpu, unsigned long spe_id, ...@@ -407,10 +410,11 @@ int ps3_alloc_spe_irq(enum ps3_cpu_binding cpu, unsigned long spe_id,
int ps3_free_spe_irq(unsigned int virq) int ps3_free_spe_irq(unsigned int virq)
{ {
ps3_disconnect_irq(virq); ps3_free_irq(virq);
return 0; return 0;
} }
#define PS3_INVALID_OUTLET ((irq_hw_number_t)-1) #define PS3_INVALID_OUTLET ((irq_hw_number_t)-1)
#define PS3_PLUG_MAX 63 #define PS3_PLUG_MAX 63
......
...@@ -163,6 +163,9 @@ int ps3_free_vuart_irq(unsigned int virq); ...@@ -163,6 +163,9 @@ int ps3_free_vuart_irq(unsigned int virq);
int ps3_alloc_spe_irq(enum ps3_cpu_binding cpu, unsigned long spe_id, int ps3_alloc_spe_irq(enum ps3_cpu_binding cpu, unsigned long spe_id,
unsigned int class, unsigned int *virq); unsigned int class, unsigned int *virq);
int ps3_free_spe_irq(unsigned int virq); int ps3_free_spe_irq(unsigned int virq);
int ps3_alloc_irq(enum ps3_cpu_binding cpu, unsigned long outlet,
unsigned int *virq);
int ps3_free_irq(unsigned int virq);
/* lv1 result codes */ /* lv1 result codes */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment