summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2016-05-09 08:49:43 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2016-05-09 08:49:43 +0200
commit4cb8e17aa3972e27f4b34e5bb2df9e7007824ac2 (patch)
tree942b24dcd275407d76f6b3ef85f6db9af1160163 /drivers
parent854df603da65bc56fe72218b402903f26155b0f0 (diff)
parent79fdb84a6b46f7c129225b57007b63e765747d52 (diff)
downloadbarebox-4cb8e17aa3972e27f4b34e5bb2df9e7007824ac2.tar.gz
barebox-4cb8e17aa3972e27f4b34e5bb2df9e7007824ac2.tar.xz
Merge branch 'for-next/misc'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/disk_ata_drive.c9
-rw-r--r--drivers/mci/mxs.c10
-rw-r--r--drivers/misc/Kconfig1
-rw-r--r--drivers/net/altera_tse.c2
-rw-r--r--drivers/net/fec_imx.h2
-rw-r--r--drivers/net/phy/phy.c49
-rw-r--r--drivers/net/smc911x.h2
-rw-r--r--drivers/of/Makefile4
-rw-r--r--drivers/of/base.c38
-rw-r--r--drivers/of/fdt.c106
-rw-r--r--drivers/pinctrl/pinctrl-mxs.c4
-rw-r--r--drivers/spi/imx_spi.c2
12 files changed, 174 insertions, 55 deletions
diff --git a/drivers/ata/disk_ata_drive.c b/drivers/ata/disk_ata_drive.c
index cd46e0cf6a..1aa1bb1456 100644
--- a/drivers/ata/disk_ata_drive.c
+++ b/drivers/ata/disk_ata_drive.c
@@ -303,6 +303,14 @@ static int ata_detect(struct device_d *dev)
return ata_port_detect(port);
}
+static void ata_info(struct device_d *dev)
+{
+ struct ata_port *port = container_of(dev, struct ata_port, class_dev);
+
+ if (port->initialized)
+ ata_dump_id(port->id);
+}
+
/**
* Register an ATA drive behind an IDE like interface
* @param dev The interface device
@@ -322,6 +330,7 @@ int ata_port_register(struct ata_port *port)
}
port->class_dev.parent = port->dev;
+ port->class_dev.info = ata_info;
port->class_dev.detect = ata_detect;
ret = register_device(&port->class_dev);
diff --git a/drivers/mci/mxs.c b/drivers/mci/mxs.c
index 2355651022..446da8ad53 100644
--- a/drivers/mci/mxs.c
+++ b/drivers/mci/mxs.c
@@ -571,7 +571,15 @@ static int mxs_mci_probe(struct device_d *hw_dev)
host->f_min = pd->f_min;
host->f_max = pd->f_max;
} else {
- host->voltages = MMC_VDD_32_33 | MMC_VDD_33_34, /* fixed to 3.3 V */
+ /* fixed to 3.3 V */
+ host->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
+
+ if (hw_dev->device_node) {
+ const char *alias = of_alias_get(hw_dev->device_node);
+ if (alias)
+ host->devname = xstrdup(alias);
+ }
+
mci_of_parse(host);
}
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 7a5b14697e..6640a70792 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -17,6 +17,7 @@ config SRAM
config STATE_DRV
tristate "state driver"
+ depends on OFDEVICE
depends on STATE
endmenu
diff --git a/drivers/net/altera_tse.c b/drivers/net/altera_tse.c
index 1e67c7a8e7..316b971742 100644
--- a/drivers/net/altera_tse.c
+++ b/drivers/net/altera_tse.c
@@ -533,7 +533,7 @@ static int tse_probe(struct device_d *dev)
}
#endif
- memset(rx_desc, 0, (sizeof *rx_desc) * (PKTBUFSRX + 1));
+ memset(rx_desc, 0, (sizeof *rx_desc) * (PKTBUFSRX + 1));
memset(tx_desc, 0, (sizeof *tx_desc) * 2);
iores = dev_request_mem_resource(dev, 0);
diff --git a/drivers/net/fec_imx.h b/drivers/net/fec_imx.h
index 0921b52bae..1947e60f69 100644
--- a/drivers/net/fec_imx.h
+++ b/drivers/net/fec_imx.h
@@ -193,7 +193,7 @@ static inline int fec_is_imx6(struct fec_priv *priv)
#define FEC_RBD_SH 0x0008 /**< Receive BD status: Short frame */
#define FEC_RBD_CR 0x0004 /**< Receive BD status: CRC error */
#define FEC_RBD_OV 0x0002 /**< Receive BD status: Receive FIFO overrun */
-#define FEC_RBD_TR 0x0001 /**< Receive BD status: Frame is truncated */
+#define FEC_RBD_TR 0x0001 /**< Receive BD status: Frame is truncated */
#define FEC_RBD_ERR (FEC_RBD_LG | FEC_RBD_NO | FEC_RBD_CR | \
FEC_RBD_OV | FEC_RBD_TR)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index be2c68bf68..73176fbc04 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -52,9 +52,11 @@ int phy_update_status(struct phy_device *phydev)
int ret;
int oldspeed = phydev->speed, oldduplex = phydev->duplex;
- ret = drv->read_status(phydev);
- if (ret)
- return ret;
+ if (drv) {
+ ret = drv->read_status(phydev);
+ if (ret)
+ return ret;
+ }
if (phydev->speed == oldspeed && phydev->duplex == oldduplex)
return 0;
@@ -173,10 +175,15 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id)
phydev->bus = bus;
phydev->dev.bus = &mdio_bus_type;
- sprintf(phydev->dev.name, "mdio%d-phy%02x",
+ if (bus) {
+ sprintf(phydev->dev.name, "mdio%d-phy%02x",
phydev->bus->dev.id,
phydev->addr);
- phydev->dev.id = DEVICE_ID_SINGLE;
+ phydev->dev.id = DEVICE_ID_SINGLE;
+ } else {
+ sprintf(phydev->dev.name, "fixed-phy");
+ phydev->dev.id = DEVICE_ID_DYNAMIC;
+ }
return phydev;
}
@@ -245,7 +252,9 @@ static void phy_config_aneg(struct phy_device *phydev)
struct phy_driver *drv;
drv = to_phy_driver(phydev->dev.driver);
- drv->config_aneg(phydev);
+
+ if (drv)
+ drv->config_aneg(phydev);
}
int phy_register_device(struct phy_device *phydev)
@@ -255,13 +264,15 @@ int phy_register_device(struct phy_device *phydev)
if (phydev->registered)
return -EBUSY;
- phydev->dev.parent = &phydev->bus->dev;
+ if (!phydev->dev.parent)
+ phydev->dev.parent = &phydev->bus->dev;
ret = register_device(&phydev->dev);
if (ret)
return ret;
- phydev->bus->phy_map[phydev->addr] = phydev;
+ if (phydev->bus)
+ phydev->bus->phy_map[phydev->addr] = phydev;
phydev->registered = 1;
@@ -289,6 +300,22 @@ void phy_unregister_device(struct phy_device *phydev)
phydev->registered = 0;
}
+struct phy_device *of_phy_register_fixed_link(struct device_node *np, struct eth_device *edev)
+{
+ struct phy_device *phydev;
+
+ phydev = phy_device_create(NULL, 0, 0);
+
+ phydev->dev.parent = &edev->dev;
+ phydev->registered = 1;
+ phydev->speed = 1000;
+ phydev->duplex = 1;
+ phydev->pause = phydev->asym_pause = 0;
+ phydev->link = 1;
+
+ return phydev;
+}
+
static struct phy_device *of_mdio_find_phy(struct eth_device *edev)
{
struct device_d *dev;
@@ -305,6 +332,12 @@ static struct phy_device *of_mdio_find_phy(struct eth_device *edev)
phy_node = of_parse_phandle(edev->parent->device_node, "phy", 0);
if (!phy_node)
phy_node = of_parse_phandle(edev->parent->device_node, "phy-device", 0);
+ if (!phy_node) {
+ phy_node = of_get_child_by_name(edev->parent->device_node, "fixed-link");
+ if (phy_node)
+ return of_phy_register_fixed_link(phy_node, edev);
+ }
+
if (!phy_node)
return NULL;
diff --git a/drivers/net/smc911x.h b/drivers/net/smc911x.h
index 8540a84344..3bf2af9c35 100644
--- a/drivers/net/smc911x.h
+++ b/drivers/net/smc911x.h
@@ -186,7 +186,7 @@
#define RX_DP_CTRL_RX_FFWD 0x80000000 /* R/W */
#define RX_DP_CTRL_FFWD_BUSY 0x80000000 /* RO */
-#define RX_FIFO_INF 0x7C
+#define RX_FIFO_INF 0x7C
#define RX_FIFO_INF_RXSUSED 0x00FF0000 /* RO */
#define RX_FIFO_INF_RXDUSED 0x0000FFFF /* RO */
diff --git a/drivers/of/Makefile b/drivers/of/Makefile
index 0dc2f8d63e..773548e133 100644
--- a/drivers/of/Makefile
+++ b/drivers/of/Makefile
@@ -1,8 +1,8 @@
-obj-y += address.o base.o fdt.o platform.o
+obj-y += address.o base.o fdt.o platform.o of_path.o
obj-$(CONFIG_OFTREE_MEM_GENERIC) += mem_generic.o
obj-$(CONFIG_OF_GPIO) += of_gpio.o
obj-$(CONFIG_OF_PCI) += of_pci.o
obj-y += partition.o
obj-y += of_net.o
obj-$(CONFIG_MTD) += of_mtd.o
-obj-$(CONFIG_OF_BAREBOX_DRIVERS) += barebox.o of_path.o
+obj-$(CONFIG_OF_BAREBOX_DRIVERS) += barebox.o
diff --git a/drivers/of/base.c b/drivers/of/base.c
index b4ef8e362f..cbe7b7cec4 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -30,6 +30,8 @@
#include <linux/amba/bus.h>
#include <linux/err.h>
+static struct device_node *root_node;
+
/*
* Iterate over all nodes of a tree. As a devicetree does not
* have a dedicated list head, the start node (usually the root
@@ -39,6 +41,9 @@ static inline struct device_node *of_next_node(struct device_node *node)
{
struct device_node *next;
+ if (!node)
+ return root_node;
+
next = list_first_entry(&node->list, struct device_node, list);
return next->parent ? next : NULL;
@@ -68,8 +73,6 @@ struct alias_prop {
static LIST_HEAD(aliases_lookup);
-static struct device_node *root_node;
-
static struct device_node *of_aliases;
#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
@@ -277,12 +280,6 @@ struct device_node *of_find_node_by_phandle_from(phandle phandle,
{
struct device_node *node;
- if (!root)
- root = root_node;
-
- if (!root)
- return NULL;
-
of_tree_for_each_node_from(node, root)
if (node->phandle == phandle)
return node;
@@ -309,15 +306,7 @@ EXPORT_SYMBOL(of_find_node_by_phandle);
phandle of_get_tree_max_phandle(struct device_node *root)
{
struct device_node *n;
- phandle max;
-
- if (!root)
- root = root_node;
-
- if (!root)
- return 0;
-
- max = root->phandle;
+ phandle max = 0;
of_tree_for_each_node_from(n, root) {
if (n->phandle > max)
@@ -430,9 +419,6 @@ struct device_node *of_find_node_by_name(struct device_node *from,
{
struct device_node *np;
- if (!from)
- from = root_node;
-
of_tree_for_each_node_from(np, from)
if (np->name && !of_node_cmp(np->name, name))
return np;
@@ -458,9 +444,6 @@ struct device_node *of_find_node_by_type(struct device_node *from,
const char *device_type;
int ret;
- if (!from)
- from = root_node;
-
of_tree_for_each_node_from(np, from) {
ret = of_property_read_string(np, "device_type", &device_type);
if (!ret && !of_node_cmp(device_type, type))
@@ -489,9 +472,6 @@ struct device_node *of_find_compatible_node(struct device_node *from,
{
struct device_node *np;
- if (!from)
- from = root_node;
-
of_tree_for_each_node_from(np, from)
if (of_device_is_compatible(np, compatible))
return np;
@@ -516,9 +496,6 @@ struct device_node *of_find_node_with_property(struct device_node *from,
{
struct device_node *np;
- if (!from)
- from = root_node;
-
of_tree_for_each_node_from(np, from) {
struct property *pp = of_find_property(np, prop_name, NULL);
if (pp)
@@ -572,9 +549,6 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
if (match)
*match = NULL;
- if (!from)
- from = root_node;
-
of_tree_for_each_node_from(np, from) {
const struct of_device_id *m = of_match_node(matches, np);
if (m) {
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 88f0523260..b2253aa7a2 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -46,6 +46,70 @@ static inline char *dt_string(struct fdt_header *f, char *strstart, uint32_t ofs
return strstart + ofs;
}
+static int of_reservemap_num_entries(const struct fdt_header *fdt)
+{
+ const struct fdt_reserve_entry *r;
+ int n = 0;
+
+ r = (void *)fdt + be32_to_cpu(fdt->off_mem_rsvmap);
+
+ while (r->size) {
+ n++;
+ r++;
+ if (n == OF_MAX_RESERVE_MAP)
+ return -EINVAL;
+ }
+
+ return n;
+}
+
+/**
+ * of_unflatten_reservemap - store /memreserve/ entries in unflattened tree
+ * @root - The unflattened tree
+ * @fdt - the flattened device tree blob
+ *
+ * This stores the memreserve entries from the dtb in a newly created
+ * /memserve node in the unflattened device tree. The device tree
+ * flatten code moves the entries back to the /memreserve/ area in the
+ * flattened tree.
+ *
+ * Return: 0 for success or negative error code
+ */
+static int of_unflatten_reservemap(struct device_node *root,
+ const struct fdt_header *fdt)
+{
+ int n;
+ struct property *p;
+ struct device_node *memreserve;
+ __be32 cells;
+
+ n = of_reservemap_num_entries(fdt);
+ if (n <= 0)
+ return n;
+
+ memreserve = of_new_node(root, "memreserve");
+ if (!memreserve)
+ return -ENOMEM;
+
+ cells = cpu_to_be32(2);
+
+ p = of_new_property(memreserve, "#address-cells", &cells, sizeof(__be32));
+ if (!p)
+ return -ENOMEM;
+
+ p = of_new_property(memreserve, "#size-cells", &cells, sizeof(__be32));
+ if (!p)
+ return -ENOMEM;
+
+ p = of_new_property(memreserve, "reg",
+ (void *)fdt + be32_to_cpu(fdt->off_mem_rsvmap),
+ n * sizeof(struct fdt_reserve_entry));
+ if (!p)
+ return -ENOMEM;
+
+ return 0;
+}
+
/**
* of_unflatten_dtb - unflatten a dtb binary blob
* @infdt - the fdt blob to unflatten
@@ -103,6 +167,10 @@ struct device_node *of_unflatten_dtb(const void *infdt)
if (!root)
return ERR_PTR(-ENOMEM);
+ ret = of_unflatten_reservemap(root, fdt);
+ if (ret)
+ goto err;
+
while (1) {
tag = be32_to_cpu(*(uint32_t *)(infdt + dt_struct));
@@ -289,7 +357,7 @@ static inline int dt_add_string(struct fdt *fdt, const char *str)
return ret;
}
-static int __of_flatten_dtb(struct fdt *fdt, struct device_node *node)
+static int __of_flatten_dtb(struct fdt *fdt, struct device_node *node, int is_root)
{
struct property *p;
struct device_node *n;
@@ -322,7 +390,10 @@ static int __of_flatten_dtb(struct fdt *fdt, struct device_node *node)
}
list_for_each_entry(n, &node->children, parent_list) {
- ret = __of_flatten_dtb(fdt, n);
+ if (is_root && !strcmp(n->name, "memreserve"))
+ continue;
+
+ ret = __of_flatten_dtb(fdt, n, 0);
if (ret)
return ret;
}
@@ -347,8 +418,10 @@ void *of_flatten_dtb(struct device_node *node)
int ret;
struct fdt_header header = {};
struct fdt fdt = {};
- uint32_t ofs;
+ uint32_t ofs, off_mem_rsvmap;
struct fdt_node_header *nh;
+ struct device_node *memreserve;
+ int len;
header.magic = cpu_to_fdt32(FDT_MAGIC);
header.version = cpu_to_fdt32(0x11);
@@ -364,14 +437,24 @@ void *of_flatten_dtb(struct device_node *node)
ofs = sizeof(struct fdt_header);
- header.off_mem_rsvmap = cpu_to_fdt32(ofs);
+ off_mem_rsvmap = ofs;
+ header.off_mem_rsvmap = cpu_to_fdt32(off_mem_rsvmap);
ofs += sizeof(struct fdt_reserve_entry) * OF_MAX_RESERVE_MAP;
fdt.dt_nextofs = ofs;
- ret = __of_flatten_dtb(&fdt, node);
+ ret = __of_flatten_dtb(&fdt, node, 1);
if (ret)
goto out_free;
+
+ memreserve = of_find_node_by_name(node, "memreserve");
+ if (memreserve) {
+ const void *entries = of_get_property(memreserve, "reg", &len);
+
+ if (entries)
+ memcpy(fdt.dt + off_mem_rsvmap, entries, len);
+ }
+
nh = fdt.dt + fdt.dt_nextofs;
nh->tag = cpu_to_fdt32(FDT_END);
fdt.dt_nextofs = dt_next_ofs(fdt.dt_nextofs, sizeof(struct fdt_node_header));
@@ -453,7 +536,18 @@ void fdt_add_reserve_map(void *__fdt)
struct of_reserve_map *res = &of_reserve_map;
struct fdt_reserve_entry *fdt_res =
__fdt + be32_to_cpu(fdt->off_mem_rsvmap);
- int i;
+ int i, n;
+
+ n = of_reservemap_num_entries(fdt);
+ if (n < 0)
+ return;
+
+ if (n + res->num_entries + 2 > OF_MAX_FREE_RESERVE_MAP) {
+ pr_err("Too many entries in reserve map\n");
+ return;
+ }
+
+ fdt_res += n;
for (i = 0; i < res->num_entries; i++) {
of_write_number(&fdt_res->address, res->start[i], 2);
diff --git a/drivers/pinctrl/pinctrl-mxs.c b/drivers/pinctrl/pinctrl-mxs.c
index ec0aaec67f..fa1176fe1b 100644
--- a/drivers/pinctrl/pinctrl-mxs.c
+++ b/drivers/pinctrl/pinctrl-mxs.c
@@ -89,8 +89,8 @@ static int mxs_pinctrl_set_state(struct pinctrl_device *pdev, struct device_node
writel(0x3 << shift, reg + STMP_OFFSET_REG_CLR);
writel(muxsel << shift, reg + STMP_OFFSET_REG_SET);
- dev_dbg(iomux->pinctrl.dev, "pin %d, mux %d, ma: %d, vol: %d, pull: %d\n",
- pinid, muxsel, ma, vol, pull);
+ dev_dbg(iomux->pinctrl.dev, "(val: 0x%x) pin %d, mux %d, ma: %d, vol: %d, pull: %d\n",
+ val, pinid, muxsel, ma, vol, pull);
/* drive */
reg = iomux->base + 0x300;
diff --git a/drivers/spi/imx_spi.c b/drivers/spi/imx_spi.c
index 5bd1845fbb..99ec228887 100644
--- a/drivers/spi/imx_spi.c
+++ b/drivers/spi/imx_spi.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Sascha Hauer, Pengutronix
+ * Copyright (C) 2008 Sascha Hauer, Pengutronix
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as