1 #include <linux/kernel.h>
2 #include <linux/module.h>
4 #include <linux/seq_file.h>
5 #include <linux/time.h>
6 #include <linux/delay.h>
7 #include <linux/slab.h>
8 #include <linux/device.h>
10 #include <linux/gpio.h>
11 #include <linux/dp501.h>
12 #include <linux/debugfs.h>
16 static int dp501_write_reg(struct i2c_client *client,char index,char reg,char val)
19 if(index == 0) //page 0
21 client->addr = (DP501_P0_ADDR >> 1);
23 else if(index == 1) //page1
25 client->addr = (DP501_P1_ADDR >> 1);
27 else if(index == 2) //page 2
29 client->addr = (DP501_P2_ADDR >> 1);
33 client->addr = (DP501_P3_ADDR >> 1);
37 dev_err(&client->dev,"invalid page number\n");
40 ret = i2c_master_reg8_send(client, reg, &val, 1,DP501_SCL_RATE);
44 dev_err(&client->dev,"%s page%d:0x%x err\n",__func__,index,reg);
52 static char dp501_read_reg(struct i2c_client *client,char index,char reg)
56 if(index == 0) //page 0
58 client->addr = (DP501_P0_ADDR >> 1);
60 else if(index == 1) //page1
62 client->addr = (DP501_P1_ADDR>>1);
64 else if(index == 2) //page 2
66 client->addr = (DP501_P2_ADDR>>1);
70 client->addr = (DP501_P3_ADDR>>1);
74 dev_err(&client->dev,"invalid page number\n");
79 ret = i2c_master_reg8_recv(client, reg, &val, 1, DP501_SCL_RATE);
82 dev_err(&client->dev,"%s page%d:0x%x err\n",__func__,index,reg);
89 static int get_dp_chip_id(struct i2c_client *client)
93 c1 = dp501_read_reg(client,2,CHIP_ID_L);
94 c2 = dp501_read_reg(client,2,CHIP_ID_H);
100 static int dp501_init(struct i2c_client *client)
104 dp501_write_reg(client,2,0x00,0x6C);
105 dp501_write_reg(client,2,0x01,0x68);
106 dp501_write_reg(client,2,0x02,0x28);
107 dp501_write_reg(client,2,0x03,0x2A);
108 dp501_write_reg(client,2,0x16,0x50);
109 dp501_write_reg(client,2,0x24,0x22);
110 dp501_write_reg(client,2,0x25,0x04);
111 dp501_write_reg(client,2,0x26,0x10); //PIO setting
113 dp501_write_reg(client,0,0x0a,0x0c); //block 74 & 76
114 dp501_write_reg(client,0,0x20,0x00);
115 dp501_write_reg(client,0,0x27,0x30); //auto detect CRTC
116 dp501_write_reg(client,0,0x2f,0x82); //reset tpfifo at v blank
117 dp501_write_reg(client,0,0x24,0xc0); //DVO mapping ; crtc follow mode
118 dp501_write_reg(client,0,0x28,0x07); //crtc follow mode
119 dp501_write_reg(client,0,0x87,0x7f); //aux retry
120 dp501_write_reg(client,0,0x88,0x1e); //aux retry
121 dp501_write_reg(client,0,0xbb,0x06); //aux retry
122 dp501_write_reg(client,0,0x72,0xa9); //DPCD readable
123 dp501_write_reg(client,0,0x60,0x00); //Scramble on
124 dp501_write_reg(client,0,0x8f,0x02); //debug select, read P0.0x8d[2] can check HPD
127 //second, set up training
128 dp501_write_reg(client,0,0x5d,0x06); //training link rate(2.7Gbps)
129 dp501_write_reg(client,0,0x5e,0x84); //training lane count(4Lanes),
130 dp501_write_reg(client,0,0x74,0x00); //idle pattern
131 dp501_write_reg(client,0,0x5f,0x0d); //trigger training
132 mdelay(100); //delay 100ms
134 //then, check training result
135 val = dp501_read_reg(client,0,0x63);
136 val1 = dp501_read_reg(client,0,0x64); //Each 4bits stand for one lane, 0x77/0x77 means training succeed with 4Lanes.
137 dev_info(&client->dev,"training result:>>val:0x%x>>val1:0x%x\n",val,val1);
144 static int edp_reg_show(struct seq_file *s, void *v)
148 struct dp501 *dp501= s->private;
150 seq_printf(s,"page 0:\n");
151 for(i=0;i< MAX_REG;i++)
153 val = dp501_read_reg(dp501->client,0,i);
154 seq_printf(s,"0x%02x>>0x%02x\n",i,val);
157 seq_printf(s,"page 1:\n");
158 for(i=0;i< MAX_REG;i++)
160 val = dp501_read_reg(dp501->client,1,i);
161 seq_printf(s,"0x%02x>>0x%02x\n",i,val);
164 seq_printf(s,"page 2:\n");
165 for(i=0;i< MAX_REG;i++)
167 val = dp501_read_reg(dp501->client,0,i);
168 seq_printf(s,"0x%02x>>0x%02x\n",2,val);
171 seq_printf(s,"page 3:\n");
172 for(i=0;i< MAX_REG;i++)
174 val = dp501_read_reg(dp501->client,3,i);
175 seq_printf(s,"0x%02x>>0x%02x\n",i,val);
181 static int edp_reg_open(struct inode *inode, struct file *file)
183 struct dp501 *dp501 = inode->i_private;
184 return single_open(file,edp_reg_show,dp501);
187 static const struct file_operations edp_reg_fops = {
188 .owner = THIS_MODULE,
189 .open = edp_reg_open,
192 .release = single_release,
195 #ifdef CONFIG_HAS_EARLYSUSPEND
196 static void dp501_early_suspend(struct early_suspend *h)
198 struct dp501 *dp501 = container_of(h, struct dp501, early_suspend);
199 gpio_set_value(dp501->pdata->dvdd33_en_pin,!dp501->pdata->dvdd33_en_val);
200 gpio_set_value(dp501->pdata->dvdd18_en_pin,!dp501->pdata->dvdd18_en_val);
204 static void dp501_late_resume(struct early_suspend *h)
206 struct dp501 *dp501 = container_of(h, struct dp501, early_suspend);
207 gpio_set_value(dp501->pdata->dvdd33_en_pin,dp501->pdata->dvdd33_en_val);
208 gpio_set_value(dp501->pdata->dvdd18_en_pin,dp501->pdata->dvdd18_en_val);
209 gpio_set_value(dp501->pdata->edp_rst_pin,0);
211 gpio_set_value(dp501->pdata->edp_rst_pin,1);
212 dp501->edp_init(dp501->client);
215 static int dp501_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
219 struct dp501 *dp501 = NULL;
223 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
225 dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");
228 dp501 = kzalloc(sizeof(struct dp501), GFP_KERNEL);
231 dev_err(&client->dev,"alloc for struct dp501 fail\n");
235 dp501->client = client;
236 dp501->pdata = client->dev.platform_data;
237 i2c_set_clientdata(client,dp501);
238 if(dp501->pdata->power_ctl)
239 dp501->pdata->power_ctl();
241 debugfs_create_file("edp-reg", S_IRUSR,NULL,dp501,&edp_reg_fops);
243 #ifdef CONFIG_HAS_EARLYSUSPEND
244 dp501->early_suspend.suspend = dp501_early_suspend;
245 dp501->early_suspend.resume = dp501_late_resume;
246 dp501->early_suspend.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING;
247 register_early_suspend(&dp501->early_suspend);
250 chip_id = get_dp_chip_id(client);
251 dp501->edp_init = dp501_init;
252 dp501->edp_init(client);
255 printk("edp dp%x probe ok\n",chip_id);
260 static int __devexit dp501_i2c_remove(struct i2c_client *client)
266 static const struct i2c_device_id id_table[] = {
271 static struct i2c_driver dp501_i2c_driver = {
274 .owner = THIS_MODULE,
276 .probe = &dp501_i2c_probe,
277 .remove = &dp501_i2c_remove,
278 .id_table = id_table,
282 static int __init dp501_module_init(void)
284 return i2c_add_driver(&dp501_i2c_driver);
287 static void __exit dp501_module_exit(void)
289 i2c_del_driver(&dp501_i2c_driver);
292 fs_initcall_sync(dp501_module_init);
293 module_exit(dp501_module_exit);