You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (31 commits) driver core: Display error codes when class suspend fails Driver core: Add section count to memory_block struct Driver core: Add mutex for adding/removing memory blocks Driver core: Move find_memory_block routine hpilo: Despecificate driver from iLO generation driver core: Convert link_mem_sections to use find_memory_block_hinted. driver core: Introduce find_memory_block_hinted which utilizes kset_find_obj_hinted. kobject: Introduce kset_find_obj_hinted. driver core: fix build for CONFIG_BLOCK not enabled driver-core: base: change to new flag variable sysfs: only access bin file vm_ops with the active lock sysfs: Fail bin file mmap if vma close is implemented. FW_LOADER: fix kconfig dependency warning on HOTPLUG uio: Statically allocate uio_class and use class .dev_attrs. uio: Support 2^MINOR_BITS minors uio: Cleanup irq handling. uio: Don't clear driver data uio: Fix lack of locking in init_uio_class SYSFS: Allow boot time switching between deprecated and modern sysfs layout driver core: remove CONFIG_SYSFS_DEPRECATED_V2 but keep it for block devices ...
This commit is contained in:
@@ -0,0 +1,12 @@
|
|||||||
|
What: /sys/module/pch_phub/drivers/.../pch_mac
|
||||||
|
Date: August 2010
|
||||||
|
KernelVersion: 2.6.35
|
||||||
|
Contact: masa-korg@dsn.okisemi.com
|
||||||
|
Description: Write/read GbE MAC address.
|
||||||
|
|
||||||
|
What: /sys/module/pch_phub/drivers/.../pch_firmware
|
||||||
|
Date: August 2010
|
||||||
|
KernelVersion: 2.6.35
|
||||||
|
Contact: masa-korg@dsn.okisemi.com
|
||||||
|
Description: Write/read Option ROM data.
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ Dynamic debug has even more useful features:
|
|||||||
read to display the complete list of known debug statements, to help guide you
|
read to display the complete list of known debug statements, to help guide you
|
||||||
|
|
||||||
Controlling dynamic debug Behaviour
|
Controlling dynamic debug Behaviour
|
||||||
===============================
|
===================================
|
||||||
|
|
||||||
The behaviour of pr_debug()/dev_debug()s are controlled via writing to a
|
The behaviour of pr_debug()/dev_debug()s are controlled via writing to a
|
||||||
control file in the 'debugfs' filesystem. Thus, you must first mount the debugfs
|
control file in the 'debugfs' filesystem. Thus, you must first mount the debugfs
|
||||||
@@ -212,6 +212,26 @@ Note the regexp ^[-+=][scp]+$ matches a flags specification.
|
|||||||
Note also that there is no convenient syntax to remove all
|
Note also that there is no convenient syntax to remove all
|
||||||
the flags at once, you need to use "-psc".
|
the flags at once, you need to use "-psc".
|
||||||
|
|
||||||
|
|
||||||
|
Debug messages during boot process
|
||||||
|
==================================
|
||||||
|
|
||||||
|
To be able to activate debug messages during the boot process,
|
||||||
|
even before userspace and debugfs exists, use the boot parameter:
|
||||||
|
ddebug_query="QUERY"
|
||||||
|
|
||||||
|
QUERY follows the syntax described above, but must not exceed 1023
|
||||||
|
characters. The enablement of debug messages is done as an arch_initcall.
|
||||||
|
Thus you can enable debug messages in all code processed after this
|
||||||
|
arch_initcall via this boot parameter.
|
||||||
|
On an x86 system for example ACPI enablement is a subsys_initcall and
|
||||||
|
ddebug_query="file ec.c +p"
|
||||||
|
will show early Embedded Controller transactions during ACPI setup if
|
||||||
|
your machine (typically a laptop) has an Embedded Controller.
|
||||||
|
PCI (or other devices) initialization also is a hot candidate for using
|
||||||
|
this boot parameter for debugging purposes.
|
||||||
|
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
========
|
========
|
||||||
|
|
||||||
|
|||||||
@@ -43,10 +43,11 @@ parameter is applicable:
|
|||||||
AVR32 AVR32 architecture is enabled.
|
AVR32 AVR32 architecture is enabled.
|
||||||
AX25 Appropriate AX.25 support is enabled.
|
AX25 Appropriate AX.25 support is enabled.
|
||||||
BLACKFIN Blackfin architecture is enabled.
|
BLACKFIN Blackfin architecture is enabled.
|
||||||
DRM Direct Rendering Management support is enabled.
|
|
||||||
EDD BIOS Enhanced Disk Drive Services (EDD) is enabled
|
EDD BIOS Enhanced Disk Drive Services (EDD) is enabled
|
||||||
EFI EFI Partitioning (GPT) is enabled
|
EFI EFI Partitioning (GPT) is enabled
|
||||||
EIDE EIDE/ATAPI support is enabled.
|
EIDE EIDE/ATAPI support is enabled.
|
||||||
|
DRM Direct Rendering Management support is enabled.
|
||||||
|
DYNAMIC_DEBUG Build in debug messages and enable them at runtime
|
||||||
FB The frame buffer device is enabled.
|
FB The frame buffer device is enabled.
|
||||||
GCOV GCOV profiling is enabled.
|
GCOV GCOV profiling is enabled.
|
||||||
HW Appropriate hardware is enabled.
|
HW Appropriate hardware is enabled.
|
||||||
@@ -570,6 +571,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
Format: <port#>,<type>
|
Format: <port#>,<type>
|
||||||
See also Documentation/input/joystick-parport.txt
|
See also Documentation/input/joystick-parport.txt
|
||||||
|
|
||||||
|
ddebug_query= [KNL,DYNAMIC_DEBUG] Enable debug messages at early boot
|
||||||
|
time. See Documentation/dynamic-debug-howto.txt for
|
||||||
|
details.
|
||||||
|
|
||||||
debug [KNL] Enable kernel debugging (events log level).
|
debug [KNL] Enable kernel debugging (events log level).
|
||||||
|
|
||||||
debug_locks_verbose=
|
debug_locks_verbose=
|
||||||
@@ -2370,6 +2375,15 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
|
|
||||||
switches= [HW,M68k]
|
switches= [HW,M68k]
|
||||||
|
|
||||||
|
sysfs.deprecated=0|1 [KNL]
|
||||||
|
Enable/disable old style sysfs layout for old udev
|
||||||
|
on older distributions. When this option is enabled
|
||||||
|
very new udev will not work anymore. When this option
|
||||||
|
is disabled (or CONFIG_SYSFS_DEPRECATED not compiled)
|
||||||
|
in older udev will not work anymore.
|
||||||
|
Default depends on CONFIG_SYSFS_DEPRECATED_V2 set in
|
||||||
|
the kernel configuration.
|
||||||
|
|
||||||
sysrq_always_enabled
|
sysrq_always_enabled
|
||||||
[KNL]
|
[KNL]
|
||||||
Ignore sysrq setting - this boot parameter will
|
Ignore sysrq setting - this boot parameter will
|
||||||
|
|||||||
+3
-1
@@ -2064,14 +2064,16 @@ F: drivers/block/drbd/
|
|||||||
F: lib/lru_cache.c
|
F: lib/lru_cache.c
|
||||||
F: Documentation/blockdev/drbd/
|
F: Documentation/blockdev/drbd/
|
||||||
|
|
||||||
DRIVER CORE, KOBJECTS, AND SYSFS
|
DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS
|
||||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/kobject.txt
|
F: Documentation/kobject.txt
|
||||||
F: drivers/base/
|
F: drivers/base/
|
||||||
F: fs/sysfs/
|
F: fs/sysfs/
|
||||||
|
F: fs/debugfs/
|
||||||
F: include/linux/kobj*
|
F: include/linux/kobj*
|
||||||
|
F: include/linux/debugfs.h
|
||||||
F: lib/kobj*
|
F: lib/kobj*
|
||||||
|
|
||||||
DRM DRIVERS
|
DRM DRIVERS
|
||||||
|
|||||||
+2
-5
@@ -22,9 +22,7 @@
|
|||||||
#include "blk.h"
|
#include "blk.h"
|
||||||
|
|
||||||
static DEFINE_MUTEX(block_class_lock);
|
static DEFINE_MUTEX(block_class_lock);
|
||||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
|
||||||
struct kobject *block_depr;
|
struct kobject *block_depr;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* for extended dynamic devt allocation, currently only one major is used */
|
/* for extended dynamic devt allocation, currently only one major is used */
|
||||||
#define MAX_EXT_DEVT (1 << MINORBITS)
|
#define MAX_EXT_DEVT (1 << MINORBITS)
|
||||||
@@ -810,10 +808,9 @@ static int __init genhd_device_init(void)
|
|||||||
|
|
||||||
register_blkdev(BLOCK_EXT_MAJOR, "blkext");
|
register_blkdev(BLOCK_EXT_MAJOR, "blkext");
|
||||||
|
|
||||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
|
||||||
/* create top-level block dir */
|
/* create top-level block dir */
|
||||||
block_depr = kobject_create_and_add("block", NULL);
|
if (!sysfs_deprecated)
|
||||||
#endif
|
block_depr = kobject_create_and_add("block", NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ config PREVENT_FIRMWARE_BUILD
|
|||||||
|
|
||||||
config FW_LOADER
|
config FW_LOADER
|
||||||
tristate "Userspace firmware loading support" if EMBEDDED
|
tristate "Userspace firmware loading support" if EMBEDDED
|
||||||
depends on HOTPLUG
|
|
||||||
default y
|
default y
|
||||||
---help---
|
---help---
|
||||||
This option is provided for the case where no in-kernel-tree modules
|
This option is provided for the case where no in-kernel-tree modules
|
||||||
|
|||||||
@@ -19,7 +19,5 @@ obj-$(CONFIG_MODULES) += module.o
|
|||||||
endif
|
endif
|
||||||
obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor.o
|
obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_DEBUG_DRIVER),y)
|
ccflags-$(CONFIG_DEBUG_DRIVER) := -DDEBUG
|
||||||
EXTRA_CFLAGS += -DDEBUG
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|||||||
@@ -440,22 +440,6 @@ static void device_remove_attrs(struct bus_type *bus, struct device *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
static int make_deprecated_bus_links(struct device *dev)
|
|
||||||
{
|
|
||||||
return sysfs_create_link(&dev->kobj,
|
|
||||||
&dev->bus->p->subsys.kobj, "bus");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void remove_deprecated_bus_links(struct device *dev)
|
|
||||||
{
|
|
||||||
sysfs_remove_link(&dev->kobj, "bus");
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static inline int make_deprecated_bus_links(struct device *dev) { return 0; }
|
|
||||||
static inline void remove_deprecated_bus_links(struct device *dev) { }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bus_add_device - add device to bus
|
* bus_add_device - add device to bus
|
||||||
* @dev: device being added
|
* @dev: device being added
|
||||||
@@ -482,15 +466,10 @@ int bus_add_device(struct device *dev)
|
|||||||
&dev->bus->p->subsys.kobj, "subsystem");
|
&dev->bus->p->subsys.kobj, "subsystem");
|
||||||
if (error)
|
if (error)
|
||||||
goto out_subsys;
|
goto out_subsys;
|
||||||
error = make_deprecated_bus_links(dev);
|
|
||||||
if (error)
|
|
||||||
goto out_deprecated;
|
|
||||||
klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);
|
klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_deprecated:
|
|
||||||
sysfs_remove_link(&dev->kobj, "subsystem");
|
|
||||||
out_subsys:
|
out_subsys:
|
||||||
sysfs_remove_link(&bus->p->devices_kset->kobj, dev_name(dev));
|
sysfs_remove_link(&bus->p->devices_kset->kobj, dev_name(dev));
|
||||||
out_id:
|
out_id:
|
||||||
@@ -530,7 +509,6 @@ void bus_remove_device(struct device *dev)
|
|||||||
{
|
{
|
||||||
if (dev->bus) {
|
if (dev->bus) {
|
||||||
sysfs_remove_link(&dev->kobj, "subsystem");
|
sysfs_remove_link(&dev->kobj, "subsystem");
|
||||||
remove_deprecated_bus_links(dev);
|
|
||||||
sysfs_remove_link(&dev->bus->p->devices_kset->kobj,
|
sysfs_remove_link(&dev->bus->p->devices_kset->kobj,
|
||||||
dev_name(dev));
|
dev_name(dev));
|
||||||
device_remove_attrs(dev->bus, dev);
|
device_remove_attrs(dev->bus, dev);
|
||||||
|
|||||||
+2
-21
@@ -184,9 +184,9 @@ int __class_register(struct class *cls, struct lock_class_key *key)
|
|||||||
if (!cls->dev_kobj)
|
if (!cls->dev_kobj)
|
||||||
cls->dev_kobj = sysfs_dev_char_kobj;
|
cls->dev_kobj = sysfs_dev_char_kobj;
|
||||||
|
|
||||||
#if defined(CONFIG_SYSFS_DEPRECATED) && defined(CONFIG_BLOCK)
|
#if defined(CONFIG_BLOCK)
|
||||||
/* let the block class directory show up in the root of sysfs */
|
/* let the block class directory show up in the root of sysfs */
|
||||||
if (cls != &block_class)
|
if (!sysfs_deprecated || cls != &block_class)
|
||||||
cp->class_subsys.kobj.kset = class_kset;
|
cp->class_subsys.kobj.kset = class_kset;
|
||||||
#else
|
#else
|
||||||
cp->class_subsys.kobj.kset = class_kset;
|
cp->class_subsys.kobj.kset = class_kset;
|
||||||
@@ -276,25 +276,6 @@ void class_destroy(struct class *cls)
|
|||||||
class_unregister(cls);
|
class_unregister(cls);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
char *make_class_name(const char *name, struct kobject *kobj)
|
|
||||||
{
|
|
||||||
char *class_name;
|
|
||||||
int size;
|
|
||||||
|
|
||||||
size = strlen(name) + strlen(kobject_name(kobj)) + 2;
|
|
||||||
|
|
||||||
class_name = kmalloc(size, GFP_KERNEL);
|
|
||||||
if (!class_name)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
strcpy(class_name, name);
|
|
||||||
strcat(class_name, ":");
|
|
||||||
strcat(class_name, kobject_name(kobj));
|
|
||||||
return class_name;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* class_dev_iter_init - initialize class device iterator
|
* class_dev_iter_init - initialize class device iterator
|
||||||
* @iter: class iterator to initialize
|
* @iter: class iterator to initialize
|
||||||
|
|||||||
+44
-174
@@ -26,6 +26,19 @@
|
|||||||
#include "base.h"
|
#include "base.h"
|
||||||
#include "power/power.h"
|
#include "power/power.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYSFS_DEPRECATED
|
||||||
|
#ifdef CONFIG_SYSFS_DEPRECATED_V2
|
||||||
|
long sysfs_deprecated = 1;
|
||||||
|
#else
|
||||||
|
long sysfs_deprecated = 0;
|
||||||
|
#endif
|
||||||
|
static __init int sysfs_deprecated_setup(char *arg)
|
||||||
|
{
|
||||||
|
return strict_strtol(arg, 10, &sysfs_deprecated);
|
||||||
|
}
|
||||||
|
early_param("sysfs.deprecated", sysfs_deprecated_setup);
|
||||||
|
#endif
|
||||||
|
|
||||||
int (*platform_notify)(struct device *dev) = NULL;
|
int (*platform_notify)(struct device *dev) = NULL;
|
||||||
int (*platform_notify_remove)(struct device *dev) = NULL;
|
int (*platform_notify_remove)(struct device *dev) = NULL;
|
||||||
static struct kobject *dev_kobj;
|
static struct kobject *dev_kobj;
|
||||||
@@ -203,37 +216,6 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj,
|
|||||||
if (dev->driver)
|
if (dev->driver)
|
||||||
add_uevent_var(env, "DRIVER=%s", dev->driver->name);
|
add_uevent_var(env, "DRIVER=%s", dev->driver->name);
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
if (dev->class) {
|
|
||||||
struct device *parent = dev->parent;
|
|
||||||
|
|
||||||
/* find first bus device in parent chain */
|
|
||||||
while (parent && !parent->bus)
|
|
||||||
parent = parent->parent;
|
|
||||||
if (parent && parent->bus) {
|
|
||||||
const char *path;
|
|
||||||
|
|
||||||
path = kobject_get_path(&parent->kobj, GFP_KERNEL);
|
|
||||||
if (path) {
|
|
||||||
add_uevent_var(env, "PHYSDEVPATH=%s", path);
|
|
||||||
kfree(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
add_uevent_var(env, "PHYSDEVBUS=%s", parent->bus->name);
|
|
||||||
|
|
||||||
if (parent->driver)
|
|
||||||
add_uevent_var(env, "PHYSDEVDRIVER=%s",
|
|
||||||
parent->driver->name);
|
|
||||||
}
|
|
||||||
} else if (dev->bus) {
|
|
||||||
add_uevent_var(env, "PHYSDEVBUS=%s", dev->bus->name);
|
|
||||||
|
|
||||||
if (dev->driver)
|
|
||||||
add_uevent_var(env, "PHYSDEVDRIVER=%s",
|
|
||||||
dev->driver->name);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* have the bus specific function add its stuff */
|
/* have the bus specific function add its stuff */
|
||||||
if (dev->bus && dev->bus->uevent) {
|
if (dev->bus && dev->bus->uevent) {
|
||||||
retval = dev->bus->uevent(dev, env);
|
retval = dev->bus->uevent(dev, env);
|
||||||
@@ -578,24 +560,6 @@ void device_initialize(struct device *dev)
|
|||||||
set_dev_node(dev, -1);
|
set_dev_node(dev, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
static struct kobject *get_device_parent(struct device *dev,
|
|
||||||
struct device *parent)
|
|
||||||
{
|
|
||||||
/* class devices without a parent live in /sys/class/<classname>/ */
|
|
||||||
if (dev->class && (!parent || parent->class != dev->class))
|
|
||||||
return &dev->class->p->class_subsys.kobj;
|
|
||||||
/* all other devices keep their parent */
|
|
||||||
else if (parent)
|
|
||||||
return &parent->kobj;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cleanup_device_parent(struct device *dev) {}
|
|
||||||
static inline void cleanup_glue_dir(struct device *dev,
|
|
||||||
struct kobject *glue_dir) {}
|
|
||||||
#else
|
|
||||||
static struct kobject *virtual_device_parent(struct device *dev)
|
static struct kobject *virtual_device_parent(struct device *dev)
|
||||||
{
|
{
|
||||||
static struct kobject *virtual_dir = NULL;
|
static struct kobject *virtual_dir = NULL;
|
||||||
@@ -666,6 +630,15 @@ static struct kobject *get_device_parent(struct device *dev,
|
|||||||
struct kobject *parent_kobj;
|
struct kobject *parent_kobj;
|
||||||
struct kobject *k;
|
struct kobject *k;
|
||||||
|
|
||||||
|
#ifdef CONFIG_BLOCK
|
||||||
|
/* block disks show up in /sys/block */
|
||||||
|
if (sysfs_deprecated && dev->class == &block_class) {
|
||||||
|
if (parent && parent->class == &block_class)
|
||||||
|
return &parent->kobj;
|
||||||
|
return &block_class.p->class_subsys.kobj;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we have no parent, we live in "virtual".
|
* If we have no parent, we live in "virtual".
|
||||||
* Class-devices with a non class-device as parent, live
|
* Class-devices with a non class-device as parent, live
|
||||||
@@ -719,7 +692,6 @@ static void cleanup_device_parent(struct device *dev)
|
|||||||
{
|
{
|
||||||
cleanup_glue_dir(dev, dev->kobj.parent);
|
cleanup_glue_dir(dev, dev->kobj.parent);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static void setup_parent(struct device *dev, struct device *parent)
|
static void setup_parent(struct device *dev, struct device *parent)
|
||||||
{
|
{
|
||||||
@@ -742,70 +714,29 @@ static int device_add_class_symlinks(struct device *dev)
|
|||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
/* stacked class devices need a symlink in the class directory */
|
|
||||||
if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
|
|
||||||
device_is_not_partition(dev)) {
|
|
||||||
error = sysfs_create_link(&dev->class->p->class_subsys.kobj,
|
|
||||||
&dev->kobj, dev_name(dev));
|
|
||||||
if (error)
|
|
||||||
goto out_subsys;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->parent && device_is_not_partition(dev)) {
|
|
||||||
struct device *parent = dev->parent;
|
|
||||||
char *class_name;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* stacked class devices have the 'device' link
|
|
||||||
* pointing to the bus device instead of the parent
|
|
||||||
*/
|
|
||||||
while (parent->class && !parent->bus && parent->parent)
|
|
||||||
parent = parent->parent;
|
|
||||||
|
|
||||||
error = sysfs_create_link(&dev->kobj,
|
|
||||||
&parent->kobj,
|
|
||||||
"device");
|
|
||||||
if (error)
|
|
||||||
goto out_busid;
|
|
||||||
|
|
||||||
class_name = make_class_name(dev->class->name,
|
|
||||||
&dev->kobj);
|
|
||||||
if (class_name)
|
|
||||||
error = sysfs_create_link(&dev->parent->kobj,
|
|
||||||
&dev->kobj, class_name);
|
|
||||||
kfree(class_name);
|
|
||||||
if (error)
|
|
||||||
goto out_device;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
out_device:
|
|
||||||
if (dev->parent && device_is_not_partition(dev))
|
|
||||||
sysfs_remove_link(&dev->kobj, "device");
|
|
||||||
out_busid:
|
|
||||||
if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
|
|
||||||
device_is_not_partition(dev))
|
|
||||||
sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj,
|
|
||||||
dev_name(dev));
|
|
||||||
#else
|
|
||||||
/* link in the class directory pointing to the device */
|
|
||||||
error = sysfs_create_link(&dev->class->p->class_subsys.kobj,
|
|
||||||
&dev->kobj, dev_name(dev));
|
|
||||||
if (error)
|
|
||||||
goto out_subsys;
|
|
||||||
|
|
||||||
if (dev->parent && device_is_not_partition(dev)) {
|
if (dev->parent && device_is_not_partition(dev)) {
|
||||||
error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
|
error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
|
||||||
"device");
|
"device");
|
||||||
if (error)
|
if (error)
|
||||||
goto out_busid;
|
goto out_subsys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_BLOCK
|
||||||
|
/* /sys/block has directories and does not need symlinks */
|
||||||
|
if (sysfs_deprecated && dev->class == &block_class)
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* link in the class directory pointing to the device */
|
||||||
|
error = sysfs_create_link(&dev->class->p->class_subsys.kobj,
|
||||||
|
&dev->kobj, dev_name(dev));
|
||||||
|
if (error)
|
||||||
|
goto out_device;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_busid:
|
out_device:
|
||||||
sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj, dev_name(dev));
|
sysfs_remove_link(&dev->kobj, "device");
|
||||||
#endif
|
|
||||||
|
|
||||||
out_subsys:
|
out_subsys:
|
||||||
sysfs_remove_link(&dev->kobj, "subsystem");
|
sysfs_remove_link(&dev->kobj, "subsystem");
|
||||||
@@ -818,30 +749,14 @@ static void device_remove_class_symlinks(struct device *dev)
|
|||||||
if (!dev->class)
|
if (!dev->class)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
if (dev->parent && device_is_not_partition(dev)) {
|
|
||||||
char *class_name;
|
|
||||||
|
|
||||||
class_name = make_class_name(dev->class->name, &dev->kobj);
|
|
||||||
if (class_name) {
|
|
||||||
sysfs_remove_link(&dev->parent->kobj, class_name);
|
|
||||||
kfree(class_name);
|
|
||||||
}
|
|
||||||
sysfs_remove_link(&dev->kobj, "device");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
|
|
||||||
device_is_not_partition(dev))
|
|
||||||
sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj,
|
|
||||||
dev_name(dev));
|
|
||||||
#else
|
|
||||||
if (dev->parent && device_is_not_partition(dev))
|
if (dev->parent && device_is_not_partition(dev))
|
||||||
sysfs_remove_link(&dev->kobj, "device");
|
sysfs_remove_link(&dev->kobj, "device");
|
||||||
|
|
||||||
sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj, dev_name(dev));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sysfs_remove_link(&dev->kobj, "subsystem");
|
sysfs_remove_link(&dev->kobj, "subsystem");
|
||||||
|
#ifdef CONFIG_BLOCK
|
||||||
|
if (sysfs_deprecated && dev->class == &block_class)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj, dev_name(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1613,41 +1528,23 @@ int device_rename(struct device *dev, const char *new_name)
|
|||||||
pr_debug("device: '%s': %s: renaming to '%s'\n", dev_name(dev),
|
pr_debug("device: '%s': %s: renaming to '%s'\n", dev_name(dev),
|
||||||
__func__, new_name);
|
__func__, new_name);
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
if ((dev->class) && (dev->parent))
|
|
||||||
old_class_name = make_class_name(dev->class->name, &dev->kobj);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
old_device_name = kstrdup(dev_name(dev), GFP_KERNEL);
|
old_device_name = kstrdup(dev_name(dev), GFP_KERNEL);
|
||||||
if (!old_device_name) {
|
if (!old_device_name) {
|
||||||
error = -ENOMEM;
|
error = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
|
||||||
if (dev->class) {
|
if (dev->class) {
|
||||||
error = sysfs_rename_link(&dev->class->p->class_subsys.kobj,
|
error = sysfs_rename_link(&dev->class->p->class_subsys.kobj,
|
||||||
&dev->kobj, old_device_name, new_name);
|
&dev->kobj, old_device_name, new_name);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
error = kobject_rename(&dev->kobj, new_name);
|
error = kobject_rename(&dev->kobj, new_name);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
if (old_class_name) {
|
|
||||||
new_class_name = make_class_name(dev->class->name, &dev->kobj);
|
|
||||||
if (new_class_name) {
|
|
||||||
error = sysfs_rename_link(&dev->parent->kobj,
|
|
||||||
&dev->kobj,
|
|
||||||
old_class_name,
|
|
||||||
new_class_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
put_device(dev);
|
put_device(dev);
|
||||||
|
|
||||||
@@ -1664,40 +1561,13 @@ static int device_move_class_links(struct device *dev,
|
|||||||
struct device *new_parent)
|
struct device *new_parent)
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
||||||
char *class_name;
|
|
||||||
|
|
||||||
class_name = make_class_name(dev->class->name, &dev->kobj);
|
|
||||||
if (!class_name) {
|
|
||||||
error = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (old_parent) {
|
|
||||||
sysfs_remove_link(&dev->kobj, "device");
|
|
||||||
sysfs_remove_link(&old_parent->kobj, class_name);
|
|
||||||
}
|
|
||||||
if (new_parent) {
|
|
||||||
error = sysfs_create_link(&dev->kobj, &new_parent->kobj,
|
|
||||||
"device");
|
|
||||||
if (error)
|
|
||||||
goto out;
|
|
||||||
error = sysfs_create_link(&new_parent->kobj, &dev->kobj,
|
|
||||||
class_name);
|
|
||||||
if (error)
|
|
||||||
sysfs_remove_link(&dev->kobj, "device");
|
|
||||||
} else
|
|
||||||
error = 0;
|
|
||||||
out:
|
|
||||||
kfree(class_name);
|
|
||||||
return error;
|
|
||||||
#else
|
|
||||||
if (old_parent)
|
if (old_parent)
|
||||||
sysfs_remove_link(&dev->kobj, "device");
|
sysfs_remove_link(&dev->kobj, "device");
|
||||||
if (new_parent)
|
if (new_parent)
|
||||||
error = sysfs_create_link(&dev->kobj, &new_parent->kobj,
|
error = sysfs_create_link(&dev->kobj, &new_parent->kobj,
|
||||||
"device");
|
"device");
|
||||||
return error;
|
return error;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+57
-37
@@ -27,6 +27,8 @@
|
|||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
|
static DEFINE_MUTEX(mem_sysfs_mutex);
|
||||||
|
|
||||||
#define MEMORY_CLASS_NAME "memory"
|
#define MEMORY_CLASS_NAME "memory"
|
||||||
|
|
||||||
static struct sysdev_class memory_sysdev_class = {
|
static struct sysdev_class memory_sysdev_class = {
|
||||||
@@ -435,6 +437,45 @@ int __weak arch_get_memory_phys_device(unsigned long start_pfn)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct memory_block *find_memory_block_hinted(struct mem_section *section,
|
||||||
|
struct memory_block *hint)
|
||||||
|
{
|
||||||
|
struct kobject *kobj;
|
||||||
|
struct sys_device *sysdev;
|
||||||
|
struct memory_block *mem;
|
||||||
|
char name[sizeof(MEMORY_CLASS_NAME) + 9 + 1];
|
||||||
|
|
||||||
|
kobj = hint ? &hint->sysdev.kobj : NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This only works because we know that section == sysdev->id
|
||||||
|
* slightly redundant with sysdev_register()
|
||||||
|
*/
|
||||||
|
sprintf(&name[0], "%s%d", MEMORY_CLASS_NAME, __section_nr(section));
|
||||||
|
|
||||||
|
kobj = kset_find_obj_hinted(&memory_sysdev_class.kset, name, kobj);
|
||||||
|
if (!kobj)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
sysdev = container_of(kobj, struct sys_device, kobj);
|
||||||
|
mem = container_of(sysdev, struct memory_block, sysdev);
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For now, we have a linear search to go find the appropriate
|
||||||
|
* memory_block corresponding to a particular phys_index. If
|
||||||
|
* this gets to be a real problem, we can always use a radix
|
||||||
|
* tree or something here.
|
||||||
|
*
|
||||||
|
* This could be made generic for all sysdev classes.
|
||||||
|
*/
|
||||||
|
struct memory_block *find_memory_block(struct mem_section *section)
|
||||||
|
{
|
||||||
|
return find_memory_block_hinted(section, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static int add_memory_block(int nid, struct mem_section *section,
|
static int add_memory_block(int nid, struct mem_section *section,
|
||||||
unsigned long state, enum mem_add_context context)
|
unsigned long state, enum mem_add_context context)
|
||||||
{
|
{
|
||||||
@@ -445,8 +486,11 @@ static int add_memory_block(int nid, struct mem_section *section,
|
|||||||
if (!mem)
|
if (!mem)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
mutex_lock(&mem_sysfs_mutex);
|
||||||
|
|
||||||
mem->phys_index = __section_nr(section);
|
mem->phys_index = __section_nr(section);
|
||||||
mem->state = state;
|
mem->state = state;
|
||||||
|
mem->section_count++;
|
||||||
mutex_init(&mem->state_mutex);
|
mutex_init(&mem->state_mutex);
|
||||||
start_pfn = section_nr_to_pfn(mem->phys_index);
|
start_pfn = section_nr_to_pfn(mem->phys_index);
|
||||||
mem->phys_device = arch_get_memory_phys_device(start_pfn);
|
mem->phys_device = arch_get_memory_phys_device(start_pfn);
|
||||||
@@ -465,53 +509,29 @@ static int add_memory_block(int nid, struct mem_section *section,
|
|||||||
ret = register_mem_sect_under_node(mem, nid);
|
ret = register_mem_sect_under_node(mem, nid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_unlock(&mem_sysfs_mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* For now, we have a linear search to go find the appropriate
|
|
||||||
* memory_block corresponding to a particular phys_index. If
|
|
||||||
* this gets to be a real problem, we can always use a radix
|
|
||||||
* tree or something here.
|
|
||||||
*
|
|
||||||
* This could be made generic for all sysdev classes.
|
|
||||||
*/
|
|
||||||
struct memory_block *find_memory_block(struct mem_section *section)
|
|
||||||
{
|
|
||||||
struct kobject *kobj;
|
|
||||||
struct sys_device *sysdev;
|
|
||||||
struct memory_block *mem;
|
|
||||||
char name[sizeof(MEMORY_CLASS_NAME) + 9 + 1];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This only works because we know that section == sysdev->id
|
|
||||||
* slightly redundant with sysdev_register()
|
|
||||||
*/
|
|
||||||
sprintf(&name[0], "%s%d", MEMORY_CLASS_NAME, __section_nr(section));
|
|
||||||
|
|
||||||
kobj = kset_find_obj(&memory_sysdev_class.kset, name);
|
|
||||||
if (!kobj)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
sysdev = container_of(kobj, struct sys_device, kobj);
|
|
||||||
mem = container_of(sysdev, struct memory_block, sysdev);
|
|
||||||
|
|
||||||
return mem;
|
|
||||||
}
|
|
||||||
|
|
||||||
int remove_memory_block(unsigned long node_id, struct mem_section *section,
|
int remove_memory_block(unsigned long node_id, struct mem_section *section,
|
||||||
int phys_device)
|
int phys_device)
|
||||||
{
|
{
|
||||||
struct memory_block *mem;
|
struct memory_block *mem;
|
||||||
|
|
||||||
|
mutex_lock(&mem_sysfs_mutex);
|
||||||
mem = find_memory_block(section);
|
mem = find_memory_block(section);
|
||||||
unregister_mem_sect_under_nodes(mem);
|
|
||||||
mem_remove_simple_file(mem, phys_index);
|
|
||||||
mem_remove_simple_file(mem, state);
|
|
||||||
mem_remove_simple_file(mem, phys_device);
|
|
||||||
mem_remove_simple_file(mem, removable);
|
|
||||||
unregister_memory(mem, section);
|
|
||||||
|
|
||||||
|
mem->section_count--;
|
||||||
|
if (mem->section_count == 0) {
|
||||||
|
unregister_mem_sect_under_nodes(mem);
|
||||||
|
mem_remove_simple_file(mem, phys_index);
|
||||||
|
mem_remove_simple_file(mem, state);
|
||||||
|
mem_remove_simple_file(mem, phys_device);
|
||||||
|
mem_remove_simple_file(mem, removable);
|
||||||
|
unregister_memory(mem, section);
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_unlock(&mem_sysfs_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -409,25 +409,27 @@ static int link_mem_sections(int nid)
|
|||||||
unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
|
unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
|
||||||
unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
|
unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
|
||||||
unsigned long pfn;
|
unsigned long pfn;
|
||||||
|
struct memory_block *mem_blk = NULL;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
|
for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
|
||||||
unsigned long section_nr = pfn_to_section_nr(pfn);
|
unsigned long section_nr = pfn_to_section_nr(pfn);
|
||||||
struct mem_section *mem_sect;
|
struct mem_section *mem_sect;
|
||||||
struct memory_block *mem_blk;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!present_section_nr(section_nr))
|
if (!present_section_nr(section_nr))
|
||||||
continue;
|
continue;
|
||||||
mem_sect = __nr_to_section(section_nr);
|
mem_sect = __nr_to_section(section_nr);
|
||||||
mem_blk = find_memory_block(mem_sect);
|
mem_blk = find_memory_block_hinted(mem_sect, mem_blk);
|
||||||
ret = register_mem_sect_under_node(mem_blk, nid);
|
ret = register_mem_sect_under_node(mem_blk, nid);
|
||||||
if (!err)
|
if (!err)
|
||||||
err = ret;
|
err = ret;
|
||||||
|
|
||||||
/* discard ref obtained in find_memory_block() */
|
/* discard ref obtained in find_memory_block() */
|
||||||
kobject_put(&mem_blk->sysdev.kobj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mem_blk)
|
||||||
|
kobject_put(&mem_blk->sysdev.kobj);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+57
-23
@@ -192,6 +192,9 @@ int platform_device_add_resources(struct platform_device *pdev,
|
|||||||
{
|
{
|
||||||
struct resource *r;
|
struct resource *r;
|
||||||
|
|
||||||
|
if (!res)
|
||||||
|
return 0;
|
||||||
|
|
||||||
r = kmemdup(res, sizeof(struct resource) * num, GFP_KERNEL);
|
r = kmemdup(res, sizeof(struct resource) * num, GFP_KERNEL);
|
||||||
if (r) {
|
if (r) {
|
||||||
pdev->resource = r;
|
pdev->resource = r;
|
||||||
@@ -215,8 +218,12 @@ EXPORT_SYMBOL_GPL(platform_device_add_resources);
|
|||||||
int platform_device_add_data(struct platform_device *pdev, const void *data,
|
int platform_device_add_data(struct platform_device *pdev, const void *data,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
void *d = kmemdup(data, size, GFP_KERNEL);
|
void *d;
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
d = kmemdup(data, size, GFP_KERNEL);
|
||||||
if (d) {
|
if (d) {
|
||||||
pdev->dev.platform_data = d;
|
pdev->dev.platform_data = d;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -373,17 +380,13 @@ struct platform_device *__init_or_module platform_device_register_resndata(
|
|||||||
|
|
||||||
pdev->dev.parent = parent;
|
pdev->dev.parent = parent;
|
||||||
|
|
||||||
if (res) {
|
ret = platform_device_add_resources(pdev, res, num);
|
||||||
ret = platform_device_add_resources(pdev, res, num);
|
if (ret)
|
||||||
if (ret)
|
goto err;
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data) {
|
ret = platform_device_add_data(pdev, data, size);
|
||||||
ret = platform_device_add_data(pdev, data, size);
|
if (ret)
|
||||||
if (ret)
|
goto err;
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = platform_device_add(pdev);
|
ret = platform_device_add(pdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -488,12 +491,12 @@ int __init_or_module platform_driver_probe(struct platform_driver *drv,
|
|||||||
* if the probe was successful, and make sure any forced probes of
|
* if the probe was successful, and make sure any forced probes of
|
||||||
* new devices fail.
|
* new devices fail.
|
||||||
*/
|
*/
|
||||||
spin_lock(&platform_bus_type.p->klist_drivers.k_lock);
|
spin_lock(&drv->driver.bus->p->klist_drivers.k_lock);
|
||||||
drv->probe = NULL;
|
drv->probe = NULL;
|
||||||
if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
|
if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
|
||||||
retval = -ENODEV;
|
retval = -ENODEV;
|
||||||
drv->driver.probe = platform_drv_probe_fail;
|
drv->driver.probe = platform_drv_probe_fail;
|
||||||
spin_unlock(&platform_bus_type.p->klist_drivers.k_lock);
|
spin_unlock(&drv->driver.bus->p->klist_drivers.k_lock);
|
||||||
|
|
||||||
if (code != retval)
|
if (code != retval)
|
||||||
platform_driver_unregister(drv);
|
platform_driver_unregister(drv);
|
||||||
@@ -530,17 +533,13 @@ struct platform_device * __init_or_module platform_create_bundle(
|
|||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res) {
|
error = platform_device_add_resources(pdev, res, n_res);
|
||||||
error = platform_device_add_resources(pdev, res, n_res);
|
if (error)
|
||||||
if (error)
|
goto err_pdev_put;
|
||||||
goto err_pdev_put;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data) {
|
error = platform_device_add_data(pdev, data, size);
|
||||||
error = platform_device_add_data(pdev, data, size);
|
if (error)
|
||||||
if (error)
|
goto err_pdev_put;
|
||||||
goto err_pdev_put;
|
|
||||||
}
|
|
||||||
|
|
||||||
error = platform_device_add(pdev);
|
error = platform_device_add(pdev);
|
||||||
if (error)
|
if (error)
|
||||||
@@ -976,6 +975,41 @@ struct bus_type platform_bus_type = {
|
|||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(platform_bus_type);
|
EXPORT_SYMBOL_GPL(platform_bus_type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* platform_bus_get_pm_ops() - return pointer to busses dev_pm_ops
|
||||||
|
*
|
||||||
|
* This function can be used by platform code to get the current
|
||||||
|
* set of dev_pm_ops functions used by the platform_bus_type.
|
||||||
|
*/
|
||||||
|
const struct dev_pm_ops * __init platform_bus_get_pm_ops(void)
|
||||||
|
{
|
||||||
|
return platform_bus_type.pm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* platform_bus_set_pm_ops() - update dev_pm_ops for the platform_bus_type
|
||||||
|
*
|
||||||
|
* @pm: pointer to new dev_pm_ops struct to be used for platform_bus_type
|
||||||
|
*
|
||||||
|
* Platform code can override the dev_pm_ops methods of
|
||||||
|
* platform_bus_type by using this function. It is expected that
|
||||||
|
* platform code will first do a platform_bus_get_pm_ops(), then
|
||||||
|
* kmemdup it, then customize selected methods and pass a pointer to
|
||||||
|
* the new struct dev_pm_ops to this function.
|
||||||
|
*
|
||||||
|
* Since platform-specific code is customizing methods for *all*
|
||||||
|
* devices (not just platform-specific devices) it is expected that
|
||||||
|
* any custom overrides of these functions will keep existing behavior
|
||||||
|
* and simply extend it. For example, any customization of the
|
||||||
|
* runtime PM methods should continue to call the pm_generic_*
|
||||||
|
* functions as the default ones do in addition to the
|
||||||
|
* platform-specific behavior.
|
||||||
|
*/
|
||||||
|
void __init platform_bus_set_pm_ops(const struct dev_pm_ops *pm)
|
||||||
|
{
|
||||||
|
platform_bus_type.pm = pm;
|
||||||
|
}
|
||||||
|
|
||||||
int __init platform_bus_init(void)
|
int __init platform_bus_init(void)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|||||||
+4
-4
@@ -432,13 +432,13 @@ int sysdev_suspend(pm_message_t state)
|
|||||||
/* resume current sysdev */
|
/* resume current sysdev */
|
||||||
cls_driver:
|
cls_driver:
|
||||||
drv = NULL;
|
drv = NULL;
|
||||||
printk(KERN_ERR "Class suspend failed for %s\n",
|
printk(KERN_ERR "Class suspend failed for %s: %d\n",
|
||||||
kobject_name(&sysdev->kobj));
|
kobject_name(&sysdev->kobj), ret);
|
||||||
|
|
||||||
aux_driver:
|
aux_driver:
|
||||||
if (drv)
|
if (drv)
|
||||||
printk(KERN_ERR "Class driver suspend failed for %s\n",
|
printk(KERN_ERR "Class driver suspend failed for %s: %d\n",
|
||||||
kobject_name(&sysdev->kobj));
|
kobject_name(&sysdev->kobj), ret);
|
||||||
list_for_each_entry(err_drv, &cls->drivers, entry) {
|
list_for_each_entry(err_drv, &cls->drivers, entry) {
|
||||||
if (err_drv == drv)
|
if (err_drv == drv)
|
||||||
break;
|
break;
|
||||||
|
|||||||
+17
-5
@@ -248,15 +248,15 @@ config CS5535_CLOCK_EVENT_SRC
|
|||||||
generic PIT, and are suitable for use as high-res timers.
|
generic PIT, and are suitable for use as high-res timers.
|
||||||
|
|
||||||
config HP_ILO
|
config HP_ILO
|
||||||
tristate "Channel interface driver for HP iLO/iLO2 processor"
|
tristate "Channel interface driver for the HP iLO processor"
|
||||||
depends on PCI
|
depends on PCI
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
The channel interface driver allows applications to communicate
|
The channel interface driver allows applications to communicate
|
||||||
with iLO/iLO2 management processors present on HP ProLiant
|
with iLO management processors present on HP ProLiant servers.
|
||||||
servers. Upon loading, the driver creates /dev/hpilo/dXccbN files,
|
Upon loading, the driver creates /dev/hpilo/dXccbN files, which
|
||||||
which can be used to gather data from the management processor,
|
can be used to gather data from the management processor, via
|
||||||
via read and write system calls.
|
read and write system calls.
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called hpilo.
|
module will be called hpilo.
|
||||||
@@ -390,6 +390,18 @@ config BMP085
|
|||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called bmp085.
|
module will be called bmp085.
|
||||||
|
|
||||||
|
config PCH_PHUB
|
||||||
|
tristate "PCH Packet Hub of Intel Topcliff"
|
||||||
|
depends on PCI
|
||||||
|
help
|
||||||
|
This driver is for PCH(Platform controller Hub) PHUB(Packet Hub) of
|
||||||
|
Intel Topcliff which is an IOH(Input/Output Hub) for x86 embedded
|
||||||
|
processor. The Topcliff has MAC address and Option ROM data in SROM.
|
||||||
|
This driver can access MAC address and Option ROM data in SROM.
|
||||||
|
|
||||||
|
To compile this driver as a module, choose M here: the module will
|
||||||
|
be called pch_phub.
|
||||||
|
|
||||||
source "drivers/misc/c2port/Kconfig"
|
source "drivers/misc/c2port/Kconfig"
|
||||||
source "drivers/misc/eeprom/Kconfig"
|
source "drivers/misc/eeprom/Kconfig"
|
||||||
source "drivers/misc/cb710/Kconfig"
|
source "drivers/misc/cb710/Kconfig"
|
||||||
|
|||||||
@@ -35,3 +35,4 @@ obj-y += eeprom/
|
|||||||
obj-y += cb710/
|
obj-y += cb710/
|
||||||
obj-$(CONFIG_VMWARE_BALLOON) += vmw_balloon.o
|
obj-$(CONFIG_VMWARE_BALLOON) += vmw_balloon.o
|
||||||
obj-$(CONFIG_ARM_CHARLCD) += arm-charlcd.o
|
obj-$(CONFIG_ARM_CHARLCD) += arm-charlcd.o
|
||||||
|
obj-$(CONFIG_PCH_PHUB) += pch_phub.o
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Driver for HP iLO/iLO2 management processor.
|
* Driver for the HP iLO management processor.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
|
* Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
|
||||||
* David Altobelli <david.altobelli@hp.com>
|
* David Altobelli <david.altobelli@hp.com>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -412,9 +412,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
|
|||||||
|
|
||||||
device_initialize(&shost->shost_gendev);
|
device_initialize(&shost->shost_gendev);
|
||||||
dev_set_name(&shost->shost_gendev, "host%d", shost->host_no);
|
dev_set_name(&shost->shost_gendev, "host%d", shost->host_no);
|
||||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
|
||||||
shost->shost_gendev.bus = &scsi_bus_type;
|
shost->shost_gendev.bus = &scsi_bus_type;
|
||||||
#endif
|
|
||||||
shost->shost_gendev.type = &scsi_host_type;
|
shost->shost_gendev.type = &scsi_host_type;
|
||||||
|
|
||||||
device_initialize(&shost->shost_dev);
|
device_initialize(&shost->shost_dev);
|
||||||
|
|||||||
@@ -417,9 +417,7 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
|
|||||||
starget->reap_ref = 1;
|
starget->reap_ref = 1;
|
||||||
dev->parent = get_device(parent);
|
dev->parent = get_device(parent);
|
||||||
dev_set_name(dev, "target%d:%d:%d", shost->host_no, channel, id);
|
dev_set_name(dev, "target%d:%d:%d", shost->host_no, channel, id);
|
||||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
|
||||||
dev->bus = &scsi_bus_type;
|
dev->bus = &scsi_bus_type;
|
||||||
#endif
|
|
||||||
dev->type = &scsi_target_type;
|
dev->type = &scsi_target_type;
|
||||||
starget->id = id;
|
starget->id = id;
|
||||||
starget->channel = channel;
|
starget->channel = channel;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user