All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [RFC PATCH 0/2] ARMV7: OMAP4: Add support for twl6032
@ 2013-07-24 13:56 Oleg Kosheliev
  2013-07-24 13:56 ` [U-Boot] [RFC PATCH 1/2] ARMV7: OMAP4: Add struct for twl603x data Oleg Kosheliev
  2013-07-24 13:56 ` [U-Boot] [RFC PATCH 2/2] ARMV7: OMAP4: Add twl6032 support Oleg Kosheliev
  0 siblings, 2 replies; 5+ messages in thread
From: Oleg Kosheliev @ 2013-07-24 13:56 UTC (permalink / raw)
  To: u-boot

From: Oleg Kosheliev <oleg.kosheliev@ti.com>

TWL6032 is a companion Power Management IC (PMIC) of OMAP4470.
This chip is similar to TWL6030 but has slight difference
in some registers e.g. for GPADC.
In u-boot only TWL6030 is supported now, thus there is no ability to 
boot OMAP4470 with TWL6032 because u-boot hangs when attempts to get
the battery voltage from GPADC using false ctrl register address.
These patches add the detection of the TWL chip type and support
for TWL6032 chip in the battery charger driver.

Oleg Kosheliev (2):
  ARMV7: OMAP4: Add struct for twl603x data
  ARMV7: OMAP4: Add twl6032 support

 drivers/power/twl6030.c |   79 +++++++++++++++++++++++++++++++++++++++++------
 include/twl6030.h       |   38 +++++++++++++++++++++++
 2 files changed, 107 insertions(+), 10 deletions(-)

-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] [RFC PATCH 1/2] ARMV7: OMAP4: Add struct for twl603x data
  2013-07-24 13:56 [U-Boot] [RFC PATCH 0/2] ARMV7: OMAP4: Add support for twl6032 Oleg Kosheliev
@ 2013-07-24 13:56 ` Oleg Kosheliev
  2013-08-28 13:57   ` Tom Rini
  2013-07-24 13:56 ` [U-Boot] [RFC PATCH 2/2] ARMV7: OMAP4: Add twl6032 support Oleg Kosheliev
  1 sibling, 1 reply; 5+ messages in thread
From: Oleg Kosheliev @ 2013-07-24 13:56 UTC (permalink / raw)
  To: u-boot

From: Oleg Kosheliev <oleg.kosheliev@ti.com>

The data struct is used to support different
PMIC chip types. It contains the chip type and
the data (e.g. registers addresses, adc multiplier)
which is different for twl6030 and twl6032.
Replaced some hardcoded values with the
structure vars.

Based on Balaji T K <balajitk@ti.com> patches for TI u-boot.

Signed-off-by: Oleg Kosheliev <oleg.kosheliev@ti.com>
---
 drivers/power/twl6030.c |   25 ++++++++++++++++++++-----
 include/twl6030.h       |   18 ++++++++++++++++++
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/drivers/power/twl6030.c b/drivers/power/twl6030.c
index d421e60..badcd4a 100644
--- a/drivers/power/twl6030.c
+++ b/drivers/power/twl6030.c
@@ -25,6 +25,17 @@
 
 #include <twl6030.h>
 
+static struct twl6030_data *twl;
+
+static struct twl6030_data twl6030_info = {
+	.chip_type	= chip_TWL6030,
+	.adc_rbase	= GPCH0_LSB,
+	.adc_ctrl	= CTRL_P2,
+	.adc_enable	= CTRL_P2_SP2,
+	.vbat_mult	= TWL6030_VBAT_MULT,
+	.vbat_shift	= TWL6030_VBAT_SHIFT,
+};
+
 static int twl6030_gpadc_read_channel(u8 channel_no)
 {
 	u8 lsb = 0;
@@ -32,12 +43,12 @@ static int twl6030_gpadc_read_channel(u8 channel_no)
 	int ret = 0;
 
 	ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC,
-				  GPCH0_LSB + channel_no * 2, &lsb);
+				  twl->adc_rbase + channel_no * 2, &lsb);
 	if (ret)
 		return ret;
 
 	ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC,
-				  GPCH0_MSB + channel_no * 2, &msb);
+				  twl->adc_rbase + 1 + channel_no * 2, &msb);
 	if (ret)
 		return ret;
 
@@ -49,7 +60,8 @@ static int twl6030_gpadc_sw2_trigger(void)
 	u8 val;
 	int ret = 0;
 
-	ret = twl6030_i2c_write_u8(TWL6030_CHIP_ADC, CTRL_P2, CTRL_P2_SP2);
+	ret = twl6030_i2c_write_u8(TWL6030_CHIP_ADC,
+				   twl->adc_ctrl, twl->adc_enable);
 	if (ret)
 		return ret;
 
@@ -57,7 +69,8 @@ static int twl6030_gpadc_sw2_trigger(void)
 	val =  CTRL_P2_BUSY;
 
 	while (!((val & CTRL_P2_EOCP2) && (!(val & CTRL_P2_BUSY)))) {
-		ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC, CTRL_P2, &val);
+		ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC,
+					  twl->adc_ctrl, &val);
 		if (ret)
 			return ret;
 		udelay(1000);
@@ -132,7 +145,7 @@ int twl6030_get_battery_voltage(void)
 		printf("Failed to read battery voltage\n");
 		return ret;
 	}
-	battery_volt = (battery_volt * 25 * 1000) >> (10 + 2);
+	battery_volt = (battery_volt * twl->vbat_mult) >> twl->vbat_shift;
 	printf("Battery Voltage: %d mV\n", battery_volt);
 
 	return battery_volt;
@@ -144,6 +157,8 @@ void twl6030_init_battery_charging(void)
 	int battery_volt = 0;
 	int ret = 0;
 
+	twl = &twl6030_info;
+
 	/* Enable VBAT measurement */
 	twl6030_i2c_write_u8(TWL6030_CHIP_PM, MISC1, VBAT_MEAS);
 
diff --git a/include/twl6030.h b/include/twl6030.h
index 029b21f..c0db668 100644
--- a/include/twl6030.h
+++ b/include/twl6030.h
@@ -129,6 +129,24 @@
 #define GPCH0_LSB	0x57
 #define GPCH0_MSB	0x58
 
+#define TWL6030_VBAT_MULT	40 * 1000
+
+#define TWL6030_VBAT_SHIFT	(10 + 3)
+
+typedef enum {
+	chip_TWL6030,
+	chip_TWL603X_cnt
+}t_TWL603X_chip_type;
+
+struct twl6030_data{
+	t_TWL603X_chip_type chip_type;
+	u8 adc_rbase;
+	u8 adc_ctrl;
+	u8 adc_enable;
+	int vbat_mult;
+	int vbat_shift;
+};
+
 /* Functions to read and write from TWL6030 */
 static inline int twl6030_i2c_write_u8(u8 chip_no, u8 reg, u8 val)
 {
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [U-Boot] [RFC PATCH 2/2] ARMV7: OMAP4: Add twl6032 support
  2013-07-24 13:56 [U-Boot] [RFC PATCH 0/2] ARMV7: OMAP4: Add support for twl6032 Oleg Kosheliev
  2013-07-24 13:56 ` [U-Boot] [RFC PATCH 1/2] ARMV7: OMAP4: Add struct for twl603x data Oleg Kosheliev
@ 2013-07-24 13:56 ` Oleg Kosheliev
  2013-08-28 13:58   ` Tom Rini
  1 sibling, 1 reply; 5+ messages in thread
From: Oleg Kosheliev @ 2013-07-24 13:56 UTC (permalink / raw)
  To: u-boot

From: Oleg Kosheliev <oleg.kosheliev@ti.com>

Added chip type detection and twl6032
support in the battery control
and charge functions.

Based on Balaji T K <balajitk@ti.com> patches for TI u-boot.

Signed-off-by: Oleg Kosheliev <oleg.kosheliev@ti.com>
---
 drivers/power/twl6030.c |   56 ++++++++++++++++++++++++++++++++++++++++++-----
 include/twl6030.h       |   20 +++++++++++++++++
 2 files changed, 70 insertions(+), 6 deletions(-)

diff --git a/drivers/power/twl6030.c b/drivers/power/twl6030.c
index badcd4a..8d8f1b5 100644
--- a/drivers/power/twl6030.c
+++ b/drivers/power/twl6030.c
@@ -36,6 +36,15 @@ static struct twl6030_data twl6030_info = {
 	.vbat_shift	= TWL6030_VBAT_SHIFT,
 };
 
+static struct twl6030_data twl6032_info = {
+	.chip_type	= chip_TWL6032,
+	.adc_rbase	= TWL6032_GPCH0_LSB,
+	.adc_ctrl	= TWL6032_CTRL_P1,
+	.adc_enable	= CTRL_P1_SP1,
+	.vbat_mult	= TWL6032_VBAT_MULT,
+	.vbat_shift	= TWL6032_VBAT_SHIFT,
+};
+
 static int twl6030_gpadc_read_channel(u8 channel_no)
 {
 	u8 lsb = 0;
@@ -131,6 +140,18 @@ int twl6030_get_battery_voltage(void)
 {
 	int battery_volt = 0;
 	int ret = 0;
+	u8 vbatch;
+
+	if (twl->chip_type == chip_TWL6030) {
+		vbatch = TWL6030_GPADC_VBAT_CHNL;
+	} else {
+		ret = twl6030_i2c_write_u8(TWL6030_CHIP_ADC,
+					   TWL6032_GPSELECT_ISB,
+					   TWL6032_GPADC_VBAT_CHNL);
+		if (ret)
+			return ret;
+		vbatch = 0;
+	}
 
 	/* Start GPADC SW conversion */
 	ret = twl6030_gpadc_sw2_trigger();
@@ -140,7 +161,7 @@ int twl6030_get_battery_voltage(void)
 	}
 
 	/* measure Vbat voltage */
-	battery_volt = twl6030_gpadc_read_channel(7);
+	battery_volt = twl6030_gpadc_read_channel(vbatch);
 	if (battery_volt < 0) {
 		printf("Failed to read battery voltage\n");
 		return ret;
@@ -153,14 +174,37 @@ int twl6030_get_battery_voltage(void)
 
 void twl6030_init_battery_charging(void)
 {
-	u8 stat1 = 0;
+	u8 val = 0;
 	int battery_volt = 0;
 	int ret = 0;
 
-	twl = &twl6030_info;
+	ret = twl6030_i2c_read_u8(TWL6030_CHIP_USB, USB_PRODUCT_ID_LSB, &val);
+	if (ret) {
+		printf("twl6030_init_battery_charging(): " \
+		       "could not determine chip!\n");
+		return;
+	}
+	if (val == 0x30) {
+		twl = &twl6030_info;
+	} else if (val == 0x32) {
+		twl = &twl6032_info;
+	} else {
+		printf("twl6030_init_battery_charging(): " \
+		       "unsupported chip type\n");
+		return;
+	}
 
 	/* Enable VBAT measurement */
-	twl6030_i2c_write_u8(TWL6030_CHIP_PM, MISC1, VBAT_MEAS);
+	if (twl->chip_type == chip_TWL6030) {
+		twl6030_i2c_write_u8(TWL6030_CHIP_PM, MISC1, VBAT_MEAS);
+		twl6030_i2c_write_u8(TWL6030_CHIP_ADC,
+				     TWL6030_GPADC_CTRL,
+				     GPADC_CTRL_SCALER_DIV4);
+	} else {
+		twl6030_i2c_write_u8(TWL6030_CHIP_ADC,
+				     TWL6032_GPADC_CTRL2,
+				     GPADC_CTRL2_CH18_SCALER_EN);
+	}
 
 	/* Enable GPADC module */
 	ret = twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, TOGGLE1, FGS | GPADCS);
@@ -177,10 +221,10 @@ void twl6030_init_battery_charging(void)
 		printf("Main battery voltage too low!\n");
 
 	/* Check for the presence of USB charger */
-	twl6030_i2c_read_u8(TWL6030_CHIP_CHARGER, CONTROLLER_STAT1, &stat1);
+	twl6030_i2c_read_u8(TWL6030_CHIP_CHARGER, CONTROLLER_STAT1, &val);
 
 	/* check for battery presence indirectly via Fuel gauge */
-	if ((stat1 & VBUS_DET) && (battery_volt < 3300))
+	if ((val & VBUS_DET) && (battery_volt < 3300))
 		twl6030_start_usb_charging();
 
 	return;
diff --git a/include/twl6030.h b/include/twl6030.h
index c0db668..9fd2c8b 100644
--- a/include/twl6030.h
+++ b/include/twl6030.h
@@ -126,15 +126,35 @@
 #define CTRL_P2_EOCP2	(1 << 1)
 #define CTRL_P2_BUSY	(1 << 0)
 
+#define TWL6032_CTRL_P1	0x36
+#define CTRL_P1_SP1	(1 << 3)
+
 #define GPCH0_LSB	0x57
 #define GPCH0_MSB	0x58
 
+#define TWL6032_GPCH0_LSB	0x3b
+
+#define TWL6032_GPSELECT_ISB	0x35
+
+#define USB_PRODUCT_ID_LSB	0x02
+
+#define TWL6030_GPADC_VBAT_CHNL	0x07
+#define TWL6032_GPADC_VBAT_CHNL	0x12
+
+#define TWL6030_GPADC_CTRL	0x2e
+#define TWL6032_GPADC_CTRL2	0x2f
+#define GPADC_CTRL2_CH18_SCALER_EN	(1 << 2)
+#define GPADC_CTRL_SCALER_DIV4		(1 << 3)
+
 #define TWL6030_VBAT_MULT	40 * 1000
+#define TWL6032_VBAT_MULT	25 * 1000
 
 #define TWL6030_VBAT_SHIFT	(10 + 3)
+#define TWL6032_VBAT_SHIFT	(12 + 2)
 
 typedef enum {
 	chip_TWL6030,
+	chip_TWL6032,
 	chip_TWL603X_cnt
 }t_TWL603X_chip_type;
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [U-Boot] [RFC PATCH 1/2] ARMV7: OMAP4: Add struct for twl603x data
  2013-07-24 13:56 ` [U-Boot] [RFC PATCH 1/2] ARMV7: OMAP4: Add struct for twl603x data Oleg Kosheliev
@ 2013-08-28 13:57   ` Tom Rini
  0 siblings, 0 replies; 5+ messages in thread
From: Tom Rini @ 2013-08-28 13:57 UTC (permalink / raw)
  To: u-boot

On Wed, Jul 24, 2013 at 04:56:35PM +0300, Oleg Kosheliev wrote:

> From: Oleg Kosheliev <oleg.kosheliev@ti.com>
> 
> The data struct is used to support different
> PMIC chip types. It contains the chip type and
> the data (e.g. registers addresses, adc multiplier)
> which is different for twl6030 and twl6032.
> Replaced some hardcoded values with the
> structure vars.
> 
> Based on Balaji T K <balajitk@ti.com> patches for TI u-boot.
> 
> Signed-off-by: Oleg Kosheliev <oleg.kosheliev@ti.com>
[snip]
> +typedef enum {
> +	chip_TWL6030,
> +	chip_TWL603X_cnt
> +}t_TWL603X_chip_type;
> +
> +struct twl6030_data{
> +	t_TWL603X_chip_type chip_type;

No new typedefs.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20130828/b3a3a571/attachment.pgp>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] [RFC PATCH 2/2] ARMV7: OMAP4: Add twl6032 support
  2013-07-24 13:56 ` [U-Boot] [RFC PATCH 2/2] ARMV7: OMAP4: Add twl6032 support Oleg Kosheliev
@ 2013-08-28 13:58   ` Tom Rini
  0 siblings, 0 replies; 5+ messages in thread
From: Tom Rini @ 2013-08-28 13:58 UTC (permalink / raw)
  To: u-boot

On Wed, Jul 24, 2013 at 04:56:36PM +0300, Oleg Kosheliev wrote:

> From: Oleg Kosheliev <oleg.kosheliev@ti.com>
> 
> Added chip type detection and twl6032
> support in the battery control
> and charge functions.
> 
> Based on Balaji T K <balajitk@ti.com> patches for TI u-boot.
> 
> Signed-off-by: Oleg Kosheliev <oleg.kosheliev@ti.com>
[snip]
> +	ret = twl6030_i2c_read_u8(TWL6030_CHIP_USB, USB_PRODUCT_ID_LSB, &val);
> +	if (ret) {
> +		printf("twl6030_init_battery_charging(): " \
> +		       "could not determine chip!\n");
> +		return;

Please use puts() and don't split text strings, they can be longer than
80char wide.

[snip]
> +		printf("twl6030_init_battery_charging(): " \
> +		       "unsupported chip type\n");

Same.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20130828/1a779d09/attachment.pgp>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-08-28 13:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-24 13:56 [U-Boot] [RFC PATCH 0/2] ARMV7: OMAP4: Add support for twl6032 Oleg Kosheliev
2013-07-24 13:56 ` [U-Boot] [RFC PATCH 1/2] ARMV7: OMAP4: Add struct for twl603x data Oleg Kosheliev
2013-08-28 13:57   ` Tom Rini
2013-07-24 13:56 ` [U-Boot] [RFC PATCH 2/2] ARMV7: OMAP4: Add twl6032 support Oleg Kosheliev
2013-08-28 13:58   ` Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.