aboutsummaryrefslogtreecommitdiff
path: root/board/st-ericsson/u5500/u5500_backlight.c
blob: 0b5eda665f284d998cd65b33d8aa8afdcb399808 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * Copyright (C) ST-Ericsson SA 2010
 *
 * Author: Sesahgiri.Holi <seshagiri.holi@stericsson.com> for ST-Ericsson
 * License terms: GNU General Public License (GPL), version 2.
 */

#include <common.h>
#include <i2c.h>
#include <asm/arch/prcmu-db5500.h>
#include "u5500_backlight.h"

#define BACKLIGHT_SLAVE_ADDR   0x36

#define LM3530_GEN_CONFIG		0x10
#define LM3530_ALS_CONFIG		0x20
#define LM3530_BRT_RAMP_RATE		0x30
#define LM3530_ALS_ZONE_REG		0x40
#define LM3530_ALS_IMP_SELECT		0x41
#define LM3530_BRT_CTRL_REG		0xA0
#define LM3530_ALS_ZB0_REG		0x60
#define LM3530_ALS_ZB1_REG		0x61
#define LM3530_ALS_ZB2_REG		0x62
#define LM3530_ALS_ZB3_REG		0x63
#define LM3530_ALS_Z0T_REG		0x70
#define LM3530_ALS_Z1T_REG		0x71
#define LM3530_ALS_Z2T_REG		0x72
#define LM3530_ALS_Z3T_REG		0x73
#define LM3530_ALS_Z4T_REG		0x74
#define LM3530_REG_MAX			15

#define ADDR_LEN			0x01
#define DATA_LEN			0x01

/* General Control Register */
#define LM3530_EN_I2C_SHIFT		(0)
#define LM3530_RAMP_LAW_SHIFT		(1)
#define LM3530_MAX_CURR_SHIFT		(2)
#define LM3530_EN_PWM_SHIFT		(5)
#define LM3530_PWM_POL_SHIFT		(6)
#define LM3530_EN_PWM_SIMPLE_SHIFT	(7)

#define LM3530_ENABLE_I2C		(1 << LM3530_EN_I2C_SHIFT)
#define LM3530_ENABLE_PWM		(1 << LM3530_EN_PWM_SHIFT)
#define LM3530_POL_LOW			(1 << LM3530_PWM_POL_SHIFT)
#define LM3530_ENABLE_PWM_SIMPLE	(1 << LM3530_EN_PWM_SIMPLE_SHIFT)

/* ALS Config Register Options */
#define LM3530_ALS_AVG_TIME_SHIFT	(0)
#define LM3530_EN_ALS_SHIFT		(3)
#define LM3530_ALS_SEL_SHIFT		(5)

#define LM3530_ENABLE_ALS		(3 << LM3530_EN_ALS_SHIFT)

/* Brightness Ramp Rate Register */
#define LM3530_BRT_RAMP_FALL_SHIFT	(0)
#define LM3530_BRT_RAMP_RISE_SHIFT	(3)

/* ALS Resistor Select */
#define LM3530_ALS1_IMP_SHIFT		(0)
#define LM3530_ALS2_IMP_SHIFT		(4)

/* Zone Boundary Register defaults */
#define LM3530_ALS_ZB_MAX		(4)
#define LM3530_ALS_WINDOW_mV		(1000)
#define LM3530_ALS_OFFSET_mV		(4)

/* Zone Target Register defaults */
#define LM3530_DEF_ZT_0			(0x7F)
#define LM3530_DEF_ZT_1			(0x66)
#define LM3530_DEF_ZT_2			(0x4C)
#define LM3530_DEF_ZT_3			(0x33)
#define LM3530_DEF_ZT_4			(0x19)

#define LM3530_MAX_BRIGHTNESS		(0x7F)

static const u8 lm3530_reg[LM3530_REG_MAX] = {
	LM3530_GEN_CONFIG,
	LM3530_ALS_CONFIG,
	LM3530_BRT_RAMP_RATE,
	LM3530_ALS_ZONE_REG,
	LM3530_ALS_IMP_SELECT,
	LM3530_BRT_CTRL_REG,
	LM3530_ALS_ZB0_REG,
	LM3530_ALS_ZB1_REG,
	LM3530_ALS_ZB2_REG,
	LM3530_ALS_ZB3_REG,
	LM3530_ALS_Z0T_REG,
	LM3530_ALS_Z1T_REG,
	LM3530_ALS_Z2T_REG,
	LM3530_ALS_Z3T_REG,
	LM3530_ALS_Z4T_REG,
};

void backlight_init(void)
{
	u8 gen_config;
	u8 brt_ramp;
	u8 byte;
	u8 i;
	int ret = 0;
	u8 reg_val[LM3530_REG_MAX];

	/* Enable regulator for back light*/
	byte = 0x36;
	(void) prcmu_abb_write(0x3, 0x7B, &byte, (u8)sizeof(byte));

	i2c_set_bus_num(2);
	i2c_set_bus_speed(CONFIG_SYS_I2C_SPEED);

	gen_config = 0x1 << LM3530_RAMP_LAW_SHIFT |
		LM3530_FS_CURR_26mA << LM3530_MAX_CURR_SHIFT |
		LM3530_ENABLE_I2C;
	brt_ramp = (LM3530_RAMP_TIME_260ms << LM3530_BRT_RAMP_FALL_SHIFT) |
		(LM3530_RAMP_TIME_260ms << LM3530_BRT_RAMP_RISE_SHIFT);

	reg_val[0] = gen_config;	/* LM3530_GEN_CONFIG */
	reg_val[1] = 0x00;	/* LM3530_ALS_CONFIG */
	reg_val[2] = brt_ramp;		/* LM3530_BRT_RAMP_RATE */
	reg_val[3] = 0x00;		/* LM3530_ALS_ZONE_REG */
	reg_val[4] = 0x00;	/* LM3530_ALS_IMP_SELECT */
	reg_val[5] = LM3530_MAX_BRIGHTNESS;	/* LM3530_BRT_CTRL_REG */
	reg_val[6] = 0x00;		/* LM3530_ALS_ZB0_REG */
	reg_val[7] = 0x00;		/* LM3530_ALS_ZB1_REG */
	reg_val[8] = 0x00;		/* LM3530_ALS_ZB2_REG */
	reg_val[9] = 0x00;		/* LM3530_ALS_ZB3_REG */
	reg_val[10] = LM3530_DEF_ZT_0;	/* LM3530_ALS_Z0T_REG */
	reg_val[11] = LM3530_DEF_ZT_1;	/* LM3530_ALS_Z1T_REG */
	reg_val[12] = LM3530_DEF_ZT_2;	/* LM3530_ALS_Z2T_REG */
	reg_val[13] = LM3530_DEF_ZT_3;	/* LM3530_ALS_Z3T_REG */
	reg_val[14] = LM3530_DEF_ZT_4;	/* LM3530_ALS_Z4T_REG */

	for (i = 0; i < LM3530_REG_MAX; i++) {
		ret = i2c_write(BACKLIGHT_SLAVE_ADDR,
				lm3530_reg[i], ADDR_LEN, &reg_val[i],
				DATA_LEN);
		if (ret)
			break;
	}
	return;
}