@@ -824,9 +824,9 @@ static int rp1_pio_sm_rx_user(struct rp1_pio_device *pio, struct dma_info *dma,
824824 return ret ;
825825}
826826
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 )
828828{
829- struct rp1_pio_sm_xfer_data_args * args = param ;
829+ struct rp1_pio_sm_xfer_data32_args * args = param ;
830830 struct rp1_pio_device * pio = client -> pio ;
831831 struct dma_info * dma ;
832832
@@ -842,13 +842,27 @@ static int rp1_pio_sm_xfer_data(struct rp1_pio_client *client, void *param)
842842 return rp1_pio_sm_rx_user (pio , dma , args -> data , args -> data_bytes );
843843}
844844
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+
845858struct handler_info {
846859 const char * name ;
847860 int (* func )(struct rp1_pio_client * client , void * param );
848861 int argsize ;
849862} ioctl_handlers [] = {
850863 HANDLER (SM_CONFIG_XFER , sm_config_xfer ),
851864 HANDLER (SM_XFER_DATA , sm_xfer_data ),
865+ HANDLER (SM_XFER_DATA32 , sm_xfer_data32 ),
852866
853867 HANDLER (CAN_ADD_PROGRAM , can_add_program ),
854868 HANDLER (ADD_PROGRAM , add_program ),
@@ -1032,13 +1046,23 @@ struct rp1_pio_sm_xfer_data_args_compat {
10321046 compat_uptr_t data ;
10331047};
10341048
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+
10351056struct rp1_access_hw_args_compat {
10361057 uint32_t addr ;
10371058 uint32_t len ;
10381059 compat_uptr_t data ;
10391060};
10401061
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)
10421066#define PIO_IOC_READ_HW_COMPAT _IOW(PIO_IOC_MAGIC, 8, struct rp1_access_hw_args_compat)
10431067#define PIO_IOC_WRITE_HW_COMPAT _IOW(PIO_IOC_MAGIC, 9, struct rp1_access_hw_args_compat)
10441068
@@ -1061,6 +1085,19 @@ static long rp1_pio_compat_ioctl(struct file *filp, unsigned int ioctl_num,
10611085 param .data = compat_ptr (compat_param .data );
10621086 return rp1_pio_sm_xfer_data (client , & param );
10631087 }
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+ }
10641101
10651102 case PIO_IOC_READ_HW_COMPAT :
10661103 case PIO_IOC_WRITE_HW_COMPAT :
0 commit comments