5454#define MODULE_NAME "audio-pkt"
5555#define MINOR_NUMBER_COUNT 1
5656#define AUDPKT_DRIVER_NAME "aud_pasthru_adsp"
57- #define APM_AUDIO_DRV_NAME "q6apm-audio-pkt"
5857
5958struct q6apm_audio_pkt {
6059 struct device * dev ;
@@ -64,10 +63,8 @@ struct q6apm_audio_pkt {
6463 //wait_queue_head_t wait;
6564 struct gpr_ibasic_rsp_result_t result ;
6665
67- struct mutex cmd_lock ;
6866 uint32_t state ;
6967
70-
7168 struct cdev cdev ;
7269 struct mutex lock ;
7370 spinlock_t queue_lock ;
@@ -319,7 +316,6 @@ static ssize_t audio_pkt_read(struct file *file, char __user *buf,
319316 unsigned long flags ;
320317 struct sk_buff * skb ;
321318 int use ;
322- uint32_t * temp ;
323319
324320 if (!audpkt_dev ) {
325321 AUDIO_PKT_ERR ("invalid device handle\n" );
@@ -350,7 +346,6 @@ static ssize_t audio_pkt_read(struct file *file, char __user *buf,
350346 use = min_t (size_t , count , skb -> len );
351347 if (copy_to_user (buf , skb -> data , use ))
352348 use = - EFAULT ;
353- temp = (uint32_t * ) skb -> data ;
354349 kfree_skb (skb );
355350
356351 return use ;
@@ -421,6 +416,7 @@ static ssize_t audio_pkt_write(struct file *file, const char __user *buf,
421416 ret = audpkt_chk_and_update_physical_addr ((struct audio_gpr_pkt * ) audpkt_hdr );
422417 if (ret < 0 ) {
423418 AUDIO_PKT_ERR ("Update Physical Address Failed -%d\n" , ret );
419+ kfree (kbuf );
424420 return ret ;
425421 }
426422 }
@@ -456,6 +452,8 @@ static ssize_t audio_pkt_write(struct file *file, const char __user *buf,
456452 ret = gpr_send_pkt (audpkt_dev -> adev , (struct gpr_pkt * ) kbuf );
457453 if (ret < 0 ) {
458454 AUDIO_PKT_ERR ("APR Send Packet Failed ret -%d\n" , ret );
455+ mutex_unlock (& audpkt_dev -> lock );
456+ kfree (kbuf );
459457 return ret ;
460458 }
461459 mutex_unlock (& audpkt_dev -> lock );
@@ -480,7 +478,6 @@ static unsigned int audio_pkt_poll(struct file *file, poll_table *wait)
480478 unsigned int mask = 0 ;
481479 unsigned long flags ;
482480
483- audpkt_dev = file -> private_data ;
484481 if (!audpkt_dev ) {
485482 AUDIO_PKT_ERR ("invalid device handle\n" );
486483 return POLLERR ;
@@ -584,7 +581,7 @@ static int q6apm_audio_pkt_probe(gpr_device_t *adev)
584581err_device :
585582 class_destroy (apm -> audio_pkt_class );
586583err_class :
587- unregister_chrdev_region (MAJOR ( apm -> audio_pkt_major ) ,
584+ unregister_chrdev_region (apm -> audio_pkt_major ,
588585 MINOR_NUMBER_COUNT );
589586err_chrdev :
590587 return ret ;
@@ -596,13 +593,17 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o
596593 struct q6apm_audio_pkt * apm = dev_get_drvdata (& gdev -> dev );
597594 struct gpr_ibasic_rsp_result_t * result ;
598595 struct gpr_hdr * hdr = & data -> hdr ;
599- uint8_t * pkt = NULL ;
596+ struct device * dev = & gdev -> dev ;
600597 uint16_t hdr_size , pkt_size ;
601598 unsigned long flags ;
602599 struct sk_buff * skb ;
603600 int ret ;
604601 struct gpr_port_map * audpkt_port_map ;
605602
603+ if (!apm ) {
604+ dev_dbg (dev , "callback with NULL drvdata\n" );
605+ return - ENODEV ;
606+ }
606607
607608 hdr_size = hdr -> hdr_size * 4 ;
608609 pkt_size = hdr -> pkt_size ;
@@ -616,24 +617,17 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o
616617 idr_remove (& apm -> audpkt_port_idr , hdr -> token );
617618 kfree (audpkt_port_map );
618619 } else {
619- AUDIO_PKT_ERR ( "Token=%u not found\n" , hdr -> token );
620+ dev_dbg ( dev , "Token=%u not found\n" , hdr -> token );
620621 }
621622 mutex_unlock (& apm -> audpkt_port_lock );
622623
623- pkt = kmalloc (pkt_size , GFP_KERNEL );
624- if (!pkt )
625- return - ENOMEM ;
626-
627- memcpy (pkt , (uint8_t * )data , hdr_size );
628- memcpy (pkt + hdr_size , (uint8_t * )data -> payload , pkt_size - hdr_size );
629-
630624 skb = alloc_skb (pkt_size , GFP_ATOMIC );
631625 if (!skb )
632626 return - ENOMEM ;
633627
634- skb_put_data (skb , (void * )pkt , pkt_size );
628+ skb_put_data (skb , (uint8_t * )data , hdr_size );
629+ skb_put_data (skb , (uint8_t * )data -> payload , pkt_size - hdr_size );
635630
636- kfree (pkt );
637631 spin_lock_irqsave (& apm -> queue_lock , flags );
638632 skb_queue_tail (& apm -> queue , skb );
639633 spin_unlock_irqrestore (& apm -> queue_lock , flags );
@@ -642,19 +636,32 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o
642636 /* wake up any blocking processes, waiting for new data */
643637 wake_up_interruptible (& apm -> readq );
644638 if (hdr -> opcode == APM_CMD_RSP_GET_SPF_STATE ) {
645- result = data -> payload ;
646- apm -> result .opcode = hdr -> opcode ;
647- apm -> result .status = 0 ;
648- /* First word of result it state */
649- apm -> state = hdr -> opcode ;
650- }
639+ result = data -> payload ;
640+ apm -> result .opcode = hdr -> opcode ;
641+ apm -> result .status = 0 ;
642+ /* First word of result it state */
643+ apm -> state = hdr -> opcode ;
644+ }
651645
652646 return 0 ;
653647}
654648
655649static void q6apm_audio_pkt_remove (gpr_device_t * adev )
656650{
657- of_platform_depopulate (& adev -> dev );
651+ struct device * dev = & adev -> dev ;
652+ struct q6apm_audio_pkt * apm = dev_get_drvdata (dev );
653+
654+ of_platform_depopulate (dev );
655+
656+ if (!apm )
657+ return ;
658+
659+ cdev_del (& apm -> cdev );
660+ device_destroy (apm -> audio_pkt_class , apm -> audio_pkt_major );
661+ class_destroy (apm -> audio_pkt_class );
662+ unregister_chrdev_region (apm -> audio_pkt_major , MINOR_NUMBER_COUNT );
663+
664+ dev_set_drvdata (dev , NULL );
658665}
659666
660667#ifdef CONFIG_OF
0 commit comments