2121/* I2C registers of the Atmel microcontroller. */
2222#define REG_ID 0x80
2323#define REG_PORTA 0x81
24- #define REG_PORTA_HF BIT(2)
25- #define REG_PORTA_VF BIT(3)
2624#define REG_PORTB 0x82
25+ #define REG_PORTC 0x83
2726#define REG_POWERON 0x85
2827#define REG_PWM 0x86
28+ #define REG_ADDR_L 0x8c
29+ #define REG_ADDR_H 0x8d
30+ #define REG_WRITE_DATA_H 0x90
31+ #define REG_WRITE_DATA_L 0x91
32+
33+ #define PA_LCD_DITHB BIT(0)
34+ #define PA_LCD_MODE BIT(1)
35+ #define PA_LCD_LR BIT(2)
36+ #define PA_LCD_UD BIT(3)
37+
38+ #define PB_BRIDGE_PWRDNX_N BIT(0)
39+ #define PB_LCD_VCC_N BIT(1)
40+ #define PB_LCD_MAIN BIT(7)
41+
42+ #define PC_LED_EN BIT(0)
43+ #define PC_RST_TP_N BIT(1)
44+ #define PC_RST_LCD_N BIT(2)
45+ #define PC_RST_BRIDGE_N BIT(3)
2946
3047struct attiny_lcd {
3148 /* lock to serialise overall accesses to the Atmel */
@@ -37,99 +54,91 @@ static const struct regmap_config attiny_regmap_config = {
3754 .reg_bits = 8 ,
3855 .val_bits = 8 ,
3956 .disable_locking = 1 ,
40- .max_register = REG_PWM ,
57+ .max_register = REG_WRITE_DATA_L ,
4158 .cache_type = REGCACHE_NONE ,
4259};
4360
4461static int attiny_lcd_power_enable (struct regulator_dev * rdev )
4562{
46- struct mutex * lock = rdev_get_drvdata (rdev );
47- unsigned int data ;
48- int ret , i ;
49-
50- mutex_lock (lock );
51-
52- regmap_write (rdev -> regmap , REG_POWERON , 1 );
53- msleep (80 );
63+ struct attiny_lcd * state = rdev_get_drvdata (rdev );
5464
55- /* Wait for nPWRDWN to go low to indicate poweron is done. */
56- for (i = 0 ; i < 20 ; i ++ ) {
57- ret = regmap_read (rdev -> regmap , REG_PORTB , & data );
58- if (!ret ) {
59- if (data & BIT (0 ))
60- break ;
61- }
62- usleep_range (10000 , 12000 );
63- }
64- usleep_range (10000 , 12000 );
65+ mutex_lock (& state -> lock );
6566
66- if (ret )
67- pr_err ("%s: regmap_read_poll_timeout failed %d\n" , __func__ , ret );
67+ /* Ensure bridge, and tp stay in reset */
68+ regmap_write (rdev -> regmap , REG_PORTC , 0 );
69+ usleep_range (5000 , 10000 );
6870
6971 /* Default to the same orientation as the closed source
7072 * firmware used for the panel. Runtime rotation
7173 * configuration will be supported using VC4's plane
7274 * orientation bits.
7375 */
74- regmap_write (rdev -> regmap , REG_PORTA , BIT (2 ));
76+ regmap_write (rdev -> regmap , REG_PORTA , PA_LCD_LR );
77+ usleep_range (5000 , 10000 );
78+ regmap_write (rdev -> regmap , REG_PORTB , PB_LCD_MAIN );
79+ usleep_range (5000 , 10000 );
80+ /* Bring controllers out of reset */
81+ regmap_write (rdev -> regmap , REG_PORTC ,
82+ PC_LED_EN | PC_RST_BRIDGE_N | PC_RST_LCD_N | PC_RST_TP_N );
83+
84+ msleep (80 );
85+
86+ regmap_write (rdev -> regmap , REG_ADDR_H , 0x04 );
87+ usleep_range (5000 , 8000 );
88+ regmap_write (rdev -> regmap , REG_ADDR_L , 0x7c );
89+ usleep_range (5000 , 8000 );
90+ regmap_write (rdev -> regmap , REG_WRITE_DATA_H , 0x00 );
91+ usleep_range (5000 , 8000 );
92+ regmap_write (rdev -> regmap , REG_WRITE_DATA_L , 0x00 );
93+
94+ msleep (100 );
7595
76- mutex_unlock (lock );
96+ mutex_unlock (& state -> lock );
7797
7898 return 0 ;
7999}
80100
81101static int attiny_lcd_power_disable (struct regulator_dev * rdev )
82102{
83- struct mutex * lock = rdev_get_drvdata (rdev );
103+ struct attiny_lcd * state = rdev_get_drvdata (rdev );
84104
85- mutex_lock (lock );
105+ mutex_lock (& state -> lock );
86106
87107 regmap_write (rdev -> regmap , REG_PWM , 0 );
88- regmap_write (rdev -> regmap , REG_POWERON , 0 );
108+ usleep_range (5000 , 10000 );
109+ regmap_write (rdev -> regmap , REG_PORTA , 0 );
110+ usleep_range (5000 , 10000 );
111+ regmap_write (rdev -> regmap , REG_PORTB , PB_LCD_VCC_N );
112+ usleep_range (5000 , 10000 );
113+ regmap_write (rdev -> regmap , REG_PORTC , 0 );
89114 msleep (30 );
90115
91- mutex_unlock (lock );
116+ mutex_unlock (& state -> lock );
92117
93118 return 0 ;
94119}
95120
96121static int attiny_lcd_power_is_enabled (struct regulator_dev * rdev )
97122{
98- struct mutex * lock = rdev_get_drvdata (rdev );
123+ struct attiny_lcd * state = rdev_get_drvdata (rdev );
99124 unsigned int data ;
100125 int ret , i ;
101126
102- mutex_lock (lock );
103-
104- for (i = 0 ; i < 10 ; i ++ ) {
105- ret = regmap_read (rdev -> regmap , REG_POWERON , & data );
106- if (!ret )
107- break ;
108- usleep_range (10000 , 12000 );
109- }
110- if (ret < 0 ) {
111- mutex_unlock (lock );
112- return ret ;
113- }
114-
115- if (!(data & BIT (0 ))) {
116- mutex_unlock (lock );
117- return 0 ;
118- }
127+ mutex_lock (& state -> lock );
119128
120129 for (i = 0 ; i < 10 ; i ++ ) {
121- ret = regmap_read (rdev -> regmap , REG_PORTB , & data );
130+ ret = regmap_read (rdev -> regmap , REG_PORTC , & data );
122131 if (!ret )
123132 break ;
124133 usleep_range (10000 , 12000 );
125134 }
126135
127- mutex_unlock (lock );
136+ mutex_unlock (& state -> lock );
128137
129138 if (ret < 0 )
130139 return ret ;
131140
132- return data & BIT ( 0 ) ;
141+ return data & PC_RST_BRIDGE_N ;
133142}
134143
135144static const struct regulator_init_data attiny_regulator_default = {
@@ -256,7 +265,7 @@ static int attiny_i2c_probe(struct i2c_client *i2c,
256265 config .regmap = regmap ;
257266 config .of_node = i2c -> dev .of_node ;
258267 config .init_data = & attiny_regulator_default ;
259- config .driver_data = & state -> lock ;
268+ config .driver_data = state ;
260269
261270 rdev = devm_regulator_register (& i2c -> dev , & attiny_regulator , & config );
262271 if (IS_ERR (rdev )) {
0 commit comments