@@ -127,7 +127,8 @@ static void amd_pmf_get_metrics(struct work_struct *work)
127127 ktime_t time_elapsed_ms ;
128128 int socket_power ;
129129
130- mutex_lock (& dev -> update_mutex );
130+ guard (mutex )(& dev -> update_mutex );
131+
131132 /* Transfer table contents */
132133 memset (dev -> buf , 0 , sizeof (dev -> m_table ));
133134 amd_pmf_send_cmd (dev , SET_TRANSFER_TABLE , 0 , 7 , NULL );
@@ -149,7 +150,6 @@ static void amd_pmf_get_metrics(struct work_struct *work)
149150
150151 dev -> start_time = ktime_to_ms (ktime_get ());
151152 schedule_delayed_work (& dev -> work_buffer , msecs_to_jiffies (metrics_table_loop_ms ));
152- mutex_unlock (& dev -> update_mutex );
153153}
154154
155155static inline u32 amd_pmf_reg_read (struct amd_pmf_dev * dev , int reg_offset )
@@ -176,20 +176,34 @@ static void __maybe_unused amd_pmf_dump_registers(struct amd_pmf_dev *dev)
176176 dev_dbg (dev -> dev , "AMD_PMF_REGISTER_MESSAGE:%x\n" , value );
177177}
178178
179+ /**
180+ * fixp_q88_fromint: Convert integer to Q8.8
181+ * @val: input value
182+ *
183+ * Converts an integer into binary fixed point format where 8 bits
184+ * are used for integer and 8 bits are used for the decimal.
185+ *
186+ * Return: unsigned integer converted to Q8.8 format
187+ */
188+ u32 fixp_q88_fromint (u32 val )
189+ {
190+ return val << 8 ;
191+ }
192+
179193int amd_pmf_send_cmd (struct amd_pmf_dev * dev , u8 message , bool get , u32 arg , u32 * data )
180194{
181195 int rc ;
182196 u32 val ;
183197
184- mutex_lock (& dev -> lock );
198+ guard ( mutex ) (& dev -> lock );
185199
186200 /* Wait until we get a valid response */
187201 rc = readx_poll_timeout (ioread32 , dev -> regbase + AMD_PMF_REGISTER_RESPONSE ,
188202 val , val != 0 , PMF_MSG_DELAY_MIN_US ,
189203 PMF_MSG_DELAY_MIN_US * RESPONSE_REGISTER_LOOP_MAX );
190204 if (rc ) {
191205 dev_err (dev -> dev , "failed to talk to SMU\n" );
192- goto out_unlock ;
206+ return rc ;
193207 }
194208
195209 /* Write zero to response register */
@@ -207,7 +221,7 @@ int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32
207221 PMF_MSG_DELAY_MIN_US * RESPONSE_REGISTER_LOOP_MAX );
208222 if (rc ) {
209223 dev_err (dev -> dev , "SMU response timed out\n" );
210- goto out_unlock ;
224+ return rc ;
211225 }
212226
213227 switch (val ) {
@@ -221,21 +235,19 @@ int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32
221235 case AMD_PMF_RESULT_CMD_REJECT_BUSY :
222236 dev_err (dev -> dev , "SMU not ready. err: 0x%x\n" , val );
223237 rc = - EBUSY ;
224- goto out_unlock ;
238+ break ;
225239 case AMD_PMF_RESULT_CMD_UNKNOWN :
226240 dev_err (dev -> dev , "SMU cmd unknown. err: 0x%x\n" , val );
227241 rc = - EINVAL ;
228- goto out_unlock ;
242+ break ;
229243 case AMD_PMF_RESULT_CMD_REJECT_PREREQ :
230244 case AMD_PMF_RESULT_FAILED :
231245 default :
232246 dev_err (dev -> dev , "SMU cmd failed. err: 0x%x\n" , val );
233247 rc = - EIO ;
234- goto out_unlock ;
248+ break ;
235249 }
236250
237- out_unlock :
238- mutex_unlock (& dev -> lock );
239251 amd_pmf_dump_registers (dev );
240252 return rc ;
241253}
@@ -268,7 +280,7 @@ int amd_pmf_set_dram_addr(struct amd_pmf_dev *dev, bool alloc_buffer)
268280 dev_err (dev -> dev , "Invalid CPU id: 0x%x" , dev -> cpu_id );
269281 }
270282
271- dev -> buf = kzalloc ( dev -> mtable_size , GFP_KERNEL );
283+ dev -> buf = devm_kzalloc ( dev -> dev , dev -> mtable_size , GFP_KERNEL );
272284 if (!dev -> buf )
273285 return - ENOMEM ;
274286 }
@@ -429,18 +441,18 @@ static int amd_pmf_probe(struct platform_device *pdev)
429441
430442 err = amd_smn_read (0 , AMD_PMF_BASE_ADDR_LO , & val );
431443 if (err ) {
432- dev_err (dev -> dev , "error in reading from 0x%x\n" , AMD_PMF_BASE_ADDR_LO );
433444 pci_dev_put (rdev );
434- return pcibios_err_to_errno (err );
445+ return dev_err_probe (dev -> dev , pcibios_err_to_errno (err ),
446+ "error in reading from 0x%x\n" , AMD_PMF_BASE_ADDR_LO );
435447 }
436448
437449 base_addr_lo = val & AMD_PMF_BASE_ADDR_HI_MASK ;
438450
439451 err = amd_smn_read (0 , AMD_PMF_BASE_ADDR_HI , & val );
440452 if (err ) {
441- dev_err (dev -> dev , "error in reading from 0x%x\n" , AMD_PMF_BASE_ADDR_HI );
442453 pci_dev_put (rdev );
443- return pcibios_err_to_errno (err );
454+ return dev_err_probe (dev -> dev , pcibios_err_to_errno (err ),
455+ "error in reading from 0x%x\n" , AMD_PMF_BASE_ADDR_HI );
444456 }
445457
446458 base_addr_hi = val & AMD_PMF_BASE_ADDR_LO_MASK ;
@@ -454,8 +466,8 @@ static int amd_pmf_probe(struct platform_device *pdev)
454466
455467 mutex_init (& dev -> lock );
456468 mutex_init (& dev -> update_mutex );
469+ mutex_init (& dev -> cb_mutex );
457470
458- amd_pmf_quirks_init (dev );
459471 apmf_acpi_init (dev );
460472 platform_set_drvdata (pdev , dev );
461473 amd_pmf_dbgfs_register (dev );
@@ -480,7 +492,7 @@ static void amd_pmf_remove(struct platform_device *pdev)
480492 amd_pmf_dbgfs_unregister (dev );
481493 mutex_destroy (& dev -> lock );
482494 mutex_destroy (& dev -> update_mutex );
483- kfree ( dev -> buf );
495+ mutex_destroy ( & dev -> cb_mutex );
484496}
485497
486498static const struct attribute_group * amd_pmf_driver_groups [] = {
0 commit comments