*/
 int smscore_register_device(struct smsdevice_params_t *params,
                            struct smscore_device_t **coredev,
+                           gfp_t gfp_buf_flags,
                            void *mdev)
 {
        struct smscore_device_t *dev;
 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
        dev->media_dev = mdev;
 #endif
+       dev->gfp_buf_flags = gfp_buf_flags;
 
        /* init list entry so it could be safe in smscore_unregister_device */
        INIT_LIST_HEAD(&dev->entry);
                buffer = dma_alloc_coherent(params->device,
                                            dev->common_buffer_size,
                                            &dev->common_buffer_phys,
-                                           GFP_KERNEL | GFP_DMA);
+                                           GFP_KERNEL | dev->gfp_buf_flags);
        if (!buffer) {
                smscore_unregister_device(dev);
                return -ENOMEM;
                else {
                        buffer = kmalloc(sizeof(struct sms_msg_data2) +
                                                SMS_DMA_ALIGNMENT,
-                                               GFP_KERNEL | GFP_DMA);
+                                               GFP_KERNEL | coredev->gfp_buf_flags);
                        if (buffer) {
                                struct sms_msg_data2 *msg =
                                (struct sms_msg_data2 *)
        }
 
        /* PAGE_SIZE buffer shall be enough and dma aligned */
-       msg = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA);
+       msg = kmalloc(PAGE_SIZE, GFP_KERNEL | coredev->gfp_buf_flags);
        if (!msg)
                return -ENOMEM;
 
        }
        pr_debug("read fw %s, buffer size=0x%zx\n", fw_filename, fw->size);
        fw_buf = kmalloc(ALIGN(fw->size + sizeof(struct sms_firmware),
-                        SMS_ALLOC_ALIGNMENT), GFP_KERNEL | GFP_DMA);
+                        SMS_ALLOC_ALIGNMENT), GFP_KERNEL | coredev->gfp_buf_flags);
        if (!fw_buf) {
                pr_err("failed to allocate firmware buffer\n");
                rc = -ENOMEM;
 static int smscore_detect_mode(struct smscore_device_t *coredev)
 {
        void *buffer = kmalloc(sizeof(struct sms_msg_hdr) + SMS_DMA_ALIGNMENT,
-                              GFP_KERNEL | GFP_DMA);
+                              GFP_KERNEL | coredev->gfp_buf_flags);
        struct sms_msg_hdr *msg =
                (struct sms_msg_hdr *) SMS_ALIGN_ADDRESS(buffer);
        int rc;
        int rc = 0;
 
        buffer = kmalloc(sizeof(struct sms_msg_data) +
-                       SMS_DMA_ALIGNMENT, GFP_KERNEL | GFP_DMA);
+                       SMS_DMA_ALIGNMENT, GFP_KERNEL | coredev->gfp_buf_flags);
        if (!buffer)
                return -ENOMEM;
 
                coredev->device_flags &= ~SMS_DEVICE_NOT_READY;
 
                buffer = kmalloc(sizeof(struct sms_msg_data) +
-                                SMS_DMA_ALIGNMENT, GFP_KERNEL | GFP_DMA);
+                                SMS_DMA_ALIGNMENT, GFP_KERNEL | coredev->gfp_buf_flags);
                if (buffer) {
                        struct sms_msg_data *msg = (struct sms_msg_data *) SMS_ALIGN_ADDRESS(buffer);
 
        total_len = sizeof(struct sms_msg_hdr) + (sizeof(u32) * 6);
 
        buffer = kmalloc(total_len + SMS_DMA_ALIGNMENT,
-                       GFP_KERNEL | GFP_DMA);
+                       GFP_KERNEL | coredev->gfp_buf_flags);
        if (!buffer)
                return -ENOMEM;
 
                        (3 * sizeof(u32)); /* keep it 3 ! */
 
        buffer = kmalloc(total_len + SMS_DMA_ALIGNMENT,
-                       GFP_KERNEL | GFP_DMA);
+                       GFP_KERNEL | coredev->gfp_buf_flags);
        if (!buffer)
                return -ENOMEM;
 
        total_len = sizeof(struct sms_msg_hdr) + (2 * sizeof(u32));
 
        buffer = kmalloc(total_len + SMS_DMA_ALIGNMENT,
-                       GFP_KERNEL | GFP_DMA);
+                       GFP_KERNEL | coredev->gfp_buf_flags);
        if (!buffer)
                return -ENOMEM;