mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-18 13:11:31 +00:00
Merge branch '2020-06-30-pxa-dm_mmc-migration' into next
- Migrate the PXA MMC driver to driver model.
This commit is contained in:
commit
6b3c74428a
12 changed files with 193 additions and 48 deletions
2
Makefile
2
Makefile
|
@ -1025,7 +1025,7 @@ ifneq ($(CONFIG_DM),y)
|
|||
@echo >&2 "===================================================="
|
||||
endif
|
||||
ifeq ($(CONFIG_MMC),y)
|
||||
ifneq ($(CONFIG_DM_MMC)$(CONFIG_OF_CONTROL)$(CONFIG_BLK),yyy)
|
||||
ifneq ($(CONFIG_DM_MMC)$(CONFIG_BLK),yy)
|
||||
@echo >&2 "===================== WARNING ======================"
|
||||
@echo >&2 "This board does not use CONFIG_DM_MMC. Please update"
|
||||
@echo >&2 "the board to use CONFIG_DM_MMC before the v2019.04 release."
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Toradex Colibri PXA270 Support
|
||||
*
|
||||
* Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com>
|
||||
* Copyright (C) 2016 Marcel Ziswiler <marcel.ziswiler@toradex.com>
|
||||
* Copyright (C) 2016-2019 Marcel Ziswiler <marcel.ziswiler@toradex.com>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
|
@ -17,6 +17,7 @@
|
|||
#include <asm/arch/regs-uart.h>
|
||||
#include <asm/io.h>
|
||||
#include <dm/platdata.h>
|
||||
#include <dm/platform_data/pxa_mmc_gen.h>
|
||||
#include <dm/platform_data/serial_pxa.h>
|
||||
#include <netdev.h>
|
||||
#include <serial.h>
|
||||
|
@ -36,7 +37,7 @@ int board_init(void)
|
|||
/* arch number of Toradex Colibri PXA270 */
|
||||
gd->bd->bi_arch_number = MACH_TYPE_COLIBRI;
|
||||
|
||||
/* adress of boot parameters */
|
||||
/* address of boot parameters */
|
||||
gd->bd->bi_boot_params = 0xa0000100;
|
||||
|
||||
return 0;
|
||||
|
@ -86,7 +87,7 @@ int board_usb_init(int index, enum usb_init_type init)
|
|||
writel(readl(UHCRHDA) | 0x100, UHCRHDA);
|
||||
|
||||
/* Set port power control mask bits, only 3 ports. */
|
||||
writel(readl(UHCRHDB) | (0x7<<17), UHCRHDB);
|
||||
writel(readl(UHCRHDB) | (0x7 << 17), UHCRHDB);
|
||||
|
||||
/* enable port 2 */
|
||||
writel(readl(UP2OCR) | UP2OCR_HXOE | UP2OCR_HXS |
|
||||
|
@ -110,8 +111,6 @@ void usb_board_stop(void)
|
|||
udelay(10);
|
||||
|
||||
writel(readl(CKEN) & ~CKEN10_USBHOST, CKEN);
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -123,11 +122,22 @@ int board_eth_init(bd_t *bis)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_CMD_MMC
|
||||
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||
int board_mmc_init(bd_t *bis)
|
||||
{
|
||||
pxa_mmc_register(0);
|
||||
return 0;
|
||||
}
|
||||
#else /* !CONFIG_IS_ENABLED(DM_MMC) */
|
||||
static const struct pxa_mmc_plat mmc_platdata = {
|
||||
.base = (struct pxa_mmc_regs *)MMC0_BASE,
|
||||
};
|
||||
|
||||
U_BOOT_DEVICE(pxa_mmcs) = {
|
||||
.name = "pxa_mmc",
|
||||
.platdata = &mmc_platdata,
|
||||
};
|
||||
#endif /* !CONFIG_IS_ENABLED(DM_MMC) */
|
||||
#endif
|
||||
|
||||
static const struct pxa_serial_platdata serial_platdata = {
|
||||
|
|
|
@ -19,6 +19,7 @@ CONFIG_SYS_PROMPT="$ "
|
|||
# CONFIG_CMD_ELF is not set
|
||||
# CONFIG_CMD_EXPORTENV is not set
|
||||
# CONFIG_CMD_IMPORTENV is not set
|
||||
CONFIG_CMD_DM=y
|
||||
# CONFIG_CMD_LOADB is not set
|
||||
# CONFIG_CMD_LOADS is not set
|
||||
CONFIG_CMD_MMC=y
|
||||
|
@ -32,6 +33,8 @@ CONFIG_ENV_IS_IN_FLASH=y
|
|||
CONFIG_ENV_ADDR=0x80000
|
||||
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
|
||||
CONFIG_DM=y
|
||||
CONFIG_DM_MMC=y
|
||||
CONFIG_PXA_MMC_GENERIC=y
|
||||
CONFIG_MTD_NOR_FLASH=y
|
||||
CONFIG_FLASH_CFI_DRIVER=y
|
||||
CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
|
||||
|
|
|
@ -275,15 +275,17 @@ int dev_read_alias_seq(const struct udevice *dev, int *devnump)
|
|||
{
|
||||
ofnode node = dev_ofnode(dev);
|
||||
const char *uc_name = dev->uclass->uc_drv->name;
|
||||
int ret;
|
||||
int ret = -ENOTSUPP;
|
||||
|
||||
if (ofnode_is_np(node)) {
|
||||
ret = of_alias_get_id(ofnode_to_np(node), uc_name);
|
||||
if (ret >= 0)
|
||||
*devnump = ret;
|
||||
} else {
|
||||
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
||||
ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
|
||||
ofnode_to_offset(node), devnump);
|
||||
#endif
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -299,6 +299,14 @@ config MMC_PCI
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config PXA_MMC_GENERIC
|
||||
bool "Support for MMC controllers on PXA"
|
||||
help
|
||||
This selects MMC controllers on PXA.
|
||||
If you are on a PXA architecture, say Y here.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config MMC_OMAP_HS
|
||||
bool "TI OMAP High Speed Multimedia Card Interface support"
|
||||
select DM_REGULATOR_PBIAS if DM_MMC && DM_REGULATOR
|
||||
|
|
|
@ -2824,7 +2824,7 @@ retry:
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
/* The internal partition reset to user partition(0) at every CMD0*/
|
||||
/* The internal partition reset to user partition(0) at every CMD0 */
|
||||
mmc_get_blk_desc(mmc)->hwpart = 0;
|
||||
|
||||
/* Test for SD version 2 */
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
/*
|
||||
* Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com>
|
||||
*
|
||||
* Modified to add driver model (DM) support
|
||||
* Copyright (C) 2019 Marcel Ziswiler <marcel@ziswiler.com>
|
||||
*
|
||||
* Loosely based on the old code and Linux's PXA MMC driver
|
||||
*/
|
||||
|
||||
|
@ -11,6 +14,8 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/errno.h>
|
||||
#include <asm/io.h>
|
||||
#include <dm.h>
|
||||
#include <dm/platform_data/pxa_mmc_gen.h>
|
||||
#include <malloc.h>
|
||||
#include <mmc.h>
|
||||
|
||||
|
@ -96,7 +101,7 @@ static int pxa_mmc_stop_clock(struct mmc *mmc)
|
|||
}
|
||||
|
||||
static int pxa_mmc_start_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||
uint32_t cmdat)
|
||||
uint32_t cmdat)
|
||||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
struct pxa_mmc_regs *regs = priv->regs;
|
||||
|
@ -143,7 +148,7 @@ static int pxa_mmc_cmd_done(struct mmc *mmc, struct mmc_cmd *cmd)
|
|||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
struct pxa_mmc_regs *regs = priv->regs;
|
||||
uint32_t a, b, c;
|
||||
u32 a, b, c;
|
||||
int i;
|
||||
int stat;
|
||||
|
||||
|
@ -152,7 +157,7 @@ static int pxa_mmc_cmd_done(struct mmc *mmc, struct mmc_cmd *cmd)
|
|||
|
||||
/*
|
||||
* Linux says:
|
||||
* Did I mention this is Sick. We always need to
|
||||
* Did I mention this is Sick. We always need to
|
||||
* discard the upper 8 bits of the first 16-bit word.
|
||||
*/
|
||||
a = readl(®s->res) & 0xffff;
|
||||
|
@ -164,13 +169,13 @@ static int pxa_mmc_cmd_done(struct mmc *mmc, struct mmc_cmd *cmd)
|
|||
}
|
||||
|
||||
/* The command response didn't arrive */
|
||||
if (stat & MMC_STAT_TIME_OUT_RESPONSE)
|
||||
if (stat & MMC_STAT_TIME_OUT_RESPONSE) {
|
||||
return -ETIMEDOUT;
|
||||
else if (stat & MMC_STAT_RES_CRC_ERROR
|
||||
&& cmd->resp_type & MMC_RSP_CRC) {
|
||||
#ifdef PXAMMC_CRC_SKIP
|
||||
if (cmd->resp_type & MMC_RSP_136
|
||||
&& cmd->response[0] & (1 << 31))
|
||||
} else if (stat & MMC_STAT_RES_CRC_ERROR &&
|
||||
cmd->resp_type & MMC_RSP_CRC) {
|
||||
#ifdef PXAMMC_CRC_SKIP
|
||||
if (cmd->resp_type & MMC_RSP_136 &&
|
||||
cmd->response[0] & (1 << 31))
|
||||
printf("Ignoring CRC, this may be dangerous!\n");
|
||||
else
|
||||
#endif
|
||||
|
@ -185,8 +190,8 @@ static int pxa_mmc_do_read_xfer(struct mmc *mmc, struct mmc_data *data)
|
|||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
struct pxa_mmc_regs *regs = priv->regs;
|
||||
uint32_t len;
|
||||
uint32_t *buf = (uint32_t *)data->dest;
|
||||
u32 len;
|
||||
u32 *buf = (uint32_t *)data->dest;
|
||||
int size;
|
||||
int ret;
|
||||
|
||||
|
@ -202,7 +207,6 @@ static int pxa_mmc_do_read_xfer(struct mmc *mmc, struct mmc_data *data)
|
|||
/* Read data into the buffer */
|
||||
while (size--)
|
||||
*buf++ = readl(®s->rxfifo);
|
||||
|
||||
}
|
||||
|
||||
if (readl(®s->stat) & MMC_STAT_ERRORS)
|
||||
|
@ -221,8 +225,8 @@ static int pxa_mmc_do_write_xfer(struct mmc *mmc, struct mmc_data *data)
|
|||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
struct pxa_mmc_regs *regs = priv->regs;
|
||||
uint32_t len;
|
||||
uint32_t *buf = (uint32_t *)data->src;
|
||||
u32 len;
|
||||
u32 *buf = (uint32_t *)data->src;
|
||||
int size;
|
||||
int ret;
|
||||
|
||||
|
@ -259,12 +263,11 @@ static int pxa_mmc_do_write_xfer(struct mmc *mmc, struct mmc_data *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pxa_mmc_request(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||
struct mmc_data *data)
|
||||
static int pxa_mmc_send_cmd_common(struct pxa_mmc_priv *priv, struct mmc *mmc,
|
||||
struct mmc_cmd *cmd, struct mmc_data *data)
|
||||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
struct pxa_mmc_regs *regs = priv->regs;
|
||||
uint32_t cmdat = 0;
|
||||
u32 cmdat = 0;
|
||||
int ret;
|
||||
|
||||
/* Stop the controller */
|
||||
|
@ -313,12 +316,11 @@ static int pxa_mmc_request(struct mmc *mmc, struct mmc_cmd *cmd,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pxa_mmc_set_ios(struct mmc *mmc)
|
||||
static int pxa_mmc_set_ios_common(struct pxa_mmc_priv *priv, struct mmc *mmc)
|
||||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
struct pxa_mmc_regs *regs = priv->regs;
|
||||
uint32_t tmp;
|
||||
uint32_t pxa_mmc_clock;
|
||||
u32 tmp;
|
||||
u32 pxa_mmc_clock;
|
||||
|
||||
if (!mmc->clock) {
|
||||
pxa_mmc_stop_clock(mmc);
|
||||
|
@ -346,9 +348,8 @@ static int pxa_mmc_set_ios(struct mmc *mmc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pxa_mmc_init(struct mmc *mmc)
|
||||
static int pxa_mmc_init_common(struct pxa_mmc_priv *priv, struct mmc *mmc)
|
||||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
struct pxa_mmc_regs *regs = priv->regs;
|
||||
|
||||
/* Make sure the clock are stopped */
|
||||
|
@ -362,10 +363,34 @@ static int pxa_mmc_init(struct mmc *mmc)
|
|||
|
||||
/* Mask all interrupts */
|
||||
writel(~(MMC_I_MASK_TXFIFO_WR_REQ | MMC_I_MASK_RXFIFO_RD_REQ),
|
||||
®s->i_mask);
|
||||
®s->i_mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||
static int pxa_mmc_init(struct mmc *mmc)
|
||||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
|
||||
return pxa_mmc_init_common(priv, mmc);
|
||||
}
|
||||
|
||||
static int pxa_mmc_request(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||
struct mmc_data *data)
|
||||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
|
||||
return pxa_mmc_send_cmd_common(priv, mmc, cmd, data);
|
||||
}
|
||||
|
||||
static int pxa_mmc_set_ios(struct mmc *mmc)
|
||||
{
|
||||
struct pxa_mmc_priv *priv = mmc->priv;
|
||||
|
||||
return pxa_mmc_set_ios_common(priv, mmc);
|
||||
}
|
||||
|
||||
static const struct mmc_ops pxa_mmc_ops = {
|
||||
.send_cmd = pxa_mmc_request,
|
||||
.set_ios = pxa_mmc_set_ios,
|
||||
|
@ -386,7 +411,7 @@ int pxa_mmc_register(int card_index)
|
|||
{
|
||||
struct mmc *mmc;
|
||||
struct pxa_mmc_priv *priv;
|
||||
uint32_t reg;
|
||||
u32 reg;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
priv = malloc(sizeof(struct pxa_mmc_priv));
|
||||
|
@ -405,7 +430,7 @@ int pxa_mmc_register(int card_index)
|
|||
default:
|
||||
ret = -EINVAL;
|
||||
printf("PXA MMC: Invalid MMC controller ID (card_index = %d)\n",
|
||||
card_index);
|
||||
card_index);
|
||||
goto err1;
|
||||
}
|
||||
|
||||
|
@ -420,7 +445,7 @@ int pxa_mmc_register(int card_index)
|
|||
#endif
|
||||
|
||||
mmc = mmc_create(&pxa_mmc_cfg, priv);
|
||||
if (mmc == NULL)
|
||||
if (!mmc)
|
||||
goto err1;
|
||||
|
||||
return 0;
|
||||
|
@ -430,3 +455,82 @@ err1:
|
|||
err0:
|
||||
return ret;
|
||||
}
|
||||
#else /* !CONFIG_IS_ENABLED(DM_MMC) */
|
||||
static int pxa_mmc_probe(struct udevice *dev)
|
||||
{
|
||||
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
||||
struct pxa_mmc_plat *plat = dev_get_platdata(dev);
|
||||
struct mmc_config *cfg = &plat->cfg;
|
||||
struct mmc *mmc = &plat->mmc;
|
||||
struct pxa_mmc_priv *priv = dev_get_priv(dev);
|
||||
u32 reg;
|
||||
|
||||
upriv->mmc = mmc;
|
||||
|
||||
cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
||||
cfg->f_max = PXAMMC_MAX_SPEED;
|
||||
cfg->f_min = PXAMMC_MIN_SPEED;
|
||||
cfg->host_caps = PXAMMC_HOST_CAPS;
|
||||
cfg->name = dev->name;
|
||||
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
|
||||
mmc->priv = priv;
|
||||
|
||||
priv->regs = plat->base;
|
||||
|
||||
#ifndef CONFIG_CPU_MONAHANS /* PXA2xx */
|
||||
reg = readl(CKEN);
|
||||
reg |= CKEN12_MMC;
|
||||
writel(reg, CKEN);
|
||||
#else /* PXA3xx */
|
||||
reg = readl(CKENA);
|
||||
reg |= CKENA_12_MMC0 | CKENA_13_MMC1;
|
||||
writel(reg, CKENA);
|
||||
#endif
|
||||
|
||||
return pxa_mmc_init_common(priv, mmc);
|
||||
}
|
||||
|
||||
static int pxa_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
||||
struct mmc_data *data)
|
||||
{
|
||||
struct pxa_mmc_plat *plat = dev_get_platdata(dev);
|
||||
struct pxa_mmc_priv *priv = dev_get_priv(dev);
|
||||
|
||||
return pxa_mmc_send_cmd_common(priv, &plat->mmc, cmd, data);
|
||||
}
|
||||
|
||||
static int pxa_mmc_set_ios(struct udevice *dev)
|
||||
{
|
||||
struct pxa_mmc_plat *plat = dev_get_platdata(dev);
|
||||
struct pxa_mmc_priv *priv = dev_get_priv(dev);
|
||||
|
||||
return pxa_mmc_set_ios_common(priv, &plat->mmc);
|
||||
}
|
||||
|
||||
static const struct dm_mmc_ops pxa_mmc_ops = {
|
||||
.get_cd = NULL,
|
||||
.send_cmd = pxa_mmc_send_cmd,
|
||||
.set_ios = pxa_mmc_set_ios,
|
||||
};
|
||||
|
||||
#if CONFIG_IS_ENABLED(BLK)
|
||||
static int pxa_mmc_bind(struct udevice *dev)
|
||||
{
|
||||
struct pxa_mmc_plat *plat = dev_get_platdata(dev);
|
||||
|
||||
return mmc_bind(dev, &plat->mmc, &plat->cfg);
|
||||
}
|
||||
#endif
|
||||
|
||||
U_BOOT_DRIVER(pxa_mmc) = {
|
||||
#if CONFIG_IS_ENABLED(BLK)
|
||||
.bind = pxa_mmc_bind,
|
||||
#endif
|
||||
.id = UCLASS_MMC,
|
||||
.name = "pxa_mmc",
|
||||
.ops = &pxa_mmc_ops,
|
||||
.priv_auto_alloc_size = sizeof(struct pxa_mmc_priv),
|
||||
.probe = pxa_mmc_probe,
|
||||
};
|
||||
#endif /* !CONFIG_IS_ENABLED(DM_MMC) */
|
||||
|
|
|
@ -15,13 +15,6 @@
|
|||
#define CONFIG_KGDB_BAUDRATE 230400
|
||||
#endif
|
||||
|
||||
/*
|
||||
* MMC Card Configuration
|
||||
*/
|
||||
#ifdef CONFIG_CMD_MMC
|
||||
#define CONFIG_PXA_MMC_GENERIC
|
||||
#endif
|
||||
|
||||
/*
|
||||
* OHCI USB
|
||||
*/
|
||||
|
|
22
include/dm/platform_data/pxa_mmc_gen.h
Normal file
22
include/dm/platform_data/pxa_mmc_gen.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2019 Marcel Ziswiler <marcel.ziswiler@toradex.com>
|
||||
*/
|
||||
|
||||
#ifndef __PXA_MMC_GEN_H
|
||||
#define __PXA_MMC_GEN_H
|
||||
|
||||
#include <mmc.h>
|
||||
|
||||
/*
|
||||
* struct pxa_mmc_platdata - information about a PXA MMC controller
|
||||
*
|
||||
* @base: MMC controller base register address
|
||||
*/
|
||||
struct pxa_mmc_plat {
|
||||
struct mmc_config cfg;
|
||||
struct mmc mmc;
|
||||
struct pxa_mmc_regs *base;
|
||||
};
|
||||
|
||||
#endif /* __PXA_MMC_GEN_H */
|
|
@ -17,7 +17,7 @@
|
|||
#define FFUART_INDEX 1
|
||||
#define STUART_INDEX 2
|
||||
#elif CONFIG_CPU_PXA25X
|
||||
#define UART_CLK_BASE (1 << 4) /* HWUART */
|
||||
#define UART_CLK_BASE BIT(4) /* HWUART */
|
||||
#define UART_CLK_REG CKEN
|
||||
#define HWUART_INDEX 0
|
||||
#define STUART_INDEX 1
|
||||
|
@ -42,9 +42,9 @@
|
|||
/*
|
||||
* struct pxa_serial_platdata - information about a PXA port
|
||||
*
|
||||
* @base: Uart port base register address
|
||||
* @port: Uart port index, for cpu with pinmux for uart / gpio
|
||||
* baudrtatre: Uart port baudrate
|
||||
* @base: Uart port base register address
|
||||
* @port: Uart port index, for cpu with pinmux for uart / gpio
|
||||
* baudrtatre: Uart port baudrate
|
||||
*/
|
||||
struct pxa_serial_platdata {
|
||||
struct pxa_uart_regs *base;
|
||||
|
|
|
@ -923,8 +923,12 @@ static inline const void *dev_read_prop_by_prop(struct ofprop *prop,
|
|||
|
||||
static inline int dev_read_alias_seq(const struct udevice *dev, int *devnump)
|
||||
{
|
||||
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
||||
return fdtdec_get_alias_seq(gd->fdt_blob, dev->uclass->uc_drv->name,
|
||||
dev_of_offset(dev), devnump);
|
||||
#else
|
||||
return -ENOTSUPP;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int dev_read_u32_array(const struct udevice *dev,
|
||||
|
|
|
@ -1368,7 +1368,6 @@ CONFIG_PRPMC_PCI_ALIAS
|
|||
CONFIG_PSRAM_SCFG
|
||||
CONFIG_PWM
|
||||
CONFIG_PXA_LCD
|
||||
CONFIG_PXA_MMC_GENERIC
|
||||
CONFIG_PXA_PWR_I2C
|
||||
CONFIG_PXA_STD_I2C
|
||||
CONFIG_PXA_VGA
|
||||
|
|
Loading…
Add table
Reference in a new issue