-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Mark Brown
authored and
Liam Girdwood
committed
Oct 13, 2008
1 parent
c056109
commit 6d53592
Showing
4 changed files
with
133 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 89b4012befb1abca5e86d232bc0e2a797b0d9825 | ||
refs/heads/master: c661a0b92d487ac20cc9cddbb8f4d40e4dcdbec1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/* | ||
* wm8350-i2c.c -- Generic I2C driver for Wolfson WM8350 PMIC | ||
* | ||
* This driver defines and configures the WM8350 for the Freescale i.MX32ADS. | ||
* | ||
* Copyright 2007, 2008 Wolfson Microelectronics PLC. | ||
* | ||
* Author: Liam Girdwood | ||
* linux@wolfsonmicro.com | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the | ||
* Free Software Foundation; either version 2 of the License, or (at your | ||
* option) any later version. | ||
* | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/moduleparam.h> | ||
#include <linux/init.h> | ||
#include <linux/i2c.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/mfd/wm8350/core.h> | ||
|
||
static int wm8350_i2c_read_device(struct wm8350 *wm8350, char reg, | ||
int bytes, void *dest) | ||
{ | ||
int ret; | ||
|
||
ret = i2c_master_send(wm8350->i2c_client, ®, 1); | ||
if (ret < 0) | ||
return ret; | ||
return i2c_master_recv(wm8350->i2c_client, dest, bytes); | ||
} | ||
|
||
static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg, | ||
int bytes, void *src) | ||
{ | ||
/* we add 1 byte for device register */ | ||
u8 msg[(WM8350_MAX_REGISTER << 1) + 1]; | ||
|
||
if (bytes > ((WM8350_MAX_REGISTER << 1) + 1)) | ||
return -EINVAL; | ||
|
||
msg[0] = reg; | ||
memcpy(&msg[1], src, bytes); | ||
return i2c_master_send(wm8350->i2c_client, msg, bytes + 1); | ||
} | ||
|
||
static int wm8350_i2c_probe(struct i2c_client *i2c, | ||
const struct i2c_device_id *id) | ||
{ | ||
struct wm8350 *wm8350; | ||
int ret = 0; | ||
|
||
wm8350 = kzalloc(sizeof(struct wm8350), GFP_KERNEL); | ||
if (wm8350 == NULL) { | ||
kfree(i2c); | ||
return -ENOMEM; | ||
} | ||
|
||
i2c_set_clientdata(i2c, wm8350); | ||
wm8350->dev = &i2c->dev; | ||
wm8350->i2c_client = i2c; | ||
wm8350->read_dev = wm8350_i2c_read_device; | ||
wm8350->write_dev = wm8350_i2c_write_device; | ||
|
||
ret = wm8350_device_init(wm8350); | ||
if (ret < 0) | ||
goto err; | ||
|
||
return ret; | ||
|
||
err: | ||
kfree(wm8350); | ||
return ret; | ||
} | ||
|
||
static int wm8350_i2c_remove(struct i2c_client *i2c) | ||
{ | ||
struct wm8350 *wm8350 = i2c_get_clientdata(i2c); | ||
|
||
wm8350_device_exit(wm8350); | ||
kfree(wm8350); | ||
|
||
return 0; | ||
} | ||
|
||
static const struct i2c_device_id wm8350_i2c_id[] = { | ||
{ "wm8350", 0 }, | ||
{ } | ||
}; | ||
MODULE_DEVICE_TABLE(i2c, wm8350_i2c_id); | ||
|
||
|
||
static struct i2c_driver wm8350_i2c_driver = { | ||
.driver = { | ||
.name = "wm8350", | ||
.owner = THIS_MODULE, | ||
}, | ||
.probe = wm8350_i2c_probe, | ||
.remove = wm8350_i2c_remove, | ||
.id_table = wm8350_i2c_id, | ||
}; | ||
|
||
static int __init wm8350_i2c_init(void) | ||
{ | ||
return i2c_add_driver(&wm8350_i2c_driver); | ||
} | ||
/* init early so consumer devices can complete system boot */ | ||
subsys_initcall(wm8350_i2c_init); | ||
|
||
static void __exit wm8350_i2c_exit(void) | ||
{ | ||
i2c_del_driver(&wm8350_i2c_driver); | ||
} | ||
module_exit(wm8350_i2c_exit); | ||
|
||
MODULE_DESCRIPTION("I2C support for the WM8350 AudioPlus PMIC"); | ||
MODULE_LICENSE("GPL"); |