mfd: twl-core: Add API to query the HFCLK rate
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Mon, 10 Sep 2012 10:46:22 +0000 (13:46 +0300)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sat, 22 Sep 2012 15:14:50 +0000 (11:14 -0400)
CFG_BOOT register's HFCLK_FREQ field hold information about the used HFCLK
frequency.
Add possibility for users to get the configured rate based on this
register.
This register was configured during boot, without it the chip would not
operate correctly, so we can trust on this information.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
drivers/mfd/twl-core.c
include/linux/i2c/twl.h

index 1c32afed28aad0ade45943e6b20a6b7c22531e93..f162b68e78a8d3bea9800d2db91f64e88e7ed979 100644 (file)
@@ -552,6 +552,38 @@ int twl_get_version(void)
 }
 EXPORT_SYMBOL_GPL(twl_get_version);
 
+/**
+ * twl_get_hfclk_rate - API to get TWL external HFCLK clock rate.
+ *
+ * Api to get the TWL HFCLK rate based on BOOT_CFG register.
+ */
+int twl_get_hfclk_rate(void)
+{
+       u8 ctrl;
+       int rate;
+
+       twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &ctrl, R_CFG_BOOT);
+
+       switch (ctrl & 0x3) {
+       case HFCLK_FREQ_19p2_MHZ:
+               rate = 19200000;
+               break;
+       case HFCLK_FREQ_26_MHZ:
+               rate = 26000000;
+               break;
+       case HFCLK_FREQ_38p4_MHZ:
+               rate = 38400000;
+               break;
+       default:
+               pr_err("TWL4030: HFCLK is not configured\n");
+               rate = -EINVAL;
+               break;
+       }
+
+       return rate;
+}
+EXPORT_SYMBOL_GPL(twl_get_hfclk_rate);
+
 static struct device *
 add_numbered_child(unsigned chip, const char *name, int num,
                void *pdata, unsigned pdata_len,
index 7ea898c55a601e04d11231a9425d9b29460089b0..ac6488c9f25039bcdb4c32746a0016419b58abd0 100644 (file)
@@ -188,6 +188,7 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes);
 
 int twl_get_type(void);
 int twl_get_version(void);
+int twl_get_hfclk_rate(void);
 
 int twl6030_interrupt_unmask(u8 bit_mask, u8 offset);
 int twl6030_interrupt_mask(u8 bit_mask, u8 offset);