2424
2525#include <subdev/mc.h>
2626
27- void
28- nouveau_mc_intr (struct nouveau_subdev * subdev )
27+ static irqreturn_t
28+ nouveau_mc_intr (int irq , void * arg )
2929{
30- struct nouveau_mc * pmc = nouveau_mc ( subdev ) ;
30+ struct nouveau_mc * pmc = arg ;
3131 const struct nouveau_mc_intr * map = pmc -> intr_map ;
3232 struct nouveau_subdev * unit ;
3333 u32 stat , intr ;
3434
3535 intr = stat = nv_rd32 (pmc , 0x000100 );
3636 while (stat && map -> stat ) {
3737 if (stat & map -> stat ) {
38- unit = nouveau_subdev (subdev , map -> unit );
38+ unit = nouveau_subdev (pmc , map -> unit );
3939 if (unit && unit -> intr )
4040 unit -> intr (unit );
4141 intr &= ~map -> stat ;
@@ -46,4 +46,56 @@ nouveau_mc_intr(struct nouveau_subdev *subdev)
4646 if (intr ) {
4747 nv_error (pmc , "unknown intr 0x%08x\n" , stat );
4848 }
49+
50+ return stat ? IRQ_HANDLED : IRQ_NONE ;
51+ }
52+
53+ int
54+ _nouveau_mc_fini (struct nouveau_object * object , bool suspend )
55+ {
56+ struct nouveau_mc * pmc = (void * )object ;
57+ nv_wr32 (pmc , 0x000140 , 0x00000000 );
58+ return nouveau_subdev_fini (& pmc -> base , suspend );
59+ }
60+
61+ int
62+ _nouveau_mc_init (struct nouveau_object * object )
63+ {
64+ struct nouveau_mc * pmc = (void * )object ;
65+ int ret = nouveau_subdev_init (& pmc -> base );
66+ if (ret )
67+ return ret ;
68+ nv_wr32 (pmc , 0x000140 , 0x00000001 );
69+ return 0 ;
70+ }
71+
72+ void
73+ _nouveau_mc_dtor (struct nouveau_object * object )
74+ {
75+ struct nouveau_device * device = nv_device (object );
76+ struct nouveau_mc * pmc = (void * )object ;
77+ free_irq (device -> pdev -> irq , pmc );
78+ nouveau_subdev_destroy (& pmc -> base );
79+ }
80+
81+ int
82+ nouveau_mc_create_ (struct nouveau_object * parent , struct nouveau_object * engine ,
83+ struct nouveau_oclass * oclass , int length , void * * pobject )
84+ {
85+ struct nouveau_device * device = nv_device (parent );
86+ struct nouveau_mc * pmc ;
87+ int ret ;
88+
89+ ret = nouveau_subdev_create_ (parent , engine , oclass , 0 , "PMC" ,
90+ "master" , length , pobject );
91+ pmc = * pobject ;
92+ if (ret )
93+ return ret ;
94+
95+ ret = request_irq (device -> pdev -> irq , nouveau_mc_intr ,
96+ IRQF_SHARED , "nouveau" , pmc );
97+ if (ret < 0 )
98+ return ret ;
99+
100+ return 0 ;
49101}
0 commit comments