2626#define ACP3x_REG_START 0x1240000
2727#define ACP3x_REG_END 0x125C000
2828
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+ }
4547
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 )
4749{
50+ struct platform_device_info pdevinfo ;
51+ struct device * parent ;
4852 int ret ;
4953
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+ }
5079 if (chip -> is_pdm_dev && chip -> is_pdm_config ) {
5180 chip -> dmic_codec_dev = platform_device_register_data (& pci -> dev ,
5281 "dmic-codec" ,
@@ -55,22 +84,21 @@ static int create_acp_platform_devs(struct pci_dev *pci, struct acp_chip_info *c
5584 if (IS_ERR (chip -> dmic_codec_dev )) {
5685 dev_err (& pci -> dev , "failed to create DMIC device\n" );
5786 ret = PTR_ERR (chip -> dmic_codec_dev );
58- goto err ;
87+ goto unregister_acp_plat_dev ;
5988 }
6089 }
6190 return 0 ;
91+ unregister_acp_plat_dev :
92+ platform_device_unregister (chip -> acp_plat_dev );
6293err :
6394 return ret ;
6495}
6596
6697static int acp_pci_probe (struct pci_dev * pci , const struct pci_device_id * pci_id )
6798{
68- struct platform_device_info pdevinfo ;
6999 struct device * dev = & pci -> dev ;
70- const struct resource * res_acp ;
71100 struct acp_chip_info * chip ;
72- struct resource * res ;
73- unsigned int flag , addr , num_res , i ;
101+ unsigned int flag , addr ;
74102 int ret ;
75103
76104 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
94122
95123 pci_set_master (pci );
96124
97- res_acp = acp_res ;
98- num_res = ARRAY_SIZE (acp_res );
99125 chip -> acp_rev = pci -> revision ;
100126 switch (pci -> revision ) {
101127 case 0x01 :
@@ -129,6 +155,8 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
129155 goto release_regions ;
130156 }
131157
158+ chip -> addr = addr ;
159+
132160 chip -> acp_hw_ops_init (chip );
133161 ret = acp_hw_init (chip );
134162 if (ret )
@@ -138,48 +166,16 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
138166 if (!chip -> is_pdm_dev && !chip -> is_i2s_config )
139167 goto skip_pdev_creation ;
140168
141- ret = create_acp_platform_devs (pci , chip );
169+ ret = create_acp_platform_devs (pci , chip , addr );
142170 if (ret < 0 ) {
143171 dev_err (& pci -> dev , "ACP platform devices creation failed\n" );
144172 goto de_init ;
145173 }
146174
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 ;
180177
181178skip_pdev_creation :
182- chip -> chip_pdev = pdev ;
183179 dev_set_drvdata (& pci -> dev , chip );
184180 pm_runtime_set_autosuspend_delay (& pci -> dev , 2000 );
185181 pm_runtime_use_autosuspend (& pci -> dev );
@@ -244,8 +240,9 @@ static void acp_pci_remove(struct pci_dev *pci)
244240 pm_runtime_get_noresume (& pci -> dev );
245241 if (chip -> dmic_codec_dev )
246242 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+
249246 ret = acp_hw_deinit (chip );
250247 if (ret )
251248 dev_err (& pci -> dev , "ACP de-init failed\n" );
0 commit comments