static int hdmi_read_edid(struct omap_dss_device *dssdev, u8 *edid, int len) { bool need_enable; int r; need_enable = hdmi.core_enabled == false; if (need_enable) { r = hdmi_core_enable(dssdev); if (r) return r; } r = read_edid(edid, len); if (need_enable) hdmi_core_disable(dssdev); return r; }
static int handle_edid(int *pixclk) { #if 0 int err = 0; int dvi = 0; int fb0 = 0; int fb1 = 1; struct fb_var_screeninfo screeninfo; struct i2c_adapter *adp; memset(&screeninfo, 0, sizeof(screeninfo)); adp = i2c_get_adapter(1); if (cpu_is_mx51_rev(CHIP_REV_3_0) > 0) { gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_CSI2_HSYNC), 1); msleep(1); } err = read_edid(adp, &screeninfo, &dvi); if (cpu_is_mx51_rev(CHIP_REV_3_0) > 0) gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_CSI2_HSYNC), 0); if (!err) { printk(KERN_INFO " EDID read\n"); if (!dvi) { enable_vga = 1; fb0 = 1; /* fb0 will be VGA */ fb1 = 0; /* fb1 will be DVI or TV */ } /* Handle TV modes */ /* This logic is fairly complex yet still doesn't handle all possibilities. Once a customer knows the platform configuration, this should be simplified to what is desired. */ if (screeninfo.xres == 1920 && screeninfo.yres != 1200) { /* MX51 can't handle clock speeds for anything larger.*/ if (!enable_tv) enable_tv = 1; if (enable_vga || enable_wvga || enable_tv == 2) enable_tv = 2; fb_data[0].mode = &(video_modes[0]); if (!enable_wvga) fb_data[1].mode_str = "800x600M-16@60"; } else if (screeninfo.xres > 1280 && screeninfo.yres > 1024) { if (!enable_wvga) { fb_data[fb0].mode_str = "1280x1024M-16@60"; fb_data[fb1].mode_str = NULL; } else { /* WVGA is preset so the DVI can't be > this. */ fb_data[0].mode_str = "1024x768M-16@60"; } } else if (screeninfo.xres > 0 && screeninfo.yres > 0) { if (!enable_wvga) { fb_data[fb0].mode = kzalloc(sizeof(struct fb_videomode), GFP_KERNEL); fb_var_to_videomode(fb_data[fb0].mode, &screeninfo); fb_data[fb0].mode_str = NULL; if (screeninfo.xres >= 1280 && screeninfo.yres > 720) fb_data[fb1].mode_str = NULL; else if (screeninfo.xres > 1024 && screeninfo.yres > 768) fb_data[fb1].mode_str = "800x600M-16@60"; else if (screeninfo.xres > 800 && screeninfo.yres > 600) fb_data[fb1].mode_str = "1024x768M-16@60"; } else { /* A WVGA panel was specified and an EDID was read thus there is a DVI monitor attached. */ if (screeninfo.xres >= 1024) fb_data[0].mode_str = "1024x768M-16@60"; else if (screeninfo.xres >= 800) fb_data[0].mode_str = "800x600M-16@60"; else fb_data[0].mode_str = "640x480M-16@60"; } } } #endif return 0; }
static ssize_t tda19988_blk_transfer(devminor_t minor, int do_write, u64_t pos64, endpoint_t endpt, iovec_t * iov, unsigned int nr_req, int flags) { unsigned count; struct device *dv; u64_t dv_size; int r; cp_grant_id_t grant; log_trace(&log, "tda19988_blk_transfer()\n"); /* Get minor device information. */ dv = tda19988_blk_part(minor); if (dv == NULL) { return ENXIO; } if (nr_req > NR_IOREQS) { return EINVAL; } dv_size = dv->dv_size; if (pos64 >= dv_size) { return OK; /* Beyond EOF */ } if (nr_req > 0) { /* How much to transfer and where to / from. */ count = iov->iov_size; grant = (cp_grant_id_t) iov->iov_addr; /* check for EOF */ if (pos64 >= dv_size) { return 0; } /* don't go past the end of the device */ if (pos64 + count > dv_size) { count = dv_size - pos64; } /* don't overflow copybuf */ if (count > COPYBUF_SIZE) { count = COPYBUF_SIZE; } log_debug(&log, "transfering 0x%x bytes\n", count); if (do_write) { log_warn(&log, "Error: writing to read-only device\n"); return EACCES; } else { if (is_display_connected() == 1) { r = hdmi_init(); if (r != OK) { log_warn(&log, "Failed to enable HDMI module\n"); return EIO; } memset(copybuf, '\0', COPYBUF_SIZE); r = read_edid(copybuf, count); if (r != OK) { log_warn(&log, "read_edid() failed (r=%d)\n", r); return r; } r = sys_safecopyto(endpt, grant, (vir_bytes) 0, (vir_bytes) copybuf, count); if (r != OK) { log_warn(&log, "safecopyto failed\n"); return EINVAL; } return iov->iov_size; } else { log_warn(&log, "Display not connected.\n"); return ENODEV; } } } else { /* empty request */ return 0; } }