@@ -172,6 +172,11 @@ struct nfit_test_fw {
u64 end_time;
};
+struct nfit_dimm_dev {
+ struct device dev;
+ struct nfit_mem *nfit_mem;
+};
+
struct nfit_test {
struct acpi_nfit_desc acpi_desc;
struct platform_device pdev;
@@ -203,7 +208,7 @@ struct nfit_test {
unsigned long deadline;
spinlock_t lock;
} ars_state;
- struct device *dimm_dev[NUM_DCR];
+ struct nfit_dimm_dev dimm_dev[NUM_DCR];
struct nd_intel_smart *smart;
struct nd_intel_smart_threshold *smart_threshold;
struct badrange badrange;
@@ -1018,7 +1023,8 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
&t->smart_threshold[i -
t->dcr_idx],
&t->smart[i - t->dcr_idx],
- &t->pdev.dev, t->dimm_dev[i]);
+ &t->pdev.dev,
+ &t->dimm_dev[i].dev);
break;
case ND_INTEL_SMART_INJECT:
rc = nfit_test_cmd_smart_inject(buf,
@@ -1026,7 +1032,8 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
&t->smart_threshold[i -
t->dcr_idx],
&t->smart[i - t->dcr_idx],
- &t->pdev.dev, t->dimm_dev[i]);
+ &t->pdev.dev,
+ &t->dimm_dev[i].dev);
break;
default:
return -ENOTTY;
@@ -1224,8 +1231,7 @@ static void put_dimms(void *data)
int i;
for (i = 0; i < t->num_dcr; i++)
- if (t->dimm_dev[i])
- device_unregister(t->dimm_dev[i]);
+ device_unregister(&t->dimm_dev[i].dev);
}
static struct class *nfit_test_dimm;
@@ -1327,19 +1333,27 @@ static const struct attribute_group *nfit_test_dimm_attribute_groups[] = {
NULL,
};
+static void dimm_dev_release(struct device *dev)
+{
+}
+
static int nfit_test_dimm_init(struct nfit_test *t)
{
- int i;
+ int i, rc;
if (devm_add_action_or_reset(&t->pdev.dev, put_dimms, t))
return -ENOMEM;
for (i = 0; i < t->num_dcr; i++) {
- t->dimm_dev[i] = device_create_with_groups(nfit_test_dimm,
- &t->pdev.dev, 0, NULL,
- nfit_test_dimm_attribute_groups,
- "test_dimm%d", i + t->dcr_idx);
- if (!t->dimm_dev[i])
- return -ENOMEM;
+ t->dimm_dev[i].dev.parent = &t->pdev.dev;
+ dev_set_name(&t->dimm_dev[i].dev, "test_dimm%d",
+ i + t->dcr_idx);
+ t->dimm_dev[i].dev.class = nfit_test_dimm;
+ t->dimm_dev[i].dev.groups = nfit_test_dimm_attribute_groups;
+ t->dimm_dev[i].dev.release = dimm_dev_release;
+ rc = device_register(&t->dimm_dev[i].dev);
+ if (rc < 0)
+ return rc;
+ dev_set_drvdata(&t->dimm_dev[i].dev, t);
}
return 0;
}
@@ -2680,8 +2694,7 @@ static int nfit_test_probe(struct platform_device *pdev)
for (i = 0; i < NUM_DCR; i++)
if (nfit_handle == handle[i])
- dev_set_drvdata(nfit_test->dimm_dev[i],
- nfit_mem);
+ nfit_test->dimm_dev[i].nfit_mem = nfit_mem;
}
mutex_unlock(&acpi_desc->init_mutex);