From dc505f7e203f383af824db2b44b3364736960476 Mon Sep 17 00:00:00 2001 From: Alexander Shiyan Date: Tue, 10 Apr 2012 23:44:11 +0400 Subject: Detect MC13892 chip ID in mc13xxx_query_revision() Signed-off-by: Alexander Shiyan Signed-off-by: Sascha Hauer --- drivers/mfd/mc13xxx.c | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) (limited to 'drivers') 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; -- cgit v1.2.3