id->cu_type, id->cu_model);
 }
 
+static ssize_t
+modalias_show (struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct ccw_device *cdev = to_ccwdev(dev);
+       struct ccw_device_id *id = &(cdev->id);
+       int ret;
+
+       ret = sprintf(buf, "ccw:t%04Xm%02x",
+                       id->cu_type, id->cu_model);
+       if (id->dev_type != 0)
+               ret += sprintf(buf + ret, "dt%04Xdm%02X\n",
+                               id->dev_type, id->dev_model);
+       else
+               ret += sprintf(buf + ret, "dtdm\n");
+       return ret;
+}
+
 static ssize_t
 online_show (struct device *dev, struct device_attribute *attr, char *buf)
 {
 static DEVICE_ATTR(pimpampom, 0444, pimpampom_show, NULL);
 static DEVICE_ATTR(devtype, 0444, devtype_show, NULL);
 static DEVICE_ATTR(cutype, 0444, cutype_show, NULL);
+static DEVICE_ATTR(modalias, 0444, modalias_show, NULL);
 static DEVICE_ATTR(online, 0644, online_show, online_store);
 extern struct device_attribute dev_attr_cmb_enable;
 static DEVICE_ATTR(availability, 0444, available_show, NULL);
 static struct attribute * ccwdev_attrs[] = {
        &dev_attr_devtype.attr,
        &dev_attr_cutype.attr,
+       &dev_attr_modalias.attr,
        &dev_attr_online.attr,
        &dev_attr_cmb_enable.attr,
        &dev_attr_availability.attr,