static int ch7006_probe(struct i2c_client *client, const struct i2c_device_id *id) { uint8_t addr = CH7006_VERSION_ID; uint8_t val; int ret; ch7006_dbg(client, "\n"); ret = i2c_master_send(client, &addr, sizeof(addr)); if (ret < 0) goto fail; ret = i2c_master_recv(client, &val, sizeof(val)); if (ret < 0) goto fail; ch7006_info(client, "Detected version ID: %x\n", val); /* I don't know what this is for, but otherwise I get no * signal. */ ch7006_write(client, 0x3d, 0x0); return 0; fail: ch7006_err(client, "Error %d reading version ID\n", ret); return -ENODEV; }
static enum drm_connector_status ch7006_encoder_detect(struct drm_encoder *encoder, struct drm_connector *connector) { struct i2c_client *client = drm_i2c_encoder_get_client(encoder); struct ch7006_priv *priv = to_ch7006_priv(encoder); struct ch7006_state *state = &priv->state; int det; ch7006_dbg(client, "\n"); ch7006_save_reg(client, state, CH7006_DETECT); ch7006_save_reg(client, state, CH7006_POWER); ch7006_save_reg(client, state, CH7006_CLKMODE); ch7006_write(client, CH7006_POWER, CH7006_POWER_RESET | bitfs(CH7006_POWER_LEVEL, NORMAL)); ch7006_write(client, CH7006_CLKMODE, CH7006_CLKMODE_MASTER); ch7006_write(client, CH7006_DETECT, CH7006_DETECT_SENSE); ch7006_write(client, CH7006_DETECT, 0); det = ch7006_read(client, CH7006_DETECT); ch7006_load_reg(client, state, CH7006_CLKMODE); ch7006_load_reg(client, state, CH7006_POWER); ch7006_load_reg(client, state, CH7006_DETECT); if ((det & (CH7006_DETECT_SVIDEO_Y_TEST| CH7006_DETECT_SVIDEO_C_TEST| CH7006_DETECT_CVBS_TEST)) == 0) priv->subconnector = DRM_MODE_SUBCONNECTOR_SCART; else if ((det & (CH7006_DETECT_SVIDEO_Y_TEST| CH7006_DETECT_SVIDEO_C_TEST)) == 0) priv->subconnector = DRM_MODE_SUBCONNECTOR_SVIDEO; else if ((det & CH7006_DETECT_CVBS_TEST) == 0) priv->subconnector = DRM_MODE_SUBCONNECTOR_Composite; else priv->subconnector = DRM_MODE_SUBCONNECTOR_Unknown; drm_connector_property_set_value(connector, encoder->dev->mode_config.tv_subconnector_property, priv->subconnector); return priv->subconnector ? connector_status_connected : connector_status_disconnected; }
static int ch7006_resume(struct i2c_client *client) { ch7006_dbg(client, "\n"); ch7006_write(client, 0x3d, 0x0); return 0; }
static int ch7006_resume(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); ch7006_dbg(client, "\n"); ch7006_write(client, 0x3d, 0x0); return 0; }