2626#define ACP3x_REG_START 0x1240000
2727#define ACP3x_REG_END 0x125C000
2828
29- static struct platform_device * dmic_dev ;
3029static struct platform_device * pdev ;
3130
3231static const struct resource acp_res [] = {
@@ -44,6 +43,26 @@ static const struct resource acp_res[] = {
4443 },
4544};
4645
46+ static int create_acp_platform_devs (struct pci_dev * pci , struct acp_chip_info * chip )
47+ {
48+ int ret ;
49+
50+ if (chip -> is_pdm_dev && chip -> is_pdm_config ) {
51+ chip -> dmic_codec_dev = platform_device_register_data (& pci -> dev ,
52+ "dmic-codec" ,
53+ PLATFORM_DEVID_NONE ,
54+ NULL , 0 );
55+ if (IS_ERR (chip -> dmic_codec_dev )) {
56+ dev_err (& pci -> dev , "failed to create DMIC device\n" );
57+ ret = PTR_ERR (chip -> dmic_codec_dev );
58+ goto err ;
59+ }
60+ }
61+ return 0 ;
62+ err :
63+ return ret ;
64+ }
65+
4766static int acp_pci_probe (struct pci_dev * pci , const struct pci_device_id * pci_id )
4867{
4968 struct platform_device_info pdevinfo ;
@@ -102,33 +121,33 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
102121 goto release_regions ;
103122 }
104123 chip -> flag = flag ;
105- dmic_dev = platform_device_register_data (dev , "dmic-codec" , PLATFORM_DEVID_NONE , NULL , 0 );
106- if (IS_ERR (dmic_dev )) {
107- dev_err (dev , "failed to create DMIC device\n" );
108- ret = PTR_ERR (dmic_dev );
109- goto release_regions ;
110- }
111124
112125 addr = pci_resource_start (pci , 0 );
113126 chip -> base = devm_ioremap (& pci -> dev , addr , pci_resource_len (pci , 0 ));
114127 if (!chip -> base ) {
115128 ret = - ENOMEM ;
116- goto unregister_dmic_dev ;
129+ goto release_regions ;
117130 }
118131
119132 chip -> acp_hw_ops_init (chip );
120133 ret = acp_hw_init (chip );
121134 if (ret )
122- goto unregister_dmic_dev ;
135+ goto release_regions ;
123136
124137 check_acp_config (pci , chip );
125138 if (!chip -> is_pdm_dev && !chip -> is_i2s_config )
126139 goto skip_pdev_creation ;
127140
141+ ret = create_acp_platform_devs (pci , chip );
142+ if (ret < 0 ) {
143+ dev_err (& pci -> dev , "ACP platform devices creation failed\n" );
144+ goto de_init ;
145+ }
146+
128147 res = devm_kcalloc (& pci -> dev , num_res , sizeof (struct resource ), GFP_KERNEL );
129148 if (!res ) {
130149 ret = - ENOMEM ;
131- goto unregister_dmic_dev ;
150+ goto de_init ;
132151 }
133152
134153 for (i = 0 ; i < num_res ; i ++ , res_acp ++ ) {
@@ -156,7 +175,7 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
156175 if (IS_ERR (pdev )) {
157176 dev_err (& pci -> dev , "cannot register %s device\n" , pdevinfo .name );
158177 ret = PTR_ERR (pdev );
159- goto unregister_dmic_dev ;
178+ goto de_init ;
160179 }
161180
162181skip_pdev_creation :
@@ -168,8 +187,8 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
168187 pm_runtime_allow (& pci -> dev );
169188 return ret ;
170189
171- unregister_dmic_dev :
172- platform_device_unregister ( dmic_dev );
190+ de_init :
191+ acp_hw_deinit ( chip );
173192release_regions :
174193 pci_release_regions (pci );
175194disable_pci :
@@ -223,8 +242,8 @@ static void acp_pci_remove(struct pci_dev *pci)
223242 chip = pci_get_drvdata (pci );
224243 pm_runtime_forbid (& pci -> dev );
225244 pm_runtime_get_noresume (& pci -> dev );
226- if (dmic_dev )
227- platform_device_unregister (dmic_dev );
245+ if (chip -> dmic_codec_dev )
246+ platform_device_unregister (chip -> dmic_codec_dev );
228247 if (pdev )
229248 platform_device_unregister (pdev );
230249 ret = acp_hw_deinit (chip );
0 commit comments