8
8
9
9
#define VIRTIO_BUS_NB 128
10
10
11
- static int __init virt_virtio_init (unsigned int id )
11
+ static struct platform_device * __init virt_virtio_init (unsigned int id )
12
12
{
13
13
const struct resource res [] = {
14
14
DEFINE_RES_MEM (virt_bi_data .virtio .mmio + id * 0x200 , 0x200 ),
15
15
DEFINE_RES_IRQ (virt_bi_data .virtio .irq + id ),
16
16
};
17
- struct platform_device * pdev ;
18
17
19
- pdev = platform_device_register_simple ("virtio-mmio" , id ,
18
+ return platform_device_register_simple ("virtio-mmio" , id ,
20
19
res , ARRAY_SIZE (res ));
21
- if (IS_ERR (pdev ))
22
- return PTR_ERR (pdev );
23
-
24
- return 0 ;
25
20
}
26
21
27
22
static int __init virt_platform_init (void )
@@ -35,38 +30,51 @@ static int __init virt_platform_init(void)
35
30
DEFINE_RES_MEM (virt_bi_data .rtc .mmio + 0x1000 , 0x1000 ),
36
31
DEFINE_RES_IRQ (virt_bi_data .rtc .irq + 1 ),
37
32
};
38
- struct platform_device * pdev ;
33
+ struct platform_device * pdev1 , * pdev2 ;
34
+ struct platform_device * pdevs [VIRTIO_BUS_NB ];
39
35
unsigned int i ;
36
+ int ret = 0 ;
40
37
41
38
if (!MACH_IS_VIRT )
42
39
return - ENODEV ;
43
40
44
41
/* We need this to have DMA'able memory provided to goldfish-tty */
45
42
min_low_pfn = 0 ;
46
43
47
- pdev = platform_device_register_simple ("goldfish_tty" ,
48
- PLATFORM_DEVID_NONE ,
49
- goldfish_tty_res ,
50
- ARRAY_SIZE (goldfish_tty_res ));
51
- if (IS_ERR (pdev ))
52
- return PTR_ERR (pdev );
44
+ pdev1 = platform_device_register_simple ("goldfish_tty" ,
45
+ PLATFORM_DEVID_NONE ,
46
+ goldfish_tty_res ,
47
+ ARRAY_SIZE (goldfish_tty_res ));
48
+ if (IS_ERR (pdev1 ))
49
+ return PTR_ERR (pdev1 );
53
50
54
- pdev = platform_device_register_simple ("goldfish_rtc" ,
55
- PLATFORM_DEVID_NONE ,
56
- goldfish_rtc_res ,
57
- ARRAY_SIZE (goldfish_rtc_res ));
58
- if (IS_ERR (pdev ))
59
- return PTR_ERR (pdev );
51
+ pdev2 = platform_device_register_simple ("goldfish_rtc" ,
52
+ PLATFORM_DEVID_NONE ,
53
+ goldfish_rtc_res ,
54
+ ARRAY_SIZE (goldfish_rtc_res ));
55
+ if (IS_ERR (pdev2 )) {
56
+ ret = PTR_ERR (pdev2 );
57
+ goto err_unregister_tty ;
58
+ }
60
59
61
60
for (i = 0 ; i < VIRTIO_BUS_NB ; i ++ ) {
62
- int err ;
63
-
64
- err = virt_virtio_init ( i );
65
- if ( err )
66
- return err ;
61
+ pdevs [ i ] = virt_virtio_init ( i ) ;
62
+ if ( IS_ERR ( pdevs [ i ])) {
63
+ ret = PTR_ERR ( pdevs [ i ] );
64
+ goto err_unregister_rtc_virtio ;
65
+ }
67
66
}
68
67
69
68
return 0 ;
69
+
70
+ err_unregister_rtc_virtio :
71
+ while (i > 0 )
72
+ platform_device_unregister (pdevs [-- i ]);
73
+ platform_device_unregister (pdev2 );
74
+ err_unregister_tty :
75
+ platform_device_unregister (pdev1 );
76
+
77
+ return ret ;
70
78
}
71
79
72
80
arch_initcall (virt_platform_init );
0 commit comments