mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'devel-stable' into devel
Conflicts: arch/arm/Kconfig arch/arm/include/asm/system.h arch/arm/mm/Kconfig
This commit is contained in:
commit
ac1d426e82
5500 changed files with 78713 additions and 17953 deletions
|
|
@ -24,7 +24,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/i2c.h>
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/timer.h>
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
/*
|
||||
* Registers offset
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/i2c-gpio.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/gpio.h>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/completion.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define SMCR 0x00
|
||||
#define SMCR_START (1 << 0)
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/hardware.h>
|
||||
|
|
@ -145,10 +146,10 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy)
|
|||
"<%s> I2C Interrupted\n", __func__);
|
||||
return -EINTR;
|
||||
}
|
||||
if (time_after(jiffies, orig_jiffies + HZ / 1000)) {
|
||||
if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) {
|
||||
dev_dbg(&i2c_imx->adapter.dev,
|
||||
"<%s> I2C bus is busy\n", __func__);
|
||||
return -EIO;
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
schedule();
|
||||
}
|
||||
|
|
@ -443,6 +444,8 @@ static int i2c_imx_xfer(struct i2c_adapter *adapter,
|
|||
result = i2c_imx_read(i2c_imx, &msgs[i]);
|
||||
else
|
||||
result = i2c_imx_write(i2c_imx, &msgs[i]);
|
||||
if (result)
|
||||
goto fail0;
|
||||
}
|
||||
|
||||
fail0:
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-bit.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <mach/hardware.h> /* Pick up IXP2000-specific bits */
|
||||
#include <mach/gpio.h>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/of_i2c.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/fsl_devices.h>
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
* or implied.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/i2c.h>
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/err.h>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/i2c-ocores.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
struct ocores_i2c {
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <linux/io.h>
|
||||
|
|
@ -446,7 +447,7 @@ static struct i2c_adapter octeon_i2c_ops = {
|
|||
/**
|
||||
* octeon_i2c_setclock - Calculate and set clock divisors.
|
||||
*/
|
||||
static int __init octeon_i2c_setclock(struct octeon_i2c *i2c)
|
||||
static int __devinit octeon_i2c_setclock(struct octeon_i2c *i2c)
|
||||
{
|
||||
int tclk, thp_base, inc, thp_idx, mdiv_idx, ndiv_idx, foscl, diff;
|
||||
int thp = 0x18, mdiv = 2, ndiv = 0, delta_hz = 1000000;
|
||||
|
|
@ -489,7 +490,7 @@ static int __init octeon_i2c_setclock(struct octeon_i2c *i2c)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
|
||||
static int __devinit octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
|
||||
{
|
||||
u8 status;
|
||||
int tries;
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
/* I2C controller revisions */
|
||||
#define OMAP_I2C_REV_2 0x20
|
||||
|
|
@ -902,6 +903,11 @@ omap_i2c_probe(struct platform_device *pdev)
|
|||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
if (cpu_is_omap7xx())
|
||||
dev->reg_shift = 1;
|
||||
else
|
||||
dev->reg_shift = 2;
|
||||
|
||||
if ((r = omap_i2c_get_clocks(dev)) != 0)
|
||||
goto err_iounmap;
|
||||
|
||||
|
|
@ -925,11 +931,6 @@ omap_i2c_probe(struct platform_device *pdev)
|
|||
dev->b_hw = 1; /* Enable hardware fixes */
|
||||
}
|
||||
|
||||
if (cpu_is_omap7xx())
|
||||
dev->reg_shift = 1;
|
||||
else
|
||||
dev->reg_shift = 2;
|
||||
|
||||
/* reset ASAP, clearing any IRQs */
|
||||
omap_i2c_init(dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-bit.h>
|
||||
#include <linux/i2c-smbus.h>
|
||||
#include <linux/slab.h>
|
||||
#include "i2c-parport.h"
|
||||
|
||||
/* ----- Device list ------------------------------------------------------ */
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static struct pci_driver pasemi_smb_driver;
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/i2c.h>
|
||||
|
|
@ -172,6 +173,9 @@ static int i2c_pnx_master_xmit(struct i2c_pnx_algo_data *alg_data)
|
|||
/* We still have something to talk about... */
|
||||
val = *alg_data->mif.buf++;
|
||||
|
||||
if (alg_data->mif.len == 1)
|
||||
val |= stop_bit;
|
||||
|
||||
alg_data->mif.len--;
|
||||
iowrite32(val, I2C_REG_TX(alg_data));
|
||||
|
||||
|
|
@ -245,6 +249,9 @@ static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data *alg_data)
|
|||
__func__);
|
||||
|
||||
if (alg_data->mif.len == 1) {
|
||||
/* Last byte, do not acknowledge next rcv. */
|
||||
val |= stop_bit;
|
||||
|
||||
/*
|
||||
* Enable interrupt RFDAIE (data in Rx fifo),
|
||||
* and disable DRMIE (need data for Tx)
|
||||
|
|
@ -632,6 +639,8 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
|
|||
*/
|
||||
|
||||
tmp = ((freq / 1000) / I2C_PNX_SPEED_KHZ) / 2 - 2;
|
||||
if (tmp > 0x3FF)
|
||||
tmp = 0x3FF;
|
||||
iowrite32(tmp, I2C_REG_CKH(alg_data));
|
||||
iowrite32(tmp, I2C_REG_CKL(alg_data));
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ struct acpi_smbus_cmi {
|
|||
u8 cap_info:1;
|
||||
u8 cap_read:1;
|
||||
u8 cap_write:1;
|
||||
struct smbus_methods_t *methods;
|
||||
};
|
||||
|
||||
static const struct smbus_methods_t smbus_methods = {
|
||||
|
|
@ -41,10 +42,19 @@ static const struct smbus_methods_t smbus_methods = {
|
|||
.mt_sbw = "_SBW",
|
||||
};
|
||||
|
||||
/* Some IBM BIOSes omit the leading underscore */
|
||||
static const struct smbus_methods_t ibm_smbus_methods = {
|
||||
.mt_info = "SBI_",
|
||||
.mt_sbr = "SBR_",
|
||||
.mt_sbw = "SBW_",
|
||||
};
|
||||
|
||||
static const struct acpi_device_id acpi_smbus_cmi_ids[] = {
|
||||
{"SMBUS01", 0},
|
||||
{"SMBUS01", (kernel_ulong_t)&smbus_methods},
|
||||
{ACPI_SMBUS_IBM_HID, (kernel_ulong_t)&ibm_smbus_methods},
|
||||
{"", 0}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, acpi_smbus_cmi_ids);
|
||||
|
||||
#define ACPI_SMBUS_STATUS_OK 0x00
|
||||
#define ACPI_SMBUS_STATUS_FAIL 0x07
|
||||
|
|
@ -150,11 +160,11 @@ acpi_smbus_cmi_access(struct i2c_adapter *adap, u16 addr, unsigned short flags,
|
|||
|
||||
if (read_write == I2C_SMBUS_READ) {
|
||||
protocol |= ACPI_SMBUS_PRTCL_READ;
|
||||
method = smbus_methods.mt_sbr;
|
||||
method = smbus_cmi->methods->mt_sbr;
|
||||
input.count = 3;
|
||||
} else {
|
||||
protocol |= ACPI_SMBUS_PRTCL_WRITE;
|
||||
method = smbus_methods.mt_sbw;
|
||||
method = smbus_cmi->methods->mt_sbw;
|
||||
input.count = 5;
|
||||
}
|
||||
|
||||
|
|
@ -290,13 +300,13 @@ static int acpi_smbus_cmi_add_cap(struct acpi_smbus_cmi *smbus_cmi,
|
|||
union acpi_object *obj;
|
||||
acpi_status status;
|
||||
|
||||
if (!strcmp(name, smbus_methods.mt_info)) {
|
||||
if (!strcmp(name, smbus_cmi->methods->mt_info)) {
|
||||
status = acpi_evaluate_object(smbus_cmi->handle,
|
||||
smbus_methods.mt_info,
|
||||
smbus_cmi->methods->mt_info,
|
||||
NULL, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR((AE_INFO, "Evaluating %s: %i",
|
||||
smbus_methods.mt_info, status));
|
||||
smbus_cmi->methods->mt_info, status));
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
|
@ -319,9 +329,9 @@ static int acpi_smbus_cmi_add_cap(struct acpi_smbus_cmi *smbus_cmi,
|
|||
|
||||
kfree(buffer.pointer);
|
||||
smbus_cmi->cap_info = 1;
|
||||
} else if (!strcmp(name, smbus_methods.mt_sbr))
|
||||
} else if (!strcmp(name, smbus_cmi->methods->mt_sbr))
|
||||
smbus_cmi->cap_read = 1;
|
||||
else if (!strcmp(name, smbus_methods.mt_sbw))
|
||||
else if (!strcmp(name, smbus_cmi->methods->mt_sbw))
|
||||
smbus_cmi->cap_write = 1;
|
||||
else
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Unsupported CMI method: %s\n",
|
||||
|
|
@ -349,6 +359,7 @@ static acpi_status acpi_smbus_cmi_query_methods(acpi_handle handle, u32 level,
|
|||
static int acpi_smbus_cmi_add(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_smbus_cmi *smbus_cmi;
|
||||
const struct acpi_device_id *id;
|
||||
|
||||
smbus_cmi = kzalloc(sizeof(struct acpi_smbus_cmi), GFP_KERNEL);
|
||||
if (!smbus_cmi)
|
||||
|
|
@ -362,6 +373,11 @@ static int acpi_smbus_cmi_add(struct acpi_device *device)
|
|||
smbus_cmi->cap_read = 0;
|
||||
smbus_cmi->cap_write = 0;
|
||||
|
||||
for (id = acpi_smbus_cmi_ids; id->id[0]; id++)
|
||||
if (!strcmp(id->id, acpi_device_hid(device)))
|
||||
smbus_cmi->methods =
|
||||
(struct smbus_methods_t *) id->driver_data;
|
||||
|
||||
acpi_walk_namespace(ACPI_TYPE_METHOD, smbus_cmi->handle, 1,
|
||||
acpi_smbus_cmi_query_methods, NULL, smbus_cmi, NULL);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/pm_runtime.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
/* Transmit operation: */
|
||||
/* */
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-bit.h>
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
/* the name of this kernel module */
|
||||
#define NAME "stu300"
|
||||
|
|
@ -497,7 +498,7 @@ static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate)
|
|||
int i = 0;
|
||||
|
||||
/* Locate the apropriate clock setting */
|
||||
while (i < ARRAY_SIZE(stu300_clktable) &&
|
||||
while (i < ARRAY_SIZE(stu300_clktable) - 1 &&
|
||||
stu300_clktable[i].rate < clkrate)
|
||||
i++;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/* include interfaces to usb layer */
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/i2c-algo-bit.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#include <linux/wait.h>
|
||||
#include <linux/i2c-xiic.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define DRIVER_NAME "xiic-i2c"
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <linux/scx200.h>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rwsem.h>
|
||||
|
||||
#include "i2c-core.h"
|
||||
|
|
|
|||
|
|
@ -40,12 +40,11 @@
|
|||
#include "i2c-core.h"
|
||||
|
||||
|
||||
/* core_lock protects i2c_adapter_idr, userspace_devices, and guarantees
|
||||
/* core_lock protects i2c_adapter_idr, and guarantees
|
||||
that device detection, deletion of detected devices, and attach_adapter
|
||||
and detach_adapter calls are serialized */
|
||||
static DEFINE_MUTEX(core_lock);
|
||||
static DEFINE_IDR(i2c_adapter_idr);
|
||||
static LIST_HEAD(userspace_devices);
|
||||
|
||||
static struct device_type i2c_client_type;
|
||||
static int i2c_check_addr(struct i2c_adapter *adapter, int addr);
|
||||
|
|
@ -117,8 +116,10 @@ static int i2c_device_probe(struct device *dev)
|
|||
dev_dbg(dev, "probe\n");
|
||||
|
||||
status = driver->probe(client, i2c_match_id(driver->id_table, client));
|
||||
if (status)
|
||||
if (status) {
|
||||
client->driver = NULL;
|
||||
i2c_set_clientdata(client, NULL);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -139,8 +140,10 @@ static int i2c_device_remove(struct device *dev)
|
|||
dev->driver = NULL;
|
||||
status = 0;
|
||||
}
|
||||
if (status == 0)
|
||||
if (status == 0) {
|
||||
client->driver = NULL;
|
||||
i2c_set_clientdata(client, NULL);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -538,9 +541,9 @@ i2c_sysfs_new_device(struct device *dev, struct device_attribute *attr,
|
|||
return -EEXIST;
|
||||
|
||||
/* Keep track of the added device */
|
||||
mutex_lock(&core_lock);
|
||||
list_add_tail(&client->detected, &userspace_devices);
|
||||
mutex_unlock(&core_lock);
|
||||
i2c_lock_adapter(adap);
|
||||
list_add_tail(&client->detected, &adap->userspace_clients);
|
||||
i2c_unlock_adapter(adap);
|
||||
dev_info(dev, "%s: Instantiated device %s at 0x%02hx\n", "new_device",
|
||||
info.type, info.addr);
|
||||
|
||||
|
|
@ -579,9 +582,10 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,
|
|||
|
||||
/* Make sure the device was added through sysfs */
|
||||
res = -ENOENT;
|
||||
mutex_lock(&core_lock);
|
||||
list_for_each_entry_safe(client, next, &userspace_devices, detected) {
|
||||
if (client->addr == addr && client->adapter == adap) {
|
||||
i2c_lock_adapter(adap);
|
||||
list_for_each_entry_safe(client, next, &adap->userspace_clients,
|
||||
detected) {
|
||||
if (client->addr == addr) {
|
||||
dev_info(dev, "%s: Deleting device %s at 0x%02hx\n",
|
||||
"delete_device", client->name, client->addr);
|
||||
|
||||
|
|
@ -591,7 +595,7 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,
|
|||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&core_lock);
|
||||
i2c_unlock_adapter(adap);
|
||||
|
||||
if (res < 0)
|
||||
dev_err(dev, "%s: Can't find device in list\n",
|
||||
|
|
@ -673,6 +677,7 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
|
|||
}
|
||||
|
||||
rt_mutex_init(&adap->bus_lock);
|
||||
INIT_LIST_HEAD(&adap->userspace_clients);
|
||||
|
||||
/* Set default timeout to 1 second if not already set */
|
||||
if (adap->timeout == 0)
|
||||
|
|
@ -875,14 +880,15 @@ int i2c_del_adapter(struct i2c_adapter *adap)
|
|||
return res;
|
||||
|
||||
/* Remove devices instantiated from sysfs */
|
||||
list_for_each_entry_safe(client, next, &userspace_devices, detected) {
|
||||
if (client->adapter == adap) {
|
||||
dev_dbg(&adap->dev, "Removing %s at 0x%x\n",
|
||||
client->name, client->addr);
|
||||
list_del(&client->detected);
|
||||
i2c_unregister_device(client);
|
||||
}
|
||||
i2c_lock_adapter(adap);
|
||||
list_for_each_entry_safe(client, next, &adap->userspace_clients,
|
||||
detected) {
|
||||
dev_dbg(&adap->dev, "Removing %s at 0x%x\n", client->name,
|
||||
client->addr);
|
||||
list_del(&client->detected);
|
||||
i2c_unregister_device(client);
|
||||
}
|
||||
i2c_unlock_adapter(adap);
|
||||
|
||||
/* Detach any active clients. This can't fail, thus we do not
|
||||
checking the returned value. */
|
||||
|
|
@ -1260,12 +1266,23 @@ static int i2c_detect_address(struct i2c_client *temp_client,
|
|||
return 0;
|
||||
|
||||
/* Make sure there is something at this address */
|
||||
if (i2c_smbus_xfer(adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL) < 0)
|
||||
return 0;
|
||||
if (addr == 0x73 && (adapter->class & I2C_CLASS_HWMON)) {
|
||||
/* Special probe for FSC hwmon chips */
|
||||
union i2c_smbus_data dummy;
|
||||
|
||||
/* Prevent 24RF08 corruption */
|
||||
if ((addr & ~0x0f) == 0x50)
|
||||
i2c_smbus_xfer(adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL);
|
||||
if (i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_READ, 0,
|
||||
I2C_SMBUS_BYTE_DATA, &dummy) < 0)
|
||||
return 0;
|
||||
} else {
|
||||
if (i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_WRITE, 0,
|
||||
I2C_SMBUS_QUICK, NULL) < 0)
|
||||
return 0;
|
||||
|
||||
/* Prevent 24RF08 corruption */
|
||||
if ((addr & ~0x0f) == 0x50)
|
||||
i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_WRITE, 0,
|
||||
I2C_SMBUS_QUICK, NULL);
|
||||
}
|
||||
|
||||
/* Finally call the custom detection function */
|
||||
memset(&info, 0, sizeof(struct i2c_board_info));
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-smbus.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
struct i2c_smbus_alert {
|
||||
unsigned int alert_edge_triggered:1;
|
||||
|
|
|
|||
Loading…
Reference in a new issue