diff options
author | Alexander Shiyan <shc_work@mail.ru> | 2012-04-10 23:44:11 +0400 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-04-11 09:51:01 +0200 |
commit | dc505f7e203f383af824db2b44b3364736960476 (patch) | |
tree | 6d87483b9f1c416bcc19f0ea41125db8e871a1bb /drivers | |
parent | f2215e92411a98372f27abe915bb065bfc055fd2 (diff) | |
download | barebox-dc505f7e203f383af824db2b44b3364736960476.tar.gz barebox-dc505f7e203f383af824db2b44b3364736960476.tar.xz |
Detect MC13892 chip ID in mc13xxx_query_revision()
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mfd/mc13xxx.c | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/drivers/mfd/mc13xxx.c b/drivers/mfd/mc13xxx.c index 6802c12e4d..56345ced1c 100644 --- a/drivers/mfd/mc13xxx.c +++ b/drivers/mfd/mc13xxx.c @@ -234,30 +234,39 @@ static struct mc13892_rev mc13892_revisions[] = { static int mc13xxx_query_revision(struct mc13xxx *mc13xxx) { unsigned int rev_id; - char *revstr; + char *chipname, *revstr; int rev, i; mc13xxx_reg_read(mc13xxx, MC13892_REG_IDENTIFICATION, &rev_id); - for (i = 0; i < ARRAY_SIZE(mc13892_revisions); i++) - if ((rev_id & 0x1f) == mc13892_revisions[i].rev_id) - break; - - if (i == ARRAY_SIZE(mc13892_revisions)) - return -EINVAL; - - rev = mc13892_revisions[i].rev; - revstr = mc13892_revisions[i].revstr; - - if (rev == MC13892_REVISION_2_0) { - if ((rev_id >> 9) & 0x3) { - rev = MC13892_REVISION_2_0a; - revstr = "2.0a"; + /* Determine chip type by decode ICID bits */ + switch ((rev_id >> 6) & 0x7) { + case 7: + chipname = "MC13892"; + for (i = 0; i < ARRAY_SIZE(mc13892_revisions); i++) + if ((rev_id & 0x1f) == mc13892_revisions[i].rev_id) + break; + + if (i == ARRAY_SIZE(mc13892_revisions)) + return -EINVAL; + + rev = mc13892_revisions[i].rev; + revstr = mc13892_revisions[i].revstr; + + if (rev == MC13892_REVISION_2_0) { + if ((rev_id >> 9) & 0x3) { + rev = MC13892_REVISION_2_0a; + revstr = "2.0a"; + } } + break; + default: + dev_info(mc_dev->cdev.dev, "No PMIC detected.\n"); + return -EINVAL; } - dev_info(mc_dev->cdev.dev, "PMIC ID: 0x%08x [Rev: %s]\n", - rev_id, revstr); + dev_info(mc_dev->cdev.dev, "Found %s ID: 0x%06x [Rev: %s]\n", + chipname, rev_id, revstr); mc13xxx->revision = rev; |