diff options
| -rw-r--r-- | drivers/gpu/drm/Makefile | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_dp_i2c_helper.c (renamed from drivers/gpu/drm/i915/intel_dp_i2c.c) | 74 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/Makefile | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 72 | ||||
| -rw-r--r-- | include/drm/drm_dp_helper.h (renamed from drivers/gpu/drm/i915/intel_dp.h) | 15 |
6 files changed, 83 insertions, 83 deletions
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 3c8827a7aabd..91567ac806f1 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile | |||
| @@ -15,7 +15,7 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \ | |||
| 15 | 15 | ||
| 16 | drm-$(CONFIG_COMPAT) += drm_ioc32.o | 16 | drm-$(CONFIG_COMPAT) += drm_ioc32.o |
| 17 | 17 | ||
| 18 | drm_kms_helper-y := drm_fb_helper.o drm_crtc_helper.o | 18 | drm_kms_helper-y := drm_fb_helper.o drm_crtc_helper.o drm_dp_i2c_helper.o |
| 19 | 19 | ||
| 20 | obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o | 20 | obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o |
| 21 | 21 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp_i2c.c b/drivers/gpu/drm/drm_dp_i2c_helper.c index a63b6f57d2d4..f1c7c856e9db 100644 --- a/drivers/gpu/drm/i915/intel_dp_i2c.c +++ b/drivers/gpu/drm/drm_dp_i2c_helper.c | |||
| @@ -28,84 +28,20 @@ | |||
| 28 | #include <linux/errno.h> | 28 | #include <linux/errno.h> |
| 29 | #include <linux/sched.h> | 29 | #include <linux/sched.h> |
| 30 | #include <linux/i2c.h> | 30 | #include <linux/i2c.h> |
| 31 | #include "intel_dp.h" | 31 | #include "drm_dp_helper.h" |
| 32 | #include "drmP.h" | 32 | #include "drmP.h" |
| 33 | 33 | ||
| 34 | /* Run a single AUX_CH I2C transaction, writing/reading data as necessary */ | 34 | /* Run a single AUX_CH I2C transaction, writing/reading data as necessary */ |
| 35 | |||
| 36 | #define MODE_I2C_START 1 | ||
| 37 | #define MODE_I2C_WRITE 2 | ||
| 38 | #define MODE_I2C_READ 4 | ||
| 39 | #define MODE_I2C_STOP 8 | ||
| 40 | |||
| 41 | static int | 35 | static int |
| 42 | i2c_algo_dp_aux_transaction(struct i2c_adapter *adapter, int mode, | 36 | i2c_algo_dp_aux_transaction(struct i2c_adapter *adapter, int mode, |
| 43 | uint8_t write_byte, uint8_t *read_byte) | 37 | uint8_t write_byte, uint8_t *read_byte) |
| 44 | { | 38 | { |
| 45 | struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data; | 39 | struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data; |
| 46 | uint16_t address = algo_data->address; | ||
| 47 | uint8_t msg[5]; | ||
| 48 | uint8_t reply[2]; | ||
| 49 | int msg_bytes; | ||
| 50 | int reply_bytes; | ||
| 51 | int ret; | 40 | int ret; |
| 52 | 41 | ||
| 53 | /* Set up the command byte */ | 42 | ret = (*algo_data->aux_ch)(adapter, mode, |
| 54 | if (mode & MODE_I2C_READ) | 43 | write_byte, read_byte); |
| 55 | msg[0] = AUX_I2C_READ << 4; | 44 | return ret; |
| 56 | else | ||
| 57 | msg[0] = AUX_I2C_WRITE << 4; | ||
| 58 | |||
| 59 | if (!(mode & MODE_I2C_STOP)) | ||
| 60 | msg[0] |= AUX_I2C_MOT << 4; | ||
| 61 | |||
| 62 | msg[1] = address >> 8; | ||
| 63 | msg[2] = address; | ||
| 64 | |||
| 65 | switch (mode) { | ||
| 66 | case MODE_I2C_WRITE: | ||
| 67 | msg[3] = 0; | ||
| 68 | msg[4] = write_byte; | ||
| 69 | msg_bytes = 5; | ||
| 70 | reply_bytes = 1; | ||
| 71 | break; | ||
| 72 | case MODE_I2C_READ: | ||
| 73 | msg[3] = 0; | ||
| 74 | msg_bytes = 4; | ||
| 75 | reply_bytes = 2; | ||
| 76 | break; | ||
| 77 | default: | ||
| 78 | msg_bytes = 3; | ||
| 79 | reply_bytes = 1; | ||
| 80 | break; | ||
| 81 | } | ||
| 82 | |||
| 83 | for (;;) { | ||
| 84 | ret = (*algo_data->aux_ch)(adapter, | ||
| 85 | msg, msg_bytes, | ||
| 86 | reply, reply_bytes); | ||
| 87 | if (ret < 0) { | ||
| 88 | DRM_DEBUG("aux_ch failed %d\n", ret); | ||
| 89 | return ret; | ||
| 90 | } | ||
| 91 | switch (reply[0] & AUX_I2C_REPLY_MASK) { | ||
| 92 | case AUX_I2C_REPLY_ACK: | ||
| 93 | if (mode == MODE_I2C_READ) { | ||
| 94 | *read_byte = reply[1]; | ||
| 95 | } | ||
| 96 | return reply_bytes - 1; | ||
| 97 | case AUX_I2C_REPLY_NACK: | ||
| 98 | DRM_DEBUG("aux_ch nack\n"); | ||
| 99 | return -EREMOTEIO; | ||
| 100 | case AUX_I2C_REPLY_DEFER: | ||
| 101 | DRM_DEBUG("aux_ch defer\n"); | ||
| 102 | udelay(100); | ||
| 103 | break; | ||
| 104 | default: | ||
| 105 | DRM_ERROR("aux_ch invalid reply 0x%02x\n", reply[0]); | ||
| 106 | return -EREMOTEIO; | ||
| 107 | } | ||
| 108 | } | ||
| 109 | } | 45 | } |
| 110 | 46 | ||
| 111 | /* | 47 | /* |
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index fa7b9be096bc..e3d049229cdd 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile | |||
| @@ -15,7 +15,6 @@ i915-y := i915_drv.o i915_dma.o i915_irq.o i915_mem.o \ | |||
| 15 | intel_lvds.o \ | 15 | intel_lvds.o \ |
| 16 | intel_bios.o \ | 16 | intel_bios.o \ |
| 17 | intel_dp.o \ | 17 | intel_dp.o \ |
| 18 | intel_dp_i2c.o \ | ||
| 19 | intel_hdmi.o \ | 18 | intel_hdmi.o \ |
| 20 | intel_sdvo.o \ | 19 | intel_sdvo.o \ |
| 21 | intel_modes.o \ | 20 | intel_modes.o \ |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 3ba6546b7c7f..ccd180dce4cc 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | #include "intel_drv.h" | 32 | #include "intel_drv.h" |
| 33 | #include "i915_drm.h" | 33 | #include "i915_drm.h" |
| 34 | #include "i915_drv.h" | 34 | #include "i915_drv.h" |
| 35 | #include "intel_dp.h" | 35 | #include "drm_dp_helper.h" |
| 36 | 36 | ||
| 37 | #include "drm_crtc_helper.h" | 37 | #include "drm_crtc_helper.h" |
| 38 | 38 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index d83447557f9b..63424d5db9c6 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | #include "intel_drv.h" | 33 | #include "intel_drv.h" |
| 34 | #include "i915_drm.h" | 34 | #include "i915_drm.h" |
| 35 | #include "i915_drv.h" | 35 | #include "i915_drv.h" |
| 36 | #include "intel_dp.h" | 36 | #include "drm_dp_helper.h" |
| 37 | 37 | ||
| 38 | #define DP_LINK_STATUS_SIZE 6 | 38 | #define DP_LINK_STATUS_SIZE 6 |
| 39 | #define DP_LINK_CHECK_TIMEOUT (10 * 1000) | 39 | #define DP_LINK_CHECK_TIMEOUT (10 * 1000) |
| @@ -382,17 +382,77 @@ intel_dp_aux_native_read(struct intel_output *intel_output, | |||
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | static int | 384 | static int |
| 385 | intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, | 385 | intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, |
| 386 | uint8_t *send, int send_bytes, | 386 | uint8_t write_byte, uint8_t *read_byte) |
| 387 | uint8_t *recv, int recv_bytes) | ||
| 388 | { | 387 | { |
| 388 | struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data; | ||
| 389 | struct intel_dp_priv *dp_priv = container_of(adapter, | 389 | struct intel_dp_priv *dp_priv = container_of(adapter, |
| 390 | struct intel_dp_priv, | 390 | struct intel_dp_priv, |
| 391 | adapter); | 391 | adapter); |
| 392 | struct intel_output *intel_output = dp_priv->intel_output; | 392 | struct intel_output *intel_output = dp_priv->intel_output; |
| 393 | uint16_t address = algo_data->address; | ||
| 394 | uint8_t msg[5]; | ||
| 395 | uint8_t reply[2]; | ||
| 396 | int msg_bytes; | ||
| 397 | int reply_bytes; | ||
| 398 | int ret; | ||
| 399 | |||
| 400 | /* Set up the command byte */ | ||
| 401 | if (mode & MODE_I2C_READ) | ||
| 402 | msg[0] = AUX_I2C_READ << 4; | ||
| 403 | else | ||
| 404 | msg[0] = AUX_I2C_WRITE << 4; | ||
| 405 | |||
| 406 | if (!(mode & MODE_I2C_STOP)) | ||
| 407 | msg[0] |= AUX_I2C_MOT << 4; | ||
| 408 | |||
| 409 | msg[1] = address >> 8; | ||
| 410 | msg[2] = address; | ||
| 411 | |||
| 412 | switch (mode) { | ||
| 413 | case MODE_I2C_WRITE: | ||
| 414 | msg[3] = 0; | ||
| 415 | msg[4] = write_byte; | ||
| 416 | msg_bytes = 5; | ||
| 417 | reply_bytes = 1; | ||
| 418 | break; | ||
| 419 | case MODE_I2C_READ: | ||
| 420 | msg[3] = 0; | ||
| 421 | msg_bytes = 4; | ||
| 422 | reply_bytes = 2; | ||
| 423 | break; | ||
| 424 | default: | ||
| 425 | msg_bytes = 3; | ||
| 426 | reply_bytes = 1; | ||
| 427 | break; | ||
| 428 | } | ||
| 393 | 429 | ||
| 394 | return intel_dp_aux_ch(intel_output, | 430 | for (;;) { |
| 395 | send, send_bytes, recv, recv_bytes); | 431 | ret = intel_dp_aux_ch(intel_output, |
| 432 | msg, msg_bytes, | ||
| 433 | reply, reply_bytes); | ||
| 434 | if (ret < 0) { | ||
| 435 | DRM_DEBUG("aux_ch failed %d\n", ret); | ||
| 436 | return ret; | ||
| 437 | } | ||
| 438 | switch (reply[0] & AUX_I2C_REPLY_MASK) { | ||
| 439 | case AUX_I2C_REPLY_ACK: | ||
| 440 | if (mode == MODE_I2C_READ) { | ||
| 441 | *read_byte = reply[1]; | ||
| 442 | } | ||
| 443 | return reply_bytes - 1; | ||
| 444 | case AUX_I2C_REPLY_NACK: | ||
| 445 | DRM_DEBUG("aux_ch nack\n"); | ||
| 446 | return -EREMOTEIO; | ||
| 447 | case AUX_I2C_REPLY_DEFER: | ||
| 448 | DRM_DEBUG("aux_ch defer\n"); | ||
| 449 | udelay(100); | ||
| 450 | break; | ||
| 451 | default: | ||
| 452 | DRM_ERROR("aux_ch invalid reply 0x%02x\n", reply[0]); | ||
| 453 | return -EREMOTEIO; | ||
| 454 | } | ||
| 455 | } | ||
| 396 | } | 456 | } |
| 397 | 457 | ||
| 398 | static int | 458 | static int |
diff --git a/drivers/gpu/drm/i915/intel_dp.h b/include/drm/drm_dp_helper.h index 2b38054d3b6d..e49879ce95f9 100644 --- a/drivers/gpu/drm/i915/intel_dp.h +++ b/include/drm/drm_dp_helper.h | |||
| @@ -20,8 +20,8 @@ | |||
| 20 | * OF THIS SOFTWARE. | 20 | * OF THIS SOFTWARE. |
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | #ifndef _INTEL_DP_H_ | 23 | #ifndef _DRM_DP_HELPER_H_ |
| 24 | #define _INTEL_DP_H_ | 24 | #define _DRM_DP_HELPER_H_ |
| 25 | 25 | ||
| 26 | /* From the VESA DisplayPort spec */ | 26 | /* From the VESA DisplayPort spec */ |
| 27 | 27 | ||
| @@ -130,15 +130,20 @@ | |||
| 130 | #define DP_ADJUST_PRE_EMPHASIS_LANE1_MASK 0xc0 | 130 | #define DP_ADJUST_PRE_EMPHASIS_LANE1_MASK 0xc0 |
| 131 | #define DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT 6 | 131 | #define DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT 6 |
| 132 | 132 | ||
| 133 | #define MODE_I2C_START 1 | ||
| 134 | #define MODE_I2C_WRITE 2 | ||
| 135 | #define MODE_I2C_READ 4 | ||
| 136 | #define MODE_I2C_STOP 8 | ||
| 137 | |||
| 133 | struct i2c_algo_dp_aux_data { | 138 | struct i2c_algo_dp_aux_data { |
| 134 | bool running; | 139 | bool running; |
| 135 | u16 address; | 140 | u16 address; |
| 136 | int (*aux_ch) (struct i2c_adapter *adapter, | 141 | int (*aux_ch) (struct i2c_adapter *adapter, |
| 137 | uint8_t *send, int send_bytes, | 142 | int mode, uint8_t write_byte, |
| 138 | uint8_t *recv, int recv_bytes); | 143 | uint8_t *read_byte); |
| 139 | }; | 144 | }; |
| 140 | 145 | ||
| 141 | int | 146 | int |
| 142 | i2c_dp_aux_add_bus(struct i2c_adapter *adapter); | 147 | i2c_dp_aux_add_bus(struct i2c_adapter *adapter); |
| 143 | 148 | ||
| 144 | #endif /* _INTEL_DP_H_ */ | 149 | #endif /* _DRM_DP_HELPER_H_ */ |
