summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2009-06-11 15:33:49 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2009-07-21 16:41:47 +0200
commit02ba8a0542f119e02e63a3b4cd6ae5abfd8331f3 (patch)
treec358a8c1f4d1cc5db91d898e6f409f55b22f4127
parent2f8df2a003a22e8b7397e51ac5f1796db920d579 (diff)
downloadbarebox-02ba8a0542f119e02e63a3b4cd6ae5abfd8331f3.tar.gz
barebox-02ba8a0542f119e02e63a3b4cd6ae5abfd8331f3.tar.xz
get rid of device ids
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--Documentation/porting.txt1
-rw-r--r--arch/sandbox/os/common.c14
-rw-r--r--board/sandbox/hostfile.c45
-rw-r--r--commands/mount.c2
-rw-r--r--commands/net.c8
-rw-r--r--common/console.c6
-rw-r--r--common/env.c4
-rw-r--r--drivers/nand/nand.c29
-rw-r--r--drivers/nor/cfi_flash.c4
-rw-r--r--drivers/nor/cfi_flash_new.c4
-rw-r--r--drivers/usb/usb.c1
-rw-r--r--fs/devfs.c38
-rw-r--r--fs/fs.c13
-rw-r--r--include/asm-sandbox/arch-sandbox/hostfile.h3
-rw-r--r--include/console.h2
-rw-r--r--include/driver.h11
-rw-r--r--include/fs.h2
-rw-r--r--lib/driver.c81
18 files changed, 134 insertions, 134 deletions
diff --git a/Documentation/porting.txt b/Documentation/porting.txt
index d59925e5f6..b18957c825 100644
--- a/Documentation/porting.txt
+++ b/Documentation/porting.txt
@@ -34,7 +34,6 @@ extra-y += u-boot.lds
static struct device_d scb9328_serial_device = {
.name = "imx_serial",
- .id = "cs0",
.map_base = IMX_UART1_BASE,
.size = 4096,
};
diff --git a/arch/sandbox/os/common.c b/arch/sandbox/os/common.c
index 71b0c8072b..72e4c8d702 100644
--- a/arch/sandbox/os/common.c
+++ b/arch/sandbox/os/common.c
@@ -220,7 +220,7 @@ void flush_cache(unsigned long dummy1, unsigned long dummy2)
extern void start_uboot(void);
extern void mem_malloc_init(void *start, void *end);
-static int add_image(char *str, char *name_template)
+static int add_image(char *str, char *name)
{
char *file;
int readonly = 0, map = 1;
@@ -257,6 +257,7 @@ static int add_image(char *str, char *name_template)
}
hf->size = s.st_size;
+ hf->name = strdup(name);
if (map) {
hf->map_base = (unsigned long)mmap(NULL, hf->size,
@@ -266,8 +267,7 @@ static int add_image(char *str, char *name_template)
printf("warning: mmapping %s failed\n", file);
}
-
- ret = u_boot_register_filedev(hf, name_template);
+ ret = u_boot_register_filedev(hf);
if (ret)
goto err_out;
return 0;
@@ -286,6 +286,8 @@ int main(int argc, char *argv[])
void *ram;
int opt, ret, fd;
int malloc_size = 8 * 1024 * 1024;
+ char str[6];
+ int fdno = 0, envno = 0;
ram = malloc(malloc_size);
if (!ram) {
@@ -300,9 +302,11 @@ int main(int argc, char *argv[])
print_usage(basename(argv[0]));
exit(0);
case 'i':
- ret = add_image(optarg, "fd");
+ sprintf(str, "fd%d", fdno);
+ ret = add_image(optarg, str);
if (ret)
exit(1);
+ fdno++;
break;
case 'm':
/* This option is broken. add_image needs malloc, so
@@ -312,9 +316,11 @@ int main(int argc, char *argv[])
malloc_size = strtoul(optarg, NULL, 0);
break;
case 'e':
+ sprintf(str, "env%d", envno);
ret = add_image(optarg, "env");
if (ret)
exit(1);
+ envno++;
break;
case 'O':
fd = open(optarg, O_WRONLY);
diff --git a/board/sandbox/hostfile.c b/board/sandbox/hostfile.c
index b6f1dbd3d7..eb3b08ff76 100644
--- a/board/sandbox/hostfile.c
+++ b/board/sandbox/hostfile.c
@@ -29,9 +29,14 @@
#include <asm/arch/hostfile.h>
#include <xfuncs.h>
-static ssize_t hf_read(struct device_d *dev, void *buf, size_t count, ulong offset, ulong flags)
+struct hf_priv {
+ struct cdev cdev;
+ struct hf_platform_data *pdata;
+};
+
+static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
{
- struct hf_platform_data *hf = dev->platform_data;
+ struct hf_platform_data *hf = cdev->priv;
int fd = hf->fd;
if (linux_lseek(fd, offset) != offset)
@@ -40,9 +45,9 @@ static ssize_t hf_read(struct device_d *dev, void *buf, size_t count, ulong offs
return linux_read(fd, buf, count);
}
-static ssize_t hf_write(struct device_d *dev, const void *buf, size_t count, ulong offset, ulong flags)
+static ssize_t hf_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags)
{
- struct hf_platform_data *hf = dev->platform_data;
+ struct hf_platform_data *hf = cdev->priv;
int fd = hf->fd;
if (linux_lseek(fd, offset) != offset)
@@ -58,11 +63,30 @@ static void hf_info(struct device_d *dev)
printf("file: %s\n", hf->filename);
}
-static struct driver_d hf_drv = {
- .name = "hostfile",
- .probe = dummy_probe,
+static struct file_operations hf_fops = {
.read = hf_read,
.write = hf_write,
+};
+
+static int hf_probe(struct device_d *dev)
+{
+ struct hf_platform_data *hf = dev->platform_data;
+ struct hf_priv *priv = xzalloc(sizeof(*priv));
+
+ priv->pdata = hf;
+
+ priv->cdev.name = hf->name;
+ priv->cdev.size = hf->size;
+ priv->cdev.ops = &hf_fops;
+ priv->cdev.priv = hf;
+ devfs_create(&priv->cdev);
+
+ return 0;
+}
+
+static struct driver_d hf_drv = {
+ .name = "hostfile",
+ .probe = hf_probe,
.info = hf_info,
};
@@ -73,7 +97,7 @@ static int hf_init(void)
device_initcall(hf_init);
-int u_boot_register_filedev(struct hf_platform_data *hf, char *name_template)
+int u_boot_register_filedev(struct hf_platform_data *hf)
{
struct device_d *dev;
@@ -81,10 +105,7 @@ int u_boot_register_filedev(struct hf_platform_data *hf, char *name_template)
dev->platform_data = hf;
- hf = dev->platform_data;
-
- strcpy(dev->name,"hostfile");
- get_free_deviceid(dev->id, name_template);
+ strcpy(dev->name, "hostfile");
dev->size = hf->size;
dev->map_base = hf->map_base;
diff --git a/commands/mount.c b/commands/mount.c
index eefcdfa86a..54260e230f 100644
--- a/commands/mount.c
+++ b/commands/mount.c
@@ -40,7 +40,7 @@ static int do_mount (cmd_tbl_t *cmdtp, int argc, char *argv[])
entry = mtab_next_entry(entry);
if (entry) {
printf("%s on %s type %s\n",
- entry->parent_device ? entry->parent_device->id : "none",
+ entry->parent_device ? entry->parent_device->name : "none",
entry->path,
entry->dev->name);
}
diff --git a/commands/net.c b/commands/net.c
index 73da615b0d..1b5ca9f32b 100644
--- a/commands/net.c
+++ b/commands/net.c
@@ -45,10 +45,10 @@ static void netboot_update_env (void)
char tmp[22];
if (NetOurGatewayIP)
- dev_set_param_ip(eth_current->dev, "gateway", NetOurGatewayIP);
+ dev_set_param_ip(&eth_current->dev, "gateway", NetOurGatewayIP);
if (NetOurSubnetMask)
- dev_set_param_ip(eth_current->dev, "netmask", NetOurSubnetMask);
+ dev_set_param_ip(&eth_current->dev, "netmask", NetOurSubnetMask);
if (NetOurHostName[0])
@@ -58,10 +58,10 @@ static void netboot_update_env (void)
setenv ("rootpath", NetOurRootPath);
if (NetOurIP)
- dev_set_param_ip(eth_current->dev, "ipaddr", NetOurIP);
+ dev_set_param_ip(&eth_current->dev, "ipaddr", NetOurIP);
if (NetServerIP)
- dev_set_param_ip(eth_current->dev, "serverip", NetServerIP);
+ dev_set_param_ip(&eth_current->dev, "serverip", NetServerIP);
if (NetOurDNSIP) {
ip_to_string (NetOurDNSIP, tmp);
diff --git a/common/console.c b/common/console.c
index c97a4f41e5..5036c26e1a 100644
--- a/common/console.c
+++ b/common/console.c
@@ -120,10 +120,14 @@ postcore_initcall(getc_buffer_flush);
int console_register(struct console_device *newcdev)
{
- struct device_d *dev = newcdev->dev;
+ struct device_d *dev = &newcdev->class_dev;
int first = 0;
char ch;
+ strcpy(dev->name, "cs");
+ dev->type_data = newcdev->dev->type_data;
+ register_device(dev);
+
if (newcdev->setbrg) {
newcdev->baudrate_param.set = console_baudrate_set;
newcdev->baudrate_param.name = "baudrate";
diff --git a/common/env.c b/common/env.c
index 04ca275d44..edaf388956 100644
--- a/common/env.c
+++ b/common/env.c
@@ -142,7 +142,7 @@ const char *getenv (const char *name)
char *par = strchr(devstr, '.');
struct device_d *dev;
*par = 0;
- dev = get_device_by_id(devstr);
+ dev = get_device_by_name(devstr);
if (dev) {
par++;
ret = dev_get_param(dev, par);
@@ -213,7 +213,7 @@ int setenv(const char *_name, const char *value)
struct device_d *dev;
*par++ = 0;
- dev = get_device_by_id(name);
+ dev = get_device_by_name(name);
if (dev)
ret = dev_set_param(dev, par, value);
else
diff --git a/drivers/nand/nand.c b/drivers/nand/nand.c
index f90a7ecece..2b3dec0f91 100644
--- a/drivers/nand/nand.c
+++ b/drivers/nand/nand.c
@@ -152,37 +152,16 @@ static struct file_operations nand_ops = {
.erase = nand_erase,
};
-static int nand_device_probe(struct device_d *dev)
-{
- return 0;
-}
-
-static struct driver_d nand_device_driver = {
- .name = "nand_device",
- .probe = nand_device_probe,
-};
-
-static int nand_init(void)
-{
- register_driver(&nand_device_driver);
-
- return 0;
-}
-
-device_initcall(nand_init);
-
int add_mtd_device(struct mtd_info *mtd)
{
- struct device_d *dev = &mtd->class_dev;
- char name[MAX_DRIVER_NAME];
-
- get_free_deviceid(name, "nand");
+ strcpy(mtd->class_dev.name, "nand");
+ register_device(&mtd->class_dev);
mtd->cdev.ops = &nand_ops;
mtd->cdev.size = mtd->size;
- mtd->cdev.name = strdup(name);
- mtd->cdev.dev = dev;
+ mtd->cdev.name = asprintf("nand%d", mtd->class_dev.id);
mtd->cdev.priv = mtd;
+ mtd->cdev.dev = &mtd->class_dev;
devfs_create(&mtd->cdev);
diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c
index b38d291415..7131aa5707 100644
--- a/drivers/nor/cfi_flash.c
+++ b/drivers/nor/cfi_flash.c
@@ -1451,7 +1451,6 @@ static int cfi_probe (struct device_d *dev)
{
unsigned long size = 0;
flash_info_t *info = xzalloc(sizeof(flash_info_t));
- char name[MAX_DRIVER_NAME];
dev->priv = (void *)info;
@@ -1466,8 +1465,7 @@ static int cfi_probe (struct device_d *dev)
return -ENODEV;
}
- get_free_deviceid(name, "nor");
- info->cdev.name = strdup(name);
+ info->cdev.name = asprintf("nor%d", dev->id);
info->cdev.size = info->size;
info->cdev.dev = dev;
info->cdev.ops = &cfi_ops;
diff --git a/drivers/nor/cfi_flash_new.c b/drivers/nor/cfi_flash_new.c
index f45b97b839..e114bd2be6 100644
--- a/drivers/nor/cfi_flash_new.c
+++ b/drivers/nor/cfi_flash_new.c
@@ -948,7 +948,6 @@ static int cfi_probe (struct device_d *dev)
{
unsigned long size = 0;
flash_info_t *info = xzalloc(sizeof(flash_info_t));
- char name[MAX_DRIVER_NAME];
dev->priv = (void *)info;
@@ -969,8 +968,7 @@ static int cfi_probe (struct device_d *dev)
return -ENODEV;
}
- get_free_deviceid(name, "nor");
- info->cdev.name = strdup(name);
+ info->cdev.name = asprintf("nor%d", dev->id);
info->cdev.size = info->size;
info->cdev.dev = dev;
info->cdev.ops = &cfi_ops;
diff --git a/drivers/usb/usb.c b/drivers/usb/usb.c
index 61fddfa5d8..265e3f5191 100644
--- a/drivers/usb/usb.c
+++ b/drivers/usb/usb.c
@@ -424,7 +424,6 @@ static int usb_new_device(struct usb_device *dev)
usb_hub_probe(dev, 0);
sprintf(dev->dev.name, "usb%d-%d", dev->host->busnum, dev->devnum);
- sprintf(dev->dev.id, "usb%d-%d", dev->host->busnum, dev->devnum);
print_usb_device(dev);
diff --git a/fs/devfs.c b/fs/devfs.c
index b8b9fa25b1..865b9ccb79 100644
--- a/fs/devfs.c
+++ b/fs/devfs.c
@@ -47,29 +47,37 @@ struct cdev *cdev_by_name(const char *filename)
return NULL;
}
-int devfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size)
+ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
{
- struct cdev *cdev = f->inode;
-
if (!cdev->ops->read)
return -ENOSYS;
- return cdev->ops->read(cdev, buf, size,
- f->pos + cdev->offset, f->flags);
+ return cdev->ops->read(cdev, buf, count, cdev->offset +offset, flags);
}
-int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t size)
+ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags)
{
- struct cdev *cdev = f->inode;
-
if (!cdev->ops->write)
return -ENOSYS;
- return cdev->ops->write(cdev, buf, size,
- f->pos + cdev->offset, f->flags);
+ return cdev->ops->write(cdev, buf, count, cdev->offset + offset, flags);
+}
+
+static int devfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size)
+{
+ struct cdev *cdev = f->inode;
+
+ return cdev_read(cdev, buf, size, f->pos, f->flags);
+}
+
+static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t size)
+{
+ struct cdev *cdev = f->inode;
+
+ return cdev_write(cdev, buf, size, f->pos, f->flags);
}
-off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos)
+static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos)
{
struct cdev *cdev = f->inode;
off_t ret = -1;
@@ -83,7 +91,7 @@ off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos)
return ret;
}
-int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offset)
+static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offset)
{
struct cdev *cdev = f->inode;
@@ -93,7 +101,7 @@ int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offs
return cdev->ops->erase(cdev, count, offset + cdev->offset);
}
-int devfs_protect(struct device_d *_dev, FILE *f, size_t count, unsigned long offset, int prot)
+static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, unsigned long offset, int prot)
{
struct cdev *cdev = f->inode;
@@ -287,6 +295,8 @@ int devfs_create(struct cdev *new)
return -EEXIST;
list_add_tail(&new->list, &cdev_list);
+ if (new->dev)
+ list_add_tail(&new->devices_list, &new->dev->cdevs);
return 0;
}
@@ -294,6 +304,8 @@ int devfs_create(struct cdev *new)
void devfs_remove(struct cdev *cdev)
{
list_del(&cdev->list);
+ if (cdev->dev)
+ list_del(&cdev->devices_list);
}
int devfs_add_partition(const char *devname, unsigned long offset, size_t size,
diff --git a/fs/fs.c b/fs/fs.c
index fc7ada064f..148e3a35cb 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -698,16 +698,16 @@ int mount(const char *device, const char *fsname, const char *_path)
}
}
+ fsdev = xzalloc(sizeof(struct fs_device_d));
if (!fs_drv->flags & FS_DRIVER_NO_DEV) {
- parent_device = get_device_by_id(device + 5);
- if (!parent_device) {
+ fsdev->backingstore = strdup(device);
+ if (!device) {
printf("need a device for driver %s\n", fsname);
errno = -ENODEV;
+ free(fsdev);
goto out;
}
}
- fsdev = xzalloc(sizeof(struct fs_device_d));
- fsdev->parent = parent_device;
sprintf(fsdev->dev.name, "%s", fsname);
fsdev->dev.type_data = fsdev;
@@ -755,6 +755,7 @@ int umount(const char *pathname)
struct mtab_entry *entry = mtab;
struct mtab_entry *last = mtab;
char *p = normalise_path(pathname);
+ struct fs_device_d *fsdev;
while(entry && strcmp(p, entry->path)) {
last = entry;
@@ -774,7 +775,9 @@ int umount(const char *pathname)
last->next = entry->next;
unregister_device(entry->dev);
- free(entry->dev->type_data);
+ fsdev = entry->dev->type_data;
+ free(fsdev->backingstore);
+ free(fsdev);
return 0;
}
diff --git a/include/asm-sandbox/arch-sandbox/hostfile.h b/include/asm-sandbox/arch-sandbox/hostfile.h
index 8362d6be5a..30f9499c03 100644
--- a/include/asm-sandbox/arch-sandbox/hostfile.h
+++ b/include/asm-sandbox/arch-sandbox/hostfile.h
@@ -6,9 +6,10 @@ struct hf_platform_data {
size_t size;
unsigned long map_base;
char *filename;
+ char *name;
};
-int u_boot_register_filedev(struct hf_platform_data *hf, char *name_template);
+int u_boot_register_filedev(struct hf_platform_data *hf);
#endif /* __ASM_ARCH_HOSTFILE_H */
diff --git a/include/console.h b/include/console.h
index e6f06bdff3..e632946549 100644
--- a/include/console.h
+++ b/include/console.h
@@ -26,6 +26,7 @@
#include <param.h>
#include <list.h>
+#include <driver.h>
#define CONSOLE_STDIN (1 << 0)
#define CONSOLE_STDOUT (1 << 1)
@@ -33,6 +34,7 @@
struct console_device {
struct device_d *dev;
+ struct device_d class_dev;
int (*tstc)(struct console_device *cdev);
void (*putc)(struct console_device *cdev, char c);
diff --git a/include/driver.h b/include/driver.h
index 80045183b7..68f744a942 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -67,7 +67,7 @@ struct device_d {
/*! The id is used to uniquely identify a device in the system. The id
* will show up under /dev/ as the device's name. Usually this is
* something like eth0 or nor0. */
- char id[MAX_DRIVER_NAME];
+ int id;
/*! FIXME */
unsigned long size;
@@ -99,6 +99,8 @@ struct device_d {
/*! The parameters for this device. This is used to carry information
* of board specific data from the board code to the device driver. */
struct param_d *param;
+
+ struct list_head cdevs;
};
/** @brief Describes a driver present in the system */
@@ -165,13 +167,13 @@ int dev_add_child(struct device_d *dev, struct device_d *child);
*/
struct device_d *get_device_by_type(ulong type, struct device_d *last);
struct device_d *get_device_by_id(const char *id);
-struct device_d *get_device_by_path(const char *path);
+struct device_d *get_device_by_name(const char *name);
/* Find a free device id from the given template. This is archieved by
* appending a number to the template. Dynamically created devices should
* use this function rather than filling the id field themselves.
*/
-int get_free_deviceid(char *id, const char *id_template);
+int get_free_deviceid(const char *name_template);
char *deviceid_from_spec_str(const char *str, char **endp);
@@ -294,6 +296,7 @@ struct cdev {
void *priv;
struct device_d *dev;
struct list_head list;
+ struct list_head devices_list;
char *name;
unsigned long offset;
size_t size;
@@ -303,6 +306,8 @@ struct cdev {
int devfs_create(struct cdev *);
void devfs_remove(struct cdev *);
struct cdev *cdev_by_name(const char *filename);
+ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags);
+ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags);
#define DEVFS_PARTITION_FIXED (1 << 0)
#define DEVFS_PARTITION_READONLY (1 << 1)
diff --git a/include/fs.h b/include/fs.h
index e5ecb7d3a6..552c4e94bb 100644
--- a/include/fs.h
+++ b/include/fs.h
@@ -88,7 +88,7 @@ struct mtab_entry {
};
struct fs_device_d {
- struct device_d *parent; /* the device we are associated with */
+ char *backingstore; /* the device we are associated with */
struct device_d dev; /* our own device */
struct fs_driver_d *driver;
diff --git a/lib/driver.c b/lib/driver.c
index f61e2ec2e0..589bd8dffe 100644
--- a/lib/driver.c
+++ b/lib/driver.c
@@ -42,42 +42,31 @@ EXPORT_SYMBOL(driver_list);
static LIST_HEAD(active);
-struct device_d *device_by_name(const char *name)
+struct device_d *get_device_by_name(const char *name)
{
struct device_d *dev;
+ char devname[MAX_DRIVER_NAME + 3];
for_each_device(dev) {
- if(!strcmp(name, dev->name))
+ sprintf(devname, "%s%d", dev->name, dev->id);
+ if(!strcmp(name, devname))
return dev;
}
return NULL;
}
-struct device_d *get_device_by_id(const char *id)
-{
- struct device_d *dev;
-
- for_each_device(dev) {
- if(!strcmp(id, dev->id))
- return dev;
- }
-
- return NULL;
-}
-
-int get_free_deviceid(char *id, const char *id_template)
+int get_free_deviceid(const char *name_template)
{
int i = 0;
+ char name[MAX_DRIVER_NAME + 3];
while (1) {
- sprintf(id, "%s%d", id_template, i);
- if (!get_device_by_id(id))
- return 0;
+ sprintf(name, "%s%d", name_template, i);
+ if (!get_device_by_name(name))
+ return i;
i++;
};
-
- return -1;
}
static int match(struct driver_d *drv, struct device_d *dev)
@@ -106,10 +95,8 @@ int register_device(struct device_d *new_device)
{
struct driver_d *drv;
- if(*new_device->id && get_device_by_id(new_device->id)) {
- printf("device %s already exists\n", new_device->id);
- return -EINVAL;
- }
+ new_device->id = get_free_deviceid(new_device->name);
+
debug ("register_device: %s\n",new_device->name);
if (!new_device->bus) {
@@ -119,6 +106,7 @@ int register_device(struct device_d *new_device)
list_add_tail(&new_device->list, &device_list);
INIT_LIST_HEAD(&new_device->children);
+ INIT_LIST_HEAD(&new_device->cdevs);
for_each_driver(drv) {
if (!match(drv, new_device))
@@ -175,7 +163,7 @@ struct driver_d *get_driver_by_name(const char *name)
static void noinfo(struct device_d *dev)
{
- printf("no info available for %s\n", dev->id);
+ printf("no info available for %s\n", dev->name);
}
static void noshortinfo(struct device_d *dev)
@@ -207,28 +195,6 @@ int register_driver(struct driver_d *drv)
}
EXPORT_SYMBOL(register_driver);
-/* Get a device struct from the beginning of the string. Default to mem if no
- * device is given, return NULL if a unknown device is given.
- * If endp is not NULL, this function stores a pointer to the first character
- * after the device name in *endp.
- */
-struct device_d *get_device_by_path(const char *path)
-{
- struct device_d *dev = NULL;
- char *npath = normalise_path(path);
-
- if (strncmp(npath, "/dev/", 5))
- goto out;
-
- dev = get_device_by_id(npath + 5);
-
- out:
- free(npath);
- errno = -ENODEV;
- return dev;
-}
-EXPORT_SYMBOL(get_device_by_path);
-
int dev_protect(struct device_d *dev, size_t count, unsigned long offset, int prot)
{
printf("%s: currently broken\n", __func__);
@@ -264,13 +230,23 @@ EXPORT_SYMBOL(dummy_probe);
static int do_devinfo_subtree(struct device_d *dev, int depth, char edge)
{
struct device_d *child;
+ struct cdev *cdev;
int i;
for (i = 0; i < depth; i++)
printf("| ");
- if (*dev->id)
- printf("%c----%s\n", edge, dev->id);
+ printf("%c----%s%d", edge, dev->name, dev->id);
+ if (!list_empty(&dev->cdevs)) {
+ printf(" (");
+ list_for_each_entry(cdev, &dev->cdevs, devices_list) {
+ printf("%s", cdev->name);
+ if (!list_is_last(&cdev->devices_list, &dev->cdevs))
+ printf(", ");
+ }
+ printf(")");
+ }
+ printf("\n");
if (!list_empty(&dev->children)) {
device_for_each_child(dev, child) {
@@ -287,10 +263,7 @@ const char *dev_id(const struct device_d *dev)
{
static char buf[sizeof(unsigned long) * 2];
- if (strlen(dev->id))
- return dev->id;
-
- sprintf(buf, "0x%08x", dev->map_base);
+ sprintf(buf, "%s%d", dev->name, dev->id);
return buf;
}
@@ -325,7 +298,7 @@ static int do_devinfo ( cmd_tbl_t *cmdtp, int argc, char *argv[])
for_each_driver(drv)
printf("%10s\n",drv->name);
} else {
- struct device_d *dev = get_device_by_path(argv[1]);
+ struct device_d *dev = get_device_by_name(argv[1]);
if (!dev) {
printf("no such device: %s\n",argv[1]);