[PATCH] drm/dp-helper: Move the legacy helpers to gma500

Patrik Jakobsson patrik.r.jakobsson at gmail.com
Wed Oct 22 07:32:52 PDT 2014


On Wed, Oct 22, 2014 at 11:16 AM, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> Except for gma500 all drivers are converted to the new style helpers,
> which have much better abstraction of the underlying hw protocols and
> already much more helper functions (including the entire mst library)
> on top of them. Since no one seems to work on converting gma500 let's
> just move the code away so that new drivers don't end up accidentally
> using this.

Thanks for doing this! I'll CC Alan as well.

Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>

> Cc: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
> ---
>  drivers/gpu/drm/drm_dp_helper.c       | 192 -------------------------------
>  drivers/gpu/drm/gma500/cdv_intel_dp.c | 208 ++++++++++++++++++++++++++++++++++
>  include/drm/drm_dp_helper.h           |  20 ----
>  3 files changed, 208 insertions(+), 212 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
> index 08e33b8b13a4..c088bad7e72f 100644
> --- a/drivers/gpu/drm/drm_dp_helper.c
> +++ b/drivers/gpu/drm/drm_dp_helper.c
> @@ -39,198 +39,6 @@
>   * blocks, ...
>   */
>
> -/* Run a single AUX_CH I2C transaction, writing/reading data as necessary */
> -static int
> -i2c_algo_dp_aux_transaction(struct i2c_adapter *adapter, int mode,
> -                           uint8_t write_byte, uint8_t *read_byte)
> -{
> -       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> -       int ret;
> -
> -       ret = (*algo_data->aux_ch)(adapter, mode,
> -                                  write_byte, read_byte);
> -       return ret;
> -}
> -
> -/*
> - * I2C over AUX CH
> - */
> -
> -/*
> - * Send the address. If the I2C link is running, this 'restarts'
> - * the connection with the new address, this is used for doing
> - * a write followed by a read (as needed for DDC)
> - */
> -static int
> -i2c_algo_dp_aux_address(struct i2c_adapter *adapter, u16 address, bool reading)
> -{
> -       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> -       int mode = MODE_I2C_START;
> -       int ret;
> -
> -       if (reading)
> -               mode |= MODE_I2C_READ;
> -       else
> -               mode |= MODE_I2C_WRITE;
> -       algo_data->address = address;
> -       algo_data->running = true;
> -       ret = i2c_algo_dp_aux_transaction(adapter, mode, 0, NULL);
> -       return ret;
> -}
> -
> -/*
> - * Stop the I2C transaction. This closes out the link, sending
> - * a bare address packet with the MOT bit turned off
> - */
> -static void
> -i2c_algo_dp_aux_stop(struct i2c_adapter *adapter, bool reading)
> -{
> -       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> -       int mode = MODE_I2C_STOP;
> -
> -       if (reading)
> -               mode |= MODE_I2C_READ;
> -       else
> -               mode |= MODE_I2C_WRITE;
> -       if (algo_data->running) {
> -               (void) i2c_algo_dp_aux_transaction(adapter, mode, 0, NULL);
> -               algo_data->running = false;
> -       }
> -}
> -
> -/*
> - * Write a single byte to the current I2C address, the
> - * the I2C link must be running or this returns -EIO
> - */
> -static int
> -i2c_algo_dp_aux_put_byte(struct i2c_adapter *adapter, u8 byte)
> -{
> -       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> -       int ret;
> -
> -       if (!algo_data->running)
> -               return -EIO;
> -
> -       ret = i2c_algo_dp_aux_transaction(adapter, MODE_I2C_WRITE, byte, NULL);
> -       return ret;
> -}
> -
> -/*
> - * Read a single byte from the current I2C address, the
> - * I2C link must be running or this returns -EIO
> - */
> -static int
> -i2c_algo_dp_aux_get_byte(struct i2c_adapter *adapter, u8 *byte_ret)
> -{
> -       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> -       int ret;
> -
> -       if (!algo_data->running)
> -               return -EIO;
> -
> -       ret = i2c_algo_dp_aux_transaction(adapter, MODE_I2C_READ, 0, byte_ret);
> -       return ret;
> -}
> -
> -static int
> -i2c_algo_dp_aux_xfer(struct i2c_adapter *adapter,
> -                    struct i2c_msg *msgs,
> -                    int num)
> -{
> -       int ret = 0;
> -       bool reading = false;
> -       int m;
> -       int b;
> -
> -       for (m = 0; m < num; m++) {
> -               u16 len = msgs[m].len;
> -               u8 *buf = msgs[m].buf;
> -               reading = (msgs[m].flags & I2C_M_RD) != 0;
> -               ret = i2c_algo_dp_aux_address(adapter, msgs[m].addr, reading);
> -               if (ret < 0)
> -                       break;
> -               if (reading) {
> -                       for (b = 0; b < len; b++) {
> -                               ret = i2c_algo_dp_aux_get_byte(adapter, &buf[b]);
> -                               if (ret < 0)
> -                                       break;
> -                       }
> -               } else {
> -                       for (b = 0; b < len; b++) {
> -                               ret = i2c_algo_dp_aux_put_byte(adapter, buf[b]);
> -                               if (ret < 0)
> -                                       break;
> -                       }
> -               }
> -               if (ret < 0)
> -                       break;
> -       }
> -       if (ret >= 0)
> -               ret = num;
> -       i2c_algo_dp_aux_stop(adapter, reading);
> -       DRM_DEBUG_KMS("dp_aux_xfer return %d\n", ret);
> -       return ret;
> -}
> -
> -static u32
> -i2c_algo_dp_aux_functionality(struct i2c_adapter *adapter)
> -{
> -       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
> -              I2C_FUNC_SMBUS_READ_BLOCK_DATA |
> -              I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
> -              I2C_FUNC_10BIT_ADDR;
> -}
> -
> -static const struct i2c_algorithm i2c_dp_aux_algo = {
> -       .master_xfer    = i2c_algo_dp_aux_xfer,
> -       .functionality  = i2c_algo_dp_aux_functionality,
> -};
> -
> -static void
> -i2c_dp_aux_reset_bus(struct i2c_adapter *adapter)
> -{
> -       (void) i2c_algo_dp_aux_address(adapter, 0, false);
> -       (void) i2c_algo_dp_aux_stop(adapter, false);
> -}
> -
> -static int
> -i2c_dp_aux_prepare_bus(struct i2c_adapter *adapter)
> -{
> -       adapter->algo = &i2c_dp_aux_algo;
> -       adapter->retries = 3;
> -       i2c_dp_aux_reset_bus(adapter);
> -       return 0;
> -}
> -
> -/**
> - * i2c_dp_aux_add_bus() - register an i2c adapter using the aux ch helper
> - * @adapter: i2c adapter to register
> - *
> - * This registers an i2c adapter that uses dp aux channel as it's underlaying
> - * transport. The driver needs to fill out the &i2c_algo_dp_aux_data structure
> - * and store it in the algo_data member of the @adapter argument. This will be
> - * used by the i2c over dp aux algorithm to drive the hardware.
> - *
> - * RETURNS:
> - * 0 on success, -ERRNO on failure.
> - *
> - * IMPORTANT:
> - * This interface is deprecated, please switch to the new dp aux helpers and
> - * drm_dp_aux_register().
> - */
> -int
> -i2c_dp_aux_add_bus(struct i2c_adapter *adapter)
> -{
> -       int error;
> -
> -       error = i2c_dp_aux_prepare_bus(adapter);
> -       if (error)
> -               return error;
> -       error = i2c_add_adapter(adapter);
> -       return error;
> -}
> -EXPORT_SYMBOL(i2c_dp_aux_add_bus);
> -
>  /* Helpers for DP link training */
>  static u8 dp_link_status(const u8 link_status[DP_LINK_STATUS_SIZE], int r)
>  {
> diff --git a/drivers/gpu/drm/gma500/cdv_intel_dp.c b/drivers/gpu/drm/gma500/cdv_intel_dp.c
> index 9f158eab517a..fb4812713afd 100644
> --- a/drivers/gpu/drm/gma500/cdv_intel_dp.c
> +++ b/drivers/gpu/drm/gma500/cdv_intel_dp.c
> @@ -37,6 +37,214 @@
>  #include "gma_display.h"
>  #include <drm/drm_dp_helper.h>
>
> +/**
> + * struct i2c_algo_dp_aux_data - driver interface structure for i2c over dp
> + *                              aux algorithm
> + * @running: set by the algo indicating whether an i2c is ongoing or whether
> + *          the i2c bus is quiescent
> + * @address: i2c target address for the currently ongoing transfer
> + * @aux_ch: driver callback to transfer a single byte of the i2c payload
> + */
> +struct i2c_algo_dp_aux_data {
> +       bool running;
> +       u16 address;
> +       int (*aux_ch) (struct i2c_adapter *adapter,
> +                      int mode, uint8_t write_byte,
> +                      uint8_t *read_byte);
> +};
> +
> +/* Run a single AUX_CH I2C transaction, writing/reading data as necessary */
> +static int
> +i2c_algo_dp_aux_transaction(struct i2c_adapter *adapter, int mode,
> +                           uint8_t write_byte, uint8_t *read_byte)
> +{
> +       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> +       int ret;
> +
> +       ret = (*algo_data->aux_ch)(adapter, mode,
> +                                  write_byte, read_byte);
> +       return ret;
> +}
> +
> +/*
> + * I2C over AUX CH
> + */
> +
> +/*
> + * Send the address. If the I2C link is running, this 'restarts'
> + * the connection with the new address, this is used for doing
> + * a write followed by a read (as needed for DDC)
> + */
> +static int
> +i2c_algo_dp_aux_address(struct i2c_adapter *adapter, u16 address, bool reading)
> +{
> +       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> +       int mode = MODE_I2C_START;
> +       int ret;
> +
> +       if (reading)
> +               mode |= MODE_I2C_READ;
> +       else
> +               mode |= MODE_I2C_WRITE;
> +       algo_data->address = address;
> +       algo_data->running = true;
> +       ret = i2c_algo_dp_aux_transaction(adapter, mode, 0, NULL);
> +       return ret;
> +}
> +
> +/*
> + * Stop the I2C transaction. This closes out the link, sending
> + * a bare address packet with the MOT bit turned off
> + */
> +static void
> +i2c_algo_dp_aux_stop(struct i2c_adapter *adapter, bool reading)
> +{
> +       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> +       int mode = MODE_I2C_STOP;
> +
> +       if (reading)
> +               mode |= MODE_I2C_READ;
> +       else
> +               mode |= MODE_I2C_WRITE;
> +       if (algo_data->running) {
> +               (void) i2c_algo_dp_aux_transaction(adapter, mode, 0, NULL);
> +               algo_data->running = false;
> +       }
> +}
> +
> +/*
> + * Write a single byte to the current I2C address, the
> + * the I2C link must be running or this returns -EIO
> + */
> +static int
> +i2c_algo_dp_aux_put_byte(struct i2c_adapter *adapter, u8 byte)
> +{
> +       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> +       int ret;
> +
> +       if (!algo_data->running)
> +               return -EIO;
> +
> +       ret = i2c_algo_dp_aux_transaction(adapter, MODE_I2C_WRITE, byte, NULL);
> +       return ret;
> +}
> +
> +/*
> + * Read a single byte from the current I2C address, the
> + * I2C link must be running or this returns -EIO
> + */
> +static int
> +i2c_algo_dp_aux_get_byte(struct i2c_adapter *adapter, u8 *byte_ret)
> +{
> +       struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
> +       int ret;
> +
> +       if (!algo_data->running)
> +               return -EIO;
> +
> +       ret = i2c_algo_dp_aux_transaction(adapter, MODE_I2C_READ, 0, byte_ret);
> +       return ret;
> +}
> +
> +static int
> +i2c_algo_dp_aux_xfer(struct i2c_adapter *adapter,
> +                    struct i2c_msg *msgs,
> +                    int num)
> +{
> +       int ret = 0;
> +       bool reading = false;
> +       int m;
> +       int b;
> +
> +       for (m = 0; m < num; m++) {
> +               u16 len = msgs[m].len;
> +               u8 *buf = msgs[m].buf;
> +               reading = (msgs[m].flags & I2C_M_RD) != 0;
> +               ret = i2c_algo_dp_aux_address(adapter, msgs[m].addr, reading);
> +               if (ret < 0)
> +                       break;
> +               if (reading) {
> +                       for (b = 0; b < len; b++) {
> +                               ret = i2c_algo_dp_aux_get_byte(adapter, &buf[b]);
> +                               if (ret < 0)
> +                                       break;
> +                       }
> +               } else {
> +                       for (b = 0; b < len; b++) {
> +                               ret = i2c_algo_dp_aux_put_byte(adapter, buf[b]);
> +                               if (ret < 0)
> +                                       break;
> +                       }
> +               }
> +               if (ret < 0)
> +                       break;
> +       }
> +       if (ret >= 0)
> +               ret = num;
> +       i2c_algo_dp_aux_stop(adapter, reading);
> +       DRM_DEBUG_KMS("dp_aux_xfer return %d\n", ret);
> +       return ret;
> +}
> +
> +static u32
> +i2c_algo_dp_aux_functionality(struct i2c_adapter *adapter)
> +{
> +       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
> +              I2C_FUNC_SMBUS_READ_BLOCK_DATA |
> +              I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
> +              I2C_FUNC_10BIT_ADDR;
> +}
> +
> +static const struct i2c_algorithm i2c_dp_aux_algo = {
> +       .master_xfer    = i2c_algo_dp_aux_xfer,
> +       .functionality  = i2c_algo_dp_aux_functionality,
> +};
> +
> +static void
> +i2c_dp_aux_reset_bus(struct i2c_adapter *adapter)
> +{
> +       (void) i2c_algo_dp_aux_address(adapter, 0, false);
> +       (void) i2c_algo_dp_aux_stop(adapter, false);
> +}
> +
> +static int
> +i2c_dp_aux_prepare_bus(struct i2c_adapter *adapter)
> +{
> +       adapter->algo = &i2c_dp_aux_algo;
> +       adapter->retries = 3;
> +       i2c_dp_aux_reset_bus(adapter);
> +       return 0;
> +}
> +
> +/**
> + * i2c_dp_aux_add_bus() - register an i2c adapter using the aux ch helper
> + * @adapter: i2c adapter to register
> + *
> + * This registers an i2c adapter that uses dp aux channel as it's underlaying
> + * transport. The driver needs to fill out the &i2c_algo_dp_aux_data structure
> + * and store it in the algo_data member of the @adapter argument. This will be
> + * used by the i2c over dp aux algorithm to drive the hardware.
> + *
> + * RETURNS:
> + * 0 on success, -ERRNO on failure.
> + *
> + * IMPORTANT:
> + * This interface is deprecated, please switch to the new dp aux helpers and
> + * drm_dp_aux_register().
> + */
> +int
> +i2c_dp_aux_add_bus(struct i2c_adapter *adapter)
> +{
> +       int error;
> +
> +       error = i2c_dp_aux_prepare_bus(adapter);
> +       if (error)
> +               return error;
> +       error = i2c_add_adapter(adapter);
> +       return error;
> +}
> +EXPORT_SYMBOL(i2c_dp_aux_add_bus);
> +
>  #define _wait_for(COND, MS, W) ({ \
>          unsigned long timeout__ = jiffies + msecs_to_jiffies(MS);       \
>          int ret__ = 0;                                                  \
> diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
> index 8edeed00c082..45a2d1c5402b 100644
> --- a/include/drm/drm_dp_helper.h
> +++ b/include/drm/drm_dp_helper.h
> @@ -405,26 +405,6 @@
>  #define MODE_I2C_READ  4
>  #define MODE_I2C_STOP  8
>
> -/**
> - * struct i2c_algo_dp_aux_data - driver interface structure for i2c over dp
> - *                              aux algorithm
> - * @running: set by the algo indicating whether an i2c is ongoing or whether
> - *          the i2c bus is quiescent
> - * @address: i2c target address for the currently ongoing transfer
> - * @aux_ch: driver callback to transfer a single byte of the i2c payload
> - */
> -struct i2c_algo_dp_aux_data {
> -       bool running;
> -       u16 address;
> -       int (*aux_ch) (struct i2c_adapter *adapter,
> -                      int mode, uint8_t write_byte,
> -                      uint8_t *read_byte);
> -};
> -
> -int
> -i2c_dp_aux_add_bus(struct i2c_adapter *adapter);
> -
> -
>  #define DP_LINK_STATUS_SIZE       6
>  bool drm_dp_channel_eq_ok(const u8 link_status[DP_LINK_STATUS_SIZE],
>                           int lane_count);
> --
> 2.1.1
>


More information about the dri-devel mailing list