| .. | .. |
|---|
| 1 | | -/* |
|---|
| 2 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 3 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 4 | | - * published by the Free Software Foundation. |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 7 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 8 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 9 | | - * GNU General Public License for more details. |
|---|
| 10 | | - * |
|---|
| 11 | | - * Copyright (C) 2012 ARM Limited |
|---|
| 12 | | - */ |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
|---|
| 2 | +// |
|---|
| 3 | +// Copyright (C) 2012 ARM Limited |
|---|
| 13 | 4 | |
|---|
| 14 | 5 | #define DRVNAME "vexpress-regulator" |
|---|
| 15 | 6 | #define pr_fmt(fmt) DRVNAME ": " fmt |
|---|
| .. | .. |
|---|
| 23 | 14 | #include <linux/regulator/of_regulator.h> |
|---|
| 24 | 15 | #include <linux/vexpress.h> |
|---|
| 25 | 16 | |
|---|
| 26 | | -struct vexpress_regulator { |
|---|
| 27 | | - struct regulator_desc desc; |
|---|
| 28 | | - struct regulator_dev *regdev; |
|---|
| 29 | | - struct regmap *regmap; |
|---|
| 30 | | -}; |
|---|
| 31 | | - |
|---|
| 32 | 17 | static int vexpress_regulator_get_voltage(struct regulator_dev *regdev) |
|---|
| 33 | 18 | { |
|---|
| 34 | | - struct vexpress_regulator *reg = rdev_get_drvdata(regdev); |
|---|
| 35 | | - u32 uV; |
|---|
| 36 | | - int err = regmap_read(reg->regmap, 0, &uV); |
|---|
| 19 | + unsigned int uV; |
|---|
| 20 | + int err = regmap_read(regdev->regmap, 0, &uV); |
|---|
| 37 | 21 | |
|---|
| 38 | 22 | return err ? err : uV; |
|---|
| 39 | 23 | } |
|---|
| .. | .. |
|---|
| 41 | 25 | static int vexpress_regulator_set_voltage(struct regulator_dev *regdev, |
|---|
| 42 | 26 | int min_uV, int max_uV, unsigned *selector) |
|---|
| 43 | 27 | { |
|---|
| 44 | | - struct vexpress_regulator *reg = rdev_get_drvdata(regdev); |
|---|
| 45 | | - |
|---|
| 46 | | - return regmap_write(reg->regmap, 0, min_uV); |
|---|
| 28 | + return regmap_write(regdev->regmap, 0, min_uV); |
|---|
| 47 | 29 | } |
|---|
| 48 | 30 | |
|---|
| 49 | | -static struct regulator_ops vexpress_regulator_ops_ro = { |
|---|
| 31 | +static const struct regulator_ops vexpress_regulator_ops_ro = { |
|---|
| 50 | 32 | .get_voltage = vexpress_regulator_get_voltage, |
|---|
| 51 | 33 | }; |
|---|
| 52 | 34 | |
|---|
| 53 | | -static struct regulator_ops vexpress_regulator_ops = { |
|---|
| 35 | +static const struct regulator_ops vexpress_regulator_ops = { |
|---|
| 54 | 36 | .get_voltage = vexpress_regulator_get_voltage, |
|---|
| 55 | 37 | .set_voltage = vexpress_regulator_set_voltage, |
|---|
| 56 | 38 | }; |
|---|
| 57 | 39 | |
|---|
| 58 | 40 | static int vexpress_regulator_probe(struct platform_device *pdev) |
|---|
| 59 | 41 | { |
|---|
| 60 | | - struct vexpress_regulator *reg; |
|---|
| 42 | + struct regulator_desc *desc; |
|---|
| 61 | 43 | struct regulator_init_data *init_data; |
|---|
| 62 | 44 | struct regulator_config config = { }; |
|---|
| 45 | + struct regulator_dev *rdev; |
|---|
| 46 | + struct regmap *regmap; |
|---|
| 63 | 47 | |
|---|
| 64 | | - reg = devm_kzalloc(&pdev->dev, sizeof(*reg), GFP_KERNEL); |
|---|
| 65 | | - if (!reg) |
|---|
| 48 | + desc = devm_kzalloc(&pdev->dev, sizeof(*desc), GFP_KERNEL); |
|---|
| 49 | + if (!desc) |
|---|
| 66 | 50 | return -ENOMEM; |
|---|
| 67 | 51 | |
|---|
| 68 | | - reg->regmap = devm_regmap_init_vexpress_config(&pdev->dev); |
|---|
| 69 | | - if (IS_ERR(reg->regmap)) |
|---|
| 70 | | - return PTR_ERR(reg->regmap); |
|---|
| 52 | + regmap = devm_regmap_init_vexpress_config(&pdev->dev); |
|---|
| 53 | + if (IS_ERR(regmap)) |
|---|
| 54 | + return PTR_ERR(regmap); |
|---|
| 71 | 55 | |
|---|
| 72 | | - reg->desc.name = dev_name(&pdev->dev); |
|---|
| 73 | | - reg->desc.type = REGULATOR_VOLTAGE; |
|---|
| 74 | | - reg->desc.owner = THIS_MODULE; |
|---|
| 75 | | - reg->desc.continuous_voltage_range = true; |
|---|
| 56 | + desc->name = dev_name(&pdev->dev); |
|---|
| 57 | + desc->type = REGULATOR_VOLTAGE; |
|---|
| 58 | + desc->owner = THIS_MODULE; |
|---|
| 59 | + desc->continuous_voltage_range = true; |
|---|
| 76 | 60 | |
|---|
| 77 | 61 | init_data = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node, |
|---|
| 78 | | - ®->desc); |
|---|
| 62 | + desc); |
|---|
| 79 | 63 | if (!init_data) |
|---|
| 80 | 64 | return -EINVAL; |
|---|
| 81 | 65 | |
|---|
| 82 | 66 | init_data->constraints.apply_uV = 0; |
|---|
| 83 | 67 | if (init_data->constraints.min_uV && init_data->constraints.max_uV) |
|---|
| 84 | | - reg->desc.ops = &vexpress_regulator_ops; |
|---|
| 68 | + desc->ops = &vexpress_regulator_ops; |
|---|
| 85 | 69 | else |
|---|
| 86 | | - reg->desc.ops = &vexpress_regulator_ops_ro; |
|---|
| 70 | + desc->ops = &vexpress_regulator_ops_ro; |
|---|
| 87 | 71 | |
|---|
| 72 | + config.regmap = regmap; |
|---|
| 88 | 73 | config.dev = &pdev->dev; |
|---|
| 89 | 74 | config.init_data = init_data; |
|---|
| 90 | | - config.driver_data = reg; |
|---|
| 91 | 75 | config.of_node = pdev->dev.of_node; |
|---|
| 92 | 76 | |
|---|
| 93 | | - reg->regdev = devm_regulator_register(&pdev->dev, ®->desc, &config); |
|---|
| 94 | | - if (IS_ERR(reg->regdev)) |
|---|
| 95 | | - return PTR_ERR(reg->regdev); |
|---|
| 96 | | - |
|---|
| 97 | | - platform_set_drvdata(pdev, reg); |
|---|
| 98 | | - |
|---|
| 99 | | - return 0; |
|---|
| 77 | + rdev = devm_regulator_register(&pdev->dev, desc, &config); |
|---|
| 78 | + return PTR_ERR_OR_ZERO(rdev); |
|---|
| 100 | 79 | } |
|---|
| 101 | 80 | |
|---|
| 102 | 81 | static const struct of_device_id vexpress_regulator_of_match[] = { |
|---|