@@ -824,9 +824,9 @@ static int rp1_pio_sm_rx_user(struct rp1_pio_device *pio, struct dma_info *dma,
824
824
return ret ;
825
825
}
826
826
827
- static int rp1_pio_sm_xfer_data (struct rp1_pio_client * client , void * param )
827
+ static int rp1_pio_sm_xfer_data32 (struct rp1_pio_client * client , void * param )
828
828
{
829
- struct rp1_pio_sm_xfer_data_args * args = param ;
829
+ struct rp1_pio_sm_xfer_data32_args * args = param ;
830
830
struct rp1_pio_device * pio = client -> pio ;
831
831
struct dma_info * dma ;
832
832
@@ -842,13 +842,27 @@ static int rp1_pio_sm_xfer_data(struct rp1_pio_client *client, void *param)
842
842
return rp1_pio_sm_rx_user (pio , dma , args -> data , args -> data_bytes );
843
843
}
844
844
845
+ static int rp1_pio_sm_xfer_data (struct rp1_pio_client * client , void * param )
846
+ {
847
+ struct rp1_pio_sm_xfer_data_args * args = param ;
848
+ struct rp1_pio_sm_xfer_data32_args args32 ;
849
+
850
+ args32 .sm = args -> sm ;
851
+ args32 .dir = args -> dir ;
852
+ args32 .data_bytes = args -> data_bytes ;
853
+ args32 .data = args -> data ;
854
+
855
+ return rp1_pio_sm_xfer_data32 (client , & args32 );
856
+ }
857
+
845
858
struct handler_info {
846
859
const char * name ;
847
860
int (* func )(struct rp1_pio_client * client , void * param );
848
861
int argsize ;
849
862
} ioctl_handlers [] = {
850
863
HANDLER (SM_CONFIG_XFER , sm_config_xfer ),
851
864
HANDLER (SM_XFER_DATA , sm_xfer_data ),
865
+ HANDLER (SM_XFER_DATA32 , sm_xfer_data32 ),
852
866
853
867
HANDLER (CAN_ADD_PROGRAM , can_add_program ),
854
868
HANDLER (ADD_PROGRAM , add_program ),
@@ -1032,13 +1046,23 @@ struct rp1_pio_sm_xfer_data_args_compat {
1032
1046
compat_uptr_t data ;
1033
1047
};
1034
1048
1049
+ struct rp1_pio_sm_xfer_data32_args_compat {
1050
+ uint16_t sm ;
1051
+ uint16_t dir ;
1052
+ uint32_t data_bytes ;
1053
+ compat_uptr_t data ;
1054
+ };
1055
+
1035
1056
struct rp1_access_hw_args_compat {
1036
1057
uint32_t addr ;
1037
1058
uint32_t len ;
1038
1059
compat_uptr_t data ;
1039
1060
};
1040
1061
1041
- #define PIO_IOC_SM_XFER_DATA_COMPAT _IOW(PIO_IOC_MAGIC, 1, struct rp1_pio_sm_xfer_data_args_compat)
1062
+ #define PIO_IOC_SM_XFER_DATA_COMPAT \
1063
+ _IOW(PIO_IOC_MAGIC, 1, struct rp1_pio_sm_xfer_data_args_compat)
1064
+ #define PIO_IOC_SM_XFER_DATA32_COMPAT \
1065
+ _IOW(PIO_IOC_MAGIC, 2, struct rp1_pio_sm_xfer_data32_args_compat)
1042
1066
#define PIO_IOC_READ_HW_COMPAT _IOW(PIO_IOC_MAGIC, 8, struct rp1_access_hw_args_compat)
1043
1067
#define PIO_IOC_WRITE_HW_COMPAT _IOW(PIO_IOC_MAGIC, 9, struct rp1_access_hw_args_compat)
1044
1068
@@ -1061,6 +1085,19 @@ static long rp1_pio_compat_ioctl(struct file *filp, unsigned int ioctl_num,
1061
1085
param .data = compat_ptr (compat_param .data );
1062
1086
return rp1_pio_sm_xfer_data (client , & param );
1063
1087
}
1088
+ case PIO_IOC_SM_XFER_DATA32_COMPAT :
1089
+ {
1090
+ struct rp1_pio_sm_xfer_data32_args_compat compat_param ;
1091
+ struct rp1_pio_sm_xfer_data32_args param ;
1092
+
1093
+ if (copy_from_user (& compat_param , compat_ptr (ioctl_param ), sizeof (compat_param )))
1094
+ return - EFAULT ;
1095
+ param .sm = compat_param .sm ;
1096
+ param .dir = compat_param .dir ;
1097
+ param .data_bytes = compat_param .data_bytes ;
1098
+ param .data = compat_ptr (compat_param .data );
1099
+ return rp1_pio_sm_xfer_data32 (client , & param );
1100
+ }
1064
1101
1065
1102
case PIO_IOC_READ_HW_COMPAT :
1066
1103
case PIO_IOC_WRITE_HW_COMPAT :
0 commit comments