summaryrefslogtreecommitdiffstats
path: root/drivers/mfd
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-09-05 12:59:29 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2012-09-05 12:59:29 +0200
commit2c8c801c674eb8ad05f54a49b427318fc5ae9d90 (patch)
treee98b5d390ef32e510861df0196d48551f7c48e25 /drivers/mfd
parente5a927883ea8f85e2258d5e15ac6ede8f44aeaab (diff)
parent7b6529354db5b95341cc57fad859a5a3993c74c6 (diff)
downloadbarebox-2c8c801c674eb8ad05f54a49b427318fc5ae9d90.tar.gz
barebox-2c8c801c674eb8ad05f54a49b427318fc5ae9d90.tar.xz
Merge branch 'for-next/mc13xxx'
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/mc13xxx.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/mfd/mc13xxx.c b/drivers/mfd/mc13xxx.c
index 8bb0d00f8f..704446d019 100644
--- a/drivers/mfd/mc13xxx.c
+++ b/drivers/mfd/mc13xxx.c
@@ -32,6 +32,21 @@
#define DRIVERNAME "mc13xxx"
+enum mc13xxx_mode {
+ MC13XXX_MODE_I2C,
+ MC13XXX_MODE_SPI,
+};
+
+struct mc13xxx {
+ struct cdev cdev;
+ union {
+ struct i2c_client *client;
+ struct spi_device *spi;
+ };
+ enum mc13xxx_mode mode;
+ int revision;
+};
+
#define to_mc13xxx(a) container_of(a, struct mc13xxx, cdev)
static struct mc13xxx *mc_dev;
@@ -42,6 +57,12 @@ struct mc13xxx *mc13xxx_get(void)
}
EXPORT_SYMBOL(mc13xxx_get);
+int mc13xxx_revision(struct mc13xxx *mc13xxx)
+{
+ return mc13xxx->revision;
+}
+EXPORT_SYMBOL(mc13xxx_revision);
+
#ifdef CONFIG_SPI
static int spi_rw(struct spi_device *spi, void * buf, size_t len)
{
@@ -231,7 +252,7 @@ static struct mc13892_rev mc13892_revisions[] = {
static int mc13xxx_query_revision(struct mc13xxx *mc13xxx)
{
unsigned int rev_id;
- char *chipname, *revstr;
+ char *chipname, revstr[5];
int rev, i;
mc13xxx_reg_read(mc13xxx, MC13XXX_REG_IDENTIFICATION, &rev_id);
@@ -244,9 +265,9 @@ static int mc13xxx_query_revision(struct mc13xxx *mc13xxx)
/* Ver 0.2 is actually 3.2a. Report as 3.2 */
if (rev == 0x02) {
rev = 0x32;
- revstr = "3.2a";
+ strcpy(revstr, "3.2a");
} else
- revstr = asprintf("%d.%d", rev / 0x10, rev % 10);
+ sprintf(revstr, "%d.%d", rev / 0x10, rev % 10);
break;
case 7:
chipname = "MC13892";
@@ -258,12 +279,12 @@ static int mc13xxx_query_revision(struct mc13xxx *mc13xxx)
return -EINVAL;
rev = mc13892_revisions[i].rev;
- revstr = mc13892_revisions[i].revstr;
+ strcpy(revstr, mc13892_revisions[i].revstr);
if (rev == MC13892_REVISION_2_0) {
if ((rev_id >> 9) & 0x3) {
rev = MC13892_REVISION_2_0a;
- revstr = "2.0a";
+ strcpy(revstr, "2.0a");
}
}
break;