| .. | .. |
|---|
| 23 | 23 | #define LDO_FET_FULL_ON 0x1f |
|---|
| 24 | 24 | |
|---|
| 25 | 25 | struct anatop_regulator { |
|---|
| 26 | | - u32 control_reg; |
|---|
| 27 | | - struct regmap *anatop; |
|---|
| 28 | | - int vol_bit_shift; |
|---|
| 29 | | - int vol_bit_width; |
|---|
| 30 | 26 | u32 delay_reg; |
|---|
| 31 | 27 | int delay_bit_shift; |
|---|
| 32 | 28 | int delay_bit_width; |
|---|
| 33 | | - int min_bit_val; |
|---|
| 34 | | - int min_voltage; |
|---|
| 35 | | - int max_voltage; |
|---|
| 36 | 29 | struct regulator_desc rdesc; |
|---|
| 37 | | - struct regulator_init_data *initdata; |
|---|
| 38 | 30 | bool bypass; |
|---|
| 39 | 31 | int sel; |
|---|
| 40 | 32 | }; |
|---|
| .. | .. |
|---|
| 55 | 47 | * to calculate how many steps LDO need to |
|---|
| 56 | 48 | * ramp up, and how much delay needed. (us) |
|---|
| 57 | 49 | */ |
|---|
| 58 | | - regmap_read(anatop_reg->anatop, anatop_reg->delay_reg, &val); |
|---|
| 50 | + regmap_read(reg->regmap, anatop_reg->delay_reg, &val); |
|---|
| 59 | 51 | val = (val >> anatop_reg->delay_bit_shift) & |
|---|
| 60 | 52 | ((1 << anatop_reg->delay_bit_width) - 1); |
|---|
| 61 | 53 | ret = (new_sel - old_sel) * (LDO_RAMP_UP_UNIT_IN_CYCLES << |
|---|
| .. | .. |
|---|
| 147 | 139 | .map_voltage = regulator_map_voltage_linear, |
|---|
| 148 | 140 | }; |
|---|
| 149 | 141 | |
|---|
| 150 | | -static struct regulator_ops anatop_core_rops = { |
|---|
| 142 | +static const struct regulator_ops anatop_core_rops = { |
|---|
| 151 | 143 | .enable = anatop_regmap_enable, |
|---|
| 152 | 144 | .disable = anatop_regmap_disable, |
|---|
| 153 | 145 | .is_enabled = anatop_regmap_is_enabled, |
|---|
| .. | .. |
|---|
| 170 | 162 | struct anatop_regulator *sreg; |
|---|
| 171 | 163 | struct regulator_init_data *initdata; |
|---|
| 172 | 164 | struct regulator_config config = { }; |
|---|
| 165 | + struct regmap *regmap; |
|---|
| 166 | + u32 control_reg; |
|---|
| 167 | + u32 vol_bit_shift; |
|---|
| 168 | + u32 vol_bit_width; |
|---|
| 169 | + u32 min_bit_val; |
|---|
| 170 | + u32 min_voltage; |
|---|
| 171 | + u32 max_voltage; |
|---|
| 173 | 172 | int ret = 0; |
|---|
| 174 | 173 | u32 val; |
|---|
| 175 | 174 | |
|---|
| .. | .. |
|---|
| 192 | 191 | return -ENOMEM; |
|---|
| 193 | 192 | |
|---|
| 194 | 193 | initdata->supply_regulator = "vin"; |
|---|
| 195 | | - sreg->initdata = initdata; |
|---|
| 196 | 194 | |
|---|
| 197 | 195 | anatop_np = of_get_parent(np); |
|---|
| 198 | 196 | if (!anatop_np) |
|---|
| 199 | 197 | return -ENODEV; |
|---|
| 200 | | - sreg->anatop = syscon_node_to_regmap(anatop_np); |
|---|
| 198 | + regmap = syscon_node_to_regmap(anatop_np); |
|---|
| 201 | 199 | of_node_put(anatop_np); |
|---|
| 202 | | - if (IS_ERR(sreg->anatop)) |
|---|
| 203 | | - return PTR_ERR(sreg->anatop); |
|---|
| 200 | + if (IS_ERR(regmap)) |
|---|
| 201 | + return PTR_ERR(regmap); |
|---|
| 204 | 202 | |
|---|
| 205 | | - ret = of_property_read_u32(np, "anatop-reg-offset", |
|---|
| 206 | | - &sreg->control_reg); |
|---|
| 203 | + ret = of_property_read_u32(np, "anatop-reg-offset", &control_reg); |
|---|
| 207 | 204 | if (ret) { |
|---|
| 208 | 205 | dev_err(dev, "no anatop-reg-offset property set\n"); |
|---|
| 209 | 206 | return ret; |
|---|
| 210 | 207 | } |
|---|
| 211 | | - ret = of_property_read_u32(np, "anatop-vol-bit-width", |
|---|
| 212 | | - &sreg->vol_bit_width); |
|---|
| 208 | + ret = of_property_read_u32(np, "anatop-vol-bit-width", &vol_bit_width); |
|---|
| 213 | 209 | if (ret) { |
|---|
| 214 | 210 | dev_err(dev, "no anatop-vol-bit-width property set\n"); |
|---|
| 215 | 211 | return ret; |
|---|
| 216 | 212 | } |
|---|
| 217 | | - ret = of_property_read_u32(np, "anatop-vol-bit-shift", |
|---|
| 218 | | - &sreg->vol_bit_shift); |
|---|
| 213 | + ret = of_property_read_u32(np, "anatop-vol-bit-shift", &vol_bit_shift); |
|---|
| 219 | 214 | if (ret) { |
|---|
| 220 | 215 | dev_err(dev, "no anatop-vol-bit-shift property set\n"); |
|---|
| 221 | 216 | return ret; |
|---|
| 222 | 217 | } |
|---|
| 223 | | - ret = of_property_read_u32(np, "anatop-min-bit-val", |
|---|
| 224 | | - &sreg->min_bit_val); |
|---|
| 218 | + ret = of_property_read_u32(np, "anatop-min-bit-val", &min_bit_val); |
|---|
| 225 | 219 | if (ret) { |
|---|
| 226 | 220 | dev_err(dev, "no anatop-min-bit-val property set\n"); |
|---|
| 227 | 221 | return ret; |
|---|
| 228 | 222 | } |
|---|
| 229 | | - ret = of_property_read_u32(np, "anatop-min-voltage", |
|---|
| 230 | | - &sreg->min_voltage); |
|---|
| 223 | + ret = of_property_read_u32(np, "anatop-min-voltage", &min_voltage); |
|---|
| 231 | 224 | if (ret) { |
|---|
| 232 | 225 | dev_err(dev, "no anatop-min-voltage property set\n"); |
|---|
| 233 | 226 | return ret; |
|---|
| 234 | 227 | } |
|---|
| 235 | | - ret = of_property_read_u32(np, "anatop-max-voltage", |
|---|
| 236 | | - &sreg->max_voltage); |
|---|
| 228 | + ret = of_property_read_u32(np, "anatop-max-voltage", &max_voltage); |
|---|
| 237 | 229 | if (ret) { |
|---|
| 238 | 230 | dev_err(dev, "no anatop-max-voltage property set\n"); |
|---|
| 239 | 231 | return ret; |
|---|
| .. | .. |
|---|
| 247 | 239 | of_property_read_u32(np, "anatop-delay-bit-shift", |
|---|
| 248 | 240 | &sreg->delay_bit_shift); |
|---|
| 249 | 241 | |
|---|
| 250 | | - rdesc->n_voltages = (sreg->max_voltage - sreg->min_voltage) / 25000 + 1 |
|---|
| 251 | | - + sreg->min_bit_val; |
|---|
| 252 | | - rdesc->min_uV = sreg->min_voltage; |
|---|
| 242 | + rdesc->n_voltages = (max_voltage - min_voltage) / 25000 + 1 |
|---|
| 243 | + + min_bit_val; |
|---|
| 244 | + rdesc->min_uV = min_voltage; |
|---|
| 253 | 245 | rdesc->uV_step = 25000; |
|---|
| 254 | | - rdesc->linear_min_sel = sreg->min_bit_val; |
|---|
| 255 | | - rdesc->vsel_reg = sreg->control_reg; |
|---|
| 256 | | - rdesc->vsel_mask = ((1 << sreg->vol_bit_width) - 1) << |
|---|
| 257 | | - sreg->vol_bit_shift; |
|---|
| 246 | + rdesc->linear_min_sel = min_bit_val; |
|---|
| 247 | + rdesc->vsel_reg = control_reg; |
|---|
| 248 | + rdesc->vsel_mask = ((1 << vol_bit_width) - 1) << vol_bit_shift; |
|---|
| 258 | 249 | rdesc->min_dropout_uV = 125000; |
|---|
| 259 | 250 | |
|---|
| 260 | 251 | config.dev = &pdev->dev; |
|---|
| 261 | 252 | config.init_data = initdata; |
|---|
| 262 | 253 | config.driver_data = sreg; |
|---|
| 263 | 254 | config.of_node = pdev->dev.of_node; |
|---|
| 264 | | - config.regmap = sreg->anatop; |
|---|
| 255 | + config.regmap = regmap; |
|---|
| 265 | 256 | |
|---|
| 266 | 257 | /* Only core regulators have the ramp up delay configuration. */ |
|---|
| 267 | | - if (sreg->control_reg && sreg->delay_bit_width) { |
|---|
| 258 | + if (control_reg && sreg->delay_bit_width) { |
|---|
| 268 | 259 | rdesc->ops = &anatop_core_rops; |
|---|
| 269 | 260 | |
|---|
| 270 | 261 | ret = regmap_read(config.regmap, rdesc->vsel_reg, &val); |
|---|
| .. | .. |
|---|
| 273 | 264 | return ret; |
|---|
| 274 | 265 | } |
|---|
| 275 | 266 | |
|---|
| 276 | | - sreg->sel = (val & rdesc->vsel_mask) >> sreg->vol_bit_shift; |
|---|
| 267 | + sreg->sel = (val & rdesc->vsel_mask) >> vol_bit_shift; |
|---|
| 277 | 268 | if (sreg->sel == LDO_FET_FULL_ON) { |
|---|
| 278 | 269 | sreg->sel = 0; |
|---|
| 279 | 270 | sreg->bypass = true; |
|---|
| .. | .. |
|---|
| 306 | 297 | anatop_rops.disable = regulator_disable_regmap; |
|---|
| 307 | 298 | anatop_rops.is_enabled = regulator_is_enabled_regmap; |
|---|
| 308 | 299 | |
|---|
| 309 | | - rdesc->enable_reg = sreg->control_reg; |
|---|
| 300 | + rdesc->enable_reg = control_reg; |
|---|
| 310 | 301 | rdesc->enable_mask = BIT(enable_bit); |
|---|
| 311 | 302 | } |
|---|
| 312 | 303 | } |
|---|
| .. | .. |
|---|
| 314 | 305 | /* register regulator */ |
|---|
| 315 | 306 | rdev = devm_regulator_register(dev, rdesc, &config); |
|---|
| 316 | 307 | if (IS_ERR(rdev)) { |
|---|
| 317 | | - dev_err(dev, "failed to register %s\n", |
|---|
| 318 | | - rdesc->name); |
|---|
| 319 | | - return PTR_ERR(rdev); |
|---|
| 308 | + ret = PTR_ERR(rdev); |
|---|
| 309 | + if (ret == -EPROBE_DEFER) |
|---|
| 310 | + dev_dbg(dev, "failed to register %s, deferring...\n", |
|---|
| 311 | + rdesc->name); |
|---|
| 312 | + else |
|---|
| 313 | + dev_err(dev, "failed to register %s\n", rdesc->name); |
|---|
| 314 | + return ret; |
|---|
| 320 | 315 | } |
|---|
| 321 | 316 | |
|---|
| 322 | 317 | platform_set_drvdata(pdev, rdev); |
|---|