Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 115513
b: refs/heads/master
c: 810ad7b
h: refs/heads/master
i:
  115511: e374d83
v: v3
  • Loading branch information
Jean Delvare authored and Jean Delvare committed Oct 17, 2008
1 parent 34ce229 commit 35d0cdd
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 42 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 47064d645bc55863c7887a7c96cde39c9a37ee5f
refs/heads/master: 810ad7b62c0f075dc44ecc781b24c7f6ba388da5
56 changes: 18 additions & 38 deletions trunk/drivers/hwmon/ams/ams-i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,26 +60,34 @@ enum ams_i2c_cmd {
AMS_CMD_START,
};

static int ams_i2c_attach(struct i2c_adapter *adapter);
static int ams_i2c_detach(struct i2c_adapter *adapter);
static int ams_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id);
static int ams_i2c_remove(struct i2c_client *client);

static const struct i2c_device_id ams_id[] = {
{ "ams", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, ams_id);

static struct i2c_driver ams_i2c_driver = {
.driver = {
.name = "ams",
.owner = THIS_MODULE,
},
.attach_adapter = ams_i2c_attach,
.detach_adapter = ams_i2c_detach,
.probe = ams_i2c_probe,
.remove = ams_i2c_remove,
.id_table = ams_id,
};

static s32 ams_i2c_read(u8 reg)
{
return i2c_smbus_read_byte_data(&ams_info.i2c_client, reg);
return i2c_smbus_read_byte_data(ams_info.i2c_client, reg);
}

static int ams_i2c_write(u8 reg, u8 value)
{
return i2c_smbus_write_byte_data(&ams_info.i2c_client, reg, value);
return i2c_smbus_write_byte_data(ams_info.i2c_client, reg, value);
}

static int ams_i2c_cmd(enum ams_i2c_cmd cmd)
Expand Down Expand Up @@ -152,27 +160,17 @@ static void ams_i2c_get_xyz(s8 *x, s8 *y, s8 *z)
*z = ams_i2c_read(AMS_DATAZ);
}

static int ams_i2c_attach(struct i2c_adapter *adapter)
static int ams_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
unsigned long bus;
int vmaj, vmin;
int result;

/* There can be only one */
if (unlikely(ams_info.has_device))
return -ENODEV;

if (strncmp(adapter->name, "uni-n", 5))
return -ENODEV;

bus = simple_strtoul(adapter->name + 6, NULL, 10);
if (bus != ams_info.i2c_bus)
return -ENODEV;

ams_info.i2c_client.addr = ams_info.i2c_address;
ams_info.i2c_client.adapter = adapter;
ams_info.i2c_client.driver = &ams_i2c_driver;
strcpy(ams_info.i2c_client.name, "Apple Motion Sensor");
ams_info.i2c_client = client;

if (ams_i2c_cmd(AMS_CMD_RESET)) {
printk(KERN_INFO "ams: Failed to reset the device\n");
Expand Down Expand Up @@ -237,7 +235,7 @@ static int ams_i2c_attach(struct i2c_adapter *adapter)
return 0;
}

static int ams_i2c_detach(struct i2c_adapter *adapter)
static int ams_i2c_remove(struct i2c_client *client)
{
if (ams_info.has_device) {
/* Disable interrupts */
Expand All @@ -261,9 +259,7 @@ static void ams_i2c_exit(void)

int __init ams_i2c_init(struct device_node *np)
{
char *tmp_bus;
int result;
const u32 *prop;

mutex_lock(&ams_info.lock);

Expand All @@ -275,24 +271,8 @@ int __init ams_i2c_init(struct device_node *np)
ams_info.clear_irq = ams_i2c_clear_irq;
ams_info.bustype = BUS_I2C;

/* look for bus either using "reg" or by path */
prop = of_get_property(ams_info.of_node, "reg", NULL);
if (!prop) {
result = -ENODEV;

goto exit;
}

tmp_bus = strstr(ams_info.of_node->full_name, "/i2c-bus@");
if (tmp_bus)
ams_info.i2c_bus = *(tmp_bus + 9) - '0';
else
ams_info.i2c_bus = ((*prop) >> 8) & 0x0f;
ams_info.i2c_address = ((*prop) & 0xff) >> 1;

result = i2c_add_driver(&ams_i2c_driver);

exit:
mutex_unlock(&ams_info.lock);

return result;
Expand Down
4 changes: 1 addition & 3 deletions trunk/drivers/hwmon/ams/ams.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,7 @@ struct ams {

#ifdef CONFIG_SENSORS_AMS_I2C
/* I2C properties */
int i2c_bus;
int i2c_address;
struct i2c_client i2c_client;
struct i2c_client *i2c_client;
#endif

/* Joystick emulation */
Expand Down
29 changes: 29 additions & 0 deletions trunk/drivers/i2c/busses/i2c-powermac.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,35 @@ static int __devinit i2c_powermac_probe(struct platform_device *dev)
}

printk(KERN_INFO "PowerMac i2c bus %s registered\n", name);

if (!strncmp(basename, "uni-n", 5)) {
struct device_node *np;
const u32 *prop;
struct i2c_board_info info;

/* Instantiate I2C motion sensor if present */
np = of_find_node_by_name(NULL, "accelerometer");
if (np && of_device_is_compatible(np, "AAPL,accelerometer_1") &&
(prop = of_get_property(np, "reg", NULL))) {
int i2c_bus;
const char *tmp_bus;

/* look for bus either using "reg" or by path */
tmp_bus = strstr(np->full_name, "/i2c-bus@");
if (tmp_bus)
i2c_bus = *(tmp_bus + 9) - '0';
else
i2c_bus = ((*prop) >> 8) & 0x0f;

if (pmac_i2c_get_channel(bus) == i2c_bus) {
memset(&info, 0, sizeof(struct i2c_board_info));
info.addr = ((*prop) & 0xff) >> 1;
strlcpy(info.type, "ams", I2C_NAME_SIZE);
i2c_new_device(adapter, &info);
}
}
}

return rc;
}

Expand Down

0 comments on commit 35d0cdd

Please sign in to comment.