Merge sascha@brannigan.homelinux.org:/home/sascha/ptx/u-boot/u-boot-v2
This commit is contained in:
commit
045933764a
122
lib/driver.c
122
lib/driver.c
|
@ -63,16 +63,16 @@ int get_free_deviceid(char *id, char *id_template)
|
||||||
|
|
||||||
static int match(struct driver_d *drv, struct device_d *dev)
|
static int match(struct driver_d *drv, struct device_d *dev)
|
||||||
{
|
{
|
||||||
if (strcmp(dev->name, drv->name))
|
if (strcmp(dev->name, drv->name))
|
||||||
return -1;
|
return -1;
|
||||||
if (dev->type != drv->type)
|
if (dev->type != drv->type)
|
||||||
return -1;
|
return -1;
|
||||||
if(drv->probe(dev))
|
if(drv->probe(dev))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
dev->driver = drv;
|
dev->driver = drv;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int register_device(struct device_d *new_device)
|
int register_device(struct device_d *new_device)
|
||||||
|
@ -88,9 +88,9 @@ int register_device(struct device_d *new_device)
|
||||||
list_add_tail(&new_device->list, &device_list);
|
list_add_tail(&new_device->list, &device_list);
|
||||||
|
|
||||||
for_each_driver(drv) {
|
for_each_driver(drv) {
|
||||||
if (!match(drv, new_device))
|
if (!match(drv, new_device))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ struct driver_d *get_driver_by_name(const char *name)
|
||||||
|
|
||||||
static void noinfo(struct device_d *dev)
|
static void noinfo(struct device_d *dev)
|
||||||
{
|
{
|
||||||
printf("no info available for %s\n", dev->id);
|
printf("no info available for %s\n", dev->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void noshortinfo(struct device_d *dev)
|
static void noshortinfo(struct device_d *dev)
|
||||||
|
@ -130,19 +130,19 @@ static void noshortinfo(struct device_d *dev)
|
||||||
|
|
||||||
int register_driver(struct driver_d *drv)
|
int register_driver(struct driver_d *drv)
|
||||||
{
|
{
|
||||||
struct device_d *dev = NULL;
|
struct device_d *dev = NULL;
|
||||||
|
|
||||||
debug("register_driver: %s\n",new_driver->name);
|
debug("register_driver: %s\n",new_driver->name);
|
||||||
|
|
||||||
list_add_tail(&drv->list, &driver_list);
|
list_add_tail(&drv->list, &driver_list);
|
||||||
|
|
||||||
if (!drv->info)
|
if (!drv->info)
|
||||||
drv->info = noinfo;
|
drv->info = noinfo;
|
||||||
if (!drv->shortinfo)
|
if (!drv->shortinfo)
|
||||||
drv->shortinfo = noshortinfo;
|
drv->shortinfo = noshortinfo;
|
||||||
|
|
||||||
for_each_device(dev)
|
for_each_device(dev)
|
||||||
match(drv, dev);
|
match(drv, dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -152,35 +152,35 @@ static char devicename_from_spec_str_buf[PATH_MAX];
|
||||||
|
|
||||||
char *deviceid_from_spec_str(const char *str, char **endp)
|
char *deviceid_from_spec_str(const char *str, char **endp)
|
||||||
{
|
{
|
||||||
char *buf = devicename_from_spec_str_buf;
|
char *buf = devicename_from_spec_str_buf;
|
||||||
const char *end;
|
const char *end;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
if (isdigit(*str)) {
|
if (isdigit(*str)) {
|
||||||
/* No device name given, use default driver mem */
|
/* No device name given, use default driver mem */
|
||||||
sprintf(buf, "mem");
|
sprintf(buf, "mem");
|
||||||
end = str;
|
end = str;
|
||||||
} else {
|
} else {
|
||||||
/* OK, we have a device name, parse it */
|
/* OK, we have a device name, parse it */
|
||||||
while (*str) {
|
while (*str) {
|
||||||
if (*str == ':') {
|
if (*str == ':') {
|
||||||
str++;
|
str++;
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[i++] = *str++;
|
buf[i++] = *str++;
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if (i == MAX_DRIVER_NAME)
|
if (i == MAX_DRIVER_NAME)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
end = str;
|
end = str;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (endp)
|
if (endp)
|
||||||
*endp = (char *)end;
|
*endp = (char *)end;
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get a device struct from the beginning of the string. Default to mem if no
|
/* Get a device struct from the beginning of the string. Default to mem if no
|
||||||
|
@ -190,49 +190,49 @@ char *deviceid_from_spec_str(const char *str, char **endp)
|
||||||
*/
|
*/
|
||||||
struct device_d *device_from_spec_str(const char *str, char **endp)
|
struct device_d *device_from_spec_str(const char *str, char **endp)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
name = deviceid_from_spec_str(str, endp);
|
name = deviceid_from_spec_str(str, endp);
|
||||||
return get_device_by_id(name);
|
return get_device_by_id(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t dev_read(struct device_d *dev, void *buf, size_t count, unsigned long offset, ulong flags)
|
ssize_t dev_read(struct device_d *dev, void *buf, size_t count, unsigned long offset, ulong flags)
|
||||||
{
|
{
|
||||||
if (dev->driver->read)
|
if (dev->driver->read)
|
||||||
return dev->driver->read(dev, buf, count, offset, flags);
|
return dev->driver->read(dev, buf, count, offset, flags);
|
||||||
errno = -ENOSYS;
|
errno = -ENOSYS;
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t dev_write(struct device_d *dev, const void *buf, size_t count, unsigned long offset, ulong flags)
|
ssize_t dev_write(struct device_d *dev, const void *buf, size_t count, unsigned long offset, ulong flags)
|
||||||
{
|
{
|
||||||
if (dev->driver->write)
|
if (dev->driver->write)
|
||||||
return dev->driver->write(dev, buf, count, offset, flags);
|
return dev->driver->write(dev, buf, count, offset, flags);
|
||||||
errno = -ENOSYS;
|
errno = -ENOSYS;
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t dev_erase(struct device_d *dev, size_t count, unsigned long offset)
|
ssize_t dev_erase(struct device_d *dev, size_t count, unsigned long offset)
|
||||||
{
|
{
|
||||||
if (dev->driver->erase)
|
if (dev->driver->erase)
|
||||||
return dev->driver->erase(dev, count, offset);
|
return dev->driver->erase(dev, count, offset);
|
||||||
errno = -ENOSYS;
|
errno = -ENOSYS;
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dev_protect(struct device_d *dev, size_t count, unsigned long offset, int prot)
|
int dev_protect(struct device_d *dev, size_t count, unsigned long offset, int prot)
|
||||||
{
|
{
|
||||||
if (dev->driver->protect)
|
if (dev->driver->protect)
|
||||||
return dev->driver->protect(dev, count, offset, prot);
|
return dev->driver->protect(dev, count, offset, prot);
|
||||||
errno = -ENOSYS;
|
errno = -ENOSYS;
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t dev_memmap(struct device_d *dev, void **map, int flags)
|
ssize_t dev_memmap(struct device_d *dev, void **map, int flags)
|
||||||
{
|
{
|
||||||
if (dev->driver->memmap)
|
if (dev->driver->memmap)
|
||||||
return dev->driver->memmap(dev, map, flags);
|
return dev->driver->memmap(dev, map, flags);
|
||||||
errno = -ENOSYS;
|
errno = -ENOSYS;
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int generic_memmap_ro(struct device_d *dev, void **map, int flags)
|
int generic_memmap_ro(struct device_d *dev, void **map, int flags)
|
||||||
|
@ -251,7 +251,7 @@ int generic_memmap_rw(struct device_d *dev, void **map, int flags)
|
||||||
|
|
||||||
int dummy_probe(struct device_d *dev)
|
int dummy_probe(struct device_d *dev)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_devinfo ( cmd_tbl_t *cmdtp, int argc, char *argv[])
|
static int do_devinfo ( cmd_tbl_t *cmdtp, int argc, char *argv[])
|
||||||
|
|
34
lib/misc.c
34
lib/misc.c
|
@ -32,28 +32,28 @@
|
||||||
*/
|
*/
|
||||||
unsigned long strtoul_suffix(const char *str, char **endp, int base)
|
unsigned long strtoul_suffix(const char *str, char **endp, int base)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
char *end;
|
char *end;
|
||||||
|
|
||||||
val = simple_strtoul(str, &end, base);
|
val = simple_strtoul(str, &end, base);
|
||||||
|
|
||||||
switch (*end) {
|
switch (*end) {
|
||||||
case 'G':
|
case 'G':
|
||||||
val *= 1024;
|
|
||||||
case 'M':
|
|
||||||
val *= 1024;
|
val *= 1024;
|
||||||
case 'k':
|
case 'M':
|
||||||
case 'K':
|
val *= 1024;
|
||||||
val *= 1024;
|
case 'k':
|
||||||
end++;
|
case 'K':
|
||||||
|
val *= 1024;
|
||||||
|
end++;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (endp)
|
if (endp)
|
||||||
*endp = (char *)end;
|
*endp = (char *)end;
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(strtoul_suffix);
|
EXPORT_SYMBOL(strtoul_suffix);
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*str == '-') {
|
if (*str == '-') {
|
||||||
/* beginning and end given */
|
/* beginning and end given */
|
||||||
end = strtoul_suffix(str + 1, NULL, 0);
|
end = strtoul_suffix(str + 1, NULL, 0);
|
||||||
if (end < *start) {
|
if (end < *start) {
|
||||||
printf("end < start\n");
|
printf("end < start\n");
|
||||||
|
@ -99,7 +99,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*str == '+') {
|
if (*str == '+') {
|
||||||
/* beginning and size given */
|
/* beginning and size given */
|
||||||
*size = strtoul_suffix(str + 1, NULL, 0);
|
*size = strtoul_suffix(str + 1, NULL, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,30 +29,30 @@
|
||||||
|
|
||||||
struct param_d *get_param_by_name(struct device_d *dev, const char *name)
|
struct param_d *get_param_by_name(struct device_d *dev, const char *name)
|
||||||
{
|
{
|
||||||
struct param_d *param = dev->param;
|
struct param_d *param = dev->param;
|
||||||
|
|
||||||
while (param) {
|
while (param) {
|
||||||
if (!strcmp(param->name, name))
|
if (!strcmp(param->name, name))
|
||||||
return param;
|
return param;
|
||||||
param = param->next;
|
param = param->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *dev_get_param(struct device_d *dev, const char *name)
|
const char *dev_get_param(struct device_d *dev, const char *name)
|
||||||
{
|
{
|
||||||
struct param_d *param = get_param_by_name(dev, name);
|
struct param_d *param = get_param_by_name(dev, name);
|
||||||
|
|
||||||
if (!param) {
|
if (!param) {
|
||||||
errno = -EINVAL;
|
errno = -EINVAL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param->get)
|
if (param->get)
|
||||||
return param->get(dev, param);
|
return param->get(dev, param);
|
||||||
|
|
||||||
return param->value;
|
return param->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NET
|
#ifdef CONFIG_NET
|
||||||
|
@ -72,7 +72,7 @@ int dev_set_param_ip(struct device_d *dev, char *name, IPaddr_t ip)
|
||||||
|
|
||||||
int dev_set_param(struct device_d *dev, const char *name, const char *val)
|
int dev_set_param(struct device_d *dev, const char *name, const char *val)
|
||||||
{
|
{
|
||||||
struct param_d *param;
|
struct param_d *param;
|
||||||
|
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
errno = -ENODEV;
|
errno = -ENODEV;
|
||||||
|
@ -91,29 +91,29 @@ int dev_set_param(struct device_d *dev, const char *name, const char *val)
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param->set)
|
if (param->set)
|
||||||
return param->set(dev, param, val);
|
return param->set(dev, param, val);
|
||||||
|
|
||||||
if (param->value)
|
if (param->value)
|
||||||
free(param->value);
|
free(param->value);
|
||||||
|
|
||||||
param->value = strdup(val);
|
param->value = strdup(val);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dev_add_param(struct device_d *dev, struct param_d *newparam)
|
int dev_add_param(struct device_d *dev, struct param_d *newparam)
|
||||||
{
|
{
|
||||||
struct param_d *param = dev->param;
|
struct param_d *param = dev->param;
|
||||||
|
|
||||||
newparam->next = 0;
|
newparam->next = 0;
|
||||||
|
|
||||||
if (param) {
|
if (param) {
|
||||||
while (param->next)
|
while (param->next)
|
||||||
param = param->next;
|
param = param->next;
|
||||||
param->next = newparam;
|
param->next = newparam;
|
||||||
} else {
|
} else {
|
||||||
dev->param = newparam;
|
dev->param = newparam;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue