static struct nouveau_i2c_port * init_i2c(struct nvbios_init *init, int index) { struct nouveau_i2c *i2c = nouveau_i2c(init->bios); if (index == 0xff) { index = NV_I2C_DEFAULT(0); if (init->outp && init->outp->i2c_upper_default) index = NV_I2C_DEFAULT(1); } else if (index < 0) { if (!init->outp) { if (init_exec(init)) error("script needs output for i2c\n"); return NULL; } if (index == -2 && init->outp->location) { index = NV_I2C_TYPE_EXTAUX(init->outp->extdev); return i2c->find_type(i2c, index); } index = init->outp->i2c_index; } return i2c->find(i2c, index); }
static int nv50_pior_dp_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *info, u32 index, struct nvkm_object **pobject) { struct nvkm_i2c *i2c = nvkm_i2c(parent); struct nvkm_output_dp *outp; int ret; ret = nvkm_output_dp_create(parent, engine, oclass, info, index, &outp); *pobject = nv_object(outp); if (ret) return ret; outp->base.edid = i2c->find_type(i2c, NV_I2C_TYPE_EXTAUX( outp->base.info.extdev)); return 0; }
port->addr = 0x3f; port->ctrl = 0x3b; break; default: BUG_ON(1); } if (mast->adapter.algo == &i2c_bit_algo) { struct i2c_algo_bit_data *algo = mast->adapter.algo_data; algo->udelay = max(algo->udelay, 40); } return 0; } static struct nouveau_ofuncs anx9805_ddc_ofuncs = { .ctor = anx9805_ddc_port_ctor, .dtor = _nouveau_i2c_port_dtor, .init = _nouveau_i2c_port_init, .fini = _nouveau_i2c_port_fini, }; struct nouveau_oclass nouveau_anx9805_sclass[] = { { .handle = NV_I2C_TYPE_EXTDDC(0x0d), .ofuncs = &anx9805_ddc_ofuncs }, { .handle = NV_I2C_TYPE_EXTAUX(0x0d), .ofuncs = &anx9805_aux_ofuncs }, { .handle = NV_I2C_TYPE_EXTDDC(0x0e), .ofuncs = &anx9805_ddc_ofuncs }, { .handle = NV_I2C_TYPE_EXTAUX(0x0e), .ofuncs = &anx9805_aux_ofuncs }, {} };