static void hdmi_hotplug_detect_worker(struct work_struct *work) { struct hpd_worker_data *d = container_of(work, typeof(*d), dwork.work); int state = atomic_read(&d->state); // struct omap_dss_device *dssdev = get_hdmi_device(); // HDMIDBG("in hpd work %d, state=%d\n", state, dssdev->state); pr_err("in hpd work %d, state=%d\n", state, dssdev->state); if (dssdev == NULL) return; mutex_lock(&hdmi.hdmi_lock); if (state == HPD_STATE_OFF) { switch_set_state(&hdmi.hpd_switch, 0); hdmi_inform_hpd_to_cec(false); if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { mutex_unlock(&hdmi.hdmi_lock); dssdev->driver->disable(dssdev); omapdss_hdmi_enable_s3d(false); mutex_lock(&hdmi.hdmi_lock); } goto done; } else { if (state == HPD_STATE_START) { mutex_unlock(&hdmi.hdmi_lock); dssdev->driver->enable(dssdev); mutex_lock(&hdmi.hdmi_lock); } else if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE || hdmi.hpd_switch.state) { /* powered down after enable - skip EDID read */ goto done; } else if (hdmi_read_edid(&dssdev->panel.timings)) { /* get monspecs from edid */ hdmi_get_monspecs(&dssdev->panel.monspecs); pr_info("panel size %d by %d\n", dssdev->panel.monspecs.max_x, dssdev->panel.monspecs.max_y); HDMIDBG("panel size %d by %d\n", dssdev->panel.monspecs.max_x, dssdev->panel.monspecs.max_y); dssdev->panel.width_in_um = dssdev->panel.monspecs.max_x * 10000; dssdev->panel.height_in_um = dssdev->panel.monspecs.max_y * 10000; hdmi_inform_hpd_to_cec(true); switch_set_state(&hdmi.hpd_switch, 1); goto done; } else if (state == HPD_STATE_EDID_TRYLAST){ pr_info("Failed to read EDID after %d times. Giving up.", state - HPD_STATE_START); goto done; } if (atomic_add_unless(&d->state, 1, HPD_STATE_OFF)) queue_delayed_work(my_workq, &d->dwork, msecs_to_jiffies(60)); } done: mutex_unlock(&hdmi.hdmi_lock); }
// // ADD : for Hidden Menu static ssize_t hdmi_bestScore_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct omap_dss_device *dssdev = get_hdmi_device(); if(!buf) { DSSERR("failed to store the score\n"); return size; } nbestScore = simple_strtoul(buf, NULL, 10); kobject_uevent(&dssdev->dev.kobj, KOBJ_ADD); return size; }