5757#define MODULE_NAME "audio-pkt"
5858#define MINOR_NUMBER_COUNT 1
5959#define AUDPKT_DRIVER_NAME "aud_pasthru_adsp"
60- #define APM_AUDIO_DRV_NAME "q6apm-audio-pkt"
6160
6261struct q6apm_audio_pkt {
6362 struct device * dev ;
@@ -67,10 +66,8 @@ struct q6apm_audio_pkt {
6766 //wait_queue_head_t wait;
6867 struct gpr_ibasic_rsp_result_t result ;
6968
70- struct mutex cmd_lock ;
7169 uint32_t state ;
7270
73-
7471 struct cdev cdev ;
7572 struct mutex lock ;
7673 spinlock_t queue_lock ;
@@ -322,7 +319,6 @@ static ssize_t audio_pkt_read(struct file *file, char __user *buf,
322319 unsigned long flags ;
323320 struct sk_buff * skb ;
324321 int use ;
325- uint32_t * temp ;
326322
327323 if (!audpkt_dev ) {
328324 AUDIO_PKT_ERR ("invalid device handle\n" );
@@ -353,7 +349,6 @@ static ssize_t audio_pkt_read(struct file *file, char __user *buf,
353349 use = min_t (size_t , count , skb -> len );
354350 if (copy_to_user (buf , skb -> data , use ))
355351 use = - EFAULT ;
356- temp = (uint32_t * ) skb -> data ;
357352 kfree_skb (skb );
358353
359354 return use ;
@@ -424,6 +419,7 @@ static ssize_t audio_pkt_write(struct file *file, const char __user *buf,
424419 ret = audpkt_chk_and_update_physical_addr ((struct audio_gpr_pkt * ) audpkt_hdr );
425420 if (ret < 0 ) {
426421 AUDIO_PKT_ERR ("Update Physical Address Failed -%d\n" , ret );
422+ kfree (kbuf );
427423 return ret ;
428424 }
429425 }
@@ -459,6 +455,8 @@ static ssize_t audio_pkt_write(struct file *file, const char __user *buf,
459455 ret = gpr_send_pkt (audpkt_dev -> adev , (struct gpr_pkt * ) kbuf );
460456 if (ret < 0 ) {
461457 AUDIO_PKT_ERR ("APR Send Packet Failed ret -%d\n" , ret );
458+ mutex_unlock (& audpkt_dev -> lock );
459+ kfree (kbuf );
462460 return ret ;
463461 }
464462 mutex_unlock (& audpkt_dev -> lock );
@@ -483,7 +481,6 @@ static unsigned int audio_pkt_poll(struct file *file, poll_table *wait)
483481 unsigned int mask = 0 ;
484482 unsigned long flags ;
485483
486- audpkt_dev = file -> private_data ;
487484 if (!audpkt_dev ) {
488485 AUDIO_PKT_ERR ("invalid device handle\n" );
489486 return POLLERR ;
@@ -587,7 +584,7 @@ static int q6apm_audio_pkt_probe(gpr_device_t *adev)
587584err_device :
588585 class_destroy (apm -> audio_pkt_class );
589586err_class :
590- unregister_chrdev_region (MAJOR ( apm -> audio_pkt_major ) ,
587+ unregister_chrdev_region (apm -> audio_pkt_major ,
591588 MINOR_NUMBER_COUNT );
592589err_chrdev :
593590 return ret ;
@@ -600,13 +597,16 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o
600597 struct gpr_ibasic_rsp_result_t * result ;
601598 struct gpr_hdr * hdr = & data -> hdr ;
602599 struct device * dev = & gdev -> dev ;
603- uint8_t * pkt = NULL ;
604600 uint16_t hdr_size , pkt_size ;
605601 unsigned long flags ;
606602 struct sk_buff * skb ;
607603 int ret ;
608604 struct gpr_port_map * audpkt_port_map ;
609605
606+ if (!apm ) {
607+ dev_dbg (dev , "callback with NULL drvdata\n" );
608+ return - ENODEV ;
609+ }
610610
611611 hdr_size = hdr -> hdr_size * 4 ;
612612 pkt_size = hdr -> pkt_size ;
@@ -624,20 +624,13 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o
624624 }
625625 mutex_unlock (& apm -> audpkt_port_lock );
626626
627- pkt = kmalloc (pkt_size , GFP_KERNEL );
628- if (!pkt )
629- return - ENOMEM ;
630-
631- memcpy (pkt , (uint8_t * )data , hdr_size );
632- memcpy (pkt + hdr_size , (uint8_t * )data -> payload , pkt_size - hdr_size );
633-
634627 skb = alloc_skb (pkt_size , GFP_ATOMIC );
635628 if (!skb )
636629 return - ENOMEM ;
637630
638- skb_put_data (skb , (void * )pkt , pkt_size );
631+ skb_put_data (skb , (uint8_t * )data , hdr_size );
632+ skb_put_data (skb , (uint8_t * )data -> payload , pkt_size - hdr_size );
639633
640- kfree (pkt );
641634 spin_lock_irqsave (& apm -> queue_lock , flags );
642635 skb_queue_tail (& apm -> queue , skb );
643636 spin_unlock_irqrestore (& apm -> queue_lock , flags );
@@ -646,19 +639,32 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o
646639 /* wake up any blocking processes, waiting for new data */
647640 wake_up_interruptible (& apm -> readq );
648641 if (hdr -> opcode == APM_CMD_RSP_GET_SPF_STATE ) {
649- result = data -> payload ;
650- apm -> result .opcode = hdr -> opcode ;
651- apm -> result .status = 0 ;
652- /* First word of result it state */
653- apm -> state = hdr -> opcode ;
654- }
642+ result = data -> payload ;
643+ apm -> result .opcode = hdr -> opcode ;
644+ apm -> result .status = 0 ;
645+ /* First word of result it state */
646+ apm -> state = hdr -> opcode ;
647+ }
655648
656649 return 0 ;
657650}
658651
659652static void q6apm_audio_pkt_remove (gpr_device_t * adev )
660653{
661- of_platform_depopulate (& adev -> dev );
654+ struct device * dev = & adev -> dev ;
655+ struct q6apm_audio_pkt * apm = dev_get_drvdata (dev );
656+
657+ of_platform_depopulate (dev );
658+
659+ if (!apm )
660+ return ;
661+
662+ cdev_del (& apm -> cdev );
663+ device_destroy (apm -> audio_pkt_class , apm -> audio_pkt_major );
664+ class_destroy (apm -> audio_pkt_class );
665+ unregister_chrdev_region (apm -> audio_pkt_major , MINOR_NUMBER_COUNT );
666+
667+ dev_set_drvdata (dev , NULL );
662668}
663669
664670#ifdef CONFIG_OF
0 commit comments