15
15
#include <linux/list.h>
16
16
#include <linux/module.h>
17
17
#include <linux/of.h>
18
+ #include <linux/of_irq.h>
19
+ #include <linux/interrupt.h>
18
20
19
21
#include <asm/opal.h>
20
22
@@ -23,8 +25,7 @@ struct ipmi_smi_powernv {
23
25
u64 interface_id ;
24
26
struct ipmi_device_id ipmi_id ;
25
27
ipmi_smi_t intf ;
26
- u64 event ;
27
- struct notifier_block event_nb ;
28
+ unsigned int irq ;
28
29
29
30
/**
30
31
* We assume that there can only be one outstanding request, so
@@ -197,15 +198,12 @@ static struct ipmi_smi_handlers ipmi_powernv_smi_handlers = {
197
198
.poll = ipmi_powernv_poll ,
198
199
};
199
200
200
- static int ipmi_opal_event (struct notifier_block * nb ,
201
- unsigned long events , void * change )
201
+ static irqreturn_t ipmi_opal_event (int irq , void * data )
202
202
{
203
- struct ipmi_smi_powernv * smi = container_of (nb ,
204
- struct ipmi_smi_powernv , event_nb );
203
+ struct ipmi_smi_powernv * smi = data ;
205
204
206
- if (events & smi -> event )
207
- ipmi_powernv_recv (smi );
208
- return 0 ;
205
+ ipmi_powernv_recv (smi );
206
+ return IRQ_HANDLED ;
209
207
}
210
208
211
209
static int ipmi_powernv_probe (struct platform_device * pdev )
@@ -240,13 +238,16 @@ static int ipmi_powernv_probe(struct platform_device *pdev)
240
238
goto err_free ;
241
239
}
242
240
243
- ipmi -> event = 1ull << prop ;
244
- ipmi -> event_nb .notifier_call = ipmi_opal_event ;
241
+ ipmi -> irq = irq_of_parse_and_map (dev -> of_node , 0 );
242
+ if (!ipmi -> irq ) {
243
+ dev_info (dev , "Unable to map irq from device tree\n" );
244
+ ipmi -> irq = opal_event_request (prop );
245
+ }
245
246
246
- rc = opal_notifier_register ( & ipmi -> event_nb );
247
- if ( rc ) {
248
- dev_warn (dev , "OPAL notifier registration failed (%d) \n" , rc );
249
- goto err_free ;
247
+ if ( request_irq ( ipmi -> irq , ipmi_opal_event , IRQ_TYPE_LEVEL_HIGH ,
248
+ "opal-ipmi" , ipmi ) ) {
249
+ dev_warn (dev , "Unable to request irq \n" );
250
+ goto err_dispose ;
250
251
}
251
252
252
253
ipmi -> opal_msg = devm_kmalloc (dev ,
@@ -271,7 +272,9 @@ static int ipmi_powernv_probe(struct platform_device *pdev)
271
272
err_free_msg :
272
273
devm_kfree (dev , ipmi -> opal_msg );
273
274
err_unregister :
274
- opal_notifier_unregister (& ipmi -> event_nb );
275
+ free_irq (ipmi -> irq , ipmi );
276
+ err_dispose :
277
+ irq_dispose_mapping (ipmi -> irq );
275
278
err_free :
276
279
devm_kfree (dev , ipmi );
277
280
return rc ;
@@ -282,7 +285,9 @@ static int ipmi_powernv_remove(struct platform_device *pdev)
282
285
struct ipmi_smi_powernv * smi = dev_get_drvdata (& pdev -> dev );
283
286
284
287
ipmi_unregister_smi (smi -> intf );
285
- opal_notifier_unregister (& smi -> event_nb );
288
+ free_irq (smi -> irq , smi );
289
+ irq_dispose_mapping (smi -> irq );
290
+
286
291
return 0 ;
287
292
}
288
293
0 commit comments