diff options
| author | Wolfgang Denk <wd@denx.de> | 2012-05-20 21:31:26 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2012-05-20 21:31:26 +0200 | 
| commit | ee3a55fdf00b54391e406217e53674449e70d78b (patch) | |
| tree | 0c7edb3ba668e5a215c42e8b1429cc3f394351b2 /arch/arm/cpu/armv7/omap-common/vc.c | |
| parent | 6bc337fb13003a9a949dfb2713e308fb97faae8a (diff) | |
| parent | 2ca4a209a5b961ad1be8782c68dabe326d77dfaf (diff) | |
| download | olio-uboot-2014.01-ee3a55fdf00b54391e406217e53674449e70d78b.tar.xz olio-uboot-2014.01-ee3a55fdf00b54391e406217e53674449e70d78b.zip  | |
Merge branch 'master' of git://git.denx.de/u-boot-arm
* 'master' of git://git.denx.de/u-boot-arm: (167 commits)
  OMAP4/5: Change omap4_sdp, omap4_panda, omap5_evm maintainer
  ARM: omap3: Add CONFIG_SPL_BOARD_INIT for CONFIG_SPL_MMC_SUPPORT
  ARM: omap3: Set SPL stack size to 8KB, image to 54KB.
  arm, omap3: fix warm reset serial output on OMAP36xx/AM/DM37xx
  OMAP4: Set fdt_high for OMAP4 devices to enable booting with Device Tree
  omap4: do not enable auxiliary cores
  omap4: do not enable fs-usb module
  omap4: panda: disable uart2 pads during boot
  igep00x0: change mpurate from 500 to auto
  igep00x0: enable the use of a plain text file
  tegra2: trivially enable 13 mhz crystal frequency
  tegra: Enable keyboard for Seaboard
  tegra: Switch on console mux and use environment for console
  tegra: Add tegra keyboard driver
  tegra: fdt: Add keyboard definitions for Seaboard
  tegra: fdt: Add keyboard controller definition
  tegra: Add keyboard support to funcmux
  input: Add support for keyboard matrix decoding from an fdt
  input: Add generic keyboard input handler
  input: Add linux/input.h for key code support
  fdt: Add fdtdec functions to read byte array
  tegra: Enable LP0 on Seaboard
  tegra: fdt: Add EMC data for Tegra2 Seaboard
  tegra: i2c: Add function to find DVC bus
  fdt: tegra: Add EMC node to device tree
  tegra: Add EMC settings for Seaboard
  tegra: Turn off power detect in board init
  tegra: Set up warmboot code on Nvidia boards
  tegra: Setup PMC scratch info from ap20 setup
  tegra: Add warmboot implementation
  tegra: Set up PMU for Nvidia boards
  tegra: Add PMU to manage power supplies
  tegra: Add EMC support for optimal memory timings
  tegra: Add header file for APB_MISC register
  tegra: Add tegra_get_chip_type() to detect SKU
  tegra: Add flow, gp_padctl, fuse, sdram headers
  tegra: Add crypto library for warmboot code
  tegra: Add functions to access low-level Osc/PLL details
  tegra: Move ap20.h header into arch location
  Add AES crypto library
  i2c: Add TPS6586X driver
  Add abs() macro to return absolute value
  fdt: Add function to return next compatible subnode
  fdt: Add function to locate an array in the device tree
  i.MX28: Avoid redefining serial_put[cs]()
  i.MX28: Check if WP detection is implemented at all
  i.MX28: Add battery boot components to SPL
  i.MX28: Reorder battery status functions in SPL
  i.MX28: Add LRADC init to i.MX28 SPL
  i.MX28: Add LRADC register definitions
  i.MX28: Shut down the LCD controller before reset
  i.MX28: Add LCDIF register definitions
  i.MX28: Implement boot pads sampling and reporting
  i.MX28: Improve passing of data from SPL to U-Boot
  M28EVK: Add SD update command
  M28EVK: Implement support for new board V2.0
  FEC: Abstract out register setup
  MX5: PAD_CTL_DRV_VOT_LOW and PAD_CTL_DRV_VOT_HIGH exchanged
  i.MX28: Add delay after CPU bypass is cleared
  spi: mxs: Allow other chip selects to work
  spi: mxs: Introduce spi_cs_is_valid()
  mx53loco: Remove unneeded gpio_set_value()
  mx53loco: Add CONFIG_REVISION_TAG
  mx53loco: Turn on VUSB regulator
  mx53loco: Add mc34708 support and set mx53 frequency at 1GHz
  pmic: dialog: Avoid name conflicts
  imx: Add u-boot.imx as target for ARM9 i.MX SOCs
  i.MX2: Include asm/types.h in arch-mx25/imx-regs.h
  imx: usb: There is no such register
  i.MX25: usb: Set PORTSCx register
  imx: nand: Support flash based BBT
  i.MX25: This architecture has a GPIO4 too
  i.MX25: esdhc: Add mxc_get_clock infrastructure
  i.MX6: mx6q_sabrelite: add SATA bindings
  i.MX6: add enable_sata_clock()
  i.MX6: Add ANATOP regulator init
  mx28evk: add NAND support
  USB: ehci-mx6: Fix broken IO access
  M28: Scan only first 512 MB of DRAM to avoid memory wraparound
  Revert "i.MX28: Enable additional DRAM address bits"
  M28: Enable FDT support
  mx53loco: Add support for 1GHz operation for DA9053-based boards
  mx53loco: Allow to print CPU information at a later stage
  mx5: Add clock config interface
  imx-common: Factor out get_ahb_clk()
  i.MX6Q: mx6qsabrelite: Add keypress support to alter boot flow
  mx31pdk: Allow booting a zImage kernel
  mx6qarm2: Allow booting a zImage kernel
  mx6qsabrelite: Allow booting a zImage kernel
  mx28evk: Allow booting a zImage kernel
  m28evk: Allow to booting a dt kernel
  mx28evk: Allow to booting a dt kernel
  mx6qsabrelite: No need to set the direction for GPIO3_23 again
  pmic: Add support for the Dialog DA9053 PMIC
  MX53: mx53loco: Add SATA support
  MX53: Add support to ESG ima3 board
  SATA: add driver for MX5 / MX6 SOCs
  MX53: add function to set SATA clock to internal
  SATA: check for return value from sata functions
  MX5: Add definitions for SATA controller
  NET: fec_mxc.c: Add a way to disable auto negotiation
  Define UART4 and UART5 base addresses
  EXYNOS: Change bits per pixel value proper for u-boot.
  EXYNOS: support TRATS board display function
  LCD: support S6E8AX0 amoled driver based on EXYNOS MIPI DSI
  EXYNOS: support EXYNOS MIPI DSI interface driver.
  EXYNOS: support EXYNOS framebuffer and FIMD display drivers.
  LCD: add data structure for EXYNOS display driver
  EXYNOS: add LCD and MIPI DSI clock interface.
  EXYNOS: definitions of system resgister and power management registers.
  SMDK5250: fix compiler warning
  misc:pmic:samsung Convert TRATS target to use MAX8997 instead of MAX8998
  misc:pmic:max8997 MAX8997 support for PMIC driver
  TRATS: modify the trats's configuration
  ARM: Exynos4: ADC: Universal_C210: Enable LDO4 power line for ADC measurement
  EXYNOS: Rename exynos5_tzpc structure to exynos_tzpc
  arm: ea20: Change macro from BOARD_LATE_INIT to CONFIG_BOARD_LATE_INIT
  arm: cam_enc_4xx: Change macro from BOARD_LATE_INIT to CONFIG_BOARD_LATE_INIT
  cm-t35: add I2C multi-bus support
  include/configs: Remove CONFIG_SYS_64BIT_STRTOUL
  include/configs: Remove CONFIG_SYS_64BIT_VSPRINTF
  omap3: Introduce weak misc_init_r
  omap730p2: Remove empty misc_init_r
  omap5912osk: Remove empty misc_init_r
  omap4+: Remove CONFIG_ARCH_CPU_INIT
  omap4: Remove CONFIG_SYS_MMC_SET_DEV
  OMAP3: pandora: drop console kernel argument
  OMAP3: pandora: revise GPIO configuration
  ...
Diffstat (limited to 'arch/arm/cpu/armv7/omap-common/vc.c')
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/vc.c | 138 | 
1 files changed, 138 insertions, 0 deletions
diff --git a/arch/arm/cpu/armv7/omap-common/vc.c b/arch/arm/cpu/armv7/omap-common/vc.c new file mode 100644 index 000000000..a045b7718 --- /dev/null +++ b/arch/arm/cpu/armv7/omap-common/vc.c @@ -0,0 +1,138 @@ +/* + * Voltage Controller implementation for OMAP + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ + *	Nishanth Menon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include <common.h> +#include <asm/omap_common.h> +#include <asm/arch/sys_proto.h> + +/* + * Define Master code if there are multiple masters on the I2C_SR bus. + * Normally not required + */ +#ifndef CONFIG_OMAP_VC_I2C_HS_MCODE +#define CONFIG_OMAP_VC_I2C_HS_MCODE 0x0 +#endif + +/* Register defines and masks for VC IP Block */ +/* PRM_VC_CFG_I2C_MODE */ +#define PRM_VC_CFG_I2C_MODE_DFILTEREN_BIT	(0x1 << 6) +#define PRM_VC_CFG_I2C_MODE_SRMODEEN_BIT	(0x1 << 4) +#define PRM_VC_CFG_I2C_MODE_HSMODEEN_BIT	(0x1 << 3) +#define PRM_VC_CFG_I2C_MODE_HSMCODE_SHIFT	0x0 +#define PRM_VC_CFG_I2C_MODE_HSMCODE_MASK	0x3 + +/* PRM_VC_CFG_I2C_CLK */ +#define PRM_VC_CFG_I2C_CLK_HSCLL_SHIFT		24 +#define PRM_VC_CFG_I2C_CLK_HSCLL_MASK		0xFF +#define PRM_VC_CFG_I2C_CLK_HSCLH_SHIFT		16 +#define PRM_VC_CFG_I2C_CLK_HSCLH_MASK		0xFF +#define PRM_VC_CFG_I2C_CLK_SCLH_SHIFT		0 +#define PRM_VC_CFG_I2C_CLK_SCLH_MASK		0xFF +#define PRM_VC_CFG_I2C_CLK_SCLL_SHIFT		8 +#define PRM_VC_CFG_I2C_CLK_SCLL_MASK		(0xFF << 8) + +/* PRM_VC_VAL_BYPASS */ +#define PRM_VC_VAL_BYPASS_VALID_BIT		(0x1 << 24) +#define PRM_VC_VAL_BYPASS_SLAVEADDR_SHIFT	0 +#define PRM_VC_VAL_BYPASS_SLAVEADDR_MASK	0x7F +#define PRM_VC_VAL_BYPASS_REGADDR_SHIFT		8 +#define PRM_VC_VAL_BYPASS_REGADDR_MASK		0xFF +#define PRM_VC_VAL_BYPASS_DATA_SHIFT		16 +#define PRM_VC_VAL_BYPASS_DATA_MASK		0xFF + +/** + * omap_vc_init() - Initialization for Voltage controller + * @speed_khz: I2C buspeed in KHz + */ +void omap_vc_init(u16 speed_khz) +{ +	u32 val; +	u32 sys_clk_khz, cycles_hi, cycles_low; + +	sys_clk_khz = get_sys_clk_freq() / 1000; + +	if (speed_khz > 400) { +		puts("higher speed requested - throttle to 400Khz\n"); +		speed_khz = 400; +	} + +	/* +	 * Setup the dedicated I2C controller for Voltage Control +	 * I2C clk - high period 40% low period 60% +	 */ +	speed_khz /= 10; +	cycles_hi = sys_clk_khz * 4 / speed_khz; +	cycles_low = sys_clk_khz * 6 / speed_khz; +	/* values to be set in register - less by 5 & 7 respectively */ +	cycles_hi -= 5; +	cycles_low -= 7; +	val = (cycles_hi << PRM_VC_CFG_I2C_CLK_SCLH_SHIFT) | +	       (cycles_low << PRM_VC_CFG_I2C_CLK_SCLL_SHIFT); +	writel(val, &prcm->prm_vc_cfg_i2c_clk); + +	val = CONFIG_OMAP_VC_I2C_HS_MCODE << +		PRM_VC_CFG_I2C_MODE_HSMCODE_SHIFT; +	/* No HS mode for now */ +	val &= ~PRM_VC_CFG_I2C_MODE_HSMODEEN_BIT; +	writel(val, &prcm->prm_vc_cfg_i2c_mode); +} + +/** + * omap_vc_bypass_send_value() - Send a data using VC Bypass command + * @sa:		7 bit I2C slave address of the PMIC + * @reg_addr:	I2C register address(8 bit) address in PMIC + * @reg_data:	what 8 bit data to write + */ +int omap_vc_bypass_send_value(u8 sa, u8 reg_addr, u8 reg_data) +{ +	/* +	 * Unfortunately we need to loop here instead of a defined time +	 * use arbitary large value +	 */ +	u32 timeout = 0xFFFF; +	u32 reg_val; + +	sa &= PRM_VC_VAL_BYPASS_SLAVEADDR_MASK; +	reg_addr &= PRM_VC_VAL_BYPASS_REGADDR_MASK; +	reg_data &= PRM_VC_VAL_BYPASS_DATA_MASK; + +	/* program VC to send data */ +	reg_val = sa << PRM_VC_VAL_BYPASS_SLAVEADDR_SHIFT | +	    reg_addr << PRM_VC_VAL_BYPASS_REGADDR_SHIFT | +	    reg_data << PRM_VC_VAL_BYPASS_DATA_SHIFT; +	writel(reg_val, &prcm->prm_vc_val_bypass); + +	/* Signal VC to send data */ +	writel(reg_val | PRM_VC_VAL_BYPASS_VALID_BIT, &prcm->prm_vc_val_bypass); + +	/* Wait on VC to complete transmission */ +	do { +		reg_val = readl(&prcm->prm_vc_val_bypass) & +				PRM_VC_VAL_BYPASS_VALID_BIT; +		if (!reg_val) +			break; + +		sdelay(100); +	} while (--timeout); + +	/* Optional: cleanup PRM_IRQSTATUS_Ax */ +	/* In case we can do something about it in future.. */ +	if (!timeout) +		return -1; + +	/* All good.. */ +	return 0; +}  |