Re: [PATCH platform-next v1 5/9] platform/x86: mlx-platform: Set system mux configuration based on system type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Dec 31, 2019 at 12:29 PM Vadim Pasternak <vadimp@xxxxxxxxxxxx> wrote:
>
> Separate assignment for systems mux configuration based on system type,
> instead of setting the same configuration for the all.
> The motivation is to allow introduction of new systems types with the
> different mux topology.
>
> Signed-off-by: Vadim Pasternak <vadimp@xxxxxxxxxxxx>
> ---
>  drivers/platform/x86/mlx-platform.c | 46 ++++++++++++++++++++++++++-----------
>  1 file changed, 33 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c
> index 7e92dc52071f..0a41668b1587 100644
> --- a/drivers/platform/x86/mlx-platform.c
> +++ b/drivers/platform/x86/mlx-platform.c
> @@ -219,7 +219,7 @@ static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
>  static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
>
>  /* Platform mux data */
> -static struct i2c_mux_reg_platform_data mlxplat_mux_data[] = {
> +static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
>         {
>                 .parent = 1,
>                 .base_nr = MLXPLAT_CPLD_CH1,
> @@ -239,6 +239,11 @@ static struct i2c_mux_reg_platform_data mlxplat_mux_data[] = {
>
>  };
>
> +/* Platform mux configuration variables */
> +static int mlxplat_max_adap_num;
> +static int mlxplat_mux_num;
> +static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
> +
>  /* Platform hotplug devices */
>  static struct i2c_board_info mlxplat_mlxcpld_psu[] = {
>         {
> @@ -1905,7 +1910,10 @@ static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
>  {
>         int i;
>
> -       for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
> +       mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
> +       mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
> +       mlxplat_mux_data = mlxplat_default_mux_data;
> +       for (i = 0; i < mlxplat_mux_num; i++) {
>                 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
>                 mlxplat_mux_data[i].n_values =
>                                 ARRAY_SIZE(mlxplat_default_channels[i]);
> @@ -1924,7 +1932,10 @@ static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
>  {
>         int i;
>
> -       for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
> +       mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
> +       mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
> +       mlxplat_mux_data = mlxplat_default_mux_data;
> +       for (i = 0; i < mlxplat_mux_num; i++) {
>                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
>                 mlxplat_mux_data[i].n_values =
>                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
> @@ -1943,7 +1954,10 @@ static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
>  {
>         int i;
>
> -       for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
> +       mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
> +       mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
> +       mlxplat_mux_data = mlxplat_default_mux_data;
> +       for (i = 0; i < mlxplat_mux_num; i++) {
>                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
>                 mlxplat_mux_data[i].n_values =
>                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
> @@ -1962,7 +1976,10 @@ static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
>  {
>         int i;
>
> -       for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
> +       mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
> +       mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
> +       mlxplat_mux_data = mlxplat_default_mux_data;
> +       for (i = 0; i < mlxplat_mux_num; i++) {
>                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
>                 mlxplat_mux_data[i].n_values =
>                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
> @@ -1981,7 +1998,10 @@ static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
>  {
>         int i;
>
> -       for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
> +       mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
> +       mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
> +       mlxplat_mux_data = mlxplat_default_mux_data;
> +       for (i = 0; i < mlxplat_mux_num; i++) {
>                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
>                 mlxplat_mux_data[i].n_values =
>                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
> @@ -1998,7 +2018,7 @@ static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
>         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
>
>         return 1;
> -}
> +};

And this, how does it happen?

>
>  static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
>         {
> @@ -2127,7 +2147,7 @@ static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
>         /* Scan adapters from expected id to verify it is free. */
>         *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
>         for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <

> -            MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM; i++) {
> +            mlxplat_max_adap_num; i++) {

I'm wondering why 'i <; is left on previous line, or, otherwise, the
limit is on next one.

>                 search_adap = i2c_get_adapter(i);
>                 if (search_adap) {
>                         i2c_put_adapter(search_adap);
> @@ -2141,12 +2161,12 @@ static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
>         }
>
>         /* Return with error if free id for adapter is not found. */
> -       if (i == MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM)
> +       if (i == mlxplat_max_adap_num)
>                 return -ENODEV;
>
>         /* Shift adapter ids, since expected parent adapter is not free. */
>         *nr = i;
> -       for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
> +       for (i = 0; i < mlxplat_mux_num; i++) {
>                 shift = *nr - mlxplat_mux_data[i].parent;
>                 mlxplat_mux_data[i].parent = *nr;
>                 mlxplat_mux_data[i].base_nr += shift;
> @@ -2202,7 +2222,7 @@ static int __init mlxplat_init(void)
>         if (nr < 0)
>                 goto fail_alloc;
>
> -       nr = (nr == MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM) ? -1 : nr;
> +       nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
>         if (mlxplat_i2c)
>                 mlxplat_i2c->regmap = priv->regmap;
>         priv->pdev_i2c = platform_device_register_resndata(
> @@ -2215,7 +2235,7 @@ static int __init mlxplat_init(void)
>                 goto fail_alloc;
>         }
>
> -       for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
> +       for (i = 0; i < mlxplat_mux_num; i++) {
>                 priv->pdev_mux[i] = platform_device_register_resndata(
>                                                 &priv->pdev_i2c->dev,
>                                                 "i2c-mux-reg", i, NULL,
> @@ -2349,7 +2369,7 @@ static void __exit mlxplat_exit(void)
>         platform_device_unregister(priv->pdev_led);
>         platform_device_unregister(priv->pdev_hotplug);
>
> -       for (i = ARRAY_SIZE(mlxplat_mux_data) - 1; i >= 0 ; i--)

> +       for (i = mlxplat_mux_num - 1; i >= 0 ; i--)

It is basically
  while (i--)

>                 platform_device_unregister(priv->pdev_mux[i]);
>
>         platform_device_unregister(priv->pdev_i2c);
> --
> 2.11.0
>


-- 
With Best Regards,
Andy Shevchenko



[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux