Lines Matching +full:bit +full:- +full:banging

3  * Copyright © 2006-2008,2010 Intel Corporation
27 * Chris Wilson <chris@chris-wilson.co.uk>
31 #include <linux/i2c-algo-bit.h>
218 /* When using bit bashing for I2C, this bit needs to be set to 1 */ in pnv_gmbus_clock_gating()
239 struct drm_i915_private *i915 = bus->i915; in get_reserved()
244 reserved = intel_de_read_notrace(i915, bus->gpio_reg) & in get_reserved()
253 struct drm_i915_private *i915 = bus->i915; in get_clock()
256 intel_de_write_notrace(i915, bus->gpio_reg, reserved | GPIO_CLOCK_DIR_MASK); in get_clock()
257 intel_de_write_notrace(i915, bus->gpio_reg, reserved); in get_clock()
259 return (intel_de_read_notrace(i915, bus->gpio_reg) & GPIO_CLOCK_VAL_IN) != 0; in get_clock()
265 struct drm_i915_private *i915 = bus->i915; in get_data()
268 intel_de_write_notrace(i915, bus->gpio_reg, reserved | GPIO_DATA_DIR_MASK); in get_data()
269 intel_de_write_notrace(i915, bus->gpio_reg, reserved); in get_data()
271 return (intel_de_read_notrace(i915, bus->gpio_reg) & GPIO_DATA_VAL_IN) != 0; in get_data()
277 struct drm_i915_private *i915 = bus->i915; in set_clock()
287 intel_de_write_notrace(i915, bus->gpio_reg, reserved | clock_bits); in set_clock()
288 intel_de_posting_read(i915, bus->gpio_reg); in set_clock()
294 struct drm_i915_private *i915 = bus->i915; in set_data()
304 intel_de_write_notrace(i915, bus->gpio_reg, reserved | data_bits); in set_data()
305 intel_de_posting_read(i915, bus->gpio_reg); in set_data()
312 struct drm_i915_private *i915 = bus->i915; in intel_gpio_pre_xfer()
329 struct drm_i915_private *i915 = bus->i915; in intel_gpio_post_xfer()
343 algo = &bus->bit_algo; in intel_gpio_setup()
345 bus->gpio_reg = gpio_reg; in intel_gpio_setup()
346 bus->adapter.algo_data = algo; in intel_gpio_setup()
347 algo->setsda = set_data; in intel_gpio_setup()
348 algo->setscl = set_clock; in intel_gpio_setup()
349 algo->getsda = get_data; in intel_gpio_setup()
350 algo->getscl = get_clock; in intel_gpio_setup()
351 algo->pre_xfer = intel_gpio_pre_xfer; in intel_gpio_setup()
352 algo->post_xfer = intel_gpio_post_xfer; in intel_gpio_setup()
353 algo->udelay = I2C_RISEFALL_TIME; in intel_gpio_setup()
354 algo->timeout = usecs_to_jiffies(2200); in intel_gpio_setup()
355 algo->data = bus; in intel_gpio_setup()
361 * encoder->shutdown() may want to use GMBUS in has_gmbus_irq()
373 /* Important: The hw handles only the first bit, so set only one! Since in gmbus_wait()
380 add_wait_queue(&i915->display.gmbus.wait_queue, &wait); in gmbus_wait()
391 remove_wait_queue(&i915->display.gmbus.wait_queue, &wait); in gmbus_wait()
394 return -ENXIO; in gmbus_wait()
406 /* Important: The hw handles only the first bit, so set only one! */ in gmbus_wait_idle()
411 add_wait_queue(&i915->display.gmbus.wait_queue, &wait); in gmbus_wait_idle()
417 remove_wait_queue(&i915->display.gmbus.wait_queue, &wait); in gmbus_wait_idle()
468 } while (--len && ++loop < 4); in gmbus_xfer_read_chunk()
470 if (burst_read && len == size - 4) in gmbus_xfer_read_chunk()
471 /* Reset the override bit */ in gmbus_xfer_read_chunk()
492 u8 *buf = msg->buf; in gmbus_xfer_read()
493 unsigned int rx_size = msg->len; in gmbus_xfer_read()
503 ret = gmbus_xfer_read_chunk(i915, msg->addr, buf, len, in gmbus_xfer_read()
508 rx_size -= len; in gmbus_xfer_read()
526 len -= 1; in gmbus_xfer_write_chunk()
538 } while (--len && ++loop < 4); in gmbus_xfer_write_chunk()
554 u8 *buf = msg->buf; in gmbus_xfer_write()
555 unsigned int tx_size = msg->len; in gmbus_xfer_write()
562 ret = gmbus_xfer_write_chunk(i915, msg->addr, buf, len, in gmbus_xfer_write()
568 tx_size -= len; in gmbus_xfer_write()
603 /* GMBUS5 holds 16-bit index */ in gmbus_index_xfer()
625 struct drm_i915_private *i915 = bus->i915; in do_gmbus_xfer()
636 intel_de_write_fw(i915, GMBUS0(i915), gmbus0_source | bus->reg0); in do_gmbus_xfer()
642 gmbus0_source | bus->reg0); in do_gmbus_xfer()
646 gmbus0_source | bus->reg0, 0); in do_gmbus_xfer()
654 if (ret == -ETIMEDOUT) in do_gmbus_xfer()
667 * We will re-enable it at the start of the next xfer, in do_gmbus_xfer()
671 drm_dbg_kms(&i915->drm, in do_gmbus_xfer()
673 adapter->name); in do_gmbus_xfer()
674 ret = -ETIMEDOUT; in do_gmbus_xfer()
687 * adapter must report -ENXIO. It is not clear what to return if no ACK in do_gmbus_xfer()
689 * spurious -ENXIO because that will prevent i2c and drm edid functions in do_gmbus_xfer()
690 * from retrying. So return -ENXIO only when gmbus properly quiescents - in do_gmbus_xfer()
694 ret = -ENXIO; in do_gmbus_xfer()
696 drm_dbg_kms(&i915->drm, in do_gmbus_xfer()
698 adapter->name); in do_gmbus_xfer()
699 ret = -ETIMEDOUT; in do_gmbus_xfer()
702 /* Toggle the Software Clear Interrupt bit. This has the effect in do_gmbus_xfer()
710 drm_dbg_kms(&i915->drm, "GMBUS [%s] NAK for addr: %04x %c(%d)\n", in do_gmbus_xfer()
711 adapter->name, msgs[i].addr, in do_gmbus_xfer()
716 * message once on -ENXIO for GMBUS transfers; the bit banging algorithm in do_gmbus_xfer()
718 * drm_do_probe_ddc_edid, which bails out on the first -ENXIO. in do_gmbus_xfer()
720 if (ret == -ENXIO && i == 0 && try++ == 0) { in do_gmbus_xfer()
721 drm_dbg_kms(&i915->drm, in do_gmbus_xfer()
723 adapter->name); in do_gmbus_xfer()
730 drm_dbg_kms(&i915->drm, in do_gmbus_xfer()
731 "GMBUS [%s] timed out, falling back to bit banging on pin %d\n", in do_gmbus_xfer()
732 bus->adapter.name, bus->reg0 & 0xff); in do_gmbus_xfer()
739 ret = -EAGAIN; in do_gmbus_xfer()
755 struct drm_i915_private *i915 = bus->i915; in gmbus_xfer()
761 if (bus->force_bit) { in gmbus_xfer()
764 bus->force_bit &= ~GMBUS_FORCE_BIT_RETRY; in gmbus_xfer()
767 if (ret == -EAGAIN) in gmbus_xfer()
768 bus->force_bit |= GMBUS_FORCE_BIT_RETRY; in gmbus_xfer()
779 struct drm_i915_private *i915 = bus->i915; in intel_gmbus_output_aksv()
800 mutex_lock(&i915->display.gmbus.mutex); in intel_gmbus_output_aksv()
804 * pass the i2c command, and tell GMBUS to use the HW-provided value in intel_gmbus_output_aksv()
809 mutex_unlock(&i915->display.gmbus.mutex); in intel_gmbus_output_aksv()
833 struct drm_i915_private *i915 = bus->i915; in gmbus_lock_bus()
835 mutex_lock(&i915->display.gmbus.mutex); in gmbus_lock_bus()
842 struct drm_i915_private *i915 = bus->i915; in gmbus_trylock_bus()
844 return mutex_trylock(&i915->display.gmbus.mutex); in gmbus_trylock_bus()
851 struct drm_i915_private *i915 = bus->i915; in gmbus_unlock_bus()
853 mutex_unlock(&i915->display.gmbus.mutex); in gmbus_unlock_bus()
863 * intel_gmbus_setup - instantiate all Intel i2c GMBuses
868 struct pci_dev *pdev = to_pci_dev(i915->drm.dev); in intel_gmbus_setup()
873 i915->display.gmbus.mmio_base = VLV_DISPLAY_BASE; in intel_gmbus_setup()
879 i915->display.gmbus.mmio_base = PCH_DISPLAY_BASE; in intel_gmbus_setup()
881 mutex_init(&i915->display.gmbus.mutex); in intel_gmbus_setup()
882 init_waitqueue_head(&i915->display.gmbus.wait_queue); in intel_gmbus_setup()
884 for (pin = 0; pin < ARRAY_SIZE(i915->display.gmbus.bus); pin++) { in intel_gmbus_setup()
894 ret = -ENOMEM; in intel_gmbus_setup()
898 bus->adapter.owner = THIS_MODULE; in intel_gmbus_setup()
899 bus->adapter.class = I2C_CLASS_DDC; in intel_gmbus_setup()
900 snprintf(bus->adapter.name, in intel_gmbus_setup()
901 sizeof(bus->adapter.name), in intel_gmbus_setup()
902 "i915 gmbus %s", gmbus_pin->name); in intel_gmbus_setup()
904 bus->adapter.dev.parent = &pdev->dev; in intel_gmbus_setup()
905 bus->i915 = i915; in intel_gmbus_setup()
907 bus->adapter.algo = &gmbus_algorithm; in intel_gmbus_setup()
908 bus->adapter.lock_ops = &gmbus_lock_ops; in intel_gmbus_setup()
911 * We wish to retry with bit banging in intel_gmbus_setup()
914 bus->adapter.retries = 1; in intel_gmbus_setup()
917 bus->reg0 = pin | GMBUS_RATE_100KHZ; in intel_gmbus_setup()
921 bus->force_bit = 1; in intel_gmbus_setup()
923 intel_gpio_setup(bus, GPIO(i915, gmbus_pin->gpio)); in intel_gmbus_setup()
925 ret = i2c_add_adapter(&bus->adapter); in intel_gmbus_setup()
931 i915->display.gmbus.bus[pin] = bus; in intel_gmbus_setup()
947 if (drm_WARN_ON(&i915->drm, pin >= ARRAY_SIZE(i915->display.gmbus.bus) || in intel_gmbus_get_adapter()
948 !i915->display.gmbus.bus[pin])) in intel_gmbus_get_adapter()
951 return &i915->display.gmbus.bus[pin]->adapter; in intel_gmbus_get_adapter()
957 struct drm_i915_private *i915 = bus->i915; in intel_gmbus_force_bit()
959 mutex_lock(&i915->display.gmbus.mutex); in intel_gmbus_force_bit()
961 bus->force_bit += force_bit ? 1 : -1; in intel_gmbus_force_bit()
962 drm_dbg_kms(&i915->drm, in intel_gmbus_force_bit()
963 "%sabling bit-banging on %s. force bit now %d\n", in intel_gmbus_force_bit()
964 force_bit ? "en" : "dis", adapter->name, in intel_gmbus_force_bit()
965 bus->force_bit); in intel_gmbus_force_bit()
967 mutex_unlock(&i915->display.gmbus.mutex); in intel_gmbus_force_bit()
974 return bus->force_bit; in intel_gmbus_is_forced_bit()
981 for (pin = 0; pin < ARRAY_SIZE(i915->display.gmbus.bus); pin++) { in intel_gmbus_teardown()
984 bus = i915->display.gmbus.bus[pin]; in intel_gmbus_teardown()
988 i2c_del_adapter(&bus->adapter); in intel_gmbus_teardown()
991 i915->display.gmbus.bus[pin] = NULL; in intel_gmbus_teardown()
997 wake_up_all(&i915->display.gmbus.wait_queue); in intel_gmbus_irq_handler()