v3.10 DT updates for DaVinci
The pull request adds support for MMC/SD and regulator on DA850 EVM. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQIcBAABAgAGBQJRXo/nAAoJEGFBu2jqvgRNfZwQAIOLsozvHuxHM6l3sv2YDwuV 8l65WiDq2UgXaobseX59U1+LfrGDaxO03kmIorViGuNKlx534Veuxhm6pOr+phjp sf82BQLLDzJem6F04Cx3GxV9yx2kvvfRF/4mP+in1i08t7sQNmh/mVTpdTxETEQZ dBEg7ev23ZEDPDBtF/HE1QdIae/HsZWyZATA3WH0tUWfER9BZdkSihP7rjSb7Rq5 qJAJ33xJSlIRfW4qImK0fsoMQKhOKpUnAYHpjo89JD4UBXgahyMz4fvfxoVp6Xqa Qrl2ZenllrSbOmPxjH+IB6VecjdV3sHGt2aI3IOFTUomfe7gR9vfjPztal/Al/S8 HRCTRDZjcMc4KHATIKlU3jjpV48XZV5wHbdjgIK9LocneTkxYvp+wQxQZ9/0mfu+ 1FlRYqXqNezdZoVaZaLAGe7/FNN8ws1f3k/O4K5tM5FwZWFDUJY5DXyBY7Y6f0XZ FCAJLWYZm7rwemEeWFNyfFr+rN19hcAmbFmZcUV1oDIqwKZnQFvxl6omVREqKQKm 3freTqlHJudDnj7xiub9zYMJpq7TVcDoRVZPnwpcLP1RtCMS6Q0sbcA5zH/VUyKR 2TJpS3y22p0FpJ7/O+855CPzZhU4UmYrUEMYMpW2dVMk36ug+uYsbIb2vbSR+4iA /On32FUq+k1GCypzjp7d =OjvJ -----END PGP SIGNATURE----- Merge tag 'davinci-for-v3.10/dt' of git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci into next/soc From Sekhar Nori <nsekhar@ti.com>: v3.10 DT updates for DaVinci The pull request adds support for MMC/SD and regulator on DA850 EVM. * tag 'davinci-for-v3.10/dt' of git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci: ARM: davinci: da850: override mmc DT node device name ARM: davinci: da850: add mmc DT entries mmc: davinci_mmc: add DT support ARM: davinci: da850: add tps6507x regulator DT data ARM: regulator: add tps6507x device tree data Merged into soc branch rather than DT branch to avoid circular dependencies. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
759417ac74
33
Documentation/devicetree/bindings/mmc/davinci_mmc.txt
Normal file
33
Documentation/devicetree/bindings/mmc/davinci_mmc.txt
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
* TI Highspeed MMC host controller for DaVinci
|
||||||
|
|
||||||
|
The Highspeed MMC Host Controller on TI DaVinci family
|
||||||
|
provides an interface for MMC, SD and SDIO types of memory cards.
|
||||||
|
|
||||||
|
This file documents the properties used by the davinci_mmc driver.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible:
|
||||||
|
Should be "ti,da830-mmc": for da830, da850, dm365
|
||||||
|
Should be "ti,dm355-mmc": for dm355, dm644x
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- bus-width: Number of data lines, can be <1>, <4>, or <8>, default <1>
|
||||||
|
- max-frequency: Maximum operating clock frequency, default 25MHz.
|
||||||
|
- dmas: List of DMA specifiers with the controller specific format
|
||||||
|
as described in the generic DMA client binding. A tx and rx
|
||||||
|
specifier is required.
|
||||||
|
- dma-names: RX and TX DMA request names. These strings correspond
|
||||||
|
1:1 with the DMA specifiers listed in dmas.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
mmc0: mmc@1c40000 {
|
||||||
|
compatible = "ti,da830-mmc",
|
||||||
|
reg = <0x40000 0x1000>;
|
||||||
|
interrupts = <16>;
|
||||||
|
status = "okay";
|
||||||
|
bus-width = <4>;
|
||||||
|
max-frequency = <50000000>;
|
||||||
|
dmas = <&edma 16
|
||||||
|
&edma 17>;
|
||||||
|
dma-names = "rx", "tx";
|
||||||
|
};
|
|
@ -35,14 +35,84 @@
|
||||||
clock-frequency = <100000>;
|
clock-frequency = <100000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&i2c0_pins>;
|
pinctrl-0 = <&i2c0_pins>;
|
||||||
|
|
||||||
|
tps: tps@48 {
|
||||||
|
reg = <0x48>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
wdt: wdt@1c21000 {
|
wdt: wdt@1c21000 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
mmc0: mmc@1c40000 {
|
||||||
|
max-frequency = <50000000>;
|
||||||
|
bus-width = <4>;
|
||||||
|
status = "okay";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&mmc0_pins>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
nand_cs3@62000000 {
|
nand_cs3@62000000 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&nand_cs3_pins>;
|
pinctrl-0 = <&nand_cs3_pins>;
|
||||||
};
|
};
|
||||||
|
vbat: fixedregulator@0 {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "vbat";
|
||||||
|
regulator-min-microvolt = <5000000>;
|
||||||
|
regulator-max-microvolt = <5000000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/include/ "tps6507x.dtsi"
|
||||||
|
|
||||||
|
&tps {
|
||||||
|
vdcdc1_2-supply = <&vbat>;
|
||||||
|
vdcdc3-supply = <&vbat>;
|
||||||
|
vldo1_2-supply = <&vbat>;
|
||||||
|
|
||||||
|
regulators {
|
||||||
|
vdcdc1_reg: regulator@0 {
|
||||||
|
regulator-name = "VDCDC1_3.3V";
|
||||||
|
regulator-min-microvolt = <3150000>;
|
||||||
|
regulator-max-microvolt = <3450000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdcdc2_reg: regulator@1 {
|
||||||
|
regulator-name = "VDCDC2_3.3V";
|
||||||
|
regulator-min-microvolt = <1710000>;
|
||||||
|
regulator-max-microvolt = <3450000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
ti,defdcdc_default = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vdcdc3_reg: regulator@2 {
|
||||||
|
regulator-name = "VDCDC3_1.2V";
|
||||||
|
regulator-min-microvolt = <950000>;
|
||||||
|
regulator-max-microvolt = <1350000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
ti,defdcdc_default = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
ldo1_reg: regulator@3 {
|
||||||
|
regulator-name = "LDO1_1.8V";
|
||||||
|
regulator-min-microvolt = <1710000>;
|
||||||
|
regulator-max-microvolt = <1890000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
ldo2_reg: regulator@4 {
|
||||||
|
regulator-name = "LDO2_1.2V";
|
||||||
|
regulator-min-microvolt = <1140000>;
|
||||||
|
regulator-max-microvolt = <1320000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -62,6 +62,15 @@
|
||||||
0x10 0x00002200 0x0000ff00
|
0x10 0x00002200 0x0000ff00
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
mmc0_pins: pinmux_mmc_pins {
|
||||||
|
pinctrl-single,bits = <
|
||||||
|
/* MMCSD0_DAT[3] MMCSD0_DAT[2]
|
||||||
|
* MMCSD0_DAT[1] MMCSD0_DAT[0]
|
||||||
|
* MMCSD0_CMD MMCSD0_CLK
|
||||||
|
*/
|
||||||
|
0x28 0x00222222 0x00ffffff
|
||||||
|
>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
serial0: serial@1c42000 {
|
serial0: serial@1c42000 {
|
||||||
compatible = "ns16550a";
|
compatible = "ns16550a";
|
||||||
|
@ -107,6 +116,12 @@
|
||||||
reg = <0x21000 0x1000>;
|
reg = <0x21000 0x1000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
mmc0: mmc@1c40000 {
|
||||||
|
compatible = "ti,da830-mmc";
|
||||||
|
reg = <0x40000 0x1000>;
|
||||||
|
interrupts = <16>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
nand_cs3@62000000 {
|
nand_cs3@62000000 {
|
||||||
compatible = "ti,davinci-nand";
|
compatible = "ti,davinci-nand";
|
||||||
|
|
47
arch/arm/boot/dts/tps6507x.dtsi
Normal file
47
arch/arm/boot/dts/tps6507x.dtsi
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Integrated Power Management Chip
|
||||||
|
* http://www.ti.com/lit/ds/symlink/tps65070.pdf
|
||||||
|
*/
|
||||||
|
|
||||||
|
&tps {
|
||||||
|
compatible = "ti,tps6507x";
|
||||||
|
|
||||||
|
regulators {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
vdcdc1_reg: regulator@0 {
|
||||||
|
reg = <0>;
|
||||||
|
regulator-compatible = "VDCDC1";
|
||||||
|
};
|
||||||
|
|
||||||
|
vdcdc2_reg: regulator@1 {
|
||||||
|
reg = <1>;
|
||||||
|
regulator-compatible = "VDCDC2";
|
||||||
|
};
|
||||||
|
|
||||||
|
vdcdc3_reg: regulator@2 {
|
||||||
|
reg = <2>;
|
||||||
|
regulator-compatible = "VDCDC3";
|
||||||
|
};
|
||||||
|
|
||||||
|
ldo1_reg: regulator@3 {
|
||||||
|
reg = <3>;
|
||||||
|
regulator-compatible = "LDO1";
|
||||||
|
};
|
||||||
|
|
||||||
|
ldo2_reg: regulator@4 {
|
||||||
|
reg = <4>;
|
||||||
|
regulator-compatible = "LDO2";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
|
@ -40,6 +40,7 @@ static void __init da8xx_init_irq(void)
|
||||||
struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
|
struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
|
||||||
OF_DEV_AUXDATA("ti,davinci-i2c", 0x01c22000, "i2c_davinci.1", NULL),
|
OF_DEV_AUXDATA("ti,davinci-i2c", 0x01c22000, "i2c_davinci.1", NULL),
|
||||||
OF_DEV_AUXDATA("ti,davinci-wdt", 0x01c21000, "watchdog", NULL),
|
OF_DEV_AUXDATA("ti,davinci-wdt", 0x01c21000, "watchdog", NULL),
|
||||||
|
OF_DEV_AUXDATA("ti,da830-mmc", 0x01c40000, "da830-mmc.0", NULL),
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/edma.h>
|
#include <linux/edma.h>
|
||||||
#include <linux/mmc/mmc.h>
|
#include <linux/mmc/mmc.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
|
||||||
#include <linux/platform_data/mmc-davinci.h>
|
#include <linux/platform_data/mmc-davinci.h>
|
||||||
|
|
||||||
|
@ -522,14 +524,16 @@ static int __init davinci_acquire_dma_channels(struct mmc_davinci_host *host)
|
||||||
dma_cap_set(DMA_SLAVE, mask);
|
dma_cap_set(DMA_SLAVE, mask);
|
||||||
|
|
||||||
host->dma_tx =
|
host->dma_tx =
|
||||||
dma_request_channel(mask, edma_filter_fn, &host->txdma);
|
dma_request_slave_channel_compat(mask, edma_filter_fn,
|
||||||
|
&host->txdma, mmc_dev(host->mmc), "tx");
|
||||||
if (!host->dma_tx) {
|
if (!host->dma_tx) {
|
||||||
dev_err(mmc_dev(host->mmc), "Can't get dma_tx channel\n");
|
dev_err(mmc_dev(host->mmc), "Can't get dma_tx channel\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
host->dma_rx =
|
host->dma_rx =
|
||||||
dma_request_channel(mask, edma_filter_fn, &host->rxdma);
|
dma_request_slave_channel_compat(mask, edma_filter_fn,
|
||||||
|
&host->rxdma, mmc_dev(host->mmc), "rx");
|
||||||
if (!host->dma_rx) {
|
if (!host->dma_rx) {
|
||||||
dev_err(mmc_dev(host->mmc), "Can't get dma_rx channel\n");
|
dev_err(mmc_dev(host->mmc), "Can't get dma_rx channel\n");
|
||||||
r = -ENODEV;
|
r = -ENODEV;
|
||||||
|
@ -1169,9 +1173,62 @@ static struct platform_device_id davinci_mmc_devtype[] = {
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(platform, davinci_mmc_devtype);
|
MODULE_DEVICE_TABLE(platform, davinci_mmc_devtype);
|
||||||
|
|
||||||
|
static const struct of_device_id davinci_mmc_dt_ids[] = {
|
||||||
|
{
|
||||||
|
.compatible = "ti,dm6441-mmc",
|
||||||
|
.data = &davinci_mmc_devtype[MMC_CTLR_VERSION_1],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.compatible = "ti,da830-mmc",
|
||||||
|
.data = &davinci_mmc_devtype[MMC_CTLR_VERSION_2],
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, davinci_mmc_dt_ids);
|
||||||
|
|
||||||
|
static struct davinci_mmc_config
|
||||||
|
*mmc_parse_pdata(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
struct davinci_mmc_config *pdata = pdev->dev.platform_data;
|
||||||
|
const struct of_device_id *match =
|
||||||
|
of_match_device(of_match_ptr(davinci_mmc_dt_ids), &pdev->dev);
|
||||||
|
u32 data;
|
||||||
|
|
||||||
|
np = pdev->dev.of_node;
|
||||||
|
if (!np)
|
||||||
|
return pdata;
|
||||||
|
|
||||||
|
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
|
||||||
|
if (!pdata) {
|
||||||
|
dev_err(&pdev->dev, "Failed to allocate memory for struct davinci_mmc_config\n");
|
||||||
|
goto nodata;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (match)
|
||||||
|
pdev->id_entry = match->data;
|
||||||
|
|
||||||
|
if (of_property_read_u32(np, "max-frequency", &pdata->max_freq))
|
||||||
|
dev_info(&pdev->dev, "'max-frequency' property not specified, defaulting to 25MHz\n");
|
||||||
|
|
||||||
|
of_property_read_u32(np, "bus-width", &data);
|
||||||
|
switch (data) {
|
||||||
|
case 1:
|
||||||
|
case 4:
|
||||||
|
case 8:
|
||||||
|
pdata->wires = data;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
pdata->wires = 1;
|
||||||
|
dev_info(&pdev->dev, "Unsupported buswidth, defaulting to 1 bit\n");
|
||||||
|
}
|
||||||
|
nodata:
|
||||||
|
return pdata;
|
||||||
|
}
|
||||||
|
|
||||||
static int __init davinci_mmcsd_probe(struct platform_device *pdev)
|
static int __init davinci_mmcsd_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct davinci_mmc_config *pdata = pdev->dev.platform_data;
|
struct davinci_mmc_config *pdata = NULL;
|
||||||
struct mmc_davinci_host *host = NULL;
|
struct mmc_davinci_host *host = NULL;
|
||||||
struct mmc_host *mmc = NULL;
|
struct mmc_host *mmc = NULL;
|
||||||
struct resource *r, *mem = NULL;
|
struct resource *r, *mem = NULL;
|
||||||
|
@ -1179,7 +1236,11 @@ static int __init davinci_mmcsd_probe(struct platform_device *pdev)
|
||||||
size_t mem_size;
|
size_t mem_size;
|
||||||
const struct platform_device_id *id_entry;
|
const struct platform_device_id *id_entry;
|
||||||
|
|
||||||
/* REVISIT: when we're fully converted, fail if pdata is NULL */
|
pdata = mmc_parse_pdata(pdev);
|
||||||
|
if (pdata == NULL) {
|
||||||
|
dev_err(&pdev->dev, "Couldn't get platform data\n");
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
@ -1421,6 +1482,7 @@ static struct platform_driver davinci_mmcsd_driver = {
|
||||||
.name = "davinci_mmc",
|
.name = "davinci_mmc",
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.pm = davinci_mmcsd_pm_ops,
|
.pm = davinci_mmcsd_pm_ops,
|
||||||
|
.of_match_table = of_match_ptr(davinci_mmc_dt_ids),
|
||||||
},
|
},
|
||||||
.remove = __exit_p(davinci_mmcsd_remove),
|
.remove = __exit_p(davinci_mmcsd_remove),
|
||||||
.id_table = davinci_mmc_devtype,
|
.id_table = davinci_mmc_devtype,
|
||||||
|
|
Loading…
Reference in a new issue