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
Auto-update from upstream
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
*.a
|
||||
*.s
|
||||
*.ko
|
||||
*.so
|
||||
*.mod.c
|
||||
|
||||
#
|
||||
|
||||
@@ -71,15 +71,6 @@ Who: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: i2c sysfs name change: in1_ref, vid deprecated in favour of cpu0_vid
|
||||
When: November 2005
|
||||
Files: drivers/i2c/chips/adm1025.c, drivers/i2c/chips/adm1026.c
|
||||
Why: Match the other drivers' name for the same function, duplicate names
|
||||
will be available until removal of old names.
|
||||
Who: Grant Coady <gcoady@gmail.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: remove EXPORT_SYMBOL(panic_timeout)
|
||||
When: April 2006
|
||||
Files: kernel/panic.c
|
||||
|
||||
@@ -54,13 +54,16 @@ If you really want i2c accesses for these Super I/O chips,
|
||||
use the w83781d driver. However this is not the preferred method
|
||||
now that this ISA driver has been developed.
|
||||
|
||||
Technically, the w83627thf does not support a VID reading. However, it's
|
||||
possible or even likely that your mainboard maker has routed these signals
|
||||
to a specific set of general purpose IO pins (the Asus P4C800-E is one such
|
||||
board). The w83627thf driver now interprets these as VID. If the VID on
|
||||
your board doesn't work, first see doc/vid in the lm_sensors package. If
|
||||
that still doesn't help, email us at lm-sensors@lm-sensors.org.
|
||||
The w83627_HF_ uses pins 110-106 as VID0-VID4. The w83627_THF_ uses the
|
||||
same pins as GPIO[0:4]. Technically, the w83627_THF_ does not support a
|
||||
VID reading. However the two chips have the identical 128 pin package. So,
|
||||
it is possible or even likely for a w83627thf to have the VID signals routed
|
||||
to these pins despite their not being labeled for that purpose. Therefore,
|
||||
the w83627thf driver interprets these as VID. If the VID on your board
|
||||
doesn't work, first see doc/vid in the lm_sensors package[1]. If that still
|
||||
doesn't help, you may just ignore the bogus VID reading with no harm done.
|
||||
|
||||
For further information on this driver see the w83781d driver
|
||||
documentation.
|
||||
For further information on this driver see the w83781d driver documentation.
|
||||
|
||||
[1] http://www2.lm-sensors.nu/~lm78/cvs/browse.cgi/lm_sensors2/doc/vid
|
||||
|
||||
|
||||
@@ -5,7 +5,8 @@ Supported adapters:
|
||||
* nForce2 Ultra 400 MCP 10de:0084
|
||||
* nForce3 Pro150 MCP 10de:00D4
|
||||
* nForce3 250Gb MCP 10de:00E4
|
||||
* nForce4 MCP 10de:0052
|
||||
* nForce4 MCP 10de:0052
|
||||
* nForce4 MCP-04 10de:0034
|
||||
|
||||
Datasheet: not publically available, but seems to be similar to the
|
||||
AMD-8111 SMBus 2.0 adapter.
|
||||
|
||||
@@ -17,6 +17,7 @@ It currently supports the following devices:
|
||||
* Velleman K8000 adapter
|
||||
* ELV adapter
|
||||
* Analog Devices evaluation boards (ADM1025, ADM1030, ADM1031, ADM1032)
|
||||
* Barco LPT->DVI (K5800236) adapter
|
||||
|
||||
These devices use different pinout configurations, so you have to tell
|
||||
the driver what you have, using the type module parameter. There is no
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
Revision 5, 2005-07-29
|
||||
Revision 6, 2005-11-20
|
||||
Jean Delvare <khali@linux-fr.org>
|
||||
Greg KH <greg@kroah.com>
|
||||
|
||||
This is a guide on how to convert I2C chip drivers from Linux 2.4 to
|
||||
Linux 2.6. I have been using existing drivers (lm75, lm78) as examples.
|
||||
Then I converted a driver myself (lm83) and updated this document.
|
||||
Note that this guide is strongly oriented towards hardware monitoring
|
||||
drivers. Many points are still valid for other type of drivers, but
|
||||
others may be irrelevant.
|
||||
|
||||
There are two sets of points below. The first set concerns technical
|
||||
changes. The second set concerns coding policy. Both are mandatory.
|
||||
@@ -22,16 +25,20 @@ Technical changes:
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-isa.h> /* for ISA drivers */
|
||||
#include <linux/hwmon.h> /* for hardware monitoring drivers */
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/hwmon-vid.h> /* if you need VRM support */
|
||||
#include <linux/err.h> /* for class registration */
|
||||
#include <asm/io.h> /* if you have I/O operations */
|
||||
Please respect this inclusion order. Some extra headers may be
|
||||
required for a given driver (e.g. "lm75.h").
|
||||
|
||||
* [Addresses] SENSORS_I2C_END becomes I2C_CLIENT_END, ISA addresses
|
||||
are no more handled by the i2c core.
|
||||
are no more handled by the i2c core. Address ranges are no more
|
||||
supported either, define each individual address separately.
|
||||
SENSORS_INSMOD_<n> becomes I2C_CLIENT_INSMOD_<n>.
|
||||
|
||||
* [Client data] Get rid of sysctl_id. Try using standard names for
|
||||
@@ -48,23 +55,23 @@ Technical changes:
|
||||
int kind);
|
||||
static void lm75_init_client(struct i2c_client *client);
|
||||
static int lm75_detach_client(struct i2c_client *client);
|
||||
static void lm75_update_client(struct i2c_client *client);
|
||||
static struct lm75_data lm75_update_device(struct device *dev);
|
||||
|
||||
* [Sysctl] All sysctl stuff is of course gone (defines, ctl_table
|
||||
and functions). Instead, you have to define show and set functions for
|
||||
each sysfs file. Only define set for writable values. Take a look at an
|
||||
existing 2.6 driver for details (lm78 for example). Don't forget
|
||||
existing 2.6 driver for details (it87 for example). Don't forget
|
||||
to define the attributes for each file (this is that step that
|
||||
links callback functions). Use the file names specified in
|
||||
Documentation/i2c/sysfs-interface for the individual files. Also
|
||||
Documentation/hwmon/sysfs-interface for the individual files. Also
|
||||
convert the units these files read and write to the specified ones.
|
||||
If you need to add a new type of file, please discuss it on the
|
||||
sensors mailing list <lm-sensors@lm-sensors.org> by providing a
|
||||
patch to the Documentation/i2c/sysfs-interface file.
|
||||
patch to the Documentation/hwmon/sysfs-interface file.
|
||||
|
||||
* [Attach] For I2C drivers, the attach function should make sure
|
||||
that the adapter's class has I2C_CLASS_HWMON, using the
|
||||
following construct:
|
||||
that the adapter's class has I2C_CLASS_HWMON (or whatever class is
|
||||
suitable for your driver), using the following construct:
|
||||
if (!(adapter->class & I2C_CLASS_HWMON))
|
||||
return 0;
|
||||
ISA-only drivers of course don't need this.
|
||||
@@ -72,63 +79,72 @@ Technical changes:
|
||||
|
||||
* [Detect] As mentioned earlier, the flags parameter is gone.
|
||||
The type_name and client_name strings are replaced by a single
|
||||
name string, which will be filled with a lowercase, short string
|
||||
(typically the driver name, e.g. "lm75").
|
||||
name string, which will be filled with a lowercase, short string.
|
||||
In i2c-only drivers, drop the i2c_is_isa_adapter check, it's
|
||||
useless. Same for isa-only drivers, as the test would always be
|
||||
true. Only hybrid drivers (which are quite rare) still need it.
|
||||
The errorN labels are reduced to the number needed. If that number
|
||||
is 2 (i2c-only drivers), it is advised that the labels are named
|
||||
exit and exit_free. For i2c+isa drivers, labels should be named
|
||||
ERROR0, ERROR1 and ERROR2. Don't forget to properly set err before
|
||||
The labels used for error paths are reduced to the number needed.
|
||||
It is advised that the labels are given descriptive names such as
|
||||
exit and exit_free. Don't forget to properly set err before
|
||||
jumping to error labels. By the way, labels should be left-aligned.
|
||||
Use kzalloc instead of kmalloc.
|
||||
Use i2c_set_clientdata to set the client data (as opposed to
|
||||
a direct access to client->data).
|
||||
Use strlcpy instead of strcpy to copy the client name.
|
||||
Use strlcpy instead of strcpy or snprintf to copy the client name.
|
||||
Replace the sysctl directory registration by calls to
|
||||
device_create_file. Move the driver initialization before any
|
||||
sysfs file creation.
|
||||
Register the client with the hwmon class (using hwmon_device_register)
|
||||
if applicable.
|
||||
Drop client->id.
|
||||
Drop any 24RF08 corruption prevention you find, as this is now done
|
||||
at the i2c-core level, and doing it twice voids it.
|
||||
Don't add I2C_CLIENT_ALLOW_USE to client->flags, it's the default now.
|
||||
|
||||
* [Init] Limits must not be set by the driver (can be done later in
|
||||
user-space). Chip should not be reset default (although a module
|
||||
parameter may be used to force is), and initialization should be
|
||||
parameter may be used to force it), and initialization should be
|
||||
limited to the strictly necessary steps.
|
||||
|
||||
* [Detach] Get rid of data, remove the call to
|
||||
i2c_deregister_entry. Do not log an error message if
|
||||
i2c_detach_client fails, as i2c-core will now do it for you.
|
||||
* [Detach] Remove the call to i2c_deregister_entry. Do not log an
|
||||
error message if i2c_detach_client fails, as i2c-core will now do
|
||||
it for you.
|
||||
Unregister from the hwmon class if applicable.
|
||||
|
||||
* [Update] Don't access client->data directly, use
|
||||
i2c_get_clientdata(client) instead.
|
||||
* [Update] The function prototype changed, it is now
|
||||
passed a device structure, which you have to convert to a client
|
||||
using to_i2c_client(dev). The update function should return a
|
||||
pointer to the client data.
|
||||
Don't access client->data directly, use i2c_get_clientdata(client)
|
||||
instead.
|
||||
Use time_after() instead of direct jiffies comparison.
|
||||
|
||||
* [Interface] Init function should not print anything. Make sure
|
||||
there is a MODULE_LICENSE() line, at the bottom of the file
|
||||
(after MODULE_AUTHOR() and MODULE_DESCRIPTION(), in this order).
|
||||
* [Interface] Make sure there is a MODULE_LICENSE() line, at the bottom
|
||||
of the file (after MODULE_AUTHOR() and MODULE_DESCRIPTION(), in this
|
||||
order).
|
||||
|
||||
* [Driver] The flags field of the i2c_driver structure is gone.
|
||||
I2C_DF_NOTIFY is now the default behavior.
|
||||
The i2c_driver structure has a driver member, which is itself a
|
||||
structure, those name member should be initialized to a driver name
|
||||
string. i2c_driver itself has no name member anymore.
|
||||
|
||||
Coding policy:
|
||||
|
||||
* [Copyright] Use (C), not (c), for copyright.
|
||||
|
||||
* [Debug/log] Get rid of #ifdef DEBUG/#endif constructs whenever you
|
||||
can. Calls to printk/pr_debug for debugging purposes are replaced
|
||||
by calls to dev_dbg. Here is an example on how to call it (taken
|
||||
from lm75_detect):
|
||||
can. Calls to printk for debugging purposes are replaced by calls to
|
||||
dev_dbg where possible, else to pr_debug. Here is an example of how
|
||||
to call it (taken from lm75_detect):
|
||||
dev_dbg(&client->dev, "Starting lm75 update\n");
|
||||
Replace other printk calls with the dev_info, dev_err or dev_warn
|
||||
function, as appropriate.
|
||||
|
||||
* [Constants] Constants defines (registers, conversions, initial
|
||||
values) should be aligned. This greatly improves readability.
|
||||
Same goes for variables declarations. Alignments are achieved by the
|
||||
means of tabs, not spaces. Remember that tabs are set to 8 in the
|
||||
Linux kernel code.
|
||||
|
||||
* [Structure definition] The name field should be standardized. All
|
||||
lowercase and as simple as the driver name itself (e.g. "lm75").
|
||||
* [Constants] Constants defines (registers, conversions) should be
|
||||
aligned. This greatly improves readability.
|
||||
Alignments are achieved by the means of tabs, not spaces. Remember
|
||||
that tabs are set to 8 in the Linux kernel code.
|
||||
|
||||
* [Layout] Avoid extra empty lines between comments and what they
|
||||
comment. Respect the coding style (see Documentation/CodingStyle),
|
||||
|
||||
@@ -25,9 +25,9 @@ routines, a client structure specific information like the actual I2C
|
||||
address.
|
||||
|
||||
static struct i2c_driver foo_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "Foo version 2.3 driver",
|
||||
.flags = I2C_DF_NOTIFY,
|
||||
.driver = {
|
||||
.name = "foo",
|
||||
},
|
||||
.attach_adapter = &foo_attach_adapter,
|
||||
.detach_client = &foo_detach_client,
|
||||
.command = &foo_command /* may be NULL */
|
||||
@@ -36,10 +36,6 @@ static struct i2c_driver foo_driver = {
|
||||
The name field must match the driver name, including the case. It must not
|
||||
contain spaces, and may be up to 31 characters long.
|
||||
|
||||
Don't worry about the flags field; just put I2C_DF_NOTIFY into it. This
|
||||
means that your driver will be notified when new adapters are found.
|
||||
This is almost always what you want.
|
||||
|
||||
All other fields are for call-back functions which will be explained
|
||||
below.
|
||||
|
||||
@@ -496,17 +492,13 @@ Note that some functions are marked by `__init', and some data structures
|
||||
by `__init_data'. Hose functions and structures can be removed after
|
||||
kernel booting (or module loading) is completed.
|
||||
|
||||
|
||||
Command function
|
||||
================
|
||||
|
||||
A generic ioctl-like function call back is supported. You will seldom
|
||||
need this. You may even set it to NULL.
|
||||
|
||||
/* No commands defined */
|
||||
int foo_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
need this, and its use is deprecated anyway, so newer design should not
|
||||
use it. Set it to NULL.
|
||||
|
||||
|
||||
Sending and receiving
|
||||
|
||||
@@ -18,6 +18,7 @@ In this document you will find information about:
|
||||
=== 5. Include files
|
||||
--- 5.1 How to include files from the kernel include dir
|
||||
--- 5.2 External modules using an include/ dir
|
||||
--- 5.3 External modules using several directories
|
||||
=== 6. Module installation
|
||||
--- 6.1 INSTALL_MOD_PATH
|
||||
--- 6.2 INSTALL_MOD_DIR
|
||||
@@ -344,6 +345,45 @@ directory and therefore needs to deal with this in their kbuild file.
|
||||
Note that in the assignment there is no space between -I and the path.
|
||||
This is a kbuild limitation: there must be no space present.
|
||||
|
||||
--- 5.3 External modules using several directories
|
||||
|
||||
If an external module does not follow the usual kernel style but
|
||||
decide to spread files over several directories then kbuild can
|
||||
support this too.
|
||||
|
||||
Consider the following example:
|
||||
|
||||
|
|
||||
+- src/complex_main.c
|
||||
| +- hal/hardwareif.c
|
||||
| +- hal/include/hardwareif.h
|
||||
+- include/complex.h
|
||||
|
||||
To build a single module named complex.ko we then need the following
|
||||
kbuild file:
|
||||
|
||||
Kbuild:
|
||||
obj-m := complex.o
|
||||
complex-y := src/complex_main.o
|
||||
complex-y += src/hal/hardwareif.o
|
||||
|
||||
EXTRA_CFLAGS := -I$(src)/include
|
||||
EXTRA_CFLAGS += -I$(src)src/hal/include
|
||||
|
||||
|
||||
kbuild knows how to handle .o files located in another directory -
|
||||
although this is NOT reccommended practice. The syntax is to specify
|
||||
the directory relative to the directory where the Kbuild file is
|
||||
located.
|
||||
|
||||
To find the .h files we have to explicitly tell kbuild where to look
|
||||
for the .h files. When kbuild executes current directory is always
|
||||
the root of the kernel tree (argument to -C) and therefore we have to
|
||||
tell kbuild how to find the .h files using absolute paths.
|
||||
$(src) will specify the absolute path to the directory where the
|
||||
Kbuild file are located when being build as an external module.
|
||||
Therefore -I$(src)/ is used to point out the directory of the Kbuild
|
||||
file and any additional path are just appended.
|
||||
|
||||
=== 6. Module installation
|
||||
|
||||
|
||||
@@ -910,6 +910,14 @@ running once the system is up.
|
||||
nfsroot= [NFS] nfs root filesystem for disk-less boxes.
|
||||
See Documentation/nfsroot.txt.
|
||||
|
||||
nfs.callback_tcpport=
|
||||
[NFS] set the TCP port on which the NFSv4 callback
|
||||
channel should listen.
|
||||
|
||||
nfs.idmap_cache_timeout=
|
||||
[NFS] set the maximum lifetime for idmapper cache
|
||||
entries.
|
||||
|
||||
nmi_watchdog= [KNL,BUGS=IA-32] Debugging features for SMP kernels
|
||||
|
||||
no387 [BUGS=IA-32] Tells the kernel to use the 387 maths
|
||||
|
||||
+6
-7
@@ -696,13 +696,6 @@ M: pc300@cyclades.com
|
||||
W: http://www.cyclades.com/
|
||||
S: Supported
|
||||
|
||||
DAC960 RAID CONTROLLER DRIVER
|
||||
P: Dave Olien
|
||||
M dmo@osdl.org
|
||||
W: http://www.osdl.org/archive/dmo/DAC960
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
DAMA SLAVE for AX.25
|
||||
P: Joerg Reuter
|
||||
M: jreuter@yaina.de
|
||||
@@ -2923,6 +2916,12 @@ W: http://linuxtv.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git
|
||||
S: Maintained
|
||||
|
||||
VT8231 HARDWARE MONITOR DRIVER
|
||||
P: Roger Lucas
|
||||
M: roger@planbit.co.uk
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
|
||||
W1 DALLAS'S 1-WIRE BUS
|
||||
P: Evgeniy Polyakov
|
||||
M: johnpol@2ka.mipt.ru
|
||||
|
||||
@@ -124,17 +124,16 @@ static int max7310_detach_client(struct i2c_client *client)
|
||||
}
|
||||
|
||||
static struct i2c_driver max7310_i2c_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "akita-max7310",
|
||||
.driver = {
|
||||
.name = "akita-max7310",
|
||||
},
|
||||
.id = I2C_DRIVERID_AKITAIOEXP,
|
||||
.flags = I2C_DF_NOTIFY,
|
||||
.attach_adapter = max7310_attach_adapter,
|
||||
.detach_client = max7310_detach_client,
|
||||
};
|
||||
|
||||
static struct i2c_client max7310_template = {
|
||||
name: "akita-max7310",
|
||||
flags: I2C_CLIENT_ALLOW_USE,
|
||||
driver: &max7310_i2c_driver,
|
||||
};
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
vsyscall*.so
|
||||
@@ -257,9 +257,10 @@ pcf8583_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||
}
|
||||
|
||||
static struct i2c_driver pcf8583_driver = {
|
||||
.name = "PCF8583",
|
||||
.driver = {
|
||||
.name = "PCF8583",
|
||||
},
|
||||
.id = I2C_DRIVERID_PCF8583,
|
||||
.flags = I2C_DF_NOTIFY,
|
||||
.attach_adapter = pcf8583_probe,
|
||||
.detach_client = pcf8583_detach,
|
||||
.command = pcf8583_command
|
||||
|
||||
+57
-33
@@ -1,11 +1,11 @@
|
||||
/*
|
||||
* Intel Multimedia Timer device implementation for SGI SN platforms.
|
||||
* Timer device implementation for SGI SN platforms.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (c) 2001-2004 Silicon Graphics, Inc. All rights reserved.
|
||||
* Copyright (c) 2001-2006 Silicon Graphics, Inc. All rights reserved.
|
||||
*
|
||||
* This driver exports an API that should be supportable by any HPET or IA-PC
|
||||
* multimedia timer. The code below is currently specific to the SGI Altix
|
||||
@@ -45,7 +45,7 @@ MODULE_LICENSE("GPL");
|
||||
/* name of the device, usually in /dev */
|
||||
#define MMTIMER_NAME "mmtimer"
|
||||
#define MMTIMER_DESC "SGI Altix RTC Timer"
|
||||
#define MMTIMER_VERSION "2.0"
|
||||
#define MMTIMER_VERSION "2.1"
|
||||
|
||||
#define RTC_BITS 55 /* 55 bits for this implementation */
|
||||
|
||||
@@ -227,10 +227,7 @@ typedef struct mmtimer {
|
||||
struct tasklet_struct tasklet;
|
||||
} mmtimer_t;
|
||||
|
||||
/*
|
||||
* Total number of comparators is comparators/node * MAX nodes/running kernel
|
||||
*/
|
||||
static mmtimer_t timers[NUM_COMPARATORS*MAX_COMPACT_NODES];
|
||||
static mmtimer_t ** timers;
|
||||
|
||||
/**
|
||||
* mmtimer_ioctl - ioctl interface for /dev/mmtimer
|
||||
@@ -441,29 +438,29 @@ static irqreturn_t
|
||||
mmtimer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
int i;
|
||||
mmtimer_t *base = timers + cpu_to_node(smp_processor_id()) *
|
||||
NUM_COMPARATORS;
|
||||
unsigned long expires = 0;
|
||||
int result = IRQ_NONE;
|
||||
unsigned indx = cpu_to_node(smp_processor_id());
|
||||
|
||||
/*
|
||||
* Do this once for each comparison register
|
||||
*/
|
||||
for (i = 0; i < NUM_COMPARATORS; i++) {
|
||||
mmtimer_t *base = timers[indx] + i;
|
||||
/* Make sure this doesn't get reused before tasklet_sched */
|
||||
spin_lock(&base[i].lock);
|
||||
if (base[i].cpu == smp_processor_id()) {
|
||||
if (base[i].timer)
|
||||
expires = base[i].timer->it.mmtimer.expires;
|
||||
spin_lock(&base->lock);
|
||||
if (base->cpu == smp_processor_id()) {
|
||||
if (base->timer)
|
||||
expires = base->timer->it.mmtimer.expires;
|
||||
/* expires test won't work with shared irqs */
|
||||
if ((mmtimer_int_pending(i) > 0) ||
|
||||
(expires && (expires < rtc_time()))) {
|
||||
mmtimer_clr_int_pending(i);
|
||||
tasklet_schedule(&base[i].tasklet);
|
||||
tasklet_schedule(&base->tasklet);
|
||||
result = IRQ_HANDLED;
|
||||
}
|
||||
}
|
||||
spin_unlock(&base[i].lock);
|
||||
spin_unlock(&base->lock);
|
||||
expires = 0;
|
||||
}
|
||||
return result;
|
||||
@@ -523,7 +520,7 @@ static int sgi_timer_del(struct k_itimer *timr)
|
||||
{
|
||||
int i = timr->it.mmtimer.clock;
|
||||
cnodeid_t nodeid = timr->it.mmtimer.node;
|
||||
mmtimer_t *t = timers + nodeid * NUM_COMPARATORS +i;
|
||||
mmtimer_t *t = timers[nodeid] + i;
|
||||
unsigned long irqflags;
|
||||
|
||||
if (i != TIMER_OFF) {
|
||||
@@ -609,11 +606,11 @@ static int sgi_timer_set(struct k_itimer *timr, int flags,
|
||||
preempt_disable();
|
||||
|
||||
nodeid = cpu_to_node(smp_processor_id());
|
||||
base = timers + nodeid * NUM_COMPARATORS;
|
||||
retry:
|
||||
/* Don't use an allocated timer, or a deleted one that's pending */
|
||||
for(i = 0; i< NUM_COMPARATORS; i++) {
|
||||
if (!base[i].timer && !base[i].tasklet.state) {
|
||||
base = timers[nodeid] + i;
|
||||
if (!base->timer && !base->tasklet.state) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -623,14 +620,14 @@ retry:
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&base[i].lock, irqflags);
|
||||
spin_lock_irqsave(&base->lock, irqflags);
|
||||
|
||||
if (base[i].timer || base[i].tasklet.state != 0) {
|
||||
spin_unlock_irqrestore(&base[i].lock, irqflags);
|
||||
if (base->timer || base->tasklet.state != 0) {
|
||||
spin_unlock_irqrestore(&base->lock, irqflags);
|
||||
goto retry;
|
||||
}
|
||||
base[i].timer = timr;
|
||||
base[i].cpu = smp_processor_id();
|
||||
base->timer = timr;
|
||||
base->cpu = smp_processor_id();
|
||||
|
||||
timr->it.mmtimer.clock = i;
|
||||
timr->it.mmtimer.node = nodeid;
|
||||
@@ -645,11 +642,11 @@ retry:
|
||||
}
|
||||
} else {
|
||||
timr->it.mmtimer.expires -= period;
|
||||
if (reschedule_periodic_timer(base+i))
|
||||
if (reschedule_periodic_timer(base))
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&base[i].lock, irqflags);
|
||||
spin_unlock_irqrestore(&base->lock, irqflags);
|
||||
|
||||
preempt_enable();
|
||||
|
||||
@@ -675,6 +672,7 @@ static struct k_clock sgi_clock = {
|
||||
static int __init mmtimer_init(void)
|
||||
{
|
||||
unsigned i;
|
||||
cnodeid_t node, maxn = -1;
|
||||
|
||||
if (!ia64_platform_is("sn2"))
|
||||
return -1;
|
||||
@@ -691,14 +689,6 @@ static int __init mmtimer_init(void)
|
||||
mmtimer_femtoperiod = ((unsigned long)1E15 + sn_rtc_cycles_per_second /
|
||||
2) / sn_rtc_cycles_per_second;
|
||||
|
||||
for (i=0; i< NUM_COMPARATORS*MAX_COMPACT_NODES; i++) {
|
||||
spin_lock_init(&timers[i].lock);
|
||||
timers[i].timer = NULL;
|
||||
timers[i].cpu = 0;
|
||||
timers[i].i = i % NUM_COMPARATORS;
|
||||
tasklet_init(&timers[i].tasklet, mmtimer_tasklet, (unsigned long) (timers+i));
|
||||
}
|
||||
|
||||
if (request_irq(SGI_MMTIMER_VECTOR, mmtimer_interrupt, SA_PERCPU_IRQ, MMTIMER_NAME, NULL)) {
|
||||
printk(KERN_WARNING "%s: unable to allocate interrupt.",
|
||||
MMTIMER_NAME);
|
||||
@@ -712,6 +702,40 @@ static int __init mmtimer_init(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Get max numbered node, calculate slots needed */
|
||||
for_each_online_node(node) {
|
||||
maxn = node;
|
||||
}
|
||||
maxn++;
|
||||
|
||||
/* Allocate list of node ptrs to mmtimer_t's */
|
||||
timers = kmalloc(sizeof(mmtimer_t *)*maxn, GFP_KERNEL);
|
||||
if (timers == NULL) {
|
||||
printk(KERN_ERR "%s: failed to allocate memory for device\n",
|
||||
MMTIMER_NAME);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Allocate mmtimer_t's for each online node */
|
||||
for_each_online_node(node) {
|
||||
timers[node] = kmalloc_node(sizeof(mmtimer_t)*NUM_COMPARATORS, GFP_KERNEL, node);
|
||||
if (timers[node] == NULL) {
|
||||
printk(KERN_ERR "%s: failed to allocate memory for device\n",
|
||||
MMTIMER_NAME);
|
||||
return -1;
|
||||
}
|
||||
for (i=0; i< NUM_COMPARATORS; i++) {
|
||||
mmtimer_t * base = timers[node] + i;
|
||||
|
||||
spin_lock_init(&base->lock);
|
||||
base->timer = NULL;
|
||||
base->cpu = 0;
|
||||
base->i = i;
|
||||
tasklet_init(&base->tasklet, mmtimer_tasklet,
|
||||
(unsigned long) (base));
|
||||
}
|
||||
}
|
||||
|
||||
sgi_clock_period = sgi_clock.res = NSEC_PER_SEC / sn_rtc_cycles_per_second;
|
||||
register_posix_clock(CLOCK_SGI_CYCLE, &sgi_clock);
|
||||
|
||||
|
||||
@@ -350,6 +350,18 @@ config SENSORS_VIA686A
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called via686a.
|
||||
|
||||
config SENSORS_VT8231
|
||||
tristate "VT8231"
|
||||
depends on HWMON && I2C && PCI && EXPERIMENTAL
|
||||
select HWMON_VID
|
||||
select I2C_ISA
|
||||
help
|
||||
If you say yes here then you get support for the integrated sensors
|
||||
in the VIA VT8231 device.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called vt8231.
|
||||
|
||||
config SENSORS_W83781D
|
||||
tristate "Winbond W83781D, W83782D, W83783S, W83627HF, Asus AS99127F"
|
||||
depends on HWMON && I2C
|
||||
|
||||
@@ -40,6 +40,7 @@ obj-$(CONFIG_SENSORS_SIS5595) += sis5595.o
|
||||
obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o
|
||||
obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o
|
||||
obj-$(CONFIG_SENSORS_VIA686A) += via686a.o
|
||||
obj-$(CONFIG_SENSORS_VT8231) += vt8231.o
|
||||
obj-$(CONFIG_SENSORS_W83627EHF) += w83627ehf.o
|
||||
obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o
|
||||
|
||||
|
||||
@@ -126,10 +126,10 @@ static int read_only;
|
||||
|
||||
/* This is the driver that will be inserted */
|
||||
static struct i2c_driver adm1021_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "adm1021",
|
||||
.driver = {
|
||||
.name = "adm1021",
|
||||
},
|
||||
.id = I2C_DRIVERID_ADM1021,
|
||||
.flags = I2C_DF_NOTIFY,
|
||||
.attach_adapter = adm1021_attach_adapter,
|
||||
.detach_client = adm1021_detach_client,
|
||||
};
|
||||
|
||||
@@ -118,10 +118,10 @@ static struct adm1025_data *adm1025_update_device(struct device *dev);
|
||||
*/
|
||||
|
||||
static struct i2c_driver adm1025_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "adm1025",
|
||||
.driver = {
|
||||
.name = "adm1025",
|
||||
},
|
||||
.id = I2C_DRIVERID_ADM1025,
|
||||
.flags = I2C_DF_NOTIFY,
|
||||
.attach_adapter = adm1025_attach_adapter,
|
||||
.detach_client = adm1025_detach_client,
|
||||
};
|
||||
@@ -287,8 +287,6 @@ static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char
|
||||
struct adm1025_data *data = adm1025_update_device(dev);
|
||||
return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
|
||||
}
|
||||
/* in1_ref is deprecated in favour of cpu0_vid, remove after 2005-11-11 */
|
||||
static DEVICE_ATTR(in1_ref, S_IRUGO, show_vid, NULL);
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
|
||||
|
||||
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
@@ -444,8 +442,6 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind)
|
||||
device_create_file(&new_client->dev, &dev_attr_temp1_max);
|
||||
device_create_file(&new_client->dev, &dev_attr_temp2_max);
|
||||
device_create_file(&new_client->dev, &dev_attr_alarms);
|
||||
/* in1_ref is deprecated, remove after 2005-11-11 */
|
||||
device_create_file(&new_client->dev, &dev_attr_in1_ref);
|
||||
device_create_file(&new_client->dev, &dev_attr_cpu0_vid);
|
||||
device_create_file(&new_client->dev, &dev_attr_vrm);
|
||||
|
||||
|
||||
@@ -308,9 +308,9 @@ static void adm1026_init_client(struct i2c_client *client);
|
||||
|
||||
|
||||
static struct i2c_driver adm1026_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "adm1026",
|
||||
.flags = I2C_DF_NOTIFY,
|
||||
.driver = {
|
||||
.name = "adm1026",
|
||||
},
|
||||
.attach_adapter = adm1026_attach_adapter,
|
||||
.detach_client = adm1026_detach_client,
|
||||
};
|
||||
@@ -1227,8 +1227,6 @@ static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr, c
|
||||
struct adm1026_data *data = adm1026_update_device(dev);
|
||||
return sprintf(buf,"%d\n", vid_from_reg(data->vid & 0x3f, data->vrm));
|
||||
}
|
||||
/* vid deprecated in favour of cpu0_vid, remove after 2005-11-11 */
|
||||
static DEVICE_ATTR(vid, S_IRUGO, show_vid_reg, NULL);
|
||||
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
|
||||
|
||||
static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
@@ -1673,8 +1671,6 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address,
|
||||
device_create_file(&new_client->dev, &dev_attr_temp1_crit_enable);
|
||||
device_create_file(&new_client->dev, &dev_attr_temp2_crit_enable);
|
||||
device_create_file(&new_client->dev, &dev_attr_temp3_crit_enable);
|
||||
/* vid deprecated in favour of cpu0_vid, remove after 2005-11-11 */
|
||||
device_create_file(&new_client->dev, &dev_attr_vid);
|
||||
device_create_file(&new_client->dev, &dev_attr_cpu0_vid);
|
||||
device_create_file(&new_client->dev, &dev_attr_vrm);
|
||||
device_create_file(&new_client->dev, &dev_attr_alarms);
|
||||
|
||||
@@ -105,9 +105,9 @@ static struct adm1031_data *adm1031_update_device(struct device *dev);
|
||||
|
||||
/* This is the driver that will be inserted */
|
||||
static struct i2c_driver adm1031_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "adm1031",
|
||||
.flags = I2C_DF_NOTIFY,
|
||||
.driver = {
|
||||
.name = "adm1031",
|
||||
},
|
||||
.attach_adapter = adm1031_attach_adapter,
|
||||
.detach_client = adm1031_detach_client,
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user