xref: /openbmc/u-boot/drivers/nvme/nvme-uclass.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2982388eaSZhikang Zhang /*
3982388eaSZhikang Zhang  * Copyright (C) 2017 NXP Semiconductors
4982388eaSZhikang Zhang  * Copyright (C) 2017 Bin Meng <bmeng.cn@gmail.com>
5982388eaSZhikang Zhang  */
6982388eaSZhikang Zhang 
7982388eaSZhikang Zhang #include <common.h>
8982388eaSZhikang Zhang #include <errno.h>
9982388eaSZhikang Zhang #include <dm.h>
10982388eaSZhikang Zhang #include <dm/device.h>
11982388eaSZhikang Zhang #include "nvme.h"
12982388eaSZhikang Zhang 
nvme_uclass_post_probe(struct udevice * udev)13982388eaSZhikang Zhang static int nvme_uclass_post_probe(struct udevice *udev)
14982388eaSZhikang Zhang {
15982388eaSZhikang Zhang 	char name[20];
16982388eaSZhikang Zhang 	struct udevice *ns_udev;
17982388eaSZhikang Zhang 	int i, ret;
18982388eaSZhikang Zhang 	struct nvme_dev *ndev = dev_get_priv(udev);
19982388eaSZhikang Zhang 
20982388eaSZhikang Zhang 	/* Create a blk device for each namespace */
21982388eaSZhikang Zhang 	for (i = 0; i < ndev->nn; i++) {
2218aa5a41SBin Meng 		/*
2318aa5a41SBin Meng 		 * Encode the namespace id to the device name so that
2418aa5a41SBin Meng 		 * we can extract it when doing the probe.
2518aa5a41SBin Meng 		 */
2618aa5a41SBin Meng 		sprintf(name, "blk#%d", i);
27982388eaSZhikang Zhang 
28982388eaSZhikang Zhang 		/* The real blksz and size will be set by nvme_blk_probe() */
29d5b7ee9cSBin Meng 		ret = blk_create_devicef(udev, "nvme-blk", name, IF_TYPE_NVME,
3018aa5a41SBin Meng 					 -1, 512, 0, &ns_udev);
3118aa5a41SBin Meng 		if (ret)
32982388eaSZhikang Zhang 			return ret;
33982388eaSZhikang Zhang 	}
34982388eaSZhikang Zhang 
35982388eaSZhikang Zhang 	return 0;
36982388eaSZhikang Zhang }
37982388eaSZhikang Zhang 
38982388eaSZhikang Zhang UCLASS_DRIVER(nvme) = {
39982388eaSZhikang Zhang 	.name	= "nvme",
40982388eaSZhikang Zhang 	.id	= UCLASS_NVME,
41982388eaSZhikang Zhang 	.post_probe = nvme_uclass_post_probe,
42982388eaSZhikang Zhang };
43