26
26
#define ACP3x_REG_START 0x1240000
27
27
#define ACP3x_REG_END 0x125C000
28
28
29
- static struct platform_device * pdev ;
30
-
31
- static const struct resource acp_res [] = {
32
- {
33
- .start = 0 ,
34
- .end = ACP3x_REG_END - ACP3x_REG_START ,
35
- .name = "acp_mem" ,
36
- .flags = IORESOURCE_MEM ,
37
- },
38
- {
39
- .start = 0 ,
40
- .end = 0 ,
41
- .name = "acp_dai_irq" ,
42
- .flags = IORESOURCE_IRQ ,
43
- },
44
- };
29
+ static void acp_fill_platform_dev_info (struct platform_device_info * pdevinfo ,
30
+ struct device * parent ,
31
+ struct fwnode_handle * fw_node ,
32
+ char * name , unsigned int id ,
33
+ const struct resource * res ,
34
+ unsigned int num_res ,
35
+ const void * data ,
36
+ size_t size_data )
37
+ {
38
+ pdevinfo -> name = name ;
39
+ pdevinfo -> id = id ;
40
+ pdevinfo -> parent = parent ;
41
+ pdevinfo -> num_res = num_res ;
42
+ pdevinfo -> res = res ;
43
+ pdevinfo -> data = data ;
44
+ pdevinfo -> size_data = size_data ;
45
+ pdevinfo -> fwnode = fw_node ;
46
+ }
45
47
46
- static int create_acp_platform_devs (struct pci_dev * pci , struct acp_chip_info * chip )
48
+ static int create_acp_platform_devs (struct pci_dev * pci , struct acp_chip_info * chip , u32 addr )
47
49
{
50
+ struct platform_device_info pdevinfo ;
51
+ struct device * parent ;
48
52
int ret ;
49
53
54
+ parent = & pci -> dev ;
55
+
56
+ if (chip -> is_i2s_config || chip -> is_pdm_dev ) {
57
+ chip -> res = devm_kzalloc (& pci -> dev , sizeof (struct resource ), GFP_KERNEL );
58
+ if (!chip -> res ) {
59
+ ret = - ENOMEM ;
60
+ goto err ;
61
+ }
62
+ chip -> res -> flags = IORESOURCE_MEM ;
63
+ chip -> res -> start = addr ;
64
+ chip -> res -> end = addr + (ACP3x_REG_END - ACP3x_REG_START );
65
+ memset (& pdevinfo , 0 , sizeof (pdevinfo ));
66
+ }
67
+
68
+ memset (& pdevinfo , 0 , sizeof (pdevinfo ));
69
+ acp_fill_platform_dev_info (& pdevinfo , parent , NULL , chip -> name ,
70
+ 0 , chip -> res , 1 , chip , sizeof (* chip ));
71
+
72
+ chip -> acp_plat_dev = platform_device_register_full (& pdevinfo );
73
+ if (IS_ERR (chip -> acp_plat_dev )) {
74
+ dev_err (& pci -> dev ,
75
+ "cannot register %s device\n" , pdevinfo .name );
76
+ ret = PTR_ERR (chip -> acp_plat_dev );
77
+ goto err ;
78
+ }
50
79
if (chip -> is_pdm_dev && chip -> is_pdm_config ) {
51
80
chip -> dmic_codec_dev = platform_device_register_data (& pci -> dev ,
52
81
"dmic-codec" ,
@@ -55,22 +84,21 @@ static int create_acp_platform_devs(struct pci_dev *pci, struct acp_chip_info *c
55
84
if (IS_ERR (chip -> dmic_codec_dev )) {
56
85
dev_err (& pci -> dev , "failed to create DMIC device\n" );
57
86
ret = PTR_ERR (chip -> dmic_codec_dev );
58
- goto err ;
87
+ goto unregister_acp_plat_dev ;
59
88
}
60
89
}
61
90
return 0 ;
91
+ unregister_acp_plat_dev :
92
+ platform_device_unregister (chip -> acp_plat_dev );
62
93
err :
63
94
return ret ;
64
95
}
65
96
66
97
static int acp_pci_probe (struct pci_dev * pci , const struct pci_device_id * pci_id )
67
98
{
68
- struct platform_device_info pdevinfo ;
69
99
struct device * dev = & pci -> dev ;
70
- const struct resource * res_acp ;
71
100
struct acp_chip_info * chip ;
72
- struct resource * res ;
73
- unsigned int flag , addr , num_res , i ;
101
+ unsigned int flag , addr ;
74
102
int ret ;
75
103
76
104
flag = snd_amd_acp_find_config (pci );
@@ -94,8 +122,6 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
94
122
95
123
pci_set_master (pci );
96
124
97
- res_acp = acp_res ;
98
- num_res = ARRAY_SIZE (acp_res );
99
125
chip -> acp_rev = pci -> revision ;
100
126
switch (pci -> revision ) {
101
127
case 0x01 :
@@ -129,6 +155,8 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
129
155
goto release_regions ;
130
156
}
131
157
158
+ chip -> addr = addr ;
159
+
132
160
chip -> acp_hw_ops_init (chip );
133
161
ret = acp_hw_init (chip );
134
162
if (ret )
@@ -138,48 +166,16 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
138
166
if (!chip -> is_pdm_dev && !chip -> is_i2s_config )
139
167
goto skip_pdev_creation ;
140
168
141
- ret = create_acp_platform_devs (pci , chip );
169
+ ret = create_acp_platform_devs (pci , chip , addr );
142
170
if (ret < 0 ) {
143
171
dev_err (& pci -> dev , "ACP platform devices creation failed\n" );
144
172
goto de_init ;
145
173
}
146
174
147
- res = devm_kcalloc (& pci -> dev , num_res , sizeof (struct resource ), GFP_KERNEL );
148
- if (!res ) {
149
- ret = - ENOMEM ;
150
- goto de_init ;
151
- }
152
-
153
- for (i = 0 ; i < num_res ; i ++ , res_acp ++ ) {
154
- res [i ].name = res_acp -> name ;
155
- res [i ].flags = res_acp -> flags ;
156
- res [i ].start = addr + res_acp -> start ;
157
- res [i ].end = addr + res_acp -> end ;
158
- if (res_acp -> flags == IORESOURCE_IRQ ) {
159
- res [i ].start = pci -> irq ;
160
- res [i ].end = res [i ].start ;
161
- }
162
- }
163
-
164
- memset (& pdevinfo , 0 , sizeof (pdevinfo ));
165
-
166
- pdevinfo .name = chip -> name ;
167
- pdevinfo .id = 0 ;
168
- pdevinfo .parent = & pci -> dev ;
169
- pdevinfo .num_res = num_res ;
170
- pdevinfo .res = & res [0 ];
171
- pdevinfo .data = chip ;
172
- pdevinfo .size_data = sizeof (* chip );
173
-
174
- pdev = platform_device_register_full (& pdevinfo );
175
- if (IS_ERR (pdev )) {
176
- dev_err (& pci -> dev , "cannot register %s device\n" , pdevinfo .name );
177
- ret = PTR_ERR (pdev );
178
- goto de_init ;
179
- }
175
+ chip -> chip_pdev = chip -> acp_plat_dev ;
176
+ chip -> dev = & chip -> acp_plat_dev -> dev ;
180
177
181
178
skip_pdev_creation :
182
- chip -> chip_pdev = pdev ;
183
179
dev_set_drvdata (& pci -> dev , chip );
184
180
pm_runtime_set_autosuspend_delay (& pci -> dev , 2000 );
185
181
pm_runtime_use_autosuspend (& pci -> dev );
@@ -244,8 +240,9 @@ static void acp_pci_remove(struct pci_dev *pci)
244
240
pm_runtime_get_noresume (& pci -> dev );
245
241
if (chip -> dmic_codec_dev )
246
242
platform_device_unregister (chip -> dmic_codec_dev );
247
- if (pdev )
248
- platform_device_unregister (pdev );
243
+ if (chip -> acp_plat_dev )
244
+ platform_device_unregister (chip -> acp_plat_dev );
245
+
249
246
ret = acp_hw_deinit (chip );
250
247
if (ret )
251
248
dev_err (& pci -> dev , "ACP de-init failed\n" );
0 commit comments