Merge git://git.denx.de/u-boot-fsl-qoriq
This commit is contained in:
@@ -104,8 +104,10 @@ struct fsl_esdhc_priv {
|
||||
struct udevice *dev;
|
||||
int non_removable;
|
||||
int wp_enable;
|
||||
#ifdef CONFIG_DM_GPIO
|
||||
struct gpio_desc cd_gpio;
|
||||
struct gpio_desc wp_gpio;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Return the XFERTYP flags for a given command and data packet */
|
||||
@@ -688,9 +690,10 @@ static int esdhc_getcd(struct mmc *mmc)
|
||||
#ifdef CONFIG_DM_MMC
|
||||
if (priv->non_removable)
|
||||
return 1;
|
||||
|
||||
#ifdef CONFIG_DM_GPIO
|
||||
if (dm_gpio_is_valid(&priv->cd_gpio))
|
||||
return dm_gpio_get_value(&priv->cd_gpio);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
while (!(esdhc_read32(®s->prsstat) & PRSSTAT_CINS) && --timeout)
|
||||
@@ -909,17 +912,26 @@ void mmc_adapter_card_type_ident(void)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OF_LIBFDT
|
||||
__weak int esdhc_status_fixup(void *blob, const char *compat)
|
||||
{
|
||||
#ifdef CONFIG_FSL_ESDHC_PIN_MUX
|
||||
if (!hwconfig("esdhc")) {
|
||||
do_fixup_by_compat(blob, compat, "status", "disabled",
|
||||
sizeof("disabled"), 1);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
do_fixup_by_compat(blob, compat, "status", "okay",
|
||||
sizeof("okay"), 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fdt_fixup_esdhc(void *blob, bd_t *bd)
|
||||
{
|
||||
const char *compat = "fsl,esdhc";
|
||||
|
||||
#ifdef CONFIG_FSL_ESDHC_PIN_MUX
|
||||
if (!hwconfig("esdhc")) {
|
||||
do_fixup_by_compat(blob, compat, "status", "disabled",
|
||||
8 + 1, 1);
|
||||
if (esdhc_status_fixup(blob, compat))
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
||||
do_fixup_by_compat_u32(blob, compat, "peripheral-frequency",
|
||||
@@ -932,8 +944,6 @@ void fdt_fixup_esdhc(void *blob, bd_t *bd)
|
||||
do_fixup_by_compat_u32(blob, compat, "adapter-type",
|
||||
(u32)(gd->arch.sdhc_adapter), 1);
|
||||
#endif
|
||||
do_fixup_by_compat(blob, compat, "status", "okay",
|
||||
4 + 1, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -968,17 +978,20 @@ static int fsl_esdhc_probe(struct udevice *dev)
|
||||
priv->non_removable = 1;
|
||||
} else {
|
||||
priv->non_removable = 0;
|
||||
#ifdef CONFIG_DM_GPIO
|
||||
gpio_request_by_name_nodev(fdt, node, "cd-gpios", 0,
|
||||
&priv->cd_gpio, GPIOD_IS_IN);
|
||||
#endif
|
||||
}
|
||||
|
||||
priv->wp_enable = 1;
|
||||
|
||||
#ifdef CONFIG_DM_GPIO
|
||||
ret = gpio_request_by_name_nodev(fdt, node, "wp-gpios", 0,
|
||||
&priv->wp_gpio, GPIOD_IS_IN);
|
||||
if (ret)
|
||||
priv->wp_enable = 0;
|
||||
|
||||
#endif
|
||||
/*
|
||||
* TODO:
|
||||
* Because lack of clk driver, if SDHC clk is not enabled,
|
||||
@@ -1022,6 +1035,7 @@ static const struct udevice_id fsl_esdhc_ids[] = {
|
||||
{ .compatible = "fsl,imx6sl-usdhc", },
|
||||
{ .compatible = "fsl,imx6q-usdhc", },
|
||||
{ .compatible = "fsl,imx7d-usdhc", },
|
||||
{ .compatible = "fsl,esdhc", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
|
||||
@@ -71,4 +71,12 @@ config PCI_XILINX
|
||||
Enable support for the Xilinx AXI bridge for PCI express, an IP block
|
||||
which can be used on some generations of Xilinx FPGAs.
|
||||
|
||||
config PCIE_LAYERSCAPE
|
||||
bool "Layerscape PCIe support"
|
||||
depends on DM_PCI
|
||||
help
|
||||
Support Layerscape PCIe. The Layerscape SoC may have one or several
|
||||
PCIe controllers. The PCIe may works in RC or EP mode according to
|
||||
RCW[HOST_AGT_PEX] setting.
|
||||
|
||||
endif
|
||||
|
||||
@@ -32,4 +32,5 @@ obj-$(CONFIG_TSI108_PCI) += tsi108_pci.o
|
||||
obj-$(CONFIG_WINBOND_83C553) += w83c553f.o
|
||||
obj-$(CONFIG_PCIE_DW_MVEBU) += pcie_dw_mvebu.o
|
||||
obj-$(CONFIG_PCIE_LAYERSCAPE) += pcie_layerscape.o
|
||||
obj-$(CONFIG_PCIE_LAYERSCAPE) += pcie_layerscape_fixup.o
|
||||
obj-$(CONFIG_PCI_XILINX) += pcie_xilinx.o
|
||||
|
||||
@@ -181,11 +181,6 @@ phys_addr_t pci_hose_bus_to_phys(struct pci_controller *hose,
|
||||
return phys_addr;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DM_PCI
|
||||
/* The root controller has the region information */
|
||||
hose = pci_bus_to_hose(0);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* if PCI_REGION_MEM is set we do a two pass search with preference
|
||||
* on matches that don't have PCI_REGION_SYS_MEMORY set
|
||||
@@ -236,6 +231,13 @@ int __pci_hose_phys_to_bus(struct pci_controller *hose,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* pci_hose_phys_to_bus(): Convert physical address to bus address
|
||||
* @hose: PCI hose of the root PCI controller
|
||||
* @phys_addr: physical address to convert
|
||||
* @flags: flags of pci regions
|
||||
* @return bus address if OK, 0 on error
|
||||
*/
|
||||
pci_addr_t pci_hose_phys_to_bus(struct pci_controller *hose,
|
||||
phys_addr_t phys_addr,
|
||||
unsigned long flags)
|
||||
@@ -248,11 +250,6 @@ pci_addr_t pci_hose_phys_to_bus(struct pci_controller *hose,
|
||||
return bus_addr;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DM_PCI
|
||||
/* The root controller has the region information */
|
||||
hose = pci_bus_to_hose(0);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* if PCI_REGION_MEM is set we do a two pass search with preference
|
||||
* on matches that don't have PCI_REGION_SYS_MEMORY set
|
||||
|
||||
@@ -49,5 +49,5 @@ struct pci_controller *pci_bus_to_hose(int busnum)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return dev_get_uclass_priv(bus);
|
||||
return dev_get_uclass_priv(pci_get_controller(bus));
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
140
drivers/pci/pcie_layerscape.h
Normal file
140
drivers/pci/pcie_layerscape.h
Normal file
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Copyright 2014-2015 Freescale Semiconductor, Inc.
|
||||
* Layerscape PCIe driver
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _PCIE_LAYERSCAPE_H_
|
||||
#define _PCIE_LAYERSCAPE_H_
|
||||
#include <pci.h>
|
||||
#include <dm.h>
|
||||
|
||||
#ifndef CONFIG_SYS_PCI_MEMORY_BUS
|
||||
#define CONFIG_SYS_PCI_MEMORY_BUS CONFIG_SYS_SDRAM_BASE
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_PCI_MEMORY_PHYS
|
||||
#define CONFIG_SYS_PCI_MEMORY_PHYS CONFIG_SYS_SDRAM_BASE
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_PCI_MEMORY_SIZE
|
||||
#define CONFIG_SYS_PCI_MEMORY_SIZE (2 * 1024 * 1024 * 1024UL) /* 2G */
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_PCI_EP_MEMORY_BASE
|
||||
#define CONFIG_SYS_PCI_EP_MEMORY_BASE CONFIG_SYS_LOAD_ADDR
|
||||
#endif
|
||||
|
||||
/* iATU registers */
|
||||
#define PCIE_ATU_VIEWPORT 0x900
|
||||
#define PCIE_ATU_REGION_INBOUND (0x1 << 31)
|
||||
#define PCIE_ATU_REGION_OUTBOUND (0x0 << 31)
|
||||
#define PCIE_ATU_REGION_INDEX0 (0x0 << 0)
|
||||
#define PCIE_ATU_REGION_INDEX1 (0x1 << 0)
|
||||
#define PCIE_ATU_REGION_INDEX2 (0x2 << 0)
|
||||
#define PCIE_ATU_REGION_INDEX3 (0x3 << 0)
|
||||
#define PCIE_ATU_REGION_NUM 6
|
||||
#define PCIE_ATU_CR1 0x904
|
||||
#define PCIE_ATU_TYPE_MEM (0x0 << 0)
|
||||
#define PCIE_ATU_TYPE_IO (0x2 << 0)
|
||||
#define PCIE_ATU_TYPE_CFG0 (0x4 << 0)
|
||||
#define PCIE_ATU_TYPE_CFG1 (0x5 << 0)
|
||||
#define PCIE_ATU_CR2 0x908
|
||||
#define PCIE_ATU_ENABLE (0x1 << 31)
|
||||
#define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30)
|
||||
#define PCIE_ATU_BAR_NUM(bar) ((bar) << 8)
|
||||
#define PCIE_ATU_LOWER_BASE 0x90C
|
||||
#define PCIE_ATU_UPPER_BASE 0x910
|
||||
#define PCIE_ATU_LIMIT 0x914
|
||||
#define PCIE_ATU_LOWER_TARGET 0x918
|
||||
#define PCIE_ATU_BUS(x) (((x) & 0xff) << 24)
|
||||
#define PCIE_ATU_DEV(x) (((x) & 0x1f) << 19)
|
||||
#define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16)
|
||||
#define PCIE_ATU_UPPER_TARGET 0x91C
|
||||
|
||||
/* DBI registers */
|
||||
#define PCIE_SRIOV 0x178
|
||||
#define PCIE_STRFMR1 0x71c /* Symbol Timer & Filter Mask Register1 */
|
||||
#define PCIE_DBI_RO_WR_EN 0x8bc
|
||||
|
||||
#define PCIE_LINK_CAP 0x7c
|
||||
#define PCIE_LINK_SPEED_MASK 0xf
|
||||
#define PCIE_LINK_WIDTH_MASK 0x3f0
|
||||
#define PCIE_LINK_STA 0x82
|
||||
|
||||
#define LTSSM_STATE_MASK 0x3f
|
||||
#define LTSSM_PCIE_L0 0x11 /* L0 state */
|
||||
|
||||
#define PCIE_DBI_SIZE 0x100000 /* 1M */
|
||||
|
||||
#define PCIE_LCTRL0_CFG2_ENABLE (1 << 31)
|
||||
#define PCIE_LCTRL0_VF(vf) ((vf) << 22)
|
||||
#define PCIE_LCTRL0_PF(pf) ((pf) << 16)
|
||||
#define PCIE_LCTRL0_VF_ACTIVE (1 << 21)
|
||||
#define PCIE_LCTRL0_VAL(pf, vf) (PCIE_LCTRL0_PF(pf) | \
|
||||
PCIE_LCTRL0_VF(vf) | \
|
||||
((vf) == 0 ? 0 : PCIE_LCTRL0_VF_ACTIVE) | \
|
||||
PCIE_LCTRL0_CFG2_ENABLE)
|
||||
|
||||
#define PCIE_NO_SRIOV_BAR_BASE 0x1000
|
||||
|
||||
#define PCIE_PF_NUM 2
|
||||
#define PCIE_VF_NUM 64
|
||||
|
||||
#define PCIE_BAR0_SIZE (4 * 1024) /* 4K */
|
||||
#define PCIE_BAR1_SIZE (8 * 1024) /* 8K for MSIX */
|
||||
#define PCIE_BAR2_SIZE (4 * 1024) /* 4K */
|
||||
#define PCIE_BAR4_SIZE (1 * 1024 * 1024) /* 1M */
|
||||
|
||||
/* LUT registers */
|
||||
#define PCIE_LUT_UDR(n) (0x800 + (n) * 8)
|
||||
#define PCIE_LUT_LDR(n) (0x804 + (n) * 8)
|
||||
#define PCIE_LUT_ENABLE (1 << 31)
|
||||
#define PCIE_LUT_ENTRY_COUNT 32
|
||||
|
||||
/* PF Controll registers */
|
||||
#define PCIE_PF_VF_CTRL 0x7F8
|
||||
#define PCIE_PF_DBG 0x7FC
|
||||
|
||||
#define PCIE_SRDS_PRTCL(idx) (PCIE1 + (idx))
|
||||
#define PCIE_SYS_BASE_ADDR 0x3400000
|
||||
#define PCIE_CCSR_SIZE 0x0100000
|
||||
|
||||
/* CS2 */
|
||||
#define PCIE_CS2_OFFSET 0x1000 /* For PCIe without SR-IOV */
|
||||
|
||||
#define SVR_LS102XA 0
|
||||
#define SVR_VAR_PER_SHIFT 8
|
||||
#define SVR_LS102XA_MASK 0x700
|
||||
|
||||
/* LS1021a PCIE space */
|
||||
#define LS1021_PCIE_SPACE_OFFSET 0x4000000000ULL
|
||||
#define LS1021_PCIE_SPACE_SIZE 0x0800000000ULL
|
||||
|
||||
/* LS1021a PEX1/2 Misc Ports Status Register */
|
||||
#define LS1021_PEXMSCPORTSR(pex_idx) (0x94 + (pex_idx) * 4)
|
||||
#define LS1021_LTSSM_STATE_SHIFT 20
|
||||
|
||||
struct ls_pcie {
|
||||
int idx;
|
||||
struct list_head list;
|
||||
struct udevice *bus;
|
||||
struct fdt_resource dbi_res;
|
||||
struct fdt_resource lut_res;
|
||||
struct fdt_resource ctrl_res;
|
||||
struct fdt_resource cfg_res;
|
||||
void __iomem *dbi;
|
||||
void __iomem *lut;
|
||||
void __iomem *ctrl;
|
||||
void __iomem *cfg0;
|
||||
void __iomem *cfg1;
|
||||
bool big_endian;
|
||||
bool enabled;
|
||||
int next_lut_index;
|
||||
struct pci_controller hose;
|
||||
};
|
||||
|
||||
extern struct list_head ls_pcie_list;
|
||||
|
||||
#endif /* _PCIE_LAYERSCAPE_H_ */
|
||||
187
drivers/pci/pcie_layerscape_fixup.c
Normal file
187
drivers/pci/pcie_layerscape_fixup.c
Normal file
@@ -0,0 +1,187 @@
|
||||
/*
|
||||
* Copyright 2014-2015 Freescale Semiconductor, Inc.
|
||||
* Layerscape PCIe driver
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <pci.h>
|
||||
#include <asm/arch/fsl_serdes.h>
|
||||
#include <asm/io.h>
|
||||
#include <errno.h>
|
||||
#ifdef CONFIG_OF_BOARD_SETUP
|
||||
#include <libfdt.h>
|
||||
#include <fdt_support.h>
|
||||
#include "pcie_layerscape.h"
|
||||
|
||||
#ifdef CONFIG_FSL_LSCH3
|
||||
/*
|
||||
* Return next available LUT index.
|
||||
*/
|
||||
static int ls_pcie_next_lut_index(struct ls_pcie *pcie)
|
||||
{
|
||||
if (pcie->next_lut_index < PCIE_LUT_ENTRY_COUNT)
|
||||
return pcie->next_lut_index++;
|
||||
else
|
||||
return -ENOSPC; /* LUT is full */
|
||||
}
|
||||
|
||||
/* returns the next available streamid for pcie, -errno if failed */
|
||||
static int ls_pcie_next_streamid(void)
|
||||
{
|
||||
static int next_stream_id = FSL_PEX_STREAM_ID_START;
|
||||
|
||||
if (next_stream_id > FSL_PEX_STREAM_ID_END)
|
||||
return -EINVAL;
|
||||
|
||||
return next_stream_id++;
|
||||
}
|
||||
|
||||
static void lut_writel(struct ls_pcie *pcie, unsigned int value,
|
||||
unsigned int offset)
|
||||
{
|
||||
if (pcie->big_endian)
|
||||
out_be32(pcie->lut + offset, value);
|
||||
else
|
||||
out_le32(pcie->lut + offset, value);
|
||||
}
|
||||
|
||||
/*
|
||||
* Program a single LUT entry
|
||||
*/
|
||||
static void ls_pcie_lut_set_mapping(struct ls_pcie *pcie, int index, u32 devid,
|
||||
u32 streamid)
|
||||
{
|
||||
/* leave mask as all zeroes, want to match all bits */
|
||||
lut_writel(pcie, devid << 16, PCIE_LUT_UDR(index));
|
||||
lut_writel(pcie, streamid | PCIE_LUT_ENABLE, PCIE_LUT_LDR(index));
|
||||
}
|
||||
|
||||
/*
|
||||
* An msi-map is a property to be added to the pci controller
|
||||
* node. It is a table, where each entry consists of 4 fields
|
||||
* e.g.:
|
||||
*
|
||||
* msi-map = <[devid] [phandle-to-msi-ctrl] [stream-id] [count]
|
||||
* [devid] [phandle-to-msi-ctrl] [stream-id] [count]>;
|
||||
*/
|
||||
static void fdt_pcie_set_msi_map_entry(void *blob, struct ls_pcie *pcie,
|
||||
u32 devid, u32 streamid)
|
||||
{
|
||||
u32 *prop;
|
||||
u32 phandle;
|
||||
int nodeoffset;
|
||||
|
||||
/* find pci controller node */
|
||||
nodeoffset = fdt_node_offset_by_compat_reg(blob, "fsl,ls-pcie",
|
||||
pcie->dbi_res.start);
|
||||
if (nodeoffset < 0) {
|
||||
#ifdef CONFIG_FSL_PCIE_COMPAT /* Compatible with older version of dts node */
|
||||
nodeoffset = fdt_node_offset_by_compat_reg(blob,
|
||||
CONFIG_FSL_PCIE_COMPAT, pcie->dbi_res.start);
|
||||
if (nodeoffset < 0)
|
||||
return;
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* get phandle to MSI controller */
|
||||
prop = (u32 *)fdt_getprop(blob, nodeoffset, "msi-parent", 0);
|
||||
if (prop == NULL) {
|
||||
debug("\n%s: ERROR: missing msi-parent: PCIe%d\n",
|
||||
__func__, pcie->idx);
|
||||
return;
|
||||
}
|
||||
phandle = fdt32_to_cpu(*prop);
|
||||
|
||||
/* set one msi-map row */
|
||||
fdt_appendprop_u32(blob, nodeoffset, "msi-map", devid);
|
||||
fdt_appendprop_u32(blob, nodeoffset, "msi-map", phandle);
|
||||
fdt_appendprop_u32(blob, nodeoffset, "msi-map", streamid);
|
||||
fdt_appendprop_u32(blob, nodeoffset, "msi-map", 1);
|
||||
}
|
||||
|
||||
static void fdt_fixup_pcie(void *blob)
|
||||
{
|
||||
struct udevice *dev, *bus;
|
||||
struct ls_pcie *pcie;
|
||||
int streamid;
|
||||
int index;
|
||||
pci_dev_t bdf;
|
||||
|
||||
/* Scan all known buses */
|
||||
for (pci_find_first_device(&dev);
|
||||
dev;
|
||||
pci_find_next_device(&dev)) {
|
||||
for (bus = dev; device_is_on_pci_bus(bus);)
|
||||
bus = bus->parent;
|
||||
pcie = dev_get_priv(bus);
|
||||
|
||||
streamid = ls_pcie_next_streamid();
|
||||
if (streamid < 0) {
|
||||
debug("ERROR: no stream ids free\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
index = ls_pcie_next_lut_index(pcie);
|
||||
if (index < 0) {
|
||||
debug("ERROR: no LUT indexes free\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* the DT fixup must be relative to the hose first_busno */
|
||||
bdf = dm_pci_get_bdf(dev) - PCI_BDF(bus->seq, 0, 0);
|
||||
/* map PCI b.d.f to streamID in LUT */
|
||||
ls_pcie_lut_set_mapping(pcie, index, bdf >> 8,
|
||||
streamid);
|
||||
/* update msi-map in device tree */
|
||||
fdt_pcie_set_msi_map_entry(blob, pcie, bdf >> 8,
|
||||
streamid);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void ft_pcie_ls_setup(void *blob, struct ls_pcie *pcie)
|
||||
{
|
||||
int off;
|
||||
|
||||
off = fdt_node_offset_by_compat_reg(blob, "fsl,ls-pcie",
|
||||
pcie->dbi_res.start);
|
||||
if (off < 0) {
|
||||
#ifdef CONFIG_FSL_PCIE_COMPAT /* Compatible with older version of dts node */
|
||||
off = fdt_node_offset_by_compat_reg(blob,
|
||||
CONFIG_FSL_PCIE_COMPAT,
|
||||
pcie->dbi_res.start);
|
||||
if (off < 0)
|
||||
return;
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (pcie->enabled)
|
||||
fdt_set_node_status(blob, off, FDT_STATUS_OKAY, 0);
|
||||
else
|
||||
fdt_set_node_status(blob, off, FDT_STATUS_DISABLED, 0);
|
||||
}
|
||||
|
||||
/* Fixup Kernel DT for PCIe */
|
||||
void ft_pci_setup(void *blob, bd_t *bd)
|
||||
{
|
||||
struct ls_pcie *pcie;
|
||||
|
||||
list_for_each_entry(pcie, &ls_pcie_list, list)
|
||||
ft_pcie_ls_setup(blob, pcie);
|
||||
|
||||
#ifdef CONFIG_FSL_LSCH3
|
||||
fdt_fixup_pcie(blob);
|
||||
#endif
|
||||
}
|
||||
|
||||
#else /* !CONFIG_OF_BOARD_SETUP */
|
||||
void ft_pci_setup(void *blob, bd_t *bd)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
@@ -164,3 +164,10 @@ config PMIC_LP873X
|
||||
---help---
|
||||
The LP873X is a PMIC containing couple of LDOs and couple of SMPS.
|
||||
This driver binds the pmic children.
|
||||
|
||||
config POWER_MC34VR500
|
||||
bool "Enable driver for Freescale MC34VR500 PMIC"
|
||||
---help---
|
||||
The MC34VR500 is used in conjunction with the FSL T1 and LS1 series
|
||||
SoC. It provides 4 buck DC-DC convertors and 5 LDOs, and it is accessed
|
||||
via an I2C interface.
|
||||
|
||||
@@ -33,3 +33,4 @@ obj-$(CONFIG_POWER_TPS65218) += pmic_tps62362.o
|
||||
obj-$(CONFIG_POWER_TPS65218) += pmic_tps65218.o
|
||||
obj-$(CONFIG_POWER_TPS65910) += pmic_tps65910.o
|
||||
obj-$(CONFIG_POWER_HI6553) += pmic_hi6553.o
|
||||
obj-$(CONFIG_POWER_MC34VR500) += pmic_mc34vr500.o
|
||||
|
||||
32
drivers/power/pmic/pmic_mc34vr500.c
Normal file
32
drivers/power/pmic/pmic_mc34vr500.c
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2016 Freescale Semiconductor, Inc.
|
||||
* Hou Zhiqiang <Zhiqiang.Hou@freescale.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <errno.h>
|
||||
#include <i2c.h>
|
||||
#include <power/pmic.h>
|
||||
#include <power/mc34vr500_pmic.h>
|
||||
|
||||
int power_mc34vr500_init(unsigned char bus)
|
||||
{
|
||||
static const char name[] = "MC34VR500";
|
||||
struct pmic *p = pmic_alloc();
|
||||
|
||||
if (!p) {
|
||||
printf("%s: POWER allocation error!\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
p->name = name;
|
||||
p->interface = PMIC_I2C;
|
||||
p->number_of_regs = MC34VR500_NUM_OF_REGS;
|
||||
p->hw.i2c.addr = MC34VR500_I2C_ADDR;
|
||||
p->hw.i2c.tx_num = 1;
|
||||
p->bus = bus;
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user