config DCSSBLK
        def_tristate m
-       select FS_DAX_LIMITED
-       select DAX
        prompt "DCSSBLK support"
        depends on S390 && BLOCK
        help
          Support for dcss block device
 
+config DCSSBLK_DAX
+       def_bool y
+       depends on DCSSBLK
+       # requires S390 ZONE_DEVICE support
+       depends on BROKEN
+       select DAX
+       prompt "DCSSBLK DAX support"
+       help
+         Enable DAX operation for the dcss block device
+
 config DASD
        def_tristate y
        prompt "Support for DASD devices"
 
        NULL,
 };
 
+static int dcssblk_setup_dax(struct dcssblk_dev_info *dev_info)
+{
+       struct dax_device *dax_dev;
+
+       if (!IS_ENABLED(CONFIG_DCSSBLK_DAX))
+               return 0;
+
+       dax_dev = alloc_dax(dev_info, &dcssblk_dax_ops);
+       if (IS_ERR(dax_dev))
+               return PTR_ERR(dax_dev);
+       set_dax_synchronous(dax_dev);
+       dev_info->dax_dev = dax_dev;
+       return dax_add_host(dev_info->dax_dev, dev_info->gd);
+}
+
 /*
  * device attribute for adding devices
  */
        int rc, i, j, num_of_segments;
        struct dcssblk_dev_info *dev_info;
        struct segment_info *seg_info, *temp;
-       struct dax_device *dax_dev;
        char *local_buf;
        unsigned long seg_byte_size;
 
        if (rc)
                goto put_dev;
 
-       dax_dev = alloc_dax(dev_info, &dcssblk_dax_ops);
-       if (IS_ERR(dax_dev)) {
-               rc = PTR_ERR(dax_dev);
-               goto put_dev;
-       }
-       set_dax_synchronous(dax_dev);
-       dev_info->dax_dev = dax_dev;
-       rc = dax_add_host(dev_info->dax_dev, dev_info->gd);
+       rc = dcssblk_setup_dax(dev_info);
        if (rc)
                goto out_dax;
 
                *kaddr = __va(dev_info->start + offset);
        if (pfn)
                *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset),
-                               PFN_DEV|PFN_SPECIAL);
+                                     PFN_DEV);
 
        return (dev_sz - offset) / PAGE_SIZE;
 }