Skip to contentSkip to conversation

atmel-mci device tree support

PATCH Superseded ludovic.desroches at atmel.com 4 participants 20 messages May 22, 2012 – May 24, 2012

Subsystems (6)

v3 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

v3 cover atmel-mci device tree support

Hi,

This patch-set adds device tree support for atmel-mci.

Regards

Ludovic

v3:
- use cd-inverted instead of cd-invert to follow mmc common binding.
- don't assign a pointer to pdev->dev.platform.
- add mci controller nodes to other chips and boards.
- put all dts file changes together.

v2:
- squash patch v1 2/4 and 3/4.
- change atmci_get_of_slots to atmci_of_init and manage pdata allocation into it.
- correct potential issue (e.g. having only one slot which is not slot0 into the dt) about slots by adding a reg property corresponding to the slot id.

#1 lore raw

PATCH v3 1/3 mmc: atmel-mci: add device tree support

From: Ludovic Desroches <[email protected]>

---
 .../devicetree/bindings/mmc/atmel-hsmci.txt        |   67 +++++++++++++++
 drivers/mmc/host/atmel-mci.c                       |   89 +++++++++++++++++++-
 2 files changed, 154 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mmc/atmel-hsmci.txt
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +67 -0
new file mode 100644
index 0000000..81c20cc
@@ -0,0 +1,67 @@
+* Atmel High Speed MultiMedia Card Interface
+
+This controller on atmel products provides an interface for MMC, SD and SDIO
+types of memory cards.
+
+1) MCI node
+
+Required properties:
+- compatible: no blank "atmel,hsmci"
+- reg: should contain HSMCI registers location and length
+- interrupts: should contain HSMCI interrupt number
+- #address-cells: should be one. The cell is the slot id.
+- #size-cells: should be zero.
+- at least one slot node
+
+The node contains child nodes for each slot that the platform uses
+
+Example MCI node:
+
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	[ child node definitions...]
+};
+
+2) slot nodes
+
+Required properties:
+- reg: should contain the slot id.
+- bus-width: number of data lines connected to the controller
+
+Optional properties:
+- cd-gpios: specify GPIOs for card detection
+- cd-inverted: invert the value of external card detect gpio line
+- wp-gpios: specify GPIOs for write protection
+
+Example slot node:
+
+slot at 0 {
+	reg = <0>;
+	bus-width = <4>;
+	cd-gpios = <&pioD 15 0>
+	cd-inverted;
+};
+
+Example full MCI node:
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+	slot at 0 {
+		reg = <0>;
+		bus-width = <4>;
+		cd-gpios = <&pioD 15 0>
+		cd-inverted;
+	};
+	slot at 1 {
+		reg = <1>;
+		bus-width = <4>;
+	};
+};
drivers/mmc/host/atmel-mci.c +87 -2

119 lines not on this page · raw message

Signature · 1 line
1.7.5.4
#2 lore raw

PATCH v3 1/3 mmc: atmel-mci: add device tree support

On 05/22/2012 12:09 PM, ludovic.desroches at atmel.com :

Quoted 3 lines

From: Ludovic Desroches <[email protected]>

Looks neat!

Quoted 207 lines
---
 .../devicetree/bindings/mmc/atmel-hsmci.txt        |   67 +++++++++++++++
 drivers/mmc/host/atmel-mci.c                       |   89 +++++++++++++++++++-
 2 files changed, 154 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mmc/atmel-hsmci.txt
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +67 -0
new file mode 100644
index 0000000..81c20cc
@@ -0,0 +1,67 @@
+* Atmel High Speed MultiMedia Card Interface
+
+This controller on atmel products provides an interface for MMC, SD and SDIO
+types of memory cards.
+
+1) MCI node
+
+Required properties:
+- compatible: no blank "atmel,hsmci"
+- reg: should contain HSMCI registers location and length
+- interrupts: should contain HSMCI interrupt number
+- #address-cells: should be one. The cell is the slot id.
+- #size-cells: should be zero.
+- at least one slot node
+
+The node contains child nodes for each slot that the platform uses
+
+Example MCI node:
+
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	[ child node definitions...]
+};
+
+2) slot nodes
+
+Required properties:
+- reg: should contain the slot id.
+- bus-width: number of data lines connected to the controller
+
+Optional properties:
+- cd-gpios: specify GPIOs for card detection
+- cd-inverted: invert the value of external card detect gpio line
+- wp-gpios: specify GPIOs for write protection
+
+Example slot node:
+
+slot at 0 {
+	reg = <0>;
+	bus-width = <4>;
+	cd-gpios = <&pioD 15 0>
+	cd-inverted;
+};
+
+Example full MCI node:
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+	slot at 0 {
+		reg = <0>;
+		bus-width = <4>;
+		cd-gpios = <&pioD 15 0>
+		cd-inverted;
+	};
+	slot at 1 {
+		reg = <1>;
+		bus-width = <4>;
+	};
+};
drivers/mmc/host/atmel-mci.c +87 -2
index 556d384..43f98fc 100644
@@ -19,6 +19,9 @@
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
 #include <linux/platform_device.h>
 #include <linux/scatterlist.h>
 #include <linux/seq_file.h>
@@ -493,6 +496,74 @@ err:
 	dev_err(&mmc->class_dev, "failed to initialize debugfs for slot\n");
 }
 
+#if defined(CONFIG_OF)
+static const struct of_device_id atmci_dt_ids[] = {
+	{ .compatible = "atmel,hsmci" },
+	{ /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmci_dt_ids);
+
+static struct mci_platform_data __devinit*
+atmci_of_init(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *cnp;
+	struct mci_platform_data *pdata;
+	unsigned int slot_id;
+	const __be32 *reg;
+
+	if (!np) {
+		dev_err(&pdev->dev, "device node not found\n");
+		return ERR_PTR(-EINVAL);
+	}
+
+	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata) {
+		dev_err(&pdev->dev, "could not allocate memory for pdata\n");
+		return ERR_PTR(-ENOMEM);
+	}
+
+	for_each_child_of_node(np, cnp) {
+		reg = of_get_property(cnp, "reg", NULL);
+		if (!reg) {
+			dev_warn(&pdev->dev, "reg property is missing for %s\n",
+				 cnp->full_name);
+			continue;
+		}
+
+		slot_id = be32_to_cpu(reg[0]);
+
+		if (slot_id > (ATMCI_MAX_NR_SLOTS-1)) {
+			dev_warn(&pdev->dev, "can't have more than %d slots\n",
+			         ATMCI_MAX_NR_SLOTS);
+			break;
+		}
+
+		if (of_property_read_u32(cnp, "bus-width",
+		                         &pdata->slot[slot_id].bus_width))
+			pdata->slot[slot_id].bus_width = 1;
+
+		pdata->slot[slot_id].detect_pin =
+			of_get_named_gpio(cnp, "cd-gpios", 0);
+
+		if (of_find_property(cnp, "cd-inverted", NULL))
+			pdata->slot[slot_id].detect_is_active_high = true;
+
+		pdata->slot[slot_id].wp_pin =
+			of_get_named_gpio(cnp, "wp-gpios", 0);
+	}
+
+	return pdata;
+}
+#else /* CONFIG_OF */
+static inline struct mci_platform_data*
+atmci_of_init(struct platform_device *dev)
+{
+	return ERR_PTR(-EINVAL);
+}
+#endif
+
 static inline unsigned int atmci_get_version(struct atmel_mci *host)
 {
 	return atmci_readl(host, ATMCI_VERSION) & 0x00000fff;
@@ -2038,6 +2109,13 @@ static int __init atmci_init_slot(struct atmel_mci *host,
 	slot->sdc_reg = sdc_reg;
 	slot->sdio_irq = sdio_irq;
 
+	dev_dbg(&mmc->class_dev,
+	        "slot[%u]: bus_width=%u, detect_pin=%d, "
+		"detect_is_active_high=%s, wp_pin=%d\n",
+		id, slot_data->bus_width, slot_data->detect_pin,
+		slot_data->detect_is_active_high ? "true" : "false",
+		slot_data->wp_pin);
+
 	mmc->ops = &atmci_ops;
 	mmc->f_min = DIV_ROUND_UP(host->bus_hz, 512);
 	mmc->f_max = host->bus_hz / 2;
@@ -2258,8 +2336,14 @@ static int __init atmci_probe(struct platform_device *pdev)
 	if (!regs)
 		return -ENXIO;
 	pdata = pdev->dev.platform_data;
-	if (!pdata)
-		return -ENXIO;
+	if (!pdata) {
+		pdata = atmci_of_init(pdev);
+		if (IS_ERR(pdata)) {
+			dev_err(&pdev->dev, "platform data not available\n");
+			return -EINVAL;
+		}
+	}
+
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0)
 		return irq;
@@ -2477,6 +2561,7 @@ static struct platform_driver atmci_driver = {
 	.driver		= {
 		.name		= "atmel_mci",
 		.pm		= ATMCI_PM_OPS,
+		.of_match_table	= of_match_ptr(atmci_dt_ids),
 	},
 };
 
Signature · 1 line
Nicolas Ferre
#3 lore raw

PATCH v3 1/3 mmc: atmel-mci: add device tree support

In reply to ludovic.desroches at atmel.com
Quoted 43 lines · ludovic.desroches at atmel.com

From: Ludovic Desroches <[email protected]>

---
 .../devicetree/bindings/mmc/atmel-hsmci.txt        |   67 +++++++++++++++
 drivers/mmc/host/atmel-mci.c                       |   89 +++++++++++++++++++-
 2 files changed, 154 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mmc/atmel-hsmci.txt
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +28 -0
new file mode 100644
index 0000000..81c20cc
@@ -0,0 +1,67 @@
+* Atmel High Speed MultiMedia Card Interface
+
+This controller on atmel products provides an interface for MMC, SD and SDIO
+types of memory cards.
+
+1) MCI node
+
+Required properties:
+- compatible: no blank "atmel,hsmci"
+- reg: should contain HSMCI registers location and length
+- interrupts: should contain HSMCI interrupt number
+- #address-cells: should be one. The cell is the slot id.
+- #size-cells: should be zero.
+- at least one slot node
+
+The node contains child nodes for each slot that the platform uses
+
+Example MCI node:
+
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	[ child node definitions...]
+};

Documentation/devicetree/bindings/mmc/atmel-hsmci.txt line 38

Quoted 10 lines
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +10 -0
+
+2) slot nodes
+
+Required properties:
+- reg: should contain the slot id.
+- bus-width: number of data lines connected to the controller
+
+Optional properties:
+- cd-gpios: specify GPIOs for card detection
+- cd-inverted: invert the value of external card detect gpio line

why this

no need you can use the third field and OF_GPIO_ACTIVE_LOW as done on ohci-at91.c

Quoted 74 lines
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +29 -0
+- wp-gpios: specify GPIOs for write protection
+
+Example slot node:
+
+slot at 0 {
+	reg = <0>;
+	bus-width = <4>;
+	cd-gpios = <&pioD 15 0>
+	cd-inverted;
+};
+
+Example full MCI node:
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+	slot at 0 {
+		reg = <0>;
+		bus-width = <4>;
+		cd-gpios = <&pioD 15 0>
+		cd-inverted;
+	};
+	slot at 1 {
+		reg = <1>;
+		bus-width = <4>;
+	};
+};
drivers/mmc/host/atmel-mci.c +30 -0
index 556d384..43f98fc 100644
@@ -19,6 +19,9 @@
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
 #include <linux/platform_device.h>
 #include <linux/scatterlist.h>
 #include <linux/seq_file.h>
@@ -493,6 +496,74 @@ err:
 	dev_err(&mmc->class_dev, "failed to initialize debugfs for slot\n");
 }
 
+#if defined(CONFIG_OF)
+static const struct of_device_id atmci_dt_ids[] = {
+	{ .compatible = "atmel,hsmci" },
+	{ /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmci_dt_ids);
+
+static struct mci_platform_data __devinit*
+atmci_of_init(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *cnp;
+	struct mci_platform_data *pdata;
+	unsigned int slot_id;
+	const __be32 *reg;
+
+	if (!np) {
+		dev_err(&pdev->dev, "device node not found\n");
+		return ERR_PTR(-EINVAL);
+	}
+
+	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata) {
+		dev_err(&pdev->dev, "could not allocate memory for pdata\n");
+		return ERR_PTR(-ENOMEM);
+	}

drivers/mmc/host/atmel-mci.c err: · line 535

Quoted 10 lines
drivers/mmc/host/atmel-mci.c +10 -0
+
+	for_each_child_of_node(np, cnp) {
+		reg = of_get_property(cnp, "reg", NULL);
+		if (!reg) {
+			dev_warn(&pdev->dev, "reg property is missing for %s\n",
+				 cnp->full_name);
+			continue;
+		}
+
+		slot_id = be32_to_cpu(reg[0]);

read_u32

Quoted 49 lines
drivers/mmc/host/atmel-mci.c +38 -0
+
+		if (slot_id > (ATMCI_MAX_NR_SLOTS-1)) {
+			dev_warn(&pdev->dev, "can't have more than %d slots\n",
+			         ATMCI_MAX_NR_SLOTS);
+			break;
+		}
+
+		if (of_property_read_u32(cnp, "bus-width",
+		                         &pdata->slot[slot_id].bus_width))
+			pdata->slot[slot_id].bus_width = 1;
+
+		pdata->slot[slot_id].detect_pin =
+			of_get_named_gpio(cnp, "cd-gpios", 0);
+
+		if (of_find_property(cnp, "cd-inverted", NULL))
+			pdata->slot[slot_id].detect_is_active_high = true;
+
+		pdata->slot[slot_id].wp_pin =
+			of_get_named_gpio(cnp, "wp-gpios", 0);
+	}
+
+	return pdata;
+}
+#else /* CONFIG_OF */
+static inline struct mci_platform_data*
+atmci_of_init(struct platform_device *dev)
+{
+	return ERR_PTR(-EINVAL);
+}
+#endif
+
 static inline unsigned int atmci_get_version(struct atmel_mci *host)
 {
 	return atmci_readl(host, ATMCI_VERSION) & 0x00000fff;
@@ -2038,6 +2109,13 @@ static int __init atmci_init_slot(struct atmel_mci *host,
 	slot->sdc_reg = sdc_reg;
 	slot->sdio_irq = sdio_irq;
 
+	dev_dbg(&mmc->class_dev,
+	        "slot[%u]: bus_width=%u, detect_pin=%d, "
+		"detect_is_active_high=%s, wp_pin=%d\n",
+		id, slot_data->bus_width, slot_data->detect_pin,
+		slot_data->detect_is_active_high ? "true" : "false",
+		slot_data->wp_pin);
+
 	mmc->ops = &atmci_ops;
 	mmc->f_min = DIV_ROUND_UP(host->bus_hz, 512);
 	mmc->f_max = host->bus_hz / 2;

drivers/mmc/host/atmel-mci.c static int __init atmci_probe(struct platform_device *pdev) · line 2262

Quoted 5 lines
drivers/mmc/host/atmel-mci.c +0 -2
@@ -2258,8 +2336,14 @@ static int __init atmci_probe(struct platform_device *pdev)
 	if (!regs)
 		return -ENXIO;
 	pdata = pdev->dev.platform_data;
-	if (!pdata)
-		return -ENXIO;

check the node and then check the return

Best Regards,
J.

#4 lore raw

PATCH v3 1/3 mmc: atmel-mci: add device tree support

Le 05/22/2012 04:08 PM, Jean-Christophe PLAGNIOL-VILLARD a ?crit :

Quoted 56 lines · ludovic.desroches at atmel.com
Quoted 43 lines

From: Ludovic Desroches<[email protected]>

---
  .../devicetree/bindings/mmc/atmel-hsmci.txt        |   67 +++++++++++++++
  drivers/mmc/host/atmel-mci.c                       |   89 +++++++++++++++++++-
  2 files changed, 154 insertions(+), 2 deletions(-)

create mode 100644 Documentation/devicetree/bindings/mmc/atmel-hsmci.txt

Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +28 -0
new file mode 100644
index 0000000..81c20cc
@@ -0,0 +1,67 @@
+* Atmel High Speed MultiMedia Card Interface
+
+This controller on atmel products provides an interface for MMC, SD and SDIO
+types of memory cards.
+
+1) MCI node
+
+Required properties:
+- compatible: no blank "atmel,hsmci"
+- reg: should contain HSMCI registers location and length
+- interrupts: should contain HSMCI interrupt number
+- #address-cells: should be one. The cell is the slot id.
+- #size-cells: should be zero.
+- at least one slot node
+
+The node contains child nodes for each slot that the platform uses
+
+Example MCI node:
+
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg =<0xf0008000 0x600>;
+	interrupts =<12 4>;
+	#address-cells =<1>;
+	#size-cells =<0>;
+
+	[ child node definitions...]
+};

Documentation/devicetree/bindings/mmc/atmel-hsmci.txt line 38

Quoted 10 lines
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +10 -0
+
+2) slot nodes
+
+Required properties:
+- reg: should contain the slot id.
+- bus-width: number of data lines connected to the controller
+
+Optional properties:
+- cd-gpios: specify GPIOs for card detection
+- cd-inverted: invert the value of external card detect gpio line

why this

Quoted 3 lines

no need you can use the third field and OF_GPIO_ACTIVE_LOW as done on ohci-at91.c

It's a property from the common mmc binding so why not using it?

Quoted 77 lines
Quoted 77 lines
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +29 -0
+- wp-gpios: specify GPIOs for write protection
+
+Example slot node:
+
+slot at 0 {
+	reg =<0>;
+	bus-width =<4>;
+	cd-gpios =<&pioD 15 0>
+	cd-inverted;
+};
+
+Example full MCI node:
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg =<0xf0008000 0x600>;
+	interrupts =<12 4>;
+	#address-cells =<1>;
+	#size-cells =<0>;
+	slot at 0 {
+		reg =<0>;
+		bus-width =<4>;
+		cd-gpios =<&pioD 15 0>
+		cd-inverted;
+	};
+	slot at 1 {
+		reg =<1>;
+		bus-width =<4>;
+	};
+};
drivers/mmc/host/atmel-mci.c +33 -0
index 556d384..43f98fc 100644
@@ -19,6 +19,9 @@
  #include<linux/interrupt.h>
  #include<linux/ioport.h>
  #include<linux/module.h>
+#include<linux/of.h>
+#include<linux/of_device.h>
+#include<linux/of_gpio.h>
  #include<linux/platform_device.h>
  #include<linux/scatterlist.h>
  #include<linux/seq_file.h>
@@ -493,6 +496,74 @@ err:
  	dev_err(&mmc->class_dev, "failed to initialize debugfs for slot\n");
  }
 
+#if defined(CONFIG_OF)
+static const struct of_device_id atmci_dt_ids[] = {
+	{ .compatible = "atmel,hsmci" },
+	{ /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmci_dt_ids);
+
+static struct mci_platform_data __devinit*
+atmci_of_init(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *cnp;
+	struct mci_platform_data *pdata;
+	unsigned int slot_id;
+	const __be32 *reg;
+
+	if (!np) {
+		dev_err(&pdev->dev, "device node not found\n");
+		return ERR_PTR(-EINVAL);
+	}
+
+	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata) {
+		dev_err(&pdev->dev, "could not allocate memory for pdata\n");
+		return ERR_PTR(-ENOMEM);
+	}
+
+	for_each_child_of_node(np, cnp) {
+		reg = of_get_property(cnp, "reg", NULL);
Quoted 8 lines

drivers/mmc/host/atmel-mci.c err: · line 535

Quoted 7 lines
drivers/mmc/host/atmel-mci.c +7 -0
+		if (!reg) {
+			dev_warn(&pdev->dev, "reg property is missing for %s\n",
+				 cnp->full_name);
+			continue;
+		}
+
+		slot_id = be32_to_cpu(reg[0]);

read_u32

ok

Quoted 47 lines
Quoted 47 lines
drivers/mmc/host/atmel-mci.c +38 -0
+
+		if (slot_id>  (ATMCI_MAX_NR_SLOTS-1)) {
+			dev_warn(&pdev->dev, "can't have more than %d slots\n",
+			         ATMCI_MAX_NR_SLOTS);
+			break;
+		}
+
+		if (of_property_read_u32(cnp, "bus-width",
+		&pdata->slot[slot_id].bus_width))
+			pdata->slot[slot_id].bus_width = 1;
+
+		pdata->slot[slot_id].detect_pin =
+			of_get_named_gpio(cnp, "cd-gpios", 0);
+
+		if (of_find_property(cnp, "cd-inverted", NULL))
+			pdata->slot[slot_id].detect_is_active_high = true;
+
+		pdata->slot[slot_id].wp_pin =
+			of_get_named_gpio(cnp, "wp-gpios", 0);
+	}
+
+	return pdata;
+}
+#else /* CONFIG_OF */
+static inline struct mci_platform_data*
+atmci_of_init(struct platform_device *dev)
+{
+	return ERR_PTR(-EINVAL);
+}
+#endif
+
  static inline unsigned int atmci_get_version(struct atmel_mci *host)
  {
  	return atmci_readl(host, ATMCI_VERSION)&  0x00000fff;
@@ -2038,6 +2109,13 @@ static int __init atmci_init_slot(struct atmel_mci *host,
  	slot->sdc_reg = sdc_reg;
  	slot->sdio_irq = sdio_irq;
 
+	dev_dbg(&mmc->class_dev,
+	        "slot[%u]: bus_width=%u, detect_pin=%d, "
+		"detect_is_active_high=%s, wp_pin=%d\n",
+		id, slot_data->bus_width, slot_data->detect_pin,
+		slot_data->detect_is_active_high ? "true" : "false",
+		slot_data->wp_pin);
+
  	mmc->ops =&atmci_ops;
  	mmc->f_min = DIV_ROUND_UP(host->bus_hz, 512);
Quoted 9 lines

drivers/mmc/host/atmel-mci.c static int __init atmci_probe(struct platform_device *pdev) · line 2262

Quoted 7 lines
drivers/mmc/host/atmel-mci.c +0 -2
  	mmc->f_max = host->bus_hz / 2;
@@ -2258,8 +2336,14 @@ static int __init atmci_probe(struct platform_device *pdev)
  	if (!regs)
  		return -ENXIO;
  	pdata = pdev->dev.platform_data;
-	if (!pdata)
-		return -ENXIO;

check the node and then check the return

Sorry but what do you mean? The node is checked into atmci_of_init and the return is checked:

+ if (!pdata) {
+ pdata = atmci_of_init(pdev);
+ if (IS_ERR(pdata)) {
+ dev_err(&pdev->dev, "platform data not available\n");
+ return -EINVAL;
+ }
+ }

Regards

Ludovic

#5 lore raw

PATCH v3 1/3 mmc: atmel-mci: add device tree support

Quoted 57 lines · ludovic.desroches

Le 05/22/2012 04:08 PM, Jean-Christophe PLAGNIOL-VILLARD a ?crit :

Quoted 56 lines · ludovic.desroches at atmel.com
Quoted 43 lines

From: Ludovic Desroches<[email protected]>

---
 .../devicetree/bindings/mmc/atmel-hsmci.txt        |   67 +++++++++++++++
 drivers/mmc/host/atmel-mci.c                       |   89 +++++++++++++++++++-
 2 files changed, 154 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mmc/atmel-hsmci.txt
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +28 -0
new file mode 100644
index 0000000..81c20cc
@@ -0,0 +1,67 @@
+* Atmel High Speed MultiMedia Card Interface
+
+This controller on atmel products provides an interface for MMC, SD and SDIO
+types of memory cards.
+
+1) MCI node
+
+Required properties:
+- compatible: no blank "atmel,hsmci"
+- reg: should contain HSMCI registers location and length
+- interrupts: should contain HSMCI interrupt number
+- #address-cells: should be one. The cell is the slot id.
+- #size-cells: should be zero.
+- at least one slot node
+
+The node contains child nodes for each slot that the platform uses
+
+Example MCI node:
+
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg =<0xf0008000 0x600>;
+	interrupts =<12 4>;
+	#address-cells =<1>;
+	#size-cells =<0>;
+
+	[ child node definitions...]
+};

Documentation/devicetree/bindings/mmc/atmel-hsmci.txt line 38

Quoted 10 lines
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +10 -0
+
+2) slot nodes
+
+Required properties:
+- reg: should contain the slot id.
+- bus-width: number of data lines connected to the controller
+
+Optional properties:
+- cd-gpios: specify GPIOs for card detection
+- cd-inverted: invert the value of external card detect gpio line

why this

Quoted 5 lines
Quoted 3 lines

no need you can use the third field and OF_GPIO_ACTIVE_LOW as done on ohci-at91.c

It's a property from the common mmc binding so why not using it?

gpio alread carry this information mmc common bindingd need to use is

btw for bool property you need to use of_property_read_bool

Quoted 149 lines
Quoted 78 lines
Quoted 78 lines
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +29 -0
+- wp-gpios: specify GPIOs for write protection
+
+Example slot node:
+
+slot at 0 {
+	reg =<0>;
+	bus-width =<4>;
+	cd-gpios =<&pioD 15 0>
+	cd-inverted;
+};
+
+Example full MCI node:
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg =<0xf0008000 0x600>;
+	interrupts =<12 4>;
+	#address-cells =<1>;
+	#size-cells =<0>;
+	slot at 0 {
+		reg =<0>;
+		bus-width =<4>;
+		cd-gpios =<&pioD 15 0>
+		cd-inverted;
+	};
+	slot at 1 {
+		reg =<1>;
+		bus-width =<4>;
+	};
+};
drivers/mmc/host/atmel-mci.c +33 -0
index 556d384..43f98fc 100644
@@ -19,6 +19,9 @@
 #include<linux/interrupt.h>
 #include<linux/ioport.h>
 #include<linux/module.h>
+#include<linux/of.h>
+#include<linux/of_device.h>
+#include<linux/of_gpio.h>
 #include<linux/platform_device.h>
 #include<linux/scatterlist.h>
 #include<linux/seq_file.h>
@@ -493,6 +496,74 @@ err:
 	dev_err(&mmc->class_dev, "failed to initialize debugfs for slot\n");
 }
 
+#if defined(CONFIG_OF)
+static const struct of_device_id atmci_dt_ids[] = {
+	{ .compatible = "atmel,hsmci" },
+	{ /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmci_dt_ids);
+
+static struct mci_platform_data __devinit*
+atmci_of_init(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *cnp;
+	struct mci_platform_data *pdata;
+	unsigned int slot_id;
+	const __be32 *reg;
+
+	if (!np) {
+		dev_err(&pdev->dev, "device node not found\n");
+		return ERR_PTR(-EINVAL);
+	}
+
+	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata) {
+		dev_err(&pdev->dev, "could not allocate memory for pdata\n");
+		return ERR_PTR(-ENOMEM);
+	}
+
+	for_each_child_of_node(np, cnp) {
+		reg = of_get_property(cnp, "reg", NULL);
Quoted 8 lines

drivers/mmc/host/atmel-mci.c err: · line 535

Quoted 7 lines
drivers/mmc/host/atmel-mci.c +7 -0
+		if (!reg) {
+			dev_warn(&pdev->dev, "reg property is missing for %s\n",
+				 cnp->full_name);
+			continue;
+		}
+
+		slot_id = be32_to_cpu(reg[0]);

read_u32

ok

Quoted 47 lines
Quoted 47 lines
drivers/mmc/host/atmel-mci.c +38 -0
+
+		if (slot_id>  (ATMCI_MAX_NR_SLOTS-1)) {
+			dev_warn(&pdev->dev, "can't have more than %d slots\n",
+			         ATMCI_MAX_NR_SLOTS);
+			break;
+		}
+
+		if (of_property_read_u32(cnp, "bus-width",
+		&pdata->slot[slot_id].bus_width))
+			pdata->slot[slot_id].bus_width = 1;
+
+		pdata->slot[slot_id].detect_pin =
+			of_get_named_gpio(cnp, "cd-gpios", 0);
+
+		if (of_find_property(cnp, "cd-inverted", NULL))
+			pdata->slot[slot_id].detect_is_active_high = true;
+
+		pdata->slot[slot_id].wp_pin =
+			of_get_named_gpio(cnp, "wp-gpios", 0);
+	}
+
+	return pdata;
+}
+#else /* CONFIG_OF */
+static inline struct mci_platform_data*
+atmci_of_init(struct platform_device *dev)
+{
+	return ERR_PTR(-EINVAL);
+}
+#endif
+
 static inline unsigned int atmci_get_version(struct atmel_mci *host)
 {
 	return atmci_readl(host, ATMCI_VERSION)&  0x00000fff;
@@ -2038,6 +2109,13 @@ static int __init atmci_init_slot(struct atmel_mci *host,
 	slot->sdc_reg = sdc_reg;
 	slot->sdio_irq = sdio_irq;
 
+	dev_dbg(&mmc->class_dev,
+	        "slot[%u]: bus_width=%u, detect_pin=%d, "
+		"detect_is_active_high=%s, wp_pin=%d\n",
+		id, slot_data->bus_width, slot_data->detect_pin,
+		slot_data->detect_is_active_high ? "true" : "false",
+		slot_data->wp_pin);
+
 	mmc->ops =&atmci_ops;
 	mmc->f_min = DIV_ROUND_UP(host->bus_hz, 512);
Quoted 9 lines

drivers/mmc/host/atmel-mci.c static int __init atmci_probe(struct platform_device *pdev) · line 2262

Quoted 7 lines
drivers/mmc/host/atmel-mci.c +0 -2
 	mmc->f_max = host->bus_hz / 2;
@@ -2258,8 +2336,14 @@ static int __init atmci_probe(struct platform_device *pdev)
 	if (!regs)
 		return -ENXIO;
 	pdata = pdev->dev.platform_data;
-	if (!pdata)
-		return -ENXIO;

check the node and then check the return

Sorry but what do you mean? The node is checked into atmci_of_init and the return is checked:

drivers/mmc/host/atmel-mci.c static int __init atmci_probe(struct platform_device *pdev) · line 2343

Quoted 5 lines
drivers/mmc/host/atmel-mci.c +5 -0
+	if (!pdata) {
+		pdata = atmci_of_init(pdev);
+		if (IS_ERR(pdata)) {
+			dev_err(&pdev->dev, "platform data not available\n");
+			return -EINVAL;

and here return the reall error btw

Review

Quoted 2 lines
(quoted diff) +2 -0
+		}
+	}

you just call the of_init if you have a node

Best Regards,
J.

Quoted 6 lines

Regards

Ludovic

#6 lore raw

PATCH v3 1/3 mmc: atmel-mci: add device tree support

On 05/22/2012 05:10 PM, Jean-Christophe PLAGNIOL-VILLARD :

Quoted 58 lines · ludovic.desroches
Quoted 57 lines

Le 05/22/2012 04:08 PM, Jean-Christophe PLAGNIOL-VILLARD a ?crit :

Quoted 56 lines · ludovic.desroches at atmel.com
Quoted 43 lines

From: Ludovic Desroches<[email protected]>

---
 .../devicetree/bindings/mmc/atmel-hsmci.txt        |   67 +++++++++++++++
 drivers/mmc/host/atmel-mci.c                       |   89 +++++++++++++++++++-
 2 files changed, 154 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mmc/atmel-hsmci.txt
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +28 -0
new file mode 100644
index 0000000..81c20cc
@@ -0,0 +1,67 @@
+* Atmel High Speed MultiMedia Card Interface
+
+This controller on atmel products provides an interface for MMC, SD and SDIO
+types of memory cards.
+
+1) MCI node
+
+Required properties:
+- compatible: no blank "atmel,hsmci"
+- reg: should contain HSMCI registers location and length
+- interrupts: should contain HSMCI interrupt number
+- #address-cells: should be one. The cell is the slot id.
+- #size-cells: should be zero.
+- at least one slot node
+
+The node contains child nodes for each slot that the platform uses
+
+Example MCI node:
+
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg =<0xf0008000 0x600>;
+	interrupts =<12 4>;
+	#address-cells =<1>;
+	#size-cells =<0>;
+
+	[ child node definitions...]
+};

Documentation/devicetree/bindings/mmc/atmel-hsmci.txt line 38

Quoted 10 lines
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +10 -0
+
+2) slot nodes
+
+Required properties:
+- reg: should contain the slot id.
+- bus-width: number of data lines connected to the controller
+
+Optional properties:
+- cd-gpios: specify GPIOs for card detection
+- cd-inverted: invert the value of external card detect gpio line

why this

Quoted 6 lines
Quoted 5 lines
Quoted 3 lines

no need you can use the third field and OF_GPIO_ACTIVE_LOW as done on ohci-at91.c

It's a property from the common mmc binding so why not using it?

gpio alread carry this information mmc common bindingd need to use is

Discussion seem ongoing about common mmc binding. What you describe above has been proposed but not adopted. So, until it reaches a consensus, we keep what is described in current binding.

Quoted 156 lines

btw for bool property you need to use of_property_read_bool

Quoted 149 lines
Quoted 78 lines
Quoted 78 lines
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +29 -0
+- wp-gpios: specify GPIOs for write protection
+
+Example slot node:
+
+slot at 0 {
+	reg =<0>;
+	bus-width =<4>;
+	cd-gpios =<&pioD 15 0>
+	cd-inverted;
+};
+
+Example full MCI node:
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg =<0xf0008000 0x600>;
+	interrupts =<12 4>;
+	#address-cells =<1>;
+	#size-cells =<0>;
+	slot at 0 {
+		reg =<0>;
+		bus-width =<4>;
+		cd-gpios =<&pioD 15 0>
+		cd-inverted;
+	};
+	slot at 1 {
+		reg =<1>;
+		bus-width =<4>;
+	};
+};
drivers/mmc/host/atmel-mci.c +33 -0
index 556d384..43f98fc 100644
@@ -19,6 +19,9 @@
 #include<linux/interrupt.h>
 #include<linux/ioport.h>
 #include<linux/module.h>
+#include<linux/of.h>
+#include<linux/of_device.h>
+#include<linux/of_gpio.h>
 #include<linux/platform_device.h>
 #include<linux/scatterlist.h>
 #include<linux/seq_file.h>
@@ -493,6 +496,74 @@ err:
 	dev_err(&mmc->class_dev, "failed to initialize debugfs for slot\n");
 }
 
+#if defined(CONFIG_OF)
+static const struct of_device_id atmci_dt_ids[] = {
+	{ .compatible = "atmel,hsmci" },
+	{ /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmci_dt_ids);
+
+static struct mci_platform_data __devinit*
+atmci_of_init(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *cnp;
+	struct mci_platform_data *pdata;
+	unsigned int slot_id;
+	const __be32 *reg;
+
+	if (!np) {
+		dev_err(&pdev->dev, "device node not found\n");
+		return ERR_PTR(-EINVAL);
+	}
+
+	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata) {
+		dev_err(&pdev->dev, "could not allocate memory for pdata\n");
+		return ERR_PTR(-ENOMEM);
+	}
+
+	for_each_child_of_node(np, cnp) {
+		reg = of_get_property(cnp, "reg", NULL);
Quoted 8 lines

drivers/mmc/host/atmel-mci.c err: · line 535

Quoted 7 lines
drivers/mmc/host/atmel-mci.c +7 -0
+		if (!reg) {
+			dev_warn(&pdev->dev, "reg property is missing for %s\n",
+				 cnp->full_name);
+			continue;
+		}
+
+		slot_id = be32_to_cpu(reg[0]);

read_u32

ok

Quoted 47 lines
Quoted 47 lines
drivers/mmc/host/atmel-mci.c +38 -0
+
+		if (slot_id>  (ATMCI_MAX_NR_SLOTS-1)) {
+			dev_warn(&pdev->dev, "can't have more than %d slots\n",
+			         ATMCI_MAX_NR_SLOTS);
+			break;
+		}
+
+		if (of_property_read_u32(cnp, "bus-width",
+		&pdata->slot[slot_id].bus_width))
+			pdata->slot[slot_id].bus_width = 1;
+
+		pdata->slot[slot_id].detect_pin =
+			of_get_named_gpio(cnp, "cd-gpios", 0);
+
+		if (of_find_property(cnp, "cd-inverted", NULL))
+			pdata->slot[slot_id].detect_is_active_high = true;
+
+		pdata->slot[slot_id].wp_pin =
+			of_get_named_gpio(cnp, "wp-gpios", 0);
+	}
+
+	return pdata;
+}
+#else /* CONFIG_OF */
+static inline struct mci_platform_data*
+atmci_of_init(struct platform_device *dev)
+{
+	return ERR_PTR(-EINVAL);
+}
+#endif
+
 static inline unsigned int atmci_get_version(struct atmel_mci *host)
 {
 	return atmci_readl(host, ATMCI_VERSION)&  0x00000fff;
@@ -2038,6 +2109,13 @@ static int __init atmci_init_slot(struct atmel_mci *host,
 	slot->sdc_reg = sdc_reg;
 	slot->sdio_irq = sdio_irq;
 
+	dev_dbg(&mmc->class_dev,
+	        "slot[%u]: bus_width=%u, detect_pin=%d, "
+		"detect_is_active_high=%s, wp_pin=%d\n",
+		id, slot_data->bus_width, slot_data->detect_pin,
+		slot_data->detect_is_active_high ? "true" : "false",
+		slot_data->wp_pin);
+
 	mmc->ops =&atmci_ops;
 	mmc->f_min = DIV_ROUND_UP(host->bus_hz, 512);
Quoted 9 lines

drivers/mmc/host/atmel-mci.c static int __init atmci_probe(struct platform_device *pdev) · line 2262

Quoted 7 lines
drivers/mmc/host/atmel-mci.c +0 -2
 	mmc->f_max = host->bus_hz / 2;
@@ -2258,8 +2336,14 @@ static int __init atmci_probe(struct platform_device *pdev)
 	if (!regs)
 		return -ENXIO;
 	pdata = pdev->dev.platform_data;
-	if (!pdata)
-		return -ENXIO;

check the node and then check the return

Sorry but what do you mean? The node is checked into atmci_of_init and the return is checked:

drivers/mmc/host/atmel-mci.c static int __init atmci_probe(struct platform_device *pdev) · line 2343

Quoted 5 lines
drivers/mmc/host/atmel-mci.c +5 -0
+	if (!pdata) {
+		pdata = atmci_of_init(pdev);
+		if (IS_ERR(pdata)) {
+			dev_err(&pdev->dev, "platform data not available\n");
+			return -EINVAL;

and here return the reall error btw

Quoted 3 lines

Review

Quoted 2 lines
(quoted diff) +2 -0
+		}
+	}

you just call the of_init if you have a node

Well, this seems simple and elegant to me.

Bye,

Signature · 1 line
Nicolas Ferre
#7 lore raw

PATCH v4 1/3 mmc: atmel-mci: add device tree support

In reply to ludovic.desroches at atmel.com

From: Ludovic Desroches <[email protected]>

---
 .../devicetree/bindings/mmc/atmel-hsmci.txt        |   67 +++++++++++++++
 drivers/mmc/host/atmel-mci.c                       |   87 +++++++++++++++++++-
 2 files changed, 152 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mmc/atmel-hsmci.txt
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +67 -0
new file mode 100644
index 0000000..81c20cc
@@ -0,0 +1,67 @@
+* Atmel High Speed MultiMedia Card Interface
+
+This controller on atmel products provides an interface for MMC, SD and SDIO
+types of memory cards.
+
+1) MCI node
+
+Required properties:
+- compatible: no blank "atmel,hsmci"
+- reg: should contain HSMCI registers location and length
+- interrupts: should contain HSMCI interrupt number
+- #address-cells: should be one. The cell is the slot id.
+- #size-cells: should be zero.
+- at least one slot node
+
+The node contains child nodes for each slot that the platform uses
+
+Example MCI node:
+
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	[ child node definitions...]
+};
+
+2) slot nodes
+
+Required properties:
+- reg: should contain the slot id.
+- bus-width: number of data lines connected to the controller
+
+Optional properties:
+- cd-gpios: specify GPIOs for card detection
+- cd-inverted: invert the value of external card detect gpio line
+- wp-gpios: specify GPIOs for write protection
+
+Example slot node:
+
+slot at 0 {
+	reg = <0>;
+	bus-width = <4>;
+	cd-gpios = <&pioD 15 0>
+	cd-inverted;
+};
+
+Example full MCI node:
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+	slot at 0 {
+		reg = <0>;
+		bus-width = <4>;
+		cd-gpios = <&pioD 15 0>
+		cd-inverted;
+	};
+	slot at 1 {
+		reg = <1>;
+		bus-width = <4>;
+	};
+};
drivers/mmc/host/atmel-mci.c +85 -2

117 lines not on this page · raw message

Signature · 1 line
1.7.5.4
#8 lore raw

PATCH v4 1/3 mmc: atmel-mci: add device tree support

Quoted 121 lines · ludovic.desroches at atmel.com

From: Ludovic Desroches <[email protected]>

---
 .../devicetree/bindings/mmc/atmel-hsmci.txt        |   67 +++++++++++++++
 drivers/mmc/host/atmel-mci.c                       |   87 +++++++++++++++++++-
 2 files changed, 152 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mmc/atmel-hsmci.txt
Documentation/devicetree/bindings/mmc/atmel-hsmci.txt new file +67 -0
new file mode 100644
index 0000000..81c20cc
@@ -0,0 +1,67 @@
+* Atmel High Speed MultiMedia Card Interface
+
+This controller on atmel products provides an interface for MMC, SD and SDIO
+types of memory cards.
+
+1) MCI node
+
+Required properties:
+- compatible: no blank "atmel,hsmci"
+- reg: should contain HSMCI registers location and length
+- interrupts: should contain HSMCI interrupt number
+- #address-cells: should be one. The cell is the slot id.
+- #size-cells: should be zero.
+- at least one slot node
+
+The node contains child nodes for each slot that the platform uses
+
+Example MCI node:
+
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	[ child node definitions...]
+};
+
+2) slot nodes
+
+Required properties:
+- reg: should contain the slot id.
+- bus-width: number of data lines connected to the controller
+
+Optional properties:
+- cd-gpios: specify GPIOs for card detection
+- cd-inverted: invert the value of external card detect gpio line
+- wp-gpios: specify GPIOs for write protection
+
+Example slot node:
+
+slot at 0 {
+	reg = <0>;
+	bus-width = <4>;
+	cd-gpios = <&pioD 15 0>
+	cd-inverted;
+};
+
+Example full MCI node:
+mmc0: mmc at f0008000 {
+	compatible = "atmel,hsmci";
+	reg = <0xf0008000 0x600>;
+	interrupts = <12 4>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+	slot at 0 {
+		reg = <0>;
+		bus-width = <4>;
+		cd-gpios = <&pioD 15 0>
+		cd-inverted;
+	};
+	slot at 1 {
+		reg = <1>;
+		bus-width = <4>;
+	};
+};
drivers/mmc/host/atmel-mci.c +24 -0
index 556d384..1842dc7 100644
@@ -19,6 +19,9 @@
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
 #include <linux/platform_device.h>
 #include <linux/scatterlist.h>
 #include <linux/seq_file.h>
@@ -493,6 +496,72 @@ err:
 	dev_err(&mmc->class_dev, "failed to initialize debugfs for slot\n");
 }
 
+#if defined(CONFIG_OF)
+static const struct of_device_id atmci_dt_ids[] = {
+	{ .compatible = "atmel,hsmci" },
+	{ /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmci_dt_ids);
+
+static struct mci_platform_data __devinit*
+atmci_of_init(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *cnp;
+	struct mci_platform_data *pdata;
+	u32 slot_id;
+	int ret;
+
+	if (!np) {
+		dev_err(&pdev->dev, "device node not found\n");
+		return ERR_PTR(-EINVAL);
+	}

drivers/mmc/host/atmel-mci.c err: · line 529

Quoted 10 lines
drivers/mmc/host/atmel-mci.c +10 -0
+
+	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata) {
+		dev_err(&pdev->dev, "could not allocate memory for pdata\n");
+		return ERR_PTR(-ENOMEM);
+	}
+
+	for_each_child_of_node(np, cnp) {
+		ret = of_property_read_u32(cnp, "reg", &slot_id);
+		if (ret) {

really need ret = ?

drivers/mmc/host/atmel-mci.c err: · line 535

Quoted 6 lines
drivers/mmc/host/atmel-mci.c +6 -0
+			dev_warn(&pdev->dev, "reg property is missing for %s\n",
+				 cnp->full_name);
+			continue;
+		}
+
+		if (slot_id > (ATMCI_MAX_NR_SLOTS-1)) {

missing spase arround '-'
if (slot_id >= ATMCI_MAX_NR_SLOTS)
will do the same

Quoted 4 lines
drivers/mmc/host/atmel-mci.c +4 -0
+			dev_warn(&pdev->dev, "can't have more than %d slots\n",
+			         ATMCI_MAX_NR_SLOTS);
+			break;
+		}

drivers/mmc/host/atmel-mci.c err: · line 549

Quoted 10 lines
drivers/mmc/host/atmel-mci.c +10 -0
+
+		if (of_property_read_u32(cnp, "bus-width",
+		                         &pdata->slot[slot_id].bus_width))
+			pdata->slot[slot_id].bus_width = 1;
+
+		pdata->slot[slot_id].detect_pin =
+			of_get_named_gpio(cnp, "cd-gpios", 0);
+
+		pdata->slot[slot_id].detect_is_active_high =
+			of_property_read_bool(cnp, "cd-inverted");

I really this this is redondant with gpio binding

Chris??

BestRegards,
J.

#9 lore raw

PATCH v4 1/3 mmc: atmel-mci: add device tree support

Hi,

Quoted 7 lines · Jean-Christophe PLAGNIOL-VILLARD

drivers/mmc/host/atmel-mci.c err: · line 549

Quoted 3 lines
drivers/mmc/host/atmel-mci.c +3 -0
+
+		pdata->slot[slot_id].detect_is_active_high =
+			of_property_read_bool(cnp, "cd-inverted");

I really this this is redondant with gpio binding

Chris??

Hm, I think go ahead and add it for now -- I agree it's redundant, but we should go through and remove the redundancy from all drivers (and the binding document, which is in 3.5-rc1 now) at once later. Since it's in the bindings doc, best to implement it until that changes.

Thanks,

- Chris.

Signature · 2 lines
Chris Ball   <[email protected]>   <http://printf.net/>
One Laptop Per Child
#10 lore raw

PATCH v3 2/3 ARM: at91: add clocks for DT entries

In reply to ludovic.desroches at atmel.com

From: Ludovic Desroches <[email protected]>

Add clocks to clock lookup table for DT entries.

---
 arch/arm/mach-at91/at91sam9260.c |    1 +
 arch/arm/mach-at91/at91sam9g45.c |    2 ++
 arch/arm/mach-at91/at91sam9x5.c  |    2 ++
 3 files changed, 5 insertions(+), 0 deletions(-)
arch/arm/mach-at91/at91sam9260.c +1 -0
index 46f7742..c356471 100644
@@ -218,6 +218,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk),
 	CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),
 	CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk),
 	/* fake hclk clock */
 	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
 	CLKDEV_CON_ID("pioA", &pioA_clk),
arch/arm/mach-at91/at91sam9g45.c +2 -0
index d222f83..0a2c662 100644
@@ -235,6 +235,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk),
 	CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk),
 	CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fffd0000.mmc", &mmc1_clk),
 	/* fake hclk clock */
 	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk),
 	CLKDEV_CON_ID("pioA", &pioA_clk),
arch/arm/mach-at91/at91sam9x5.c +2 -0
index 13c8cae..39cbef3 100644
@@ -225,6 +225,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk),
 	CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk),
 	CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "f000c000.mmc", &mmc1_clk),
 	CLKDEV_CON_ID("pioA", &pioAB_clk),
 	CLKDEV_CON_ID("pioB", &pioAB_clk),
 	CLKDEV_CON_ID("pioC", &pioCD_clk),
Signature · 1 line
1.7.5.4
#11 lore raw

PATCH v3 2/3 ARM: at91: add clocks for DT entries

On 05/22/2012 12:09 PM, ludovic.desroches at atmel.com :

Quoted 5 lines

From: Ludovic Desroches <[email protected]>

Add clocks to clock lookup table for DT entries.

This one will probably go through arm-soc git tree...

Quoted 44 lines
---
 arch/arm/mach-at91/at91sam9260.c |    1 +
 arch/arm/mach-at91/at91sam9g45.c |    2 ++
 arch/arm/mach-at91/at91sam9x5.c  |    2 ++
 3 files changed, 5 insertions(+), 0 deletions(-)
arch/arm/mach-at91/at91sam9260.c +1 -0
index 46f7742..c356471 100644
@@ -218,6 +218,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk),
 	CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),
 	CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk),
 	/* fake hclk clock */
 	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
 	CLKDEV_CON_ID("pioA", &pioA_clk),
arch/arm/mach-at91/at91sam9g45.c +2 -0
index d222f83..0a2c662 100644
@@ -235,6 +235,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk),
 	CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk),
 	CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fffd0000.mmc", &mmc1_clk),
 	/* fake hclk clock */
 	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk),
 	CLKDEV_CON_ID("pioA", &pioA_clk),
arch/arm/mach-at91/at91sam9x5.c +2 -0
index 13c8cae..39cbef3 100644
@@ -225,6 +225,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk),
 	CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk),
 	CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "f000c000.mmc", &mmc1_clk),
 	CLKDEV_CON_ID("pioA", &pioAB_clk),
 	CLKDEV_CON_ID("pioB", &pioAB_clk),
 	CLKDEV_CON_ID("pioC", &pioCD_clk),
Signature · 1 line
Nicolas Ferre
#13 lore raw

PATCH v4 2/3 ARM: at91: add clocks for DT entries

In reply to ludovic.desroches at atmel.com

From: Ludovic Desroches <[email protected]>

Add clocks to clock lookup table for DT entries.

---
v4: add new chips

 arch/arm/mach-at91/at91sam9260.c |    1 +
 arch/arm/mach-at91/at91sam9263.c |    2 ++
 arch/arm/mach-at91/at91sam9g45.c |    2 ++
 arch/arm/mach-at91/at91sam9n12.c |    1 +
 arch/arm/mach-at91/at91sam9x5.c  |    2 ++
 5 files changed, 8 insertions(+), 0 deletions(-)
arch/arm/mach-at91/at91sam9260.c +1 -0
index 2b1e438..ddba004 100644
@@ -226,6 +226,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk),
 	CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),
 	CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk),
 	/* fake hclk clock */
 	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
 	CLKDEV_CON_ID("pioA", &pioA_clk),
arch/arm/mach-at91/at91sam9263.c +2 -0
index 0eb20f9..f165b25 100644
@@ -211,6 +211,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("hclk", "a00000.ohci", &ohci_clk),
 	CLKDEV_CON_DEV_ID("spi_clk", "fffa4000.spi", &spi0_clk),
 	CLKDEV_CON_DEV_ID("spi_clk", "fffa8000.spi", &spi1_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fff84000.mmc", &mmc1_clk),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
arch/arm/mach-at91/at91sam9g45.c +2 -0
index 4792682..aa24e82 100644
@@ -242,6 +242,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk),
 	CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk),
 	CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "fffd0000.mmc", &mmc1_clk),
 	/* fake hclk clock */
 	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk),
 	CLKDEV_CON_ID("pioA", &pioA_clk),
arch/arm/mach-at91/at91sam9n12.c +1 -0
index 0849466..cce4e0f 100644
@@ -168,6 +168,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk),
 	CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb_clk),
 	CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc_clk),
 	CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk),
 	CLKDEV_CON_ID("pioA", &pioAB_clk),
 	CLKDEV_CON_ID("pioB", &pioAB_clk),
arch/arm/mach-at91/at91sam9x5.c +2 -0
index 1b144b4..de86e37 100644
@@ -231,6 +231,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
 	CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk),
 	CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk),
 	CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk),
+	CLKDEV_CON_DEV_ID("mci_clk", "f000c000.mmc", &mmc1_clk),
 	CLKDEV_CON_ID("pioA", &pioAB_clk),
 	CLKDEV_CON_ID("pioB", &pioAB_clk),
 	CLKDEV_CON_ID("pioC", &pioCD_clk),
Signature · 1 line
1.7.5.4
#15 lore raw

PATCH v3 3/3 ARM: dts: add nodes for atmel hsmci controllers for atmel platforms

In reply to ludovic.desroches at atmel.com

From: Ludovic Desroches <[email protected]>

Add nodes for mci controllers.

---
 arch/arm/boot/dts/at91sam9g20.dtsi     |   12 ++++++++++++
 arch/arm/boot/dts/at91sam9g25ek.dts    |   16 ++++++++++++++++
 arch/arm/boot/dts/at91sam9g45.dtsi     |   24 ++++++++++++++++++++++++
 arch/arm/boot/dts/at91sam9m10g45ek.dts |   17 +++++++++++++++++
 arch/arm/boot/dts/at91sam9x5.dtsi      |   24 ++++++++++++++++++++++++
 5 files changed, 93 insertions(+), 0 deletions(-)
arch/arm/boot/dts/at91sam9g20.dtsi +12 -0
index 773ef48..6a28bfe 100644
@@ -197,6 +197,18 @@
 				interrupts = <10 4>;
 				status = "disabled";
 			};
+
+			mmc0: mmc at fffa800 {
+				compatible = "atmel,hsmci";
+				reg = <0xfffa800 0x600>;
+				interrupts = <9 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9g25ek.dts +16 -0
index 7829a4d..dd94f4b 100644
@@ -32,6 +32,22 @@
 				phy-mode = "rmii";
 				status = "okay";
 			};
+
+			mmc0: mmc at f0008000 {
+				status = "okay";
+				slot at 0 {
+					bus-width = <4>;
+					cd-gpios = <&pioD 15 0>;
+				};
+			};
+
+			mmc1: mmc at f000c000 {
+				status = "okay";
+				slot at 0 {
+					bus-width = <4>;
+					cd-gpios = <&pioD 14 0>;
+				};
+			};
 		};
 
 		usb0: ohci at 00600000 {
arch/arm/boot/dts/at91sam9g45.dtsi +24 -0
index c804214..2922648 100644
@@ -199,6 +199,30 @@
 				interrupts = <25 4>;
 				status = "disabled";
 			};
+
+			mmc0: mmc at fff80000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfff80000 0x600>;
+				interrupts = <11 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
+
+			mmc1: mmc at fffd0000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfffd0000 0x600>;
+				interrupts = <29 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9m10g45ek.dts +17 -0
index a3633bd..bc4cb3c 100644
@@ -46,6 +46,23 @@
 				phy-mode = "rmii";
 				status = "okay";
 			};
+
+			mmc0: mmc at fff80000 {
+				status = "okay";
+				slot at 0 {
+					bus-width = <4>;
+					cd-gpios = <&pioD 10 0>;
+				};
+			};
+
+			mmc1: mmc at fffd0000 {
+				status = "okay";
+				slot at 0 {
+					bus-width = <4>;
+					cd-gpios = <&pioD 11 0>;
+					wp-gpios = <&pioD 29 0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9x5.dtsi +24 -0
index dd4ed74..d5999b2 100644
@@ -190,6 +190,30 @@
 				interrupts = <27 4>;
 				status = "disabled";
 			};
+
+			mmc0: mmc at f0008000 {
+				compatible = "atmel,hsmci";
+				reg = <0xf0008000 0x600>;
+				interrupts = <12 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
+
+			mmc1: mmc at f000c000 {
+				compatible = "atmel,hsmci";
+				reg = <0xf000c000 0x600>;
+				interrupts = <26 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
Signature · 1 line
1.7.5.4
#16 lore raw

PATCH v3 3/3 ARM: dts: add nodes for atmel hsmci controllers for atmel platforms

On 05/22/2012 12:09 PM, ludovic.desroches at atmel.com :

Quoted 7 lines

From: Ludovic Desroches <[email protected]>

Add nodes for mci controllers.

---
 arch/arm/boot/dts/at91sam9g20.dtsi     |   12 ++++++++++++

Maybe this one will have to be reworked on top of new ADC declarations. Maybe also take into account the device tree support for sam9260: it is linked with 9g20 support...

otherwise, once rebased you can add my:

(and I think that this one also should go through arm-soc)

Quoted 154 lines
 arch/arm/boot/dts/at91sam9g25ek.dts    |   16 ++++++++++++++++
 arch/arm/boot/dts/at91sam9g45.dtsi     |   24 ++++++++++++++++++++++++
 arch/arm/boot/dts/at91sam9m10g45ek.dts |   17 +++++++++++++++++
 arch/arm/boot/dts/at91sam9x5.dtsi      |   24 ++++++++++++++++++++++++
 5 files changed, 93 insertions(+), 0 deletions(-)
arch/arm/boot/dts/at91sam9g20.dtsi +12 -0
index 773ef48..6a28bfe 100644
@@ -197,6 +197,18 @@
 				interrupts = <10 4>;
 				status = "disabled";
 			};
+
+			mmc0: mmc at fffa800 {
+				compatible = "atmel,hsmci";
+				reg = <0xfffa800 0x600>;
+				interrupts = <9 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9g25ek.dts +16 -0
index 7829a4d..dd94f4b 100644
@@ -32,6 +32,22 @@
 				phy-mode = "rmii";
 				status = "okay";
 			};
+
+			mmc0: mmc at f0008000 {
+				status = "okay";
+				slot at 0 {
+					bus-width = <4>;
+					cd-gpios = <&pioD 15 0>;
+				};
+			};
+
+			mmc1: mmc at f000c000 {
+				status = "okay";
+				slot at 0 {
+					bus-width = <4>;
+					cd-gpios = <&pioD 14 0>;
+				};
+			};
 		};
 
 		usb0: ohci at 00600000 {
arch/arm/boot/dts/at91sam9g45.dtsi +24 -0
index c804214..2922648 100644
@@ -199,6 +199,30 @@
 				interrupts = <25 4>;
 				status = "disabled";
 			};
+
+			mmc0: mmc at fff80000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfff80000 0x600>;
+				interrupts = <11 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
+
+			mmc1: mmc at fffd0000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfffd0000 0x600>;
+				interrupts = <29 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9m10g45ek.dts +17 -0
index a3633bd..bc4cb3c 100644
@@ -46,6 +46,23 @@
 				phy-mode = "rmii";
 				status = "okay";
 			};
+
+			mmc0: mmc at fff80000 {
+				status = "okay";
+				slot at 0 {
+					bus-width = <4>;
+					cd-gpios = <&pioD 10 0>;
+				};
+			};
+
+			mmc1: mmc at fffd0000 {
+				status = "okay";
+				slot at 0 {
+					bus-width = <4>;
+					cd-gpios = <&pioD 11 0>;
+					wp-gpios = <&pioD 29 0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9x5.dtsi +24 -0
index dd4ed74..d5999b2 100644
@@ -190,6 +190,30 @@
 				interrupts = <27 4>;
 				status = "disabled";
 			};
+
+			mmc0: mmc at f0008000 {
+				compatible = "atmel,hsmci";
+				reg = <0xf0008000 0x600>;
+				interrupts = <12 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
+
+			mmc1: mmc at f000c000 {
+				compatible = "atmel,hsmci";
+				reg = <0xf000c000 0x600>;
+				interrupts = <26 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
Signature · 1 line
Nicolas Ferre
#17 lore raw

PATCH v3 3/3 ARM: dts: add nodes for atmel hsmci controllers for atmel platforms

In reply to ludovic.desroches at atmel.com
Quoted 23 lines · ludovic.desroches at atmel.com

From: Ludovic Desroches <[email protected]>

Add nodes for mci controllers.

---
 arch/arm/boot/dts/at91sam9g20.dtsi     |   12 ++++++++++++
 arch/arm/boot/dts/at91sam9g25ek.dts    |   16 ++++++++++++++++
 arch/arm/boot/dts/at91sam9g45.dtsi     |   24 ++++++++++++++++++++++++
 arch/arm/boot/dts/at91sam9m10g45ek.dts |   17 +++++++++++++++++
 arch/arm/boot/dts/at91sam9x5.dtsi      |   24 ++++++++++++++++++++++++
 5 files changed, 93 insertions(+), 0 deletions(-)
arch/arm/boot/dts/at91sam9g20.dtsi +2 -0
index 773ef48..6a28bfe 100644
@@ -197,6 +197,18 @@
 				interrupts = <10 4>;
 				status = "disabled";
 			};
+
+			mmc0: mmc at fffa800 {

arch/arm/boot/dts/at91sam9g20.dtsi line 211

Quoted 10 lines
arch/arm/boot/dts/at91sam9g20.dtsi +10 -0
+				compatible = "atmel,hsmci";
+				reg = <0xfffa800 0x600>;
+				interrupts = <9 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				slot at 0 {
+					reg = <0>;
+				};
+			};

this need to be in 9260.dtsi

if you add the board too plese add all of them
or seperate the commits

Best Regards,
J.

#18 lore raw

PATCH v3 3/3 ARM: dts: add nodes for atmel hsmci controllers for atmel platforms

Le 05/22/2012 04:13 PM, Jean-Christophe PLAGNIOL-VILLARD a ?crit :

Quoted 36 lines · ludovic.desroches at atmel.com
Quoted 23 lines

From: Ludovic Desroches<[email protected]>

Add nodes for mci controllers.

---
  arch/arm/boot/dts/at91sam9g20.dtsi     |   12 ++++++++++++
  arch/arm/boot/dts/at91sam9g25ek.dts    |   16 ++++++++++++++++
  arch/arm/boot/dts/at91sam9g45.dtsi     |   24 ++++++++++++++++++++++++
  arch/arm/boot/dts/at91sam9m10g45ek.dts |   17 +++++++++++++++++
  arch/arm/boot/dts/at91sam9x5.dtsi      |   24 ++++++++++++++++++++++++
  5 files changed, 93 insertions(+), 0 deletions(-)
arch/arm/boot/dts/at91sam9g20.dtsi +2 -0
index 773ef48..6a28bfe 100644
@@ -197,6 +197,18 @@
  				interrupts =<10 4>;
  				status = "disabled";
  			};
+
+			mmc0: mmc at fffa800 {

arch/arm/boot/dts/at91sam9g20.dtsi line 211

Quoted 10 lines
arch/arm/boot/dts/at91sam9g20.dtsi +10 -0
+				compatible = "atmel,hsmci";
+				reg =<0xfffa800 0x600>;
+				interrupts =<9 4>;
+				status = "disabled";
+				#address-cells =<1>;
+				#size-cells =<0>;
+				slot at 0 {
+					reg =<0>;
+				};
+			};

this need to be in 9260.dtsi

Quoted 3 lines

if you add the board too plese add all of them
or seperate the commits

I based it on 3.4 so 9260.dtsi was not present. Nicolas gave me a new branch with it so I will add mmc node to 9260.

Regards

Ludovic

#19 lore raw

PATCH v4 3/3 ARM: dts: add nodes for atmel hsmci controllers for atmel platforms

In reply to ludovic.desroches at atmel.com

From: Ludovic Desroches <[email protected]>

Add nodes for mci controllers.

---
v4: add new chips and boards

 arch/arm/boot/dts/at91sam9260.dtsi          |    9 +++++++++
 arch/arm/boot/dts/at91sam9263.dtsi          |   18 ++++++++++++++++++
 arch/arm/boot/dts/at91sam9263ek.dts         |   10 ++++++++++
 arch/arm/boot/dts/at91sam9g20ek_2mmc.dts    |   12 ++++++++++++
 arch/arm/boot/dts/at91sam9g20ek_common.dtsi |    9 +++++++++
 arch/arm/boot/dts/at91sam9g25ek.dts         |   18 ++++++++++++++++++
 arch/arm/boot/dts/at91sam9g45.dtsi          |   18 ++++++++++++++++++
 arch/arm/boot/dts/at91sam9m10g45ek.dts      |   19 +++++++++++++++++++
 arch/arm/boot/dts/at91sam9n12.dtsi          |    9 +++++++++
 arch/arm/boot/dts/at91sam9n12ek.dts         |    9 +++++++++
 arch/arm/boot/dts/at91sam9x5.dtsi           |   18 ++++++++++++++++++
 11 files changed, 149 insertions(+), 0 deletions(-)
arch/arm/boot/dts/at91sam9260.dtsi +9 -0
index f449efc..ae54bf3 100644
@@ -198,6 +198,15 @@
 				status = "disabled";
 			};
 
+			mmc0: mmc at fffa8000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfffa800 0x600>;
+				interrupts = <9 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+			};
+
 			adc0: adc at fffe0000 {
 				compatible = "atmel,at91sam9260-adc";
 				reg = <0xfffe0000 0x100>;
arch/arm/boot/dts/at91sam9263.dtsi +18 -0
index 0209913..a327ebe 100644
@@ -179,6 +179,24 @@
 				interrupts = <24 4>;
 				status = "disabled";
 			};
+
+			mmc0: mmc at fff80000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfff80000 0x600>;
+				interrupts = <10 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+			};
+
+			mmc1: mmc at fff84000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfff84000 0x600>;
+				interrupts = <11 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9263ek.dts +10 -0
index f86ac4b..05028ed 100644
@@ -50,6 +50,16 @@
 				atmel,vbus-gpio = <&pioA 25 0>;
 				status = "okay";
 			};
+
+			mmc0: mmc at fff80000 {
+				status = "okay";
+				slot at 0 {
+					reg = <0>;
+					bus-width = <4>;
+					cd-gpios = <&pioE 18 0>;
+					wp-gpios = <&pioE 19 0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9g20ek_2mmc.dts +12 -0
index f1b2e14..684b229 100644
@@ -12,6 +12,18 @@
 	model = "Atmel at91sam9g20ek 2 mmc";
 	compatible = "atmel,at91sam9g20ek_2mmc", "atmel,at91sam9g20", "atmel,at91sam9";
 
+	ahb {
+		apb{
+			mmc0: mmc at fffa8000 {
+				slot at 0 {
+					reg = <0>;
+					bus-width = <4>;
+					cd-gpios = <&pioC 2 0>;
+				};
+			};
+		};
+	};
+
 	leds {
 		compatible = "gpio-leds";
 
arch/arm/boot/dts/at91sam9g20ek_common.dtsi +9 -0
index b06c0db..7da326a 100644
@@ -51,6 +51,15 @@
 				atmel,vbus-gpio = <&pioC 5 0>;
 				status = "okay";
 			};
+
+			mmc0: mmc at fffa8000 {
+				status = "okay";
+				slot at 1 {
+					reg = <1>;
+					bus-width = <4>;
+					cd-gpios = <&pioC 9 0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9g25ek.dts +18 -0
index 7829a4d..422a9fb 100644
@@ -32,6 +32,24 @@
 				phy-mode = "rmii";
 				status = "okay";
 			};
+
+			mmc0: mmc at f0008000 {
+				status = "okay";
+				slot at 0 {
+					reg = <0>;
+					bus-width = <4>;
+					cd-gpios = <&pioD 15 0>;
+				};
+			};
+
+			mmc1: mmc at f000c000 {
+				status = "okay";
+				slot at 0 {
+					reg = <0>;
+					bus-width = <4>;
+					cd-gpios = <&pioD 14 0>;
+				};
+			};
 		};
 
 		usb0: ohci at 00600000 {
arch/arm/boot/dts/at91sam9g45.dtsi +18 -0
index 7dbccaf..0360bf8 100644
@@ -236,6 +236,24 @@
 					trigger-value = <0x6>;
 				};
 			};
+
+			mmc0: mmc at fff80000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfff80000 0x600>;
+				interrupts = <11 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+			};
+
+			mmc1: mmc at fffd0000 {
+				compatible = "atmel,hsmci";
+				reg = <0xfffd0000 0x600>;
+				interrupts = <29 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9m10g45ek.dts +19 -0
index a3633bd..7a7b571 100644
@@ -46,6 +46,25 @@
 				phy-mode = "rmii";
 				status = "okay";
 			};
+
+			mmc0: mmc at fff80000 {
+				status = "okay";
+				slot at 0 {
+					reg = <0>;
+					bus-width = <4>;
+					cd-gpios = <&pioD 10 0>;
+				};
+			};
+
+			mmc1: mmc at fffd0000 {
+				status = "okay";
+				slot at 0 {
+					reg = <0>;
+					bus-width = <4>;
+					cd-gpios = <&pioD 11 0>;
+					wp-gpios = <&pioD 29 0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9n12.dtsi +9 -0
index cb84de7..f3e03fb 100644
@@ -82,6 +82,15 @@
 				reg = <0xfffffe10 0x10>;
 			};
 
+			mmc0: mmc at f0008000 {
+				compatible = "atmel,hsmci";
+				reg = <0xf0008000 0x600>;
+				interrupts = <12 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+			};
+
 			tcb0: timer at f8008000 {
 				compatible = "atmel,at91sam9x5-tcb";
 				reg = <0xf8008000 0x100>;
arch/arm/boot/dts/at91sam9n12ek.dts +9 -0
index f4e43e3..44b42d9 100644
@@ -37,6 +37,15 @@
 			dbgu: serial at fffff200 {
 				status = "okay";
 			};
+
+			mmc0: mmc at f0008000 {
+				status = "okay";
+				slot at 0 {
+					reg = <0>;
+					bus-width = <4>;
+					cd-gpios = <&pioA 7 0>;
+				};
+			};
 		};
 
 		nand0: nand at 40000000 {
arch/arm/boot/dts/at91sam9x5.dtsi +18 -0
index 6b3ef43..4e8125b 100644
@@ -228,6 +228,24 @@
 					trigger-value = <0x6>;
 				};
 			};
+
+			mmc0: mmc at f0008000 {
+				compatible = "atmel,hsmci";
+				reg = <0xf0008000 0x600>;
+				interrupts = <12 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+			};
+
+			mmc1: mmc at f000c000 {
+				compatible = "atmel,hsmci";
+				reg = <0xf000c000 0x600>;
+				interrupts = <26 4>;
+				status = "disabled";
+				#address-cells = <1>;
+				#size-cells = <0>;
+			};
 		};
 
 		nand0: nand at 40000000 {
Signature · 1 line
1.7.5.4