[PATCH 09/17] soc: imx: add i.MX8M blk-ctrl driver
Dan Carpenter
dan.carpenter at oracle.com
Sun Jul 18 23:12:15 PDT 2021
Hi Lucas,
url: https://github.com/0day-ci/linux/commits/Lucas-Stach/i-MX8MM-GPC-improvements-and-BLK_CTRL-driver/20210718-102944
base: https://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git for-next
config: i386-randconfig-m021-20210718 (attached as .config)
compiler: gcc-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>
Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
smatch warnings:
drivers/soc/imx/imx8m-blk-ctrl.c:222 imx8m_blk_ctrl_probe() warn: missing error code 'ret'
vim +/ret +222 drivers/soc/imx/imx8m-blk-ctrl.c
446185fda14696 Lucas Stach 2021-07-17 150 static int imx8m_blk_ctrl_probe(struct platform_device *pdev)
446185fda14696 Lucas Stach 2021-07-17 151 {
446185fda14696 Lucas Stach 2021-07-17 152 const struct imx8m_blk_ctrl_data *bc_data;
446185fda14696 Lucas Stach 2021-07-17 153 struct device *dev = &pdev->dev;
446185fda14696 Lucas Stach 2021-07-17 154 struct imx8m_blk_ctrl *bc;
446185fda14696 Lucas Stach 2021-07-17 155 void __iomem *base;
446185fda14696 Lucas Stach 2021-07-17 156 int i, ret;
446185fda14696 Lucas Stach 2021-07-17 157
446185fda14696 Lucas Stach 2021-07-17 158 struct regmap_config regmap_config = {
446185fda14696 Lucas Stach 2021-07-17 159 .reg_bits = 32,
446185fda14696 Lucas Stach 2021-07-17 160 .val_bits = 32,
446185fda14696 Lucas Stach 2021-07-17 161 .reg_stride = 4,
446185fda14696 Lucas Stach 2021-07-17 162 };
446185fda14696 Lucas Stach 2021-07-17 163
446185fda14696 Lucas Stach 2021-07-17 164 bc = devm_kzalloc(dev, sizeof(*bc), GFP_KERNEL);
446185fda14696 Lucas Stach 2021-07-17 165 if (!bc)
446185fda14696 Lucas Stach 2021-07-17 166 return -ENOMEM;
446185fda14696 Lucas Stach 2021-07-17 167
446185fda14696 Lucas Stach 2021-07-17 168 bc->dev = dev;
446185fda14696 Lucas Stach 2021-07-17 169
446185fda14696 Lucas Stach 2021-07-17 170 bc_data = of_device_get_match_data(dev);
446185fda14696 Lucas Stach 2021-07-17 171
446185fda14696 Lucas Stach 2021-07-17 172 base = devm_platform_ioremap_resource(pdev, 0);
446185fda14696 Lucas Stach 2021-07-17 173 if (IS_ERR(base))
446185fda14696 Lucas Stach 2021-07-17 174 return PTR_ERR(base);
446185fda14696 Lucas Stach 2021-07-17 175
446185fda14696 Lucas Stach 2021-07-17 176 regmap_config.max_register = bc_data->max_reg;
446185fda14696 Lucas Stach 2021-07-17 177 bc->regmap = devm_regmap_init_mmio(dev, base, ®map_config);
446185fda14696 Lucas Stach 2021-07-17 178 if (IS_ERR(bc->regmap))
446185fda14696 Lucas Stach 2021-07-17 179 return dev_err_probe(dev, PTR_ERR(bc->regmap),
446185fda14696 Lucas Stach 2021-07-17 180 "failed to init regmap \n");
446185fda14696 Lucas Stach 2021-07-17 181
446185fda14696 Lucas Stach 2021-07-17 182 bc->domains = devm_kcalloc(dev, bc_data->num_domains,
446185fda14696 Lucas Stach 2021-07-17 183 sizeof(struct imx8m_blk_ctrl_domain),
446185fda14696 Lucas Stach 2021-07-17 184 GFP_KERNEL);
446185fda14696 Lucas Stach 2021-07-17 185 if (!bc->domains)
446185fda14696 Lucas Stach 2021-07-17 186 return -ENOMEM;
446185fda14696 Lucas Stach 2021-07-17 187
446185fda14696 Lucas Stach 2021-07-17 188 bc->onecell_data.num_domains = bc_data->num_domains;
446185fda14696 Lucas Stach 2021-07-17 189 bc->onecell_data.xlate = imx8m_blk_ctrl_xlate;
446185fda14696 Lucas Stach 2021-07-17 190 bc->onecell_data.domains =
446185fda14696 Lucas Stach 2021-07-17 191 devm_kcalloc(dev, bc_data->num_domains,
446185fda14696 Lucas Stach 2021-07-17 192 sizeof(struct generic_pm_domain *), GFP_KERNEL);
446185fda14696 Lucas Stach 2021-07-17 193 if (!bc->onecell_data.domains)
446185fda14696 Lucas Stach 2021-07-17 194 return -ENOMEM;
446185fda14696 Lucas Stach 2021-07-17 195
446185fda14696 Lucas Stach 2021-07-17 196 bc->bus_power_dev = genpd_dev_pm_attach_by_name(dev, "bus");
446185fda14696 Lucas Stach 2021-07-17 197 if (IS_ERR(bc->bus_power_dev))
446185fda14696 Lucas Stach 2021-07-17 198 return dev_err_probe(dev, PTR_ERR(bc->bus_power_dev),
446185fda14696 Lucas Stach 2021-07-17 199 "failed to attach power domain\n");
446185fda14696 Lucas Stach 2021-07-17 200
446185fda14696 Lucas Stach 2021-07-17 201 for (i = 0; i < bc_data->num_domains; i++) {
446185fda14696 Lucas Stach 2021-07-17 202 const struct imx8m_blk_ctrl_domain_data *data = &bc_data->domains[i];
446185fda14696 Lucas Stach 2021-07-17 203 struct imx8m_blk_ctrl_domain *domain = &bc->domains[i];
446185fda14696 Lucas Stach 2021-07-17 204 int j;
446185fda14696 Lucas Stach 2021-07-17 205
446185fda14696 Lucas Stach 2021-07-17 206 domain->data = data;
446185fda14696 Lucas Stach 2021-07-17 207
446185fda14696 Lucas Stach 2021-07-17 208 for (j = 0; j < data->num_clks; j++)
446185fda14696 Lucas Stach 2021-07-17 209 domain->clks[j].id = data->clk_names[j];
446185fda14696 Lucas Stach 2021-07-17 210
446185fda14696 Lucas Stach 2021-07-17 211 ret = devm_clk_bulk_get(dev, data->num_clks, domain->clks);
446185fda14696 Lucas Stach 2021-07-17 212 if (ret) {
446185fda14696 Lucas Stach 2021-07-17 213 dev_err_probe(dev, ret, "failed to get clock\n");
446185fda14696 Lucas Stach 2021-07-17 214 goto cleanup_pds;
446185fda14696 Lucas Stach 2021-07-17 215 }
446185fda14696 Lucas Stach 2021-07-17 216
446185fda14696 Lucas Stach 2021-07-17 217 domain->power_dev =
446185fda14696 Lucas Stach 2021-07-17 218 dev_pm_domain_attach_by_name(dev, data->gpc_name);
446185fda14696 Lucas Stach 2021-07-17 219 if (IS_ERR(domain->power_dev )) {
^
Extra space character.
446185fda14696 Lucas Stach 2021-07-17 220 dev_err_probe(dev, PTR_ERR(domain->power_dev),
446185fda14696 Lucas Stach 2021-07-17 221 "failed to attach power domain\n");
446185fda14696 Lucas Stach 2021-07-17 @222 goto cleanup_pds;
ret = PTR_ERR(domain->power_dev);
446185fda14696 Lucas Stach 2021-07-17 223 }
446185fda14696 Lucas Stach 2021-07-17 224
446185fda14696 Lucas Stach 2021-07-17 225 domain->genpd.name = data->name;
446185fda14696 Lucas Stach 2021-07-17 226 domain->genpd.power_on = imx8m_blk_ctrl_power_on;
446185fda14696 Lucas Stach 2021-07-17 227 domain->genpd.power_off = imx8m_blk_ctrl_power_off;
446185fda14696 Lucas Stach 2021-07-17 228 domain->bc = bc;
446185fda14696 Lucas Stach 2021-07-17 229
446185fda14696 Lucas Stach 2021-07-17 230 ret = pm_genpd_init(&domain->genpd, NULL, true);
446185fda14696 Lucas Stach 2021-07-17 231 if (ret) {
446185fda14696 Lucas Stach 2021-07-17 232 dev_err_probe(dev, ret, "failed to init power domain\n");
446185fda14696 Lucas Stach 2021-07-17 233 dev_pm_domain_detach(domain->power_dev, true);
446185fda14696 Lucas Stach 2021-07-17 234 goto cleanup_pds;
446185fda14696 Lucas Stach 2021-07-17 235 }
446185fda14696 Lucas Stach 2021-07-17 236
446185fda14696 Lucas Stach 2021-07-17 237 /*
446185fda14696 Lucas Stach 2021-07-17 238 * We use runtime PM to trigger power on/off of the upstream GPC
446185fda14696 Lucas Stach 2021-07-17 239 * domain, as a strict hierarchical parent/child power domain
446185fda14696 Lucas Stach 2021-07-17 240 * setup doesn't allow us to meet the sequencing requirements.
446185fda14696 Lucas Stach 2021-07-17 241 * This means we have nested locking of genpd locks, without the
446185fda14696 Lucas Stach 2021-07-17 242 * nesting being visible at the genpd level, so we need a
446185fda14696 Lucas Stach 2021-07-17 243 * separate lock class to make lockdep aware of the fact that
446185fda14696 Lucas Stach 2021-07-17 244 * this are separate domain locks that can be nested without a
446185fda14696 Lucas Stach 2021-07-17 245 * self-deadlock.
446185fda14696 Lucas Stach 2021-07-17 246 */
446185fda14696 Lucas Stach 2021-07-17 247 lockdep_set_class(&domain->genpd.mlock,
446185fda14696 Lucas Stach 2021-07-17 248 &blk_ctrl_genpd_lock_class);
446185fda14696 Lucas Stach 2021-07-17 249
446185fda14696 Lucas Stach 2021-07-17 250 bc->onecell_data.domains[i] = &domain->genpd;
446185fda14696 Lucas Stach 2021-07-17 251 }
446185fda14696 Lucas Stach 2021-07-17 252
446185fda14696 Lucas Stach 2021-07-17 253 ret = of_genpd_add_provider_onecell(dev->of_node, &bc->onecell_data);
446185fda14696 Lucas Stach 2021-07-17 254 if (ret) {
446185fda14696 Lucas Stach 2021-07-17 255 dev_err_probe(dev, ret, "failed to add power domain provider\n");
446185fda14696 Lucas Stach 2021-07-17 256 goto cleanup_pds;
446185fda14696 Lucas Stach 2021-07-17 257 }
446185fda14696 Lucas Stach 2021-07-17 258
446185fda14696 Lucas Stach 2021-07-17 259 bc->power_nb.notifier_call = bc_data->power_notifier_fn;
446185fda14696 Lucas Stach 2021-07-17 260 ret = dev_pm_genpd_add_notifier(bc->bus_power_dev, &bc->power_nb);
446185fda14696 Lucas Stach 2021-07-17 261 if (ret) {
446185fda14696 Lucas Stach 2021-07-17 262 dev_err_probe(dev, ret, "failed to add power notifier\n");
446185fda14696 Lucas Stach 2021-07-17 263 goto cleanup_provider;
446185fda14696 Lucas Stach 2021-07-17 264 }
446185fda14696 Lucas Stach 2021-07-17 265
446185fda14696 Lucas Stach 2021-07-17 266 dev_set_drvdata(dev, bc);
446185fda14696 Lucas Stach 2021-07-17 267
446185fda14696 Lucas Stach 2021-07-17 268 return 0;
446185fda14696 Lucas Stach 2021-07-17 269
446185fda14696 Lucas Stach 2021-07-17 270 cleanup_provider:
446185fda14696 Lucas Stach 2021-07-17 271 of_genpd_del_provider(dev->of_node);
446185fda14696 Lucas Stach 2021-07-17 272 cleanup_pds:
446185fda14696 Lucas Stach 2021-07-17 273 for (i--; i >= 0; i--) {
446185fda14696 Lucas Stach 2021-07-17 274 pm_genpd_remove(&bc->domains[i].genpd);
446185fda14696 Lucas Stach 2021-07-17 275 dev_pm_domain_detach(bc->domains[i].power_dev, true);
446185fda14696 Lucas Stach 2021-07-17 276 }
446185fda14696 Lucas Stach 2021-07-17 277
446185fda14696 Lucas Stach 2021-07-17 278 dev_pm_domain_detach(bc->bus_power_dev, true);
446185fda14696 Lucas Stach 2021-07-17 279
446185fda14696 Lucas Stach 2021-07-17 280 return ret;
446185fda14696 Lucas Stach 2021-07-17 281 }
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
More information about the linux-arm-kernel
mailing list