diff options
author | Vadim Pasternak <vadimp@mellanox.com> | 2019-06-23 08:16:24 -0400 |
---|---|---|
committer | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2019-07-03 08:37:32 -0400 |
commit | 6b266e91a0715dae9923a2791e0b98165163e91f (patch) | |
tree | b5abad6adcac7a7de82d3b1e4a36ac14349f1d30 | |
parent | 3dda617a14327fb5f7c796b0cda2d211e9a2169e (diff) |
platform/x86: mlx-platform: Move regmap initialization before all drivers activation
Initialize regmap prior drivers starting to allow passing regmap handle
to 'i2c_mlxcpld' driver.
Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-rw-r--r-- | drivers/platform/x86/mlx-platform.c | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c index 983f02b5b106..91bdbc2b854f 100644 --- a/drivers/platform/x86/mlx-platform.c +++ b/drivers/platform/x86/mlx-platform.c | |||
@@ -159,6 +159,7 @@ | |||
159 | * @pdev_io_regs - register access platform devices | 159 | * @pdev_io_regs - register access platform devices |
160 | * @pdev_fan - FAN platform devices | 160 | * @pdev_fan - FAN platform devices |
161 | * @pdev_wd - array of watchdog platform devices | 161 | * @pdev_wd - array of watchdog platform devices |
162 | * @regmap: device register map | ||
162 | */ | 163 | */ |
163 | struct mlxplat_priv { | 164 | struct mlxplat_priv { |
164 | struct platform_device *pdev_i2c; | 165 | struct platform_device *pdev_i2c; |
@@ -168,6 +169,7 @@ struct mlxplat_priv { | |||
168 | struct platform_device *pdev_io_regs; | 169 | struct platform_device *pdev_io_regs; |
169 | struct platform_device *pdev_fan; | 170 | struct platform_device *pdev_fan; |
170 | struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS]; | 171 | struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS]; |
172 | void *regmap; | ||
171 | }; | 173 | }; |
172 | 174 | ||
173 | /* Regions for LPC I2C controller and LPC base register space */ | 175 | /* Regions for LPC I2C controller and LPC base register space */ |
@@ -1740,6 +1742,7 @@ static struct mlxreg_core_platform_data *mlxplat_regs_io; | |||
1740 | static struct mlxreg_core_platform_data *mlxplat_fan; | 1742 | static struct mlxreg_core_platform_data *mlxplat_fan; |
1741 | static struct mlxreg_core_platform_data | 1743 | static struct mlxreg_core_platform_data |
1742 | *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS]; | 1744 | *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS]; |
1745 | static const struct regmap_config *mlxplat_regmap_config; | ||
1743 | 1746 | ||
1744 | static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) | 1747 | static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) |
1745 | { | 1748 | { |
@@ -2018,6 +2021,24 @@ static int __init mlxplat_init(void) | |||
2018 | } | 2021 | } |
2019 | platform_set_drvdata(mlxplat_dev, priv); | 2022 | platform_set_drvdata(mlxplat_dev, priv); |
2020 | 2023 | ||
2024 | mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev, | ||
2025 | mlxplat_lpc_resources[1].start, 1); | ||
2026 | if (!mlxplat_mlxcpld_regmap_ctx.base) { | ||
2027 | err = -ENOMEM; | ||
2028 | goto fail_alloc; | ||
2029 | } | ||
2030 | |||
2031 | if (!mlxplat_regmap_config) | ||
2032 | mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config; | ||
2033 | |||
2034 | priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL, | ||
2035 | &mlxplat_mlxcpld_regmap_ctx, | ||
2036 | mlxplat_regmap_config); | ||
2037 | if (IS_ERR(priv->regmap)) { | ||
2038 | err = PTR_ERR(priv->regmap); | ||
2039 | return err; | ||
2040 | } | ||
2041 | |||
2021 | err = mlxplat_mlxcpld_verify_bus_topology(&nr); | 2042 | err = mlxplat_mlxcpld_verify_bus_topology(&nr); |
2022 | if (nr < 0) | 2043 | if (nr < 0) |
2023 | goto fail_alloc; | 2044 | goto fail_alloc; |
@@ -2042,21 +2063,8 @@ static int __init mlxplat_init(void) | |||
2042 | } | 2063 | } |
2043 | } | 2064 | } |
2044 | 2065 | ||
2045 | mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev, | 2066 | /* Add hotplug driver */ |
2046 | mlxplat_lpc_resources[1].start, 1); | 2067 | mlxplat_hotplug->regmap = priv->regmap; |
2047 | if (!mlxplat_mlxcpld_regmap_ctx.base) { | ||
2048 | err = -ENOMEM; | ||
2049 | goto fail_platform_mux_register; | ||
2050 | } | ||
2051 | |||
2052 | mlxplat_hotplug->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL, | ||
2053 | &mlxplat_mlxcpld_regmap_ctx, | ||
2054 | &mlxplat_mlxcpld_regmap_config); | ||
2055 | if (IS_ERR(mlxplat_hotplug->regmap)) { | ||
2056 | err = PTR_ERR(mlxplat_hotplug->regmap); | ||
2057 | goto fail_platform_mux_register; | ||
2058 | } | ||
2059 | |||
2060 | priv->pdev_hotplug = platform_device_register_resndata( | 2068 | priv->pdev_hotplug = platform_device_register_resndata( |
2061 | &mlxplat_dev->dev, "mlxreg-hotplug", | 2069 | &mlxplat_dev->dev, "mlxreg-hotplug", |
2062 | PLATFORM_DEVID_NONE, | 2070 | PLATFORM_DEVID_NONE, |
@@ -2069,16 +2077,16 @@ static int __init mlxplat_init(void) | |||
2069 | } | 2077 | } |
2070 | 2078 | ||
2071 | /* Set default registers. */ | 2079 | /* Set default registers. */ |
2072 | for (j = 0; j < mlxplat_mlxcpld_regmap_config.num_reg_defaults; j++) { | 2080 | for (j = 0; j < mlxplat_regmap_config->num_reg_defaults; j++) { |
2073 | err = regmap_write(mlxplat_hotplug->regmap, | 2081 | err = regmap_write(priv->regmap, |
2074 | mlxplat_mlxcpld_regmap_default[j].reg, | 2082 | mlxplat_regmap_config->reg_defaults[j].reg, |
2075 | mlxplat_mlxcpld_regmap_default[j].def); | 2083 | mlxplat_regmap_config->reg_defaults[j].def); |
2076 | if (err) | 2084 | if (err) |
2077 | goto fail_platform_mux_register; | 2085 | goto fail_platform_mux_register; |
2078 | } | 2086 | } |
2079 | 2087 | ||
2080 | /* Add LED driver. */ | 2088 | /* Add LED driver. */ |
2081 | mlxplat_led->regmap = mlxplat_hotplug->regmap; | 2089 | mlxplat_led->regmap = priv->regmap; |
2082 | priv->pdev_led = platform_device_register_resndata( | 2090 | priv->pdev_led = platform_device_register_resndata( |
2083 | &mlxplat_dev->dev, "leds-mlxreg", | 2091 | &mlxplat_dev->dev, "leds-mlxreg", |
2084 | PLATFORM_DEVID_NONE, NULL, 0, | 2092 | PLATFORM_DEVID_NONE, NULL, 0, |
@@ -2090,7 +2098,7 @@ static int __init mlxplat_init(void) | |||
2090 | 2098 | ||
2091 | /* Add registers io access driver. */ | 2099 | /* Add registers io access driver. */ |
2092 | if (mlxplat_regs_io) { | 2100 | if (mlxplat_regs_io) { |
2093 | mlxplat_regs_io->regmap = mlxplat_hotplug->regmap; | 2101 | mlxplat_regs_io->regmap = priv->regmap; |
2094 | priv->pdev_io_regs = platform_device_register_resndata( | 2102 | priv->pdev_io_regs = platform_device_register_resndata( |
2095 | &mlxplat_dev->dev, "mlxreg-io", | 2103 | &mlxplat_dev->dev, "mlxreg-io", |
2096 | PLATFORM_DEVID_NONE, NULL, 0, | 2104 | PLATFORM_DEVID_NONE, NULL, 0, |
@@ -2104,7 +2112,7 @@ static int __init mlxplat_init(void) | |||
2104 | 2112 | ||
2105 | /* Add FAN driver. */ | 2113 | /* Add FAN driver. */ |
2106 | if (mlxplat_fan) { | 2114 | if (mlxplat_fan) { |
2107 | mlxplat_fan->regmap = mlxplat_hotplug->regmap; | 2115 | mlxplat_fan->regmap = priv->regmap; |
2108 | priv->pdev_fan = platform_device_register_resndata( | 2116 | priv->pdev_fan = platform_device_register_resndata( |
2109 | &mlxplat_dev->dev, "mlxreg-fan", | 2117 | &mlxplat_dev->dev, "mlxreg-fan", |
2110 | PLATFORM_DEVID_NONE, NULL, 0, | 2118 | PLATFORM_DEVID_NONE, NULL, 0, |
@@ -2119,7 +2127,7 @@ static int __init mlxplat_init(void) | |||
2119 | /* Add WD drivers. */ | 2127 | /* Add WD drivers. */ |
2120 | for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) { | 2128 | for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) { |
2121 | if (mlxplat_wd_data[j]) { | 2129 | if (mlxplat_wd_data[j]) { |
2122 | mlxplat_wd_data[j]->regmap = mlxplat_hotplug->regmap; | 2130 | mlxplat_wd_data[j]->regmap = priv->regmap; |
2123 | priv->pdev_wd[j] = platform_device_register_resndata( | 2131 | priv->pdev_wd[j] = platform_device_register_resndata( |
2124 | &mlxplat_dev->dev, "mlx-wdt", | 2132 | &mlxplat_dev->dev, "mlx-wdt", |
2125 | j, NULL, 0, | 2133 | j, NULL, 0, |
@@ -2133,8 +2141,8 @@ static int __init mlxplat_init(void) | |||
2133 | } | 2141 | } |
2134 | 2142 | ||
2135 | /* Sync registers with hardware. */ | 2143 | /* Sync registers with hardware. */ |
2136 | regcache_mark_dirty(mlxplat_hotplug->regmap); | 2144 | regcache_mark_dirty(priv->regmap); |
2137 | err = regcache_sync(mlxplat_hotplug->regmap); | 2145 | err = regcache_sync(priv->regmap); |
2138 | if (err) | 2146 | if (err) |
2139 | goto fail_platform_wd_register; | 2147 | goto fail_platform_wd_register; |
2140 | 2148 | ||