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>
129 return pin < size && get_gmbus_pin(dev_priv, pin)->name; in intel_gmbus_is_valid_pin()
154 /* When using bit bashing for I2C, this bit needs to be set to 1 */ in pnv_gmbus_clock_gating()
191 struct drm_i915_private *i915 = bus->dev_priv; in get_reserved()
192 struct intel_uncore *uncore = &i915->uncore; in get_reserved()
197 reserved = intel_uncore_read_notrace(uncore, bus->gpio_reg) & in get_reserved()
207 struct intel_uncore *uncore = &bus->dev_priv->uncore; in get_clock()
211 bus->gpio_reg, in get_clock()
213 intel_uncore_write_notrace(uncore, bus->gpio_reg, reserved); in get_clock()
215 return (intel_uncore_read_notrace(uncore, bus->gpio_reg) & in get_clock()
222 struct intel_uncore *uncore = &bus->dev_priv->uncore; in get_data()
226 bus->gpio_reg, in get_data()
228 intel_uncore_write_notrace(uncore, bus->gpio_reg, reserved); in get_data()
230 return (intel_uncore_read_notrace(uncore, bus->gpio_reg) & in get_data()
237 struct intel_uncore *uncore = &bus->dev_priv->uncore; in set_clock()
248 bus->gpio_reg, in set_clock()
250 intel_uncore_posting_read(uncore, bus->gpio_reg); in set_clock()
256 struct intel_uncore *uncore = &bus->dev_priv->uncore; in set_data()
266 intel_uncore_write_notrace(uncore, bus->gpio_reg, reserved | data_bits); in set_data()
267 intel_uncore_posting_read(uncore, bus->gpio_reg); in set_data()
276 struct drm_i915_private *dev_priv = bus->dev_priv; in intel_gpio_pre_xfer()
295 struct drm_i915_private *dev_priv = bus->dev_priv; in intel_gpio_post_xfer()
307 struct drm_i915_private *dev_priv = bus->dev_priv; in intel_gpio_setup()
310 algo = &bus->bit_algo; in intel_gpio_setup()
312 bus->gpio_reg = GPIO(get_gmbus_pin(dev_priv, pin)->gpio); in intel_gpio_setup()
313 bus->adapter.algo_data = algo; in intel_gpio_setup()
314 algo->setsda = set_data; in intel_gpio_setup()
315 algo->setscl = set_clock; in intel_gpio_setup()
316 algo->getsda = get_data; in intel_gpio_setup()
317 algo->getscl = get_clock; in intel_gpio_setup()
318 algo->pre_xfer = intel_gpio_pre_xfer; in intel_gpio_setup()
319 algo->post_xfer = intel_gpio_post_xfer; in intel_gpio_setup()
320 algo->udelay = I2C_RISEFALL_TIME; in intel_gpio_setup()
321 algo->timeout = usecs_to_jiffies(2200); in intel_gpio_setup()
322 algo->data = bus; in intel_gpio_setup()
331 /* Important: The hw handles only the first bit, so set only one! Since in gmbus_wait()
338 add_wait_queue(&dev_priv->gmbus_wait_queue, &wait); in gmbus_wait()
349 remove_wait_queue(&dev_priv->gmbus_wait_queue, &wait); in gmbus_wait()
352 return -ENXIO; in gmbus_wait()
364 /* Important: The hw handles only the first bit, so set only one! */ in gmbus_wait_idle()
369 add_wait_queue(&dev_priv->gmbus_wait_queue, &wait); in gmbus_wait_idle()
372 ret = intel_wait_for_register_fw(&dev_priv->uncore, in gmbus_wait_idle()
377 remove_wait_queue(&dev_priv->gmbus_wait_queue, &wait); in gmbus_wait_idle()
428 } while (--len && ++loop < 4); in gmbus_xfer_read_chunk()
430 if (burst_read && len == size - 4) in gmbus_xfer_read_chunk()
431 /* Reset the override bit */ in gmbus_xfer_read_chunk()
452 u8 *buf = msg->buf; in gmbus_xfer_read()
453 unsigned int rx_size = msg->len; in gmbus_xfer_read()
463 ret = gmbus_xfer_read_chunk(dev_priv, msg->addr, buf, len, in gmbus_xfer_read()
468 rx_size -= len; in gmbus_xfer_read()
486 len -= 1; in gmbus_xfer_write_chunk()
498 } while (--len && ++loop < 4); in gmbus_xfer_write_chunk()
514 u8 *buf = msg->buf; in gmbus_xfer_write()
515 unsigned int tx_size = msg->len; in gmbus_xfer_write()
522 ret = gmbus_xfer_write_chunk(dev_priv, msg->addr, buf, len, in gmbus_xfer_write()
528 tx_size -= len; in gmbus_xfer_write()
563 /* GMBUS5 holds 16-bit index */ in gmbus_index_xfer()
587 struct drm_i915_private *dev_priv = bus->dev_priv; in do_gmbus_xfer()
598 intel_de_write_fw(dev_priv, GMBUS0, gmbus0_source | bus->reg0); in do_gmbus_xfer()
604 gmbus0_source | bus->reg0); in do_gmbus_xfer()
608 gmbus0_source | bus->reg0, 0); in do_gmbus_xfer()
616 if (ret == -ETIMEDOUT) in do_gmbus_xfer()
629 * We will re-enable it at the start of the next xfer, in do_gmbus_xfer()
633 drm_dbg_kms(&dev_priv->drm, in do_gmbus_xfer()
635 adapter->name); in do_gmbus_xfer()
636 ret = -ETIMEDOUT; in do_gmbus_xfer()
649 * adapter must report -ENXIO. It is not clear what to return if no ACK in do_gmbus_xfer()
651 * spurious -ENXIO because that will prevent i2c and drm edid functions in do_gmbus_xfer()
652 * from retrying. So return -ENXIO only when gmbus properly quiescents - in do_gmbus_xfer()
656 ret = -ENXIO; in do_gmbus_xfer()
658 drm_dbg_kms(&dev_priv->drm, in do_gmbus_xfer()
660 adapter->name); in do_gmbus_xfer()
661 ret = -ETIMEDOUT; in do_gmbus_xfer()
664 /* Toggle the Software Clear Interrupt bit. This has the effect in do_gmbus_xfer()
672 drm_dbg_kms(&dev_priv->drm, "GMBUS [%s] NAK for addr: %04x %c(%d)\n", in do_gmbus_xfer()
673 adapter->name, msgs[i].addr, in do_gmbus_xfer()
678 * message once on -ENXIO for GMBUS transfers; the bit banging algorithm in do_gmbus_xfer()
680 * drm_do_probe_ddc_edid, which bails out on the first -ENXIO. in do_gmbus_xfer()
682 if (ret == -ENXIO && i == 0 && try++ == 0) { in do_gmbus_xfer()
683 drm_dbg_kms(&dev_priv->drm, in do_gmbus_xfer()
685 adapter->name); in do_gmbus_xfer()
692 drm_dbg_kms(&dev_priv->drm, in do_gmbus_xfer()
693 "GMBUS [%s] timed out, falling back to bit banging on pin %d\n", in do_gmbus_xfer()
694 bus->adapter.name, bus->reg0 & 0xff); in do_gmbus_xfer()
701 ret = -EAGAIN; in do_gmbus_xfer()
718 struct drm_i915_private *dev_priv = bus->dev_priv; in gmbus_xfer()
724 if (bus->force_bit) { in gmbus_xfer()
727 bus->force_bit &= ~GMBUS_FORCE_BIT_RETRY; in gmbus_xfer()
730 if (ret == -EAGAIN) in gmbus_xfer()
731 bus->force_bit |= GMBUS_FORCE_BIT_RETRY; in gmbus_xfer()
743 struct drm_i915_private *dev_priv = bus->dev_priv; in intel_gmbus_output_aksv()
764 mutex_lock(&dev_priv->gmbus_mutex); in intel_gmbus_output_aksv()
768 * pass the i2c command, and tell GMBUS to use the HW-provided value in intel_gmbus_output_aksv()
773 mutex_unlock(&dev_priv->gmbus_mutex); in intel_gmbus_output_aksv()
797 struct drm_i915_private *dev_priv = bus->dev_priv; in gmbus_lock_bus()
799 mutex_lock(&dev_priv->gmbus_mutex); in gmbus_lock_bus()
806 struct drm_i915_private *dev_priv = bus->dev_priv; in gmbus_trylock_bus()
808 return mutex_trylock(&dev_priv->gmbus_mutex); in gmbus_trylock_bus()
815 struct drm_i915_private *dev_priv = bus->dev_priv; in gmbus_unlock_bus()
817 mutex_unlock(&dev_priv->gmbus_mutex); in gmbus_unlock_bus()
827 * intel_gmbus_setup - instantiate all Intel i2c GMBuses
832 struct pci_dev *pdev = dev_priv->drm.pdev; in intel_gmbus_setup()
841 dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE; in intel_gmbus_setup()
847 dev_priv->gpio_mmio_base = PCH_DISPLAY_BASE; in intel_gmbus_setup()
849 mutex_init(&dev_priv->gmbus_mutex); in intel_gmbus_setup()
850 init_waitqueue_head(&dev_priv->gmbus_wait_queue); in intel_gmbus_setup()
852 for (pin = 0; pin < ARRAY_SIZE(dev_priv->gmbus); pin++) { in intel_gmbus_setup()
856 bus = &dev_priv->gmbus[pin]; in intel_gmbus_setup()
858 bus->adapter.owner = THIS_MODULE; in intel_gmbus_setup()
859 bus->adapter.class = I2C_CLASS_DDC; in intel_gmbus_setup()
860 snprintf(bus->adapter.name, in intel_gmbus_setup()
861 sizeof(bus->adapter.name), in intel_gmbus_setup()
863 get_gmbus_pin(dev_priv, pin)->name); in intel_gmbus_setup()
865 bus->adapter.dev.parent = &pdev->dev; in intel_gmbus_setup()
866 bus->dev_priv = dev_priv; in intel_gmbus_setup()
868 bus->adapter.algo = &gmbus_algorithm; in intel_gmbus_setup()
869 bus->adapter.lock_ops = &gmbus_lock_ops; in intel_gmbus_setup()
872 * We wish to retry with bit banging in intel_gmbus_setup()
875 bus->adapter.retries = 1; in intel_gmbus_setup()
878 bus->reg0 = pin | GMBUS_RATE_100KHZ; in intel_gmbus_setup()
882 bus->force_bit = 1; in intel_gmbus_setup()
886 ret = i2c_add_adapter(&bus->adapter); in intel_gmbus_setup()
896 while (pin--) { in intel_gmbus_setup()
900 bus = &dev_priv->gmbus[pin]; in intel_gmbus_setup()
901 i2c_del_adapter(&bus->adapter); in intel_gmbus_setup()
909 if (drm_WARN_ON(&dev_priv->drm, in intel_gmbus_get_adapter()
913 return &dev_priv->gmbus[pin].adapter; in intel_gmbus_get_adapter()
920 bus->reg0 = (bus->reg0 & ~(0x3 << 8)) | speed; in intel_gmbus_set_speed()
926 struct drm_i915_private *dev_priv = bus->dev_priv; in intel_gmbus_force_bit()
928 mutex_lock(&dev_priv->gmbus_mutex); in intel_gmbus_force_bit()
930 bus->force_bit += force_bit ? 1 : -1; in intel_gmbus_force_bit()
931 drm_dbg_kms(&dev_priv->drm, in intel_gmbus_force_bit()
932 "%sabling bit-banging on %s. force bit now %d\n", in intel_gmbus_force_bit()
933 force_bit ? "en" : "dis", adapter->name, in intel_gmbus_force_bit()
934 bus->force_bit); in intel_gmbus_force_bit()
936 mutex_unlock(&dev_priv->gmbus_mutex); in intel_gmbus_force_bit()
943 return bus->force_bit; in intel_gmbus_is_forced_bit()
951 for (pin = 0; pin < ARRAY_SIZE(dev_priv->gmbus); pin++) { in intel_gmbus_teardown()
955 bus = &dev_priv->gmbus[pin]; in intel_gmbus_teardown()
956 i2c_del_adapter(&bus->adapter); in intel_gmbus_teardown()