Lines Matching +full:bit +full:- +full:banging
2 * Copyright 2007-8 Advanced Micro Devices, Inc.
58 if (radeon_connector->router.ddc_valid) in radeon_ddc_probe()
62 ret = i2c_transfer(&radeon_connector->ddc_bus->aux.ddc, msgs, 2); in radeon_ddc_probe()
64 ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); in radeon_ddc_probe()
83 /* bit banging i2c */
88 struct radeon_device *rdev = i2c->dev->dev_private; in pre_xfer()
89 struct radeon_i2c_bus_rec *rec = &i2c->rec; in pre_xfer()
92 mutex_lock(&i2c->mutex); in pre_xfer()
95 * holds the i2c port in a bad state - switch hw i2c away before in pre_xfer()
96 * doing DDC - do this for all r200s/r300s/r400s for safety sake in pre_xfer()
98 if (rec->hw_capable) { in pre_xfer()
99 if ((rdev->family >= CHIP_R200) && !ASIC_IS_AVIVO(rdev)) { in pre_xfer()
102 if (rdev->family >= CHIP_RV350) in pre_xfer()
104 else if ((rdev->family == CHIP_R300) || in pre_xfer()
105 (rdev->family == CHIP_R350)) in pre_xfer()
110 mutex_lock(&rdev->dc_hw_i2c_mutex); in pre_xfer()
111 if (rec->a_clk_reg == reg) { in pre_xfer()
118 mutex_unlock(&rdev->dc_hw_i2c_mutex); in pre_xfer()
123 if (ASIC_IS_DCE3(rdev) && rec->hw_capable) { in pre_xfer()
124 temp = RREG32(rec->mask_clk_reg); in pre_xfer()
126 WREG32(rec->mask_clk_reg, temp); in pre_xfer()
130 temp = RREG32(rec->a_clk_reg) & ~rec->a_clk_mask; in pre_xfer()
131 WREG32(rec->a_clk_reg, temp); in pre_xfer()
133 temp = RREG32(rec->a_data_reg) & ~rec->a_data_mask; in pre_xfer()
134 WREG32(rec->a_data_reg, temp); in pre_xfer()
137 temp = RREG32(rec->en_clk_reg) & ~rec->en_clk_mask; in pre_xfer()
138 WREG32(rec->en_clk_reg, temp); in pre_xfer()
140 temp = RREG32(rec->en_data_reg) & ~rec->en_data_mask; in pre_xfer()
141 WREG32(rec->en_data_reg, temp); in pre_xfer()
144 temp = RREG32(rec->mask_clk_reg) | rec->mask_clk_mask; in pre_xfer()
145 WREG32(rec->mask_clk_reg, temp); in pre_xfer()
146 temp = RREG32(rec->mask_clk_reg); in pre_xfer()
148 temp = RREG32(rec->mask_data_reg) | rec->mask_data_mask; in pre_xfer()
149 WREG32(rec->mask_data_reg, temp); in pre_xfer()
150 temp = RREG32(rec->mask_data_reg); in pre_xfer()
158 struct radeon_device *rdev = i2c->dev->dev_private; in post_xfer()
159 struct radeon_i2c_bus_rec *rec = &i2c->rec; in post_xfer()
163 temp = RREG32(rec->mask_clk_reg) & ~rec->mask_clk_mask; in post_xfer()
164 WREG32(rec->mask_clk_reg, temp); in post_xfer()
165 temp = RREG32(rec->mask_clk_reg); in post_xfer()
167 temp = RREG32(rec->mask_data_reg) & ~rec->mask_data_mask; in post_xfer()
168 WREG32(rec->mask_data_reg, temp); in post_xfer()
169 temp = RREG32(rec->mask_data_reg); in post_xfer()
171 mutex_unlock(&i2c->mutex); in post_xfer()
177 struct radeon_device *rdev = i2c->dev->dev_private; in get_clock()
178 struct radeon_i2c_bus_rec *rec = &i2c->rec; in get_clock()
182 val = RREG32(rec->y_clk_reg); in get_clock()
183 val &= rec->y_clk_mask; in get_clock()
192 struct radeon_device *rdev = i2c->dev->dev_private; in get_data()
193 struct radeon_i2c_bus_rec *rec = &i2c->rec; in get_data()
197 val = RREG32(rec->y_data_reg); in get_data()
198 val &= rec->y_data_mask; in get_data()
206 struct radeon_device *rdev = i2c->dev->dev_private; in set_clock()
207 struct radeon_i2c_bus_rec *rec = &i2c->rec; in set_clock()
211 val = RREG32(rec->en_clk_reg) & ~rec->en_clk_mask; in set_clock()
212 val |= clock ? 0 : rec->en_clk_mask; in set_clock()
213 WREG32(rec->en_clk_reg, val); in set_clock()
219 struct radeon_device *rdev = i2c->dev->dev_private; in set_data()
220 struct radeon_i2c_bus_rec *rec = &i2c->rec; in set_data()
224 val = RREG32(rec->en_data_reg) & ~rec->en_data_mask; in set_data()
225 val |= data ? 0 : rec->en_data_mask; in set_data()
226 WREG32(rec->en_data_reg, val); in set_data()
233 u32 sclk = rdev->pm.current_sclk; in radeon_get_i2c_prescale()
239 switch (rdev->family) { in radeon_get_i2c_prescale()
258 n = loop - 1; in radeon_get_i2c_prescale()
259 m = loop - 2; in radeon_get_i2c_prescale()
282 if (rdev->family == CHIP_R520) in radeon_get_i2c_prescale()
318 /* hw i2c engine for r1xx-4xx hardware
325 struct radeon_device *rdev = i2c->dev->dev_private; in r100_hw_i2c_xfer()
326 struct radeon_i2c_bus_rec *rec = &i2c->rec; in r100_hw_i2c_xfer()
333 mutex_lock(&rdev->dc_hw_i2c_mutex); in r100_hw_i2c_xfer()
335 mutex_lock(&rdev->pm.mutex); in r100_hw_i2c_xfer()
345 if (rdev->is_atom_bios) { in r100_hw_i2c_xfer()
350 if (rec->mm_i2c) { in r100_hw_i2c_xfer()
359 switch (rdev->family) { in r100_hw_i2c_xfer()
366 switch (rec->mask_clk_reg) { in r100_hw_i2c_xfer()
368 /* no gpio select bit */ in r100_hw_i2c_xfer()
372 ret = -EINVAL; in r100_hw_i2c_xfer()
377 /* only bit 4 on r200 */ in r100_hw_i2c_xfer()
378 switch (rec->mask_clk_reg) { in r100_hw_i2c_xfer()
387 ret = -EINVAL; in r100_hw_i2c_xfer()
394 switch (rec->mask_clk_reg) { in r100_hw_i2c_xfer()
406 ret = -EINVAL; in r100_hw_i2c_xfer()
412 /* only bit 4 on r300/r350 */ in r100_hw_i2c_xfer()
413 switch (rec->mask_clk_reg) { in r100_hw_i2c_xfer()
422 ret = -EINVAL; in r100_hw_i2c_xfer()
434 switch (rec->mask_clk_reg) { in r100_hw_i2c_xfer()
446 ret = -EINVAL; in r100_hw_i2c_xfer()
452 ret = -EINVAL; in r100_hw_i2c_xfer()
460 if ((num == 1) && (p->len == 0)) { in r100_hw_i2c_xfer()
465 WREG32(i2c_data, (p->addr << 1) & 0xff); in r100_hw_i2c_xfer()
483 ret = -EIO; in r100_hw_i2c_xfer()
492 for (j = 0; j < p->len; j++) { in r100_hw_i2c_xfer()
493 if (p->flags & I2C_M_RD) { in r100_hw_i2c_xfer()
498 WREG32(i2c_data, ((p->addr << 1) & 0xff) | 0x1); in r100_hw_i2c_xfer()
515 ret = -EIO; in r100_hw_i2c_xfer()
519 p->buf[j] = RREG32(i2c_data) & 0xff; in r100_hw_i2c_xfer()
525 WREG32(i2c_data, (p->addr << 1) & 0xff); in r100_hw_i2c_xfer()
526 WREG32(i2c_data, p->buf[j]); in r100_hw_i2c_xfer()
543 ret = -EIO; in r100_hw_i2c_xfer()
559 if (rdev->is_atom_bios) { in r100_hw_i2c_xfer()
565 mutex_unlock(&rdev->pm.mutex); in r100_hw_i2c_xfer()
566 mutex_unlock(&rdev->dc_hw_i2c_mutex); in r100_hw_i2c_xfer()
578 struct radeon_device *rdev = i2c->dev->dev_private; in r500_hw_i2c_xfer()
579 struct radeon_i2c_bus_rec *rec = &i2c->rec; in r500_hw_i2c_xfer()
586 mutex_lock(&rdev->dc_hw_i2c_mutex); in r500_hw_i2c_xfer()
588 mutex_lock(&rdev->pm.mutex); in r500_hw_i2c_xfer()
593 tmp = RREG32(rec->mask_clk_reg); in r500_hw_i2c_xfer()
594 tmp &= ~rec->mask_clk_mask; in r500_hw_i2c_xfer()
595 WREG32(rec->mask_clk_reg, tmp); in r500_hw_i2c_xfer()
596 tmp = RREG32(rec->mask_clk_reg); in r500_hw_i2c_xfer()
598 tmp = RREG32(rec->mask_data_reg); in r500_hw_i2c_xfer()
599 tmp &= ~rec->mask_data_mask; in r500_hw_i2c_xfer()
600 WREG32(rec->mask_data_reg, tmp); in r500_hw_i2c_xfer()
601 tmp = RREG32(rec->mask_data_reg); in r500_hw_i2c_xfer()
604 tmp = RREG32(rec->a_clk_reg); in r500_hw_i2c_xfer()
605 tmp &= ~rec->a_clk_mask; in r500_hw_i2c_xfer()
606 WREG32(rec->a_clk_reg, tmp); in r500_hw_i2c_xfer()
607 tmp = RREG32(rec->a_clk_reg); in r500_hw_i2c_xfer()
609 tmp = RREG32(rec->a_data_reg); in r500_hw_i2c_xfer()
610 tmp &= ~rec->a_data_mask; in r500_hw_i2c_xfer()
611 WREG32(rec->a_data_reg, tmp); in r500_hw_i2c_xfer()
612 tmp = RREG32(rec->a_data_reg); in r500_hw_i2c_xfer()
615 tmp = RREG32(rec->en_clk_reg); in r500_hw_i2c_xfer()
616 tmp &= ~rec->en_clk_mask; in r500_hw_i2c_xfer()
617 WREG32(rec->en_clk_reg, tmp); in r500_hw_i2c_xfer()
618 tmp = RREG32(rec->en_clk_reg); in r500_hw_i2c_xfer()
620 tmp = RREG32(rec->en_data_reg); in r500_hw_i2c_xfer()
621 tmp &= ~rec->en_data_mask; in r500_hw_i2c_xfer()
622 WREG32(rec->en_data_reg, tmp); in r500_hw_i2c_xfer()
623 tmp = RREG32(rec->en_data_reg); in r500_hw_i2c_xfer()
640 ret = -EBUSY; in r500_hw_i2c_xfer()
645 switch (rec->mask_clk_reg) { in r500_hw_i2c_xfer()
657 ret = -EINVAL; in r500_hw_i2c_xfer()
663 if ((num == 1) && (p->len == 0)) { in r500_hw_i2c_xfer()
671 WREG32(AVIVO_DC_I2C_DATA, (p->addr << 1) & 0xff); in r500_hw_i2c_xfer()
691 ret = -EIO; in r500_hw_i2c_xfer()
700 remaining = p->len; in r500_hw_i2c_xfer()
702 if (p->flags & I2C_M_RD) { in r500_hw_i2c_xfer()
715 WREG32(AVIVO_DC_I2C_DATA, ((p->addr << 1) & 0xff) | 0x1); in r500_hw_i2c_xfer()
733 ret = -EIO; in r500_hw_i2c_xfer()
738 p->buf[buffer_offset + j] = RREG32(AVIVO_DC_I2C_DATA) & 0xff; in r500_hw_i2c_xfer()
739 remaining -= current_count; in r500_hw_i2c_xfer()
755 WREG32(AVIVO_DC_I2C_DATA, (p->addr << 1) & 0xff); in r500_hw_i2c_xfer()
757 WREG32(AVIVO_DC_I2C_DATA, p->buf[buffer_offset + j]); in r500_hw_i2c_xfer()
776 ret = -EIO; in r500_hw_i2c_xfer()
780 remaining -= current_count; in r500_hw_i2c_xfer()
801 mutex_unlock(&rdev->pm.mutex); in r500_hw_i2c_xfer()
802 mutex_unlock(&rdev->dc_hw_i2c_mutex); in r500_hw_i2c_xfer()
811 struct radeon_device *rdev = i2c->dev->dev_private; in radeon_hw_i2c_xfer()
812 struct radeon_i2c_bus_rec *rec = &i2c->rec; in radeon_hw_i2c_xfer()
815 mutex_lock(&i2c->mutex); in radeon_hw_i2c_xfer()
817 switch (rdev->family) { in radeon_hw_i2c_xfer()
849 if (rec->mm_i2c) in radeon_hw_i2c_xfer()
879 ret = -EIO; in radeon_hw_i2c_xfer()
883 mutex_unlock(&i2c->mutex); in radeon_hw_i2c_xfer()
907 struct radeon_device *rdev = dev->dev_private; in radeon_i2c_create()
912 if (rec->mm_i2c && (radeon_hw_i2c == 0)) in radeon_i2c_create()
919 i2c->rec = *rec; in radeon_i2c_create()
920 i2c->adapter.owner = THIS_MODULE; in radeon_i2c_create()
921 i2c->adapter.dev.parent = dev->dev; in radeon_i2c_create()
922 i2c->dev = dev; in radeon_i2c_create()
923 i2c_set_adapdata(&i2c->adapter, i2c); in radeon_i2c_create()
924 mutex_init(&i2c->mutex); in radeon_i2c_create()
925 if (rec->mm_i2c || in radeon_i2c_create()
926 (rec->hw_capable && in radeon_i2c_create()
928 ((rdev->family <= CHIP_RS480) || in radeon_i2c_create()
929 ((rdev->family >= CHIP_RV515) && (rdev->family <= CHIP_R580))))) { in radeon_i2c_create()
931 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), in radeon_i2c_create()
933 i2c->adapter.algo = &radeon_i2c_algo; in radeon_i2c_create()
934 ret = i2c_add_adapter(&i2c->adapter); in radeon_i2c_create()
937 } else if (rec->hw_capable && in radeon_i2c_create()
941 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), in radeon_i2c_create()
943 i2c->adapter.algo = &radeon_atom_i2c_algo; in radeon_i2c_create()
944 ret = i2c_add_adapter(&i2c->adapter); in radeon_i2c_create()
948 /* set the radeon bit adapter */ in radeon_i2c_create()
949 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), in radeon_i2c_create()
950 "Radeon i2c bit bus %s", name); in radeon_i2c_create()
951 i2c->adapter.algo_data = &i2c->bit; in radeon_i2c_create()
952 i2c->bit.pre_xfer = pre_xfer; in radeon_i2c_create()
953 i2c->bit.post_xfer = post_xfer; in radeon_i2c_create()
954 i2c->bit.setsda = set_data; in radeon_i2c_create()
955 i2c->bit.setscl = set_clock; in radeon_i2c_create()
956 i2c->bit.getsda = get_data; in radeon_i2c_create()
957 i2c->bit.getscl = get_clock; in radeon_i2c_create()
958 i2c->bit.udelay = 10; in radeon_i2c_create()
959 i2c->bit.timeout = usecs_to_jiffies(2200); /* from VESA */ in radeon_i2c_create()
960 i2c->bit.data = i2c; in radeon_i2c_create()
961 ret = i2c_bit_add_bus(&i2c->adapter); in radeon_i2c_create()
963 DRM_ERROR("Failed to register bit i2c %s\n", name); in radeon_i2c_create()
979 WARN_ON(i2c->has_aux); in radeon_i2c_destroy()
980 i2c_del_adapter(&i2c->adapter); in radeon_i2c_destroy()
990 if (rdev->is_atom_bios) in radeon_i2c_init()
1002 if (rdev->i2c_bus[i]) { in radeon_i2c_fini()
1003 radeon_i2c_destroy(rdev->i2c_bus[i]); in radeon_i2c_fini()
1004 rdev->i2c_bus[i] = NULL; in radeon_i2c_fini()
1018 if (!rdev->i2c_bus[i]) { in radeon_i2c_add()
1019 rdev->i2c_bus[i] = radeon_i2c_create(dev, rec, name); in radeon_i2c_add()
1032 if (rdev->i2c_bus[i] && in radeon_i2c_lookup()
1033 (rdev->i2c_bus[i]->rec.i2c_id == i2c_bus->i2c_id)) { in radeon_i2c_lookup()
1034 return rdev->i2c_bus[i]; in radeon_i2c_lookup()
1065 if (i2c_transfer(&i2c_bus->adapter, msgs, 2) == 2) { in radeon_i2c_get_byte()
1090 if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1) in radeon_i2c_put_byte()
1100 if (!radeon_connector->router.ddc_valid) in radeon_router_select_ddc_port()
1103 if (!radeon_connector->router_bus) in radeon_router_select_ddc_port()
1106 radeon_i2c_get_byte(radeon_connector->router_bus, in radeon_router_select_ddc_port()
1107 radeon_connector->router.i2c_addr, in radeon_router_select_ddc_port()
1109 val &= ~radeon_connector->router.ddc_mux_control_pin; in radeon_router_select_ddc_port()
1110 radeon_i2c_put_byte(radeon_connector->router_bus, in radeon_router_select_ddc_port()
1111 radeon_connector->router.i2c_addr, in radeon_router_select_ddc_port()
1113 radeon_i2c_get_byte(radeon_connector->router_bus, in radeon_router_select_ddc_port()
1114 radeon_connector->router.i2c_addr, in radeon_router_select_ddc_port()
1116 val &= ~radeon_connector->router.ddc_mux_control_pin; in radeon_router_select_ddc_port()
1117 val |= radeon_connector->router.ddc_mux_state; in radeon_router_select_ddc_port()
1118 radeon_i2c_put_byte(radeon_connector->router_bus, in radeon_router_select_ddc_port()
1119 radeon_connector->router.i2c_addr, in radeon_router_select_ddc_port()
1128 if (!radeon_connector->router.cd_valid) in radeon_router_select_cd_port()
1131 if (!radeon_connector->router_bus) in radeon_router_select_cd_port()
1134 radeon_i2c_get_byte(radeon_connector->router_bus, in radeon_router_select_cd_port()
1135 radeon_connector->router.i2c_addr, in radeon_router_select_cd_port()
1137 val &= ~radeon_connector->router.cd_mux_control_pin; in radeon_router_select_cd_port()
1138 radeon_i2c_put_byte(radeon_connector->router_bus, in radeon_router_select_cd_port()
1139 radeon_connector->router.i2c_addr, in radeon_router_select_cd_port()
1141 radeon_i2c_get_byte(radeon_connector->router_bus, in radeon_router_select_cd_port()
1142 radeon_connector->router.i2c_addr, in radeon_router_select_cd_port()
1144 val &= ~radeon_connector->router.cd_mux_control_pin; in radeon_router_select_cd_port()
1145 val |= radeon_connector->router.cd_mux_state; in radeon_router_select_cd_port()
1146 radeon_i2c_put_byte(radeon_connector->router_bus, in radeon_router_select_cd_port()
1147 radeon_connector->router.i2c_addr, in radeon_router_select_cd_port()