summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-10-07 01:01:06 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2015-10-07 01:01:06 +0200
commit8a83eca779ad6b8861f5a88e32b45a87f37ae7f4 (patch)
tree3232b6cba1ef1698208ee8fb0621c1d02149fc2e /drivers
parentddd7031b979390f7872d981accd0d22d85eeee48 (diff)
parent329db2f586c4125fc0255f1e111dae7602e9845b (diff)
downloadbarebox-8a83eca779ad6b8861f5a88e32b45a87f37ae7f4.tar.gz
barebox-8a83eca779ad6b8861f5a88e32b45a87f37ae7f4.tar.xz
Merge branch 'for-next/mci'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/intf_platform_ide.c30
-rw-r--r--drivers/mci/mci-core.c25
2 files changed, 48 insertions, 7 deletions
diff --git a/drivers/ata/intf_platform_ide.c b/drivers/ata/intf_platform_ide.c
index 0d392d8d4a..d0f7984a2c 100644
--- a/drivers/ata/intf_platform_ide.c
+++ b/drivers/ata/intf_platform_ide.c
@@ -29,6 +29,7 @@
#include <ata_drive.h>
#include <platform_ide.h>
#include <linux/err.h>
+#include <of.h>
/**
* Setup the register specific addresses for an ATA like divice
@@ -85,8 +86,18 @@ static int platform_ide_probe(struct device_d *dev)
void *reg_base, *alt_base = NULL;
struct resource *reg, *alt;
int mmio = 0;
-
- if (pdata == NULL) {
+ struct device_node *dn = dev->device_node;
+ u32 ioport_shift = 0;
+ int dataif_be = 0;
+ void (*reset)(int) = NULL;
+
+ if (pdata) {
+ ioport_shift = pdata->ioport_shift;
+ dataif_be = pdata->dataif_be;
+ reset = pdata->reset;
+ } else if (dn) {
+ of_property_read_u32(dn, "reg-shift", &ioport_shift);
+ } else {
dev_err(dev, "No platform data. Cannot continue\n");
return -EINVAL;
}
@@ -123,9 +134,9 @@ static int platform_ide_probe(struct device_d *dev)
ide = xzalloc(sizeof(*ide));
ide->io.mmio = mmio;
- platform_ide_setup_port(reg_base, alt_base, &ide->io, pdata->ioport_shift);
- ide->io.reset = pdata->reset;
- ide->io.dataif_be = pdata->dataif_be;
+ platform_ide_setup_port(reg_base, alt_base, &ide->io, ioport_shift);
+ ide->io.reset = reset;
+ ide->io.dataif_be = dataif_be;
rc = ide_port_register(ide);
if (rc != 0) {
@@ -136,9 +147,18 @@ static int platform_ide_probe(struct device_d *dev)
return rc;
}
+static __maybe_unused struct of_device_id platform_ide_dt_ids[] = {
+ {
+ .compatible = "ata-generic",
+ }, {
+ /* sentinel */
+ }
+};
+
static struct driver_d platform_ide_driver = {
.name = "ide_intf",
.probe = platform_ide_probe,
+ .of_compatible = DRV_OF_COMPAT(platform_ide_dt_ids),
};
device_platform_driver(platform_ide_driver);
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index bd5cae2cea..90001153d7 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -53,6 +53,8 @@
__res & __mask; \
})
+LIST_HEAD(mci_list);
+
/**
* @file
* @brief Memory Card framework
@@ -370,7 +372,7 @@ static int mmc_send_op_cond(struct mci *mci)
* Note: Only cards newer than Version 1.1 (Physical Layer Spec) support
* this command
*/
-static int mci_send_ext_csd(struct mci *mci, char *ext_csd)
+int mci_send_ext_csd(struct mci *mci, char *ext_csd)
{
struct mci_cmd cmd;
struct mci_data data;
@@ -394,7 +396,7 @@ static int mci_send_ext_csd(struct mci *mci, char *ext_csd)
* @param value FIXME
* @return Transaction status (0 on success)
*/
-static int mci_switch(struct mci *mci, unsigned set, unsigned index,
+int mci_switch(struct mci *mci, unsigned set, unsigned index,
unsigned value)
{
struct mci_cmd cmd;
@@ -650,6 +652,9 @@ retry_scr:
if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
mci->card_caps |= MMC_CAP_SD_HIGHSPEED;
+ if (mci_caps(mci) & MMC_CAP_SD_HIGHSPEED)
+ mci->tran_speed = 50000000;
+
return 0;
}
@@ -1787,6 +1792,8 @@ int mci_register(struct mci_host *host)
if (IS_ENABLED(CONFIG_MCI_STARTUP))
mci_card_probe(mci);
+ list_add_tail(&mci->list, &mci_list);
+
return 0;
err_unregister:
@@ -1844,3 +1851,17 @@ void mci_of_parse(struct mci_host *host)
host->non_removable = of_property_read_bool(np, "non-removable");
}
+
+struct mci *mci_get_device_by_name(const char *name)
+{
+ struct mci *mci;
+
+ list_for_each_entry(mci, &mci_list, list) {
+ if (!mci->cdevname)
+ continue;
+ if (!strcmp(mci->cdevname, name))
+ return mci;
+ }
+
+ return NULL;
+}