summaryrefslogtreecommitdiffstats
path: root/include/drm
AgeCommit message (Expand)Author
2020-01-27drm/amdgpu: fix doc by clarifying sched_list definitionNirmoy Das
2020-01-20Backmerge v5.5-rc7 into drm-nextDave Airlie
2020-01-18Merge tag 'amd-drm-next-5.6-2020-01-17' of git://people.freedesktop.org/~agd5...Dave Airlie
2020-01-16drm/scheduler: fix documentation by replacing rq_list with sched_listNirmoy Das
2020-01-16drm/scheduler: improve job distribution with multiple queuesNirmoy Das
2020-01-15drm/dp_mst: Have DP_Tx send one msg at a timeWayne Lin
2020-01-15Merge tag 'drm-intel-next-2020-01-14' of git://anongit.freedesktop.org/drm/dr...Dave Airlie
2020-01-13Merge tag 'amd-drm-next-5.6-2020-01-10-dp-mst-dsc' of git://people.freedeskto...Dave Airlie
2020-01-13Merge tag 'amd-drm-next-5.6-2020-01-09' of git://people.freedesktop.org/~agd5...Dave Airlie
2020-01-13Merge tag 'drm-misc-next-2020-01-10' of git://anongit.freedesktop.org/drm/drm...Dave Airlie
2020-01-09drm: add dp helper to initialize remote aux channel.David (Dingchen) Zhang
2020-01-09drm/dp_mst: Add helper to trigger modeset on affected DSC MST CRTCsMikita Lipski
2020-01-09drm/dp_mst: Add branch bandwidth validation to MST atomic checkMikita Lipski
2020-01-09drm/dp_mst: Add DSC enablement helpers to DRMMikita Lipski
2020-01-09drm/dp_mst: Manually overwrite PBN divider for calculating timeslotsMikita Lipski
2020-01-09drm/dp_mst: Add new quirk for Synaptics MST hubsMikita Lipski
2020-01-09drm/dp_mst: Add helpers for MST DSC and virtual DPCD auxDavid Francis
2020-01-09drm/dp_mst: Parse FEC capability on MST portsDavid Francis
2020-01-09drm/dp_mst: Add PBN calculation for DSC modesDavid Francis
2020-01-09drm/fb-cma-helpers: Fix include issueBenjamin Gaignard
2020-01-09Merge drm/drm-next into drm-intel-next-queuedJani Nikula
2020-01-09Merge tag 'drm-misc-next-2020-01-07' of git://anongit.freedesktop.org/drm/drm...Dave Airlie
2020-01-09drm: of: Fix linking when CONFIG_OF is not setLaurent Pinchart
2020-01-08Revert "drm/bridge: Add a drm_bridge_state object"Boris Brezillon
2020-01-08Revert "drm/bridge: Patch atomic hooks to take a drm_bridge_state"Boris Brezillon
2020-01-08Revert "drm/bridge: Add an ->atomic_check() hook"Boris Brezillon
2020-01-08Revert "drm/bridge: Add the necessary bits to support bus format negotiation"Boris Brezillon
2020-01-07drm/fb: Extend format_info member arrays to handle four planesDhinakaran Pandiyan
2020-01-07drm/vram-helper: Remove BO device from public interfaceThomas Zimmermann
2020-01-07drm/vram-helper: Remove interruptible flag from public interfaceThomas Zimmermann
2020-01-07drm/bridge: Add the necessary bits to support bus format negotiationBoris Brezillon
2020-01-07drm/bridge: Add an ->atomic_check() hookBoris Brezillon
2020-01-07drm/bridge: Patch atomic hooks to take a drm_bridge_stateBoris Brezillon
2020-01-07drm/bridge: Add a drm_bridge_state objectBoris Brezillon
2020-01-06drm/vram: Support scanline alignment for dumb buffersThomas Zimmermann
2020-01-03Merge tag 'drm-misc-next-2020-01-02' of git://anongit.freedesktop.org/drm/drm...Dave Airlie
2019-12-27Merge tag 'drm-intel-next-2019-12-23' of git://anongit.freedesktop.org/drm/dr...Dave Airlie
2019-12-22drm/atomic: Spell CRTC consistentlyThierry Reding
2019-12-22drm: Fix a couple of typos, punctation and whitespace issuesThierry Reding
2019-12-18drm: Add Reusable task barrier.Andrey Grodzovsky
2019-12-18drm/scheduler: rework entity creationNirmoy Das
2019-12-18Merge tag 'du-next-20191218' of git://linuxtv.org/pinchartl/media into drm-nextDaniel Vetter
2019-12-18drm: Add __drm_atomic_helper_crtc_state_reset() & co.Ville Syrjälä
2019-12-18drm: of: Add drm_of_lvds_get_dual_link_pixel_orderFabrizio Castro
2019-12-17drm/drm_panel: Fix EXPORT of drm_panel_of_backlight() one more timeAndy Shevchenko
2019-12-17drm/print: introduce new struct drm_device based logging macrosJani Nikula
2019-12-17Merge tag 'drm-misc-next-2019-12-16' of git://anongit.freedesktop.org/drm/drm...Daniel Vetter
2019-12-16drm/modes: parse_cmdline: Add support for specifying panel_orientation (v2)Hans de Goede
2019-12-16drm/bridge/synopsys: dsi: driver-specific configuration of phy timingsHeiko Stuebner
2019-12-12drm/i915/cml: Separate U series pci id from origianl list.Lee Shawn C
d='n379' href='#n379'>379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859
/*
 * max8973-regulator.c -- Maxim max8973
 *
 * Regulator driver for MAXIM 8973 DC-DC step-down switching regulator.
 *
 * Copyright (c) 2012, NVIDIA Corporation.
 *
 * Author: Laxman Dewangan <ldewangan@nvidia.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation version 2.
 *
 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
 * whether express or implied; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 * 02111-1307, USA
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/max8973-regulator.h>
#include <linux/regulator/of_regulator.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/of_gpio.h>
#include <linux/i2c.h>
#include <linux/slab.h>
#include <linux/regmap.h>
#include <linux/thermal.h>
#include <linux/irq.h>
#include <linux/interrupt.h>

/* Register definitions */
#define MAX8973_VOUT					0x0
#define MAX8973_VOUT_DVS				0x1
#define MAX8973_CONTROL1				0x2
#define MAX8973_CONTROL2				0x3
#define MAX8973_CHIPID1					0x4
#define MAX8973_CHIPID2					0x5

#define MAX8973_MAX_VOUT_REG				2

/* MAX8973_VOUT */
#define MAX8973_VOUT_ENABLE				BIT(7)
#define MAX8973_VOUT_MASK				0x7F

/* MAX8973_VOUT_DVS */
#define MAX8973_DVS_VOUT_MASK				0x7F

/* MAX8973_CONTROL1 */
#define MAX8973_SNS_ENABLE				BIT(7)
#define MAX8973_FPWM_EN_M				BIT(6)
#define MAX8973_NFSR_ENABLE				BIT(5)
#define MAX8973_AD_ENABLE				BIT(4)
#define MAX8973_BIAS_ENABLE				BIT(3)
#define MAX8973_FREQSHIFT_9PER				BIT(2)

#define MAX8973_RAMP_12mV_PER_US			0x0
#define MAX8973_RAMP_25mV_PER_US			0x1
#define MAX8973_RAMP_50mV_PER_US			0x2
#define MAX8973_RAMP_200mV_PER_US			0x3
#define MAX8973_RAMP_MASK				0x3

/* MAX8973_CONTROL2 */
#define MAX8973_WDTMR_ENABLE				BIT(6)
#define MAX8973_DISCH_ENBABLE				BIT(5)
#define MAX8973_FT_ENABLE				BIT(4)
#define MAX77621_T_JUNCTION_120				BIT(7)

#define MAX8973_CKKADV_TRIP_MASK			0xC
#define MAX8973_CKKADV_TRIP_DISABLE			0xC
#define MAX8973_CKKADV_TRIP_75mV_PER_US			0x0
#define MAX8973_CKKADV_TRIP_150mV_PER_US		0x4
#define MAX8973_CKKADV_TRIP_75mV_PER_US_HIST_DIS	0x8
#define MAX8973_CONTROL_CLKADV_TRIP_MASK		0x00030000

#define MAX8973_INDUCTOR_MIN_30_PER			0x0
#define MAX8973_INDUCTOR_NOMINAL			0x1
#define MAX8973_INDUCTOR_PLUS_30_PER			0x2
#define MAX8973_INDUCTOR_PLUS_60_PER			0x3
#define MAX8973_CONTROL_INDUCTOR_VALUE_MASK		0x00300000

#define MAX8973_MIN_VOLATGE				606250
#define MAX8973_MAX_VOLATGE				1400000
#define MAX8973_VOLATGE_STEP				6250
#define MAX8973_BUCK_N_VOLTAGE				0x80

#define MAX77621_CHIPID_TJINT_S				BIT(0)

#define MAX77621_NORMAL_OPERATING_TEMP			100000
#define MAX77621_TJINT_WARNING_TEMP_120			120000
#define MAX77621_TJINT_WARNING_TEMP_140			140000

enum device_id {
	MAX8973,
	MAX77621
};

/* Maxim 8973 chip information */
struct max8973_chip {
	struct device *dev;
	struct regulator_desc desc;
	struct regmap *regmap;
	bool enable_external_control;
	int dvs_gpio;
	int lru_index[MAX8973_MAX_VOUT_REG];
	int curr_vout_val[MAX8973_MAX_VOUT_REG];
	int curr_vout_reg;
	int curr_gpio_val;
	struct regulator_ops ops;
	enum device_id id;
	int junction_temp_warning;
	int irq;
	struct thermal_zone_device *tz_device;
};

/*
 * find_voltage_set_register: Find new voltage configuration register (VOUT).
 * The finding of the new VOUT register will be based on the LRU mechanism.
 * Each VOUT register will have different voltage configured . This
 * Function will look if any of the VOUT register have requested voltage set
 * or not.
 *     - If it is already there then it will make that register as most
 *       recently used and return as found so that caller need not to set
 *       the VOUT register but need to set the proper gpios to select this
 *       VOUT register.
 *     - If requested voltage is not found then it will use the least
 *       recently mechanism to get new VOUT register for new configuration
 *       and will return not_found so that caller need to set new VOUT
 *       register and then gpios (both).
 */
static bool find_voltage_set_register(struct max8973_chip *tps,
		int req_vsel, int *vout_reg, int *gpio_val)
{
	int i;
	bool found = false;
	int new_vout_reg = tps->lru_index[MAX8973_MAX_VOUT_REG - 1];
	int found_index = MAX8973_MAX_VOUT_REG - 1;

	for (i = 0; i < MAX8973_MAX_VOUT_REG; ++i) {
		if (tps->curr_vout_val[tps->lru_index[i]] == req_vsel) {
			new_vout_reg = tps->lru_index[i];
			found_index = i;
			found = true;
			goto update_lru_index;
		}
	}

update_lru_index:
	for (i = found_index; i > 0; i--)
		tps->lru_index[i] = tps->lru_index[i - 1];

	tps->lru_index[0] = new_vout_reg;
	*gpio_val = new_vout_reg;
	*vout_reg = MAX8973_VOUT + new_vout_reg;
	return found;
}

static int max8973_dcdc_get_voltage_sel(struct regulator_dev *rdev)
{
	struct max8973_chip *max = rdev_get_drvdata(rdev);
	unsigned int data;
	int ret;

	ret = regmap_read(max->regmap, max->curr_vout_reg, &data);
	if (ret < 0) {
		dev_err(max->dev, "register %d read failed, err = %d\n",
			max->curr_vout_reg, ret);
		return ret;
	}
	return data & MAX8973_VOUT_MASK;
}

static int max8973_dcdc_set_voltage_sel(struct regulator_dev *rdev,
	     unsigned vsel)
{
	struct max8973_chip *max = rdev_get_drvdata(rdev);
	int ret;
	bool found = false;
	int vout_reg = max->curr_vout_reg;
	int gpio_val = max->curr_gpio_val;

	/*
	 * If gpios are available to select the VOUT register then least
	 * recently used register for new configuration.
	 */
	if (gpio_is_valid(max->dvs_gpio))
		found = find_voltage_set_register(max, vsel,
					&vout_reg, &gpio_val);

	if (!found) {
		ret = regmap_update_bits(max->regmap, vout_reg,
					MAX8973_VOUT_MASK, vsel);
		if (ret < 0) {
			dev_err(max->dev, "register %d update failed, err %d\n",
				 vout_reg, ret);
			return ret;
		}
		max->curr_vout_reg = vout_reg;
		max->curr_vout_val[gpio_val] = vsel;
	}

	/* Select proper VOUT register vio gpios */
	if (gpio_is_valid(max->dvs_gpio)) {
		gpio_set_value_cansleep(max->dvs_gpio, gpio_val & 0x1);
		max->curr_gpio_val = gpio_val;
	}
	return 0;
}

static int max8973_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode)
{
	struct max8973_chip *max = rdev_get_drvdata(rdev);
	int ret;
	int pwm;

	/* Enable force PWM mode in FAST mode only. */
	switch