summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlexander Shiyan <shc_work@mail.ru>2012-04-10 23:44:11 +0400
committerSascha Hauer <s.hauer@pengutronix.de>2012-04-11 09:51:01 +0200
commitdc505f7e203f383af824db2b44b3364736960476 (patch)
tree6d87483b9f1c416bcc19f0ea41125db8e871a1bb /drivers
parentf2215e92411a98372f27abe915bb065bfc055fd2 (diff)
downloadbarebox-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.c43
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;