| .. | .. | 
|---|
 | 1 | +/* SPDX-License-Identifier: GPL-2.0-only */  | 
|---|
| 1 | 2 |  /* | 
|---|
| 2 | 3 |   * driver.h -- SoC Regulator driver support. | 
|---|
| 3 | 4 |   * | 
|---|
| .. | .. | 
|---|
| 5 | 6 |   * | 
|---|
| 6 | 7 |   * Author: Liam Girdwood <lrg@slimlogic.co.uk> | 
|---|
| 7 | 8 |   * | 
|---|
| 8 |  | - * This program is free software; you can redistribute it and/or modify  | 
|---|
| 9 |  | - * it under the terms of the GNU General Public License version 2 as  | 
|---|
| 10 |  | - * published by the Free Software Foundation.  | 
|---|
| 11 |  | - *  | 
|---|
| 12 | 9 |   * Regulator Driver Interface. | 
|---|
| 13 | 10 |   */ | 
|---|
| 14 | 11 |   | 
|---|
| 15 | 12 |  #ifndef __LINUX_REGULATOR_DRIVER_H_ | 
|---|
| 16 | 13 |  #define __LINUX_REGULATOR_DRIVER_H_ | 
|---|
| 17 | 14 |   | 
|---|
| 18 |  | -#define MAX_COUPLED		4  | 
|---|
| 19 |  | -  | 
|---|
| 20 | 15 |  #include <linux/device.h> | 
|---|
 | 16 | +#include <linux/linear_range.h>  | 
|---|
| 21 | 17 |  #include <linux/notifier.h> | 
|---|
| 22 | 18 |  #include <linux/regulator/consumer.h> | 
|---|
| 23 |  | -#include <linux/regulator/proxy-consumer.h>  | 
|---|
 | 19 | +#include <linux/ww_mutex.h>  | 
|---|
 | 20 | +#include <linux/android_kabi.h>  | 
|---|
| 24 | 21 |   | 
|---|
| 25 | 22 |  struct gpio_desc; | 
|---|
| 26 | 23 |  struct regmap; | 
|---|
| .. | .. | 
|---|
| 44 | 41 |  	REGULATOR_STATUS_UNDEFINED, | 
|---|
| 45 | 42 |  }; | 
|---|
| 46 | 43 |   | 
|---|
| 47 |  | -/**  | 
|---|
| 48 |  | - * struct regulator_linear_range - specify linear voltage ranges  | 
|---|
| 49 |  | - *  | 
|---|
| 50 |  | - * Specify a range of voltages for regulator_map_linear_range() and  | 
|---|
| 51 |  | - * regulator_list_linear_range().  | 
|---|
| 52 |  | - *  | 
|---|
| 53 |  | - * @min_uV:  Lowest voltage in range  | 
|---|
| 54 |  | - * @min_sel: Lowest selector for range  | 
|---|
| 55 |  | - * @max_sel: Highest selector for range  | 
|---|
| 56 |  | - * @uV_step: Step size  | 
|---|
| 57 |  | - */  | 
|---|
| 58 |  | -struct regulator_linear_range {  | 
|---|
| 59 |  | -	unsigned int min_uV;  | 
|---|
| 60 |  | -	unsigned int min_sel;  | 
|---|
| 61 |  | -	unsigned int max_sel;  | 
|---|
| 62 |  | -	unsigned int uV_step;  | 
|---|
| 63 |  | -};  | 
|---|
| 64 |  | -  | 
|---|
| 65 |  | -/* Initialize struct regulator_linear_range */  | 
|---|
 | 44 | +/* Initialize struct linear_range for regulators */  | 
|---|
| 66 | 45 |  #define REGULATOR_LINEAR_RANGE(_min_uV, _min_sel, _max_sel, _step_uV)	\ | 
|---|
| 67 | 46 |  {									\ | 
|---|
| 68 |  | -	.min_uV		= _min_uV,					\  | 
|---|
 | 47 | +	.min		= _min_uV,					\  | 
|---|
| 69 | 48 |  	.min_sel	= _min_sel,					\ | 
|---|
| 70 | 49 |  	.max_sel	= _max_sel,					\ | 
|---|
| 71 |  | -	.uV_step	= _step_uV,					\  | 
|---|
 | 50 | +	.step		= _step_uV,					\  | 
|---|
| 72 | 51 |  } | 
|---|
| 73 | 52 |   | 
|---|
| 74 | 53 |  /** | 
|---|
| .. | .. | 
|---|
| 139 | 118 |   *                       suspended. | 
|---|
| 140 | 119 |   * @set_suspend_mode: Set the operating mode for the regulator when the | 
|---|
| 141 | 120 |   *                    system is suspended. | 
|---|
| 142 |  | - *  | 
|---|
 | 121 | + * @resume: Resume operation of suspended regulator.  | 
|---|
| 143 | 122 |   * @set_pull_down: Configure the regulator to pull down when the regulator | 
|---|
| 144 | 123 |   *		   is disabled. | 
|---|
| 145 | 124 |   * | 
|---|
| .. | .. | 
|---|
| 224 | 203 |  	int (*resume)(struct regulator_dev *rdev); | 
|---|
| 225 | 204 |   | 
|---|
| 226 | 205 |  	int (*set_pull_down) (struct regulator_dev *); | 
|---|
 | 206 | +  | 
|---|
 | 207 | +	ANDROID_KABI_RESERVE(1);  | 
|---|
| 227 | 208 |  }; | 
|---|
| 228 | 209 |   | 
|---|
| 229 | 210 |  /* | 
|---|
| .. | .. | 
|---|
| 245 | 226 |   * @name: Identifying name for the regulator. | 
|---|
| 246 | 227 |   * @supply_name: Identifying the regulator supply | 
|---|
| 247 | 228 |   * @of_match: Name used to identify regulator in DT. | 
|---|
 | 229 | + * @of_match_full_name: A flag to indicate that the of_match string, if  | 
|---|
 | 230 | + *			present, should be matched against the node full_name.  | 
|---|
| 248 | 231 |   * @regulators_node: Name of node containing regulator definitions in DT. | 
|---|
| 249 | 232 |   * @of_parse_cb: Optional callback called only if of_match is present. | 
|---|
| 250 | 233 |   *               Will be called for each regulator parsed from DT, during | 
|---|
| .. | .. | 
|---|
| 264 | 247 |   * @continuous_voltage_range: Indicates if the regulator can set any | 
|---|
| 265 | 248 |   *                            voltage within constrains range. | 
|---|
| 266 | 249 |   * @n_voltages: Number of selectors available for ops.list_voltage(). | 
|---|
 | 250 | + * @n_current_limits: Number of selectors available for current limits  | 
|---|
| 267 | 251 |   * | 
|---|
| 268 | 252 |   * @min_uV: Voltage given by the lowest selector (if linear mapping) | 
|---|
| 269 | 253 |   * @uV_step: Voltage increase with each selector (if linear mapping) | 
|---|
| .. | .. | 
|---|
| 272 | 256 |   * @ramp_delay: Time to settle down after voltage change (unit: uV/us) | 
|---|
| 273 | 257 |   * @min_dropout_uV: The minimum dropout voltage this regulator can handle | 
|---|
| 274 | 258 |   * @linear_ranges: A constant table of possible voltage ranges. | 
|---|
| 275 |  | - * @n_linear_ranges: Number of entries in the @linear_ranges table.  | 
|---|
 | 259 | + * @linear_range_selectors: A constant table of voltage range selectors.  | 
|---|
 | 260 | + *			    If pickable ranges are used each range must  | 
|---|
 | 261 | + *			    have corresponding selector here.  | 
|---|
 | 262 | + * @n_linear_ranges: Number of entries in the @linear_ranges (and in  | 
|---|
 | 263 | + *		     linear_range_selectors if used) table(s).  | 
|---|
| 276 | 264 |   * @volt_table: Voltage mapping table (if table based mapping) | 
|---|
 | 265 | + * @curr_table: Current limit mapping table (if table based mapping)  | 
|---|
| 277 | 266 |   * | 
|---|
| 278 |  | - * @vsel_reg: Register for selector when using regulator_regmap_X_voltage_  | 
|---|
 | 267 | + * @vsel_range_reg: Register for range selector when using pickable ranges  | 
|---|
 | 268 | + *		    and ``regulator_map_*_voltage_*_pickable`` functions.  | 
|---|
 | 269 | + * @vsel_range_mask: Mask for register bitfield used for range selector  | 
|---|
 | 270 | + * @vsel_reg: Register for selector when using ``regulator_map_*_voltage_*``  | 
|---|
| 279 | 271 |   * @vsel_mask: Mask for register bitfield used for selector | 
|---|
| 280 |  | - * @csel_reg: Register for TPS65218 LS3 current regulator  | 
|---|
| 281 |  | - * @csel_mask: Mask for TPS65218 LS3 current regulator  | 
|---|
 | 272 | + * @vsel_step: Specify the resolution of selector stepping when setting  | 
|---|
 | 273 | + *	       voltage. If 0, then no stepping is done (requested selector is  | 
|---|
 | 274 | + *	       set directly), if >0 then the regulator API will ramp the  | 
|---|
 | 275 | + *	       voltage up/down gradually each time increasing/decreasing the  | 
|---|
 | 276 | + *	       selector by the specified step value.  | 
|---|
 | 277 | + * @csel_reg: Register for current limit selector using regmap set_current_limit  | 
|---|
 | 278 | + * @csel_mask: Mask for register bitfield used for current limit selector  | 
|---|
| 282 | 279 |   * @apply_reg: Register for initiate voltage change on the output when | 
|---|
| 283 | 280 |   *                using regulator_set_voltage_sel_regmap | 
|---|
| 284 | 281 |   * @apply_bit: Register bitfield used for initiate voltage change on the | 
|---|
| .. | .. | 
|---|
| 313 | 310 |   * @enable_time: Time taken for initial enable of regulator (in uS). | 
|---|
| 314 | 311 |   * @off_on_delay: guard time (in uS), before re-enabling a regulator | 
|---|
| 315 | 312 |   * | 
|---|
 | 313 | + * @poll_enabled_time: The polling interval (in uS) to use while checking that  | 
|---|
 | 314 | + *                     the regulator was actually enabled. Max upto enable_time.  | 
|---|
 | 315 | + *  | 
|---|
| 316 | 316 |   * @of_map_mode: Maps a hardware mode defined in a DeviceTree to a standard mode | 
|---|
| 317 | 317 |   */ | 
|---|
| 318 | 318 |  struct regulator_desc { | 
|---|
| 319 | 319 |  	const char *name; | 
|---|
| 320 | 320 |  	const char *supply_name; | 
|---|
| 321 | 321 |  	const char *of_match; | 
|---|
 | 322 | +	bool of_match_full_name;  | 
|---|
| 322 | 323 |  	const char *regulators_node; | 
|---|
| 323 | 324 |  	int (*of_parse_cb)(struct device_node *, | 
|---|
| 324 | 325 |  			    const struct regulator_desc *, | 
|---|
| .. | .. | 
|---|
| 326 | 327 |  	int id; | 
|---|
| 327 | 328 |  	unsigned int continuous_voltage_range:1; | 
|---|
| 328 | 329 |  	unsigned n_voltages; | 
|---|
 | 330 | +	unsigned int n_current_limits;  | 
|---|
| 329 | 331 |  	const struct regulator_ops *ops; | 
|---|
| 330 | 332 |  	int irq; | 
|---|
| 331 | 333 |  	enum regulator_type type; | 
|---|
| .. | .. | 
|---|
| 338 | 340 |  	unsigned int ramp_delay; | 
|---|
| 339 | 341 |  	int min_dropout_uV; | 
|---|
| 340 | 342 |   | 
|---|
| 341 |  | -	const struct regulator_linear_range *linear_ranges;  | 
|---|
 | 343 | +	const struct linear_range *linear_ranges;  | 
|---|
 | 344 | +	const unsigned int *linear_range_selectors;  | 
|---|
 | 345 | +  | 
|---|
| 342 | 346 |  	int n_linear_ranges; | 
|---|
| 343 | 347 |   | 
|---|
| 344 | 348 |  	const unsigned int *volt_table; | 
|---|
 | 349 | +	const unsigned int *curr_table;  | 
|---|
| 345 | 350 |   | 
|---|
 | 351 | +	unsigned int vsel_range_reg;  | 
|---|
 | 352 | +	unsigned int vsel_range_mask;  | 
|---|
| 346 | 353 |  	unsigned int vsel_reg; | 
|---|
| 347 | 354 |  	unsigned int vsel_mask; | 
|---|
 | 355 | +	unsigned int vsel_step;  | 
|---|
| 348 | 356 |  	unsigned int csel_reg; | 
|---|
| 349 | 357 |  	unsigned int csel_mask; | 
|---|
| 350 | 358 |  	unsigned int apply_reg; | 
|---|
| .. | .. | 
|---|
| 373 | 381 |   | 
|---|
| 374 | 382 |  	unsigned int off_on_delay; | 
|---|
| 375 | 383 |   | 
|---|
 | 384 | +	unsigned int poll_enabled_time;  | 
|---|
 | 385 | +  | 
|---|
| 376 | 386 |  	unsigned int (*of_map_mode)(unsigned int mode); | 
|---|
 | 387 | +  | 
|---|
 | 388 | +	ANDROID_KABI_RESERVE(1);  | 
|---|
| 377 | 389 |  }; | 
|---|
| 378 | 390 |   | 
|---|
| 379 | 391 |  /** | 
|---|
| .. | .. | 
|---|
| 390 | 402 |   *           NULL). | 
|---|
| 391 | 403 |   * @regmap: regmap to use for core regmap helpers if dev_get_regmap() is | 
|---|
| 392 | 404 |   *          insufficient. | 
|---|
| 393 |  | - * @ena_gpio_initialized: GPIO controlling regulator enable was properly  | 
|---|
| 394 |  | - *                        initialized, meaning that >= 0 is a valid gpio  | 
|---|
| 395 |  | - *                        identifier and < 0 is a non existent gpio.  | 
|---|
| 396 |  | - * @ena_gpio: GPIO controlling regulator enable.  | 
|---|
| 397 |  | - * @ena_gpiod: GPIO descriptor controlling regulator enable.  | 
|---|
| 398 |  | - * @ena_gpio_invert: Sense for GPIO enable control.  | 
|---|
| 399 |  | - * @ena_gpio_flags: Flags to use when calling gpio_request_one()  | 
|---|
 | 405 | + * @ena_gpiod: GPIO controlling regulator enable.  | 
|---|
| 400 | 406 |   */ | 
|---|
| 401 | 407 |  struct regulator_config { | 
|---|
| 402 | 408 |  	struct device *dev; | 
|---|
| .. | .. | 
|---|
| 405 | 411 |  	struct device_node *of_node; | 
|---|
| 406 | 412 |  	struct regmap *regmap; | 
|---|
| 407 | 413 |   | 
|---|
| 408 |  | -	bool ena_gpio_initialized;  | 
|---|
| 409 |  | -	int ena_gpio;  | 
|---|
| 410 | 414 |  	struct gpio_desc *ena_gpiod; | 
|---|
| 411 |  | -	unsigned int ena_gpio_invert:1;  | 
|---|
| 412 |  | -	unsigned int ena_gpio_flags;  | 
|---|
| 413 | 415 |  }; | 
|---|
| 414 | 416 |   | 
|---|
| 415 | 417 |  /* | 
|---|
| .. | .. | 
|---|
| 421 | 423 |   * incremented. | 
|---|
| 422 | 424 |   */ | 
|---|
| 423 | 425 |  struct coupling_desc { | 
|---|
| 424 |  | -	struct regulator_dev *coupled_rdevs[MAX_COUPLED];  | 
|---|
 | 426 | +	struct regulator_dev **coupled_rdevs;  | 
|---|
 | 427 | +	struct regulator_coupler *coupler;  | 
|---|
| 425 | 428 |  	int n_resolved; | 
|---|
| 426 | 429 |  	int n_coupled; | 
|---|
| 427 | 430 |  }; | 
|---|
| .. | .. | 
|---|
| 452 | 455 |  	struct coupling_desc coupling_desc; | 
|---|
| 453 | 456 |   | 
|---|
| 454 | 457 |  	struct blocking_notifier_head notifier; | 
|---|
| 455 |  | -	struct mutex mutex; /* consumer lock */  | 
|---|
 | 458 | +	struct ww_mutex mutex; /* consumer lock */  | 
|---|
| 456 | 459 |  	struct task_struct *mutex_owner; | 
|---|
| 457 | 460 |  	int ref_cnt; | 
|---|
| 458 | 461 |  	struct module *owner; | 
|---|
| .. | .. | 
|---|
| 463 | 466 |  	struct regmap *regmap; | 
|---|
| 464 | 467 |   | 
|---|
| 465 | 468 |  	struct delayed_work disable_work; | 
|---|
| 466 |  | -	int deferred_disables;  | 
|---|
| 467 | 469 |   | 
|---|
| 468 | 470 |  	void *reg_data;		/* regulator_dev data */ | 
|---|
| 469 | 471 |   | 
|---|
| .. | .. | 
|---|
| 476 | 478 |   | 
|---|
| 477 | 479 |  	/* time when this regulator was disabled last time */ | 
|---|
| 478 | 480 |  	unsigned long last_off_jiffy; | 
|---|
| 479 |  | -	struct proxy_consumer *proxy_consumer;  | 
|---|
 | 481 | +  | 
|---|
 | 482 | +	ANDROID_KABI_RESERVE(1);  | 
|---|
| 480 | 483 |  }; | 
|---|
| 481 | 484 |   | 
|---|
| 482 | 485 |  struct regulator_dev * | 
|---|
| .. | .. | 
|---|
| 487 | 490 |  			const struct regulator_desc *regulator_desc, | 
|---|
| 488 | 491 |  			const struct regulator_config *config); | 
|---|
| 489 | 492 |  void regulator_unregister(struct regulator_dev *rdev); | 
|---|
| 490 |  | -void regulator_sync_state(struct device *dev);  | 
|---|
| 491 | 493 |  void devm_regulator_unregister(struct device *dev, struct regulator_dev *rdev); | 
|---|
| 492 | 494 |   | 
|---|
| 493 | 495 |  int regulator_notifier_call_chain(struct regulator_dev *rdev, | 
|---|
| .. | .. | 
|---|
| 495 | 497 |   | 
|---|
| 496 | 498 |  void *rdev_get_drvdata(struct regulator_dev *rdev); | 
|---|
| 497 | 499 |  struct device *rdev_get_dev(struct regulator_dev *rdev); | 
|---|
 | 500 | +struct regmap *rdev_get_regmap(struct regulator_dev *rdev);  | 
|---|
| 498 | 501 |  int rdev_get_id(struct regulator_dev *rdev); | 
|---|
| 499 | 502 |   | 
|---|
| 500 | 503 |  int regulator_mode_to_status(unsigned int); | 
|---|
| 501 | 504 |   | 
|---|
| 502 | 505 |  int regulator_list_voltage_linear(struct regulator_dev *rdev, | 
|---|
| 503 | 506 |  				  unsigned int selector); | 
|---|
 | 507 | +int regulator_list_voltage_pickable_linear_range(struct regulator_dev *rdev,  | 
|---|
 | 508 | +						   unsigned int selector);  | 
|---|
| 504 | 509 |  int regulator_list_voltage_linear_range(struct regulator_dev *rdev, | 
|---|
| 505 | 510 |  					unsigned int selector); | 
|---|
| 506 | 511 |  int regulator_list_voltage_table(struct regulator_dev *rdev, | 
|---|
| 507 | 512 |  				  unsigned int selector); | 
|---|
| 508 | 513 |  int regulator_map_voltage_linear(struct regulator_dev *rdev, | 
|---|
| 509 | 514 |  				  int min_uV, int max_uV); | 
|---|
 | 515 | +int regulator_map_voltage_pickable_linear_range(struct regulator_dev *rdev,  | 
|---|
 | 516 | +						  int min_uV, int max_uV);  | 
|---|
| 510 | 517 |  int regulator_map_voltage_linear_range(struct regulator_dev *rdev, | 
|---|
| 511 | 518 |  				       int min_uV, int max_uV); | 
|---|
| 512 | 519 |  int regulator_map_voltage_iterate(struct regulator_dev *rdev, | 
|---|
| 513 | 520 |  				  int min_uV, int max_uV); | 
|---|
| 514 | 521 |  int regulator_map_voltage_ascend(struct regulator_dev *rdev, | 
|---|
| 515 | 522 |  				  int min_uV, int max_uV); | 
|---|
 | 523 | +int regulator_get_voltage_sel_pickable_regmap(struct regulator_dev *rdev);  | 
|---|
 | 524 | +int regulator_set_voltage_sel_pickable_regmap(struct regulator_dev *rdev,  | 
|---|
 | 525 | +						unsigned int sel);  | 
|---|
| 516 | 526 |  int regulator_get_voltage_sel_regmap(struct regulator_dev *rdev); | 
|---|
| 517 | 527 |  int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel); | 
|---|
| 518 | 528 |  int regulator_is_enabled_regmap(struct regulator_dev *rdev); | 
|---|
| .. | .. | 
|---|
| 528 | 538 |   | 
|---|
| 529 | 539 |  int regulator_set_active_discharge_regmap(struct regulator_dev *rdev, | 
|---|
| 530 | 540 |  					  bool enable); | 
|---|
 | 541 | +int regulator_set_current_limit_regmap(struct regulator_dev *rdev,  | 
|---|
 | 542 | +				       int min_uA, int max_uA);  | 
|---|
 | 543 | +int regulator_get_current_limit_regmap(struct regulator_dev *rdev);  | 
|---|
| 531 | 544 |  void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); | 
|---|
| 532 | 545 |   | 
|---|
 | 546 | +/*  | 
|---|
 | 547 | + * Helper functions intended to be used by regulator drivers prior registering  | 
|---|
 | 548 | + * their regulators.  | 
|---|
 | 549 | + */  | 
|---|
 | 550 | +int regulator_desc_list_voltage_linear_range(const struct regulator_desc *desc,  | 
|---|
 | 551 | +					     unsigned int selector);  | 
|---|
 | 552 | +  | 
|---|
| 533 | 553 |  #endif | 
|---|