1 #include <linux/module.h>
2 #include <linux/kernel.h>
3 #include <linux/delay.h>
5 #include <linux/display-sys.h>
6 #include <linux/rk_screen.h>
7 #include <linux/rk_fb.h>
10 #include <linux/of_gpio.h>
13 #include "../../edid.h"
16 #include <linux/switch.h>
21 #define DDC_I2C_RATE 100*1000
22 #define INVALID_GPIO -1
25 #define DISPLAY_SOURCE_LCDC0 0
26 #define DISPLAY_SOURCE_LCDC1 1
28 //static char *vgaenvent[] = {"INTERFACE=VGA", NULL};
30 static const struct fb_videomode rk29_mode[] = {
31 //name refresh xres yres pixclock h_bp h_fp v_bp v_fp h_pw v_pw polariry PorI flag(used for vic)
32 { "1024x768p@60Hz", 60, 1024, 768, KHZ2PICOS(65000), 160, 24, 29, 3, 136, 6, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0 },
33 { "1280x720p@60Hz", 60, 1280, 720, KHZ2PICOS(74250), 220, 110, 20, 5, 40, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0 },
34 { "1280x1024p@60Hz", 60, 1280, 1024, KHZ2PICOS(108000), 248, 48, 38, 1, 112, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0 },
35 { "1366x768p@60Hz", 60, 1366, 768, KHZ2PICOS(85500), 213, 70, 24, 3, 143, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0 },
36 { "1440x900p@60Hz", 60, 1440, 900, KHZ2PICOS(116500), 232, 80, 25, 3, 152, 6, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0 },
37 { "1680x1050p@60Hz", 60, 1680, 1050, KHZ2PICOS(146250), 280, 104, 30, 3, 176, 6, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0 },
38 { "1920x1080p@60Hz", 60, 1920, 1080, KHZ2PICOS(148500), 148, 88, 36, 4, 44, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0 },
42 struct device *dev; /*i2c device*/
43 struct rk_display_device *ddev; /*display device*/
44 struct i2c_client *client;
45 struct list_head modelist;
46 struct fb_monspecs specs;
47 struct rk_screen screen;
53 struct switch_dev switch_vga;
57 static int i2c_master_reg8_recv(const struct i2c_client *client,
58 const char reg, char *buf, int count, int scl_rate)
60 struct i2c_adapter *adap=client->adapter;
61 struct i2c_msg msgs[2];
65 msgs[0].addr = client->addr;
66 msgs[0].flags = client->flags;
68 msgs[0].buf = ®_buf;
69 msgs[0].scl_rate = scl_rate;
71 msgs[1].addr = client->addr;
72 msgs[1].flags = client->flags | I2C_M_RD;
74 msgs[1].buf = (char *)buf;
75 msgs[1].scl_rate = scl_rate;
77 ret = i2c_transfer(adap, msgs, 2);
79 return (ret == 2)? count : ret;
84 static unsigned char *rk29fb_ddc_read(struct i2c_client *client)
87 unsigned char *buf = kzalloc(EDID_LENGTH, GFP_KERNEL);
89 dev_err(&client->dev, "unable to allocate memory for EDID\n");
93 /*Check ddc i2c communication is available or not*/
94 rc = i2c_master_reg8_recv(client, 0, buf, 6, DDC_I2C_RATE);
96 memset(buf, 0, EDID_LENGTH);
97 rc = i2c_master_reg8_recv(client, 0, buf, EDID_LENGTH, DDC_I2C_RATE);
102 dev_err(&client->dev, "unable to read EDID block.\n");
107 static int vga_mode2screen(struct fb_videomode *modedb, struct rk_screen *screen)
109 if(modedb == NULL || screen == NULL)
112 memset(screen, 0, sizeof(struct rk_screen));
113 memcpy(&screen->mode, modedb, sizeof(*modedb));
114 screen->mode.pixclock = PICOS2KHZ(screen->mode.pixclock);
115 screen->mode.pixclock /= 250;
116 screen->mode.pixclock *= 250;
117 screen->mode.pixclock *= 1000;
118 screen->xsize = screen->mode.xres;
119 screen->ysize = screen->mode.yres;
120 screen->overscan.left = 100;
121 screen->overscan.top = 100;
122 screen->overscan.right = 100;
123 screen->overscan.bottom = 100;
124 /* screen type & face */
125 screen->type = SCREEN_RGB;
126 screen->face = OUT_P888;
128 screen->pin_vsync = (screen->mode.sync & FB_SYNC_VERT_HIGH_ACT) ? 1:0;
129 screen->pin_hsync = (screen->mode.sync & FB_SYNC_HOR_HIGH_ACT) ? 1:0;
131 screen->pin_dclk = 0;
137 screen->swap_delta = 0;
138 screen->swap_dumy = 0;
139 /* Operation function*/
141 screen->standby = NULL;
146 static int vga_switch_screen(struct rockchip_vga *vga, int indx)
148 struct fb_videomode *mode = &vga->specs.modedb[indx];
149 struct rk_screen *screen = &vga->screen;
150 vga_mode2screen(mode, screen);
151 rk_fb_switch_screen(screen, 1 ,vga->lcdc_id);
157 static int vga_get_screen_info(struct rockchip_vga *vga)
161 struct fb_monspecs *specs = &vga->specs;
162 struct list_head *modelist = &vga->modelist;
163 edid = rk29fb_ddc_read(vga->client);
165 dev_info(vga->dev, "get edid failed!\n");
168 fb_edid_to_monspecs(edid,specs);
169 INIT_LIST_HEAD(modelist);
170 for (i = 0; i < specs->modedb_len; i++) {
171 fb_add_videomode(&specs->modedb[i], modelist);
172 dev_dbg(vga->dev, "%4dx%4d@%d---dclk:%ld\n",
173 specs->modedb[i].xres, specs->modedb[i].yres,
174 specs->modedb[i].refresh,
175 (PICOS2KHZ(specs->modedb[i].pixclock)/250)*250*1000);
183 static int vga_get_modelist(struct rk_display_device *device,
184 struct list_head **modelist)
186 struct rockchip_vga *vga = device->priv_data;
187 *modelist = &vga->modelist;
191 static int vga_set_mode(struct rk_display_device *device,
192 struct fb_videomode *mode)
194 struct rockchip_vga *vga = device->priv_data;
195 struct rk_screen *screen = &vga->screen;
196 vga_mode2screen(mode, screen);
197 rk_fb_switch_screen(screen, 1 ,vga->lcdc_id);
201 static int vga_get_mode(struct rk_display_device *device,
202 struct fb_videomode *mode)
204 //struct vga *vga = device->priv_data;
205 //struct fb_videomode *vmode;
210 struct rk_display_ops vga_display_ops = {
211 .getmodelist = vga_get_modelist,
212 .setmode = vga_set_mode,
213 .getmode = vga_get_mode,
216 static int vga_display_probe(struct rk_display_device *device, void *devdata)
218 device->owner = THIS_MODULE;
219 strcpy(device->type, "VGA");
220 device->priority = DISPLAY_PRIORITY_VGA;
221 device->priv_data = devdata;
222 device->ops = &vga_display_ops;
226 static struct rk_display_driver display_vga = {
227 .probe = vga_display_probe,
232 struct rk_display_device * vga_register_display_sysfs(struct rockchip_vga *vga)
234 return rk_display_device_register(&display_vga, vga->dev, vga);
237 void vga_unregister_display_sysfs(struct rockchip_vga *vga)
240 rk_display_device_unregister(vga->ddev);
244 static int vga_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
247 struct rockchip_vga *vga;
248 struct device_node *np = client->dev.of_node;
249 enum of_gpio_flags pwr_flags;
252 dev_err(&client->dev, "no device node found!\n");
256 vga = devm_kzalloc(&client->dev, sizeof(*vga), GFP_KERNEL);
258 dev_err(&client->dev, "allocate for vga failed!\n");
262 vga->client = client;
263 vga->dev = &client->dev;
264 i2c_set_clientdata(client, vga);
265 vga->ddev = vga_register_display_sysfs(vga);
266 if (IS_ERR(vga->ddev))
267 dev_warn(vga->dev, "Unable to create device for vga :%ld",
270 vga->en_pin = of_get_named_gpio_flags(np, "pwr_gpio", 0, &pwr_flags);
271 if (!gpio_is_valid(vga->en_pin)) {
272 dev_err(vga->dev, "failed to get pwr_gpio!\n");
277 vga->en_val = (pwr_flags & OF_GPIO_ACTIVE_LOW) ? 0 : 1;
278 vga->lcdc_id = DISPLAY_SOURCE_LCDC1;
280 ret = devm_gpio_request(vga->dev, vga->en_pin, "pwr_pin");
282 dev_err(vga->dev, "request for pwr_pin failed!\n ");
285 gpio_direction_output(vga->en_pin, vga->en_val);
286 ret = vga_get_screen_info(vga);
289 vga_switch_screen(vga, 7);
291 printk("VGA probe successful\n");
294 vga_unregister_display_sysfs(vga);
300 static int vga_i2c_remove(struct i2c_client *client)
306 #if defined(CONFIG_OF)
307 static struct of_device_id vga_dt_ids[] = {
308 {.compatible = "rockchip,vga" },
313 static const struct i2c_device_id vga_id[] = {
318 static struct i2c_driver vga_i2c_driver = {
321 .owner = THIS_MODULE,
322 #if defined(CONFIG_OF)
323 .of_match_table = of_match_ptr(vga_dt_ids),
326 .probe = &vga_i2c_probe,
327 .remove = &vga_i2c_remove,
331 static int __init rockchip_vga_init(void)
333 return i2c_add_driver(&vga_i2c_driver);
336 static void __exit rockchip_vga_exit(void)
338 i2c_del_driver(&vga_i2c_driver);
341 module_init(rockchip_vga_init);
342 module_exit(rockchip_vga_exit);