@@ -745,87 +745,77 @@ static void notify_src_chg(struct mxc_jpeg_ctx *ctx)
745
745
v4l2_event_queue_fh (& ctx -> fh , & ev );
746
746
}
747
747
748
- static int mxc_get_free_slot (struct mxc_jpeg_slot_data slot_data [], int n )
748
+ static int mxc_get_free_slot (struct mxc_jpeg_slot_data * slot_data )
749
749
{
750
- int free_slot = 0 ;
751
-
752
- while (slot_data [free_slot ].used && free_slot < n )
753
- free_slot ++ ;
754
-
755
- return free_slot ; /* >=n when there are no more free slots */
750
+ if (!slot_data -> used )
751
+ return slot_data -> slot ;
752
+ return -1 ;
756
753
}
757
754
758
- static bool mxc_jpeg_alloc_slot_data (struct mxc_jpeg_dev * jpeg ,
759
- unsigned int slot )
755
+ static bool mxc_jpeg_alloc_slot_data (struct mxc_jpeg_dev * jpeg )
760
756
{
761
757
struct mxc_jpeg_desc * desc ;
762
758
struct mxc_jpeg_desc * cfg_desc ;
763
759
void * cfg_stm ;
764
760
765
- if (jpeg -> slot_data [ slot ] .desc )
761
+ if (jpeg -> slot_data .desc )
766
762
goto skip_alloc ; /* already allocated, reuse it */
767
763
768
764
/* allocate descriptor for decoding/encoding phase */
769
765
desc = dma_alloc_coherent (jpeg -> dev ,
770
766
sizeof (struct mxc_jpeg_desc ),
771
- & jpeg -> slot_data [ slot ] .desc_handle ,
767
+ & jpeg -> slot_data .desc_handle ,
772
768
GFP_ATOMIC );
773
769
if (!desc )
774
770
goto err ;
775
- jpeg -> slot_data [ slot ] .desc = desc ;
771
+ jpeg -> slot_data .desc = desc ;
776
772
777
773
/* allocate descriptor for configuration phase (encoder only) */
778
774
cfg_desc = dma_alloc_coherent (jpeg -> dev ,
779
775
sizeof (struct mxc_jpeg_desc ),
780
- & jpeg -> slot_data [ slot ] .cfg_desc_handle ,
776
+ & jpeg -> slot_data .cfg_desc_handle ,
781
777
GFP_ATOMIC );
782
778
if (!cfg_desc )
783
779
goto err ;
784
- jpeg -> slot_data [ slot ] .cfg_desc = cfg_desc ;
780
+ jpeg -> slot_data .cfg_desc = cfg_desc ;
785
781
786
782
/* allocate configuration stream */
787
783
cfg_stm = dma_alloc_coherent (jpeg -> dev ,
788
784
MXC_JPEG_MAX_CFG_STREAM ,
789
- & jpeg -> slot_data [ slot ] .cfg_stream_handle ,
785
+ & jpeg -> slot_data .cfg_stream_handle ,
790
786
GFP_ATOMIC );
791
787
if (!cfg_stm )
792
788
goto err ;
793
- jpeg -> slot_data [ slot ] .cfg_stream_vaddr = cfg_stm ;
789
+ jpeg -> slot_data .cfg_stream_vaddr = cfg_stm ;
794
790
795
791
skip_alloc :
796
- jpeg -> slot_data [ slot ] .used = true;
792
+ jpeg -> slot_data .used = true;
797
793
798
794
return true;
799
795
err :
800
- dev_err (jpeg -> dev , "Could not allocate descriptors for slot %d" , slot );
796
+ dev_err (jpeg -> dev , "Could not allocate descriptors for slot %d" , jpeg -> slot_data . slot );
801
797
802
798
return false;
803
799
}
804
800
805
- static void mxc_jpeg_free_slot_data (struct mxc_jpeg_dev * jpeg ,
806
- unsigned int slot )
801
+ static void mxc_jpeg_free_slot_data (struct mxc_jpeg_dev * jpeg )
807
802
{
808
- if (slot >= MXC_MAX_SLOTS ) {
809
- dev_err (jpeg -> dev , "Invalid slot %d, nothing to free." , slot );
810
- return ;
811
- }
812
-
813
803
/* free descriptor for decoding/encoding phase */
814
804
dma_free_coherent (jpeg -> dev , sizeof (struct mxc_jpeg_desc ),
815
- jpeg -> slot_data [ slot ] .desc ,
816
- jpeg -> slot_data [ slot ] .desc_handle );
805
+ jpeg -> slot_data .desc ,
806
+ jpeg -> slot_data .desc_handle );
817
807
818
808
/* free descriptor for encoder configuration phase / decoder DHT */
819
809
dma_free_coherent (jpeg -> dev , sizeof (struct mxc_jpeg_desc ),
820
- jpeg -> slot_data [ slot ] .cfg_desc ,
821
- jpeg -> slot_data [ slot ] .cfg_desc_handle );
810
+ jpeg -> slot_data .cfg_desc ,
811
+ jpeg -> slot_data .cfg_desc_handle );
822
812
823
813
/* free configuration stream */
824
814
dma_free_coherent (jpeg -> dev , MXC_JPEG_MAX_CFG_STREAM ,
825
- jpeg -> slot_data [ slot ] .cfg_stream_vaddr ,
826
- jpeg -> slot_data [ slot ] .cfg_stream_handle );
815
+ jpeg -> slot_data .cfg_stream_vaddr ,
816
+ jpeg -> slot_data .cfg_stream_handle );
827
817
828
- jpeg -> slot_data [ slot ] .used = false;
818
+ jpeg -> slot_data .used = false;
829
819
}
830
820
831
821
static void mxc_jpeg_check_and_set_last_buffer (struct mxc_jpeg_ctx * ctx ,
@@ -855,7 +845,7 @@ static void mxc_jpeg_job_finish(struct mxc_jpeg_ctx *ctx, enum vb2_buffer_state
855
845
v4l2_m2m_buf_done (dst_buf , state );
856
846
857
847
mxc_jpeg_disable_irq (reg , ctx -> slot );
858
- ctx -> mxc_jpeg -> slot_data [ ctx -> slot ] .used = false;
848
+ jpeg -> slot_data .used = false;
859
849
if (reset )
860
850
mxc_jpeg_sw_reset (reg );
861
851
}
@@ -919,7 +909,7 @@ static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv)
919
909
goto job_unlock ;
920
910
}
921
911
922
- if (!jpeg -> slot_data [ slot ] .used )
912
+ if (!jpeg -> slot_data .used )
923
913
goto job_unlock ;
924
914
925
915
dec_ret = readl (reg + MXC_SLOT_OFFSET (slot , SLOT_STATUS ));
@@ -1179,13 +1169,13 @@ static void mxc_jpeg_config_dec_desc(struct vb2_buffer *out_buf,
1179
1169
struct mxc_jpeg_dev * jpeg = ctx -> mxc_jpeg ;
1180
1170
void __iomem * reg = jpeg -> base_reg ;
1181
1171
unsigned int slot = ctx -> slot ;
1182
- struct mxc_jpeg_desc * desc = jpeg -> slot_data [ slot ] .desc ;
1183
- struct mxc_jpeg_desc * cfg_desc = jpeg -> slot_data [ slot ] .cfg_desc ;
1184
- dma_addr_t desc_handle = jpeg -> slot_data [ slot ] .desc_handle ;
1185
- dma_addr_t cfg_desc_handle = jpeg -> slot_data [ slot ] .cfg_desc_handle ;
1186
- dma_addr_t cfg_stream_handle = jpeg -> slot_data [ slot ] .cfg_stream_handle ;
1187
- unsigned int * cfg_size = & jpeg -> slot_data [ slot ] .cfg_stream_size ;
1188
- void * cfg_stream_vaddr = jpeg -> slot_data [ slot ] .cfg_stream_vaddr ;
1172
+ struct mxc_jpeg_desc * desc = jpeg -> slot_data .desc ;
1173
+ struct mxc_jpeg_desc * cfg_desc = jpeg -> slot_data .cfg_desc ;
1174
+ dma_addr_t desc_handle = jpeg -> slot_data .desc_handle ;
1175
+ dma_addr_t cfg_desc_handle = jpeg -> slot_data .cfg_desc_handle ;
1176
+ dma_addr_t cfg_stream_handle = jpeg -> slot_data .cfg_stream_handle ;
1177
+ unsigned int * cfg_size = & jpeg -> slot_data .cfg_stream_size ;
1178
+ void * cfg_stream_vaddr = jpeg -> slot_data .cfg_stream_vaddr ;
1189
1179
struct mxc_jpeg_src_buf * jpeg_src_buf ;
1190
1180
1191
1181
jpeg_src_buf = vb2_to_mxc_buf (src_buf );
@@ -1245,18 +1235,18 @@ static void mxc_jpeg_config_enc_desc(struct vb2_buffer *out_buf,
1245
1235
struct mxc_jpeg_dev * jpeg = ctx -> mxc_jpeg ;
1246
1236
void __iomem * reg = jpeg -> base_reg ;
1247
1237
unsigned int slot = ctx -> slot ;
1248
- struct mxc_jpeg_desc * desc = jpeg -> slot_data [ slot ] .desc ;
1249
- struct mxc_jpeg_desc * cfg_desc = jpeg -> slot_data [ slot ] .cfg_desc ;
1250
- dma_addr_t desc_handle = jpeg -> slot_data [ slot ] .desc_handle ;
1251
- dma_addr_t cfg_desc_handle = jpeg -> slot_data [ slot ] .cfg_desc_handle ;
1252
- void * cfg_stream_vaddr = jpeg -> slot_data [ slot ] .cfg_stream_vaddr ;
1238
+ struct mxc_jpeg_desc * desc = jpeg -> slot_data .desc ;
1239
+ struct mxc_jpeg_desc * cfg_desc = jpeg -> slot_data .cfg_desc ;
1240
+ dma_addr_t desc_handle = jpeg -> slot_data .desc_handle ;
1241
+ dma_addr_t cfg_desc_handle = jpeg -> slot_data .cfg_desc_handle ;
1242
+ void * cfg_stream_vaddr = jpeg -> slot_data .cfg_stream_vaddr ;
1253
1243
struct mxc_jpeg_q_data * q_data ;
1254
1244
enum mxc_jpeg_image_format img_fmt ;
1255
1245
int w , h ;
1256
1246
1257
1247
q_data = mxc_jpeg_get_q_data (ctx , src_buf -> vb2_queue -> type );
1258
1248
1259
- jpeg -> slot_data [ slot ] .cfg_stream_size =
1249
+ jpeg -> slot_data .cfg_stream_size =
1260
1250
mxc_jpeg_setup_cfg_stream (cfg_stream_vaddr ,
1261
1251
q_data -> fmt -> fourcc ,
1262
1252
q_data -> crop .width ,
@@ -1265,7 +1255,7 @@ static void mxc_jpeg_config_enc_desc(struct vb2_buffer *out_buf,
1265
1255
/* chain the config descriptor with the encoding descriptor */
1266
1256
cfg_desc -> next_descpt_ptr = desc_handle | MXC_NXT_DESCPT_EN ;
1267
1257
1268
- cfg_desc -> buf_base0 = jpeg -> slot_data [ slot ] .cfg_stream_handle ;
1258
+ cfg_desc -> buf_base0 = jpeg -> slot_data .cfg_stream_handle ;
1269
1259
cfg_desc -> buf_base1 = 0 ;
1270
1260
cfg_desc -> line_pitch = 0 ;
1271
1261
cfg_desc -> stm_bufbase = 0 ; /* no output expected */
@@ -1408,7 +1398,7 @@ static void mxc_jpeg_device_run_timeout(struct work_struct *work)
1408
1398
unsigned long flags ;
1409
1399
1410
1400
spin_lock_irqsave (& ctx -> mxc_jpeg -> hw_lock , flags );
1411
- if (ctx -> slot < MXC_MAX_SLOTS && ctx -> mxc_jpeg -> slot_data [ ctx -> slot ] .used ) {
1401
+ if (ctx -> mxc_jpeg -> slot_data .used ) {
1412
1402
dev_warn (jpeg -> dev , "%s timeout, cancel it\n" ,
1413
1403
ctx -> mxc_jpeg -> mode == MXC_JPEG_DECODE ? "decode" : "encode" );
1414
1404
mxc_jpeg_job_finish (ctx , VB2_BUF_STATE_ERROR , true);
@@ -1476,12 +1466,12 @@ static void mxc_jpeg_device_run(void *priv)
1476
1466
mxc_jpeg_enable (reg );
1477
1467
mxc_jpeg_set_l_endian (reg , 1 );
1478
1468
1479
- ctx -> slot = mxc_get_free_slot (jpeg -> slot_data , MXC_MAX_SLOTS );
1480
- if (ctx -> slot >= MXC_MAX_SLOTS ) {
1469
+ ctx -> slot = mxc_get_free_slot (& jpeg -> slot_data );
1470
+ if (ctx -> slot < 0 ) {
1481
1471
dev_err (dev , "No more free slots\n" );
1482
1472
goto end ;
1483
1473
}
1484
- if (!mxc_jpeg_alloc_slot_data (jpeg , ctx -> slot )) {
1474
+ if (!mxc_jpeg_alloc_slot_data (jpeg )) {
1485
1475
dev_err (dev , "Cannot allocate slot data\n" );
1486
1476
goto end ;
1487
1477
}
@@ -2101,7 +2091,7 @@ static int mxc_jpeg_open(struct file *file)
2101
2091
}
2102
2092
ctx -> fh .ctrl_handler = & ctx -> ctrl_handler ;
2103
2093
mxc_jpeg_set_default_params (ctx );
2104
- ctx -> slot = MXC_MAX_SLOTS ; /* slot not allocated yet */
2094
+ ctx -> slot = -1 ; /* slot not allocated yet */
2105
2095
INIT_DELAYED_WORK (& ctx -> task_timer , mxc_jpeg_device_run_timeout );
2106
2096
2107
2097
if (mxc_jpeg -> mode == MXC_JPEG_DECODE )
@@ -2677,6 +2667,11 @@ static int mxc_jpeg_attach_pm_domains(struct mxc_jpeg_dev *jpeg)
2677
2667
dev_err (dev , "No power domains defined for jpeg node\n" );
2678
2668
return jpeg -> num_domains ;
2679
2669
}
2670
+ if (jpeg -> num_domains == 1 ) {
2671
+ /* genpd_dev_pm_attach() attach automatically if power domains count is 1 */
2672
+ jpeg -> num_domains = 0 ;
2673
+ return 0 ;
2674
+ }
2680
2675
2681
2676
jpeg -> pd_dev = devm_kmalloc_array (dev , jpeg -> num_domains ,
2682
2677
sizeof (* jpeg -> pd_dev ), GFP_KERNEL );
@@ -2718,7 +2713,6 @@ static int mxc_jpeg_probe(struct platform_device *pdev)
2718
2713
int ret ;
2719
2714
int mode ;
2720
2715
const struct of_device_id * of_id ;
2721
- unsigned int slot ;
2722
2716
2723
2717
of_id = of_match_node (mxc_jpeg_match , dev -> of_node );
2724
2718
if (!of_id )
@@ -2742,19 +2736,22 @@ static int mxc_jpeg_probe(struct platform_device *pdev)
2742
2736
if (IS_ERR (jpeg -> base_reg ))
2743
2737
return PTR_ERR (jpeg -> base_reg );
2744
2738
2745
- for (slot = 0 ; slot < MXC_MAX_SLOTS ; slot ++ ) {
2746
- dec_irq = platform_get_irq (pdev , slot );
2747
- if (dec_irq < 0 ) {
2748
- ret = dec_irq ;
2749
- goto err_irq ;
2750
- }
2751
- ret = devm_request_irq (& pdev -> dev , dec_irq , mxc_jpeg_dec_irq ,
2752
- 0 , pdev -> name , jpeg );
2753
- if (ret ) {
2754
- dev_err (& pdev -> dev , "Failed to request irq %d (%d)\n" ,
2755
- dec_irq , ret );
2756
- goto err_irq ;
2757
- }
2739
+ ret = of_property_read_u32_index (pdev -> dev .of_node , "slot" , 0 , & jpeg -> slot_data .slot );
2740
+ if (ret )
2741
+ jpeg -> slot_data .slot = 0 ;
2742
+ dev_info (& pdev -> dev , "choose slot %d\n" , jpeg -> slot_data .slot );
2743
+ dec_irq = platform_get_irq (pdev , 0 );
2744
+ if (dec_irq < 0 ) {
2745
+ dev_err (& pdev -> dev , "Failed to get irq %d\n" , dec_irq );
2746
+ ret = dec_irq ;
2747
+ goto err_irq ;
2748
+ }
2749
+ ret = devm_request_irq (& pdev -> dev , dec_irq , mxc_jpeg_dec_irq ,
2750
+ 0 , pdev -> name , jpeg );
2751
+ if (ret ) {
2752
+ dev_err (& pdev -> dev , "Failed to request irq %d (%d)\n" ,
2753
+ dec_irq , ret );
2754
+ goto err_irq ;
2758
2755
}
2759
2756
2760
2757
jpeg -> pdev = pdev ;
@@ -2914,11 +2911,9 @@ static const struct dev_pm_ops mxc_jpeg_pm_ops = {
2914
2911
2915
2912
static void mxc_jpeg_remove (struct platform_device * pdev )
2916
2913
{
2917
- unsigned int slot ;
2918
2914
struct mxc_jpeg_dev * jpeg = platform_get_drvdata (pdev );
2919
2915
2920
- for (slot = 0 ; slot < MXC_MAX_SLOTS ; slot ++ )
2921
- mxc_jpeg_free_slot_data (jpeg , slot );
2916
+ mxc_jpeg_free_slot_data (jpeg );
2922
2917
2923
2918
pm_runtime_disable (& pdev -> dev );
2924
2919
video_unregister_device (jpeg -> dec_vdev );
0 commit comments