diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mci/mxs.c | 2 | ||||
-rw-r--r-- | drivers/net/cpsw.c | 13 | ||||
-rw-r--r-- | drivers/net/phy/micrel.c | 86 | ||||
-rw-r--r-- | drivers/serial/serial_ns16550.c | 5 |
4 files changed, 100 insertions, 6 deletions
diff --git a/drivers/mci/mxs.c b/drivers/mci/mxs.c index 6e02d464b4..738bde98ae 100644 --- a/drivers/mci/mxs.c +++ b/drivers/mci/mxs.c @@ -152,7 +152,7 @@ static void mxs_mci_setup_timeout(struct mxs_mci_host *mxs_mci, unsigned to) * @return 0 on success, negative values else * * @note This routine uses PIO to read in the data bytes from the FIFO. This - * may fail whith high clock speeds. If you receive -EIO errors you can try + * may fail with high clock speeds. If you receive -EIO errors you can try * again with reduced clock speeds. */ static int mxs_mci_read_data(struct mxs_mci_host *mxs_mci, void *buffer, unsigned length) diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c index d3cc0e930b..b6618ad675 100644 --- a/drivers/net/cpsw.c +++ b/drivers/net/cpsw.c @@ -1199,6 +1199,19 @@ int cpsw_probe(struct device_d *dev) mdiobus_register(&priv->miibus); for (i = 0; i < priv->num_slaves; i++) { + struct phy_device *phy; + + phy = mdiobus_scan(&priv->miibus, priv->slaves[i].phy_id); + if (IS_ERR(phy)) { + ret = PTR_ERR(phy); + goto out; + } + + phy->dev.device_node = priv->slaves[i].dev.device_node; + ret = phy_register_device(phy); + if (ret) + goto out; + ret = cpsw_slave_setup(&priv->slaves[i], i, priv); if (ret) goto out; diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 866391c613..095563ad3b 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -146,6 +146,90 @@ static int ksz9021_config_init(struct phy_device *phydev) return 0; } +#define KSZ9031_PS_TO_REG 60 + +/* Extended registers */ +#define MII_KSZ9031RN_CONTROL_PAD_SKEW 4 +#define MII_KSZ9031RN_RX_DATA_PAD_SKEW 5 +#define MII_KSZ9031RN_TX_DATA_PAD_SKEW 6 +#define MII_KSZ9031RN_CLK_PAD_SKEW 8 + +static int ksz9031_of_load_skew_values(struct phy_device *phydev, + struct device_node *of_node, + u16 reg, size_t field_sz, + char *field[], u8 numfields) +{ + int val[4] = {-1, -2, -3, -4}; + int matches = 0; + u16 mask; + u16 maxval; + u16 newval; + int i; + + for (i = 0; i < numfields; i++) + if (!of_property_read_u32(of_node, field[i], val + i)) + matches++; + + if (!matches) + return 0; + + if (matches < numfields) + newval = phy_read_mmd_indirect(phydev, reg, 2); + else + newval = 0; + + maxval = (field_sz == 4) ? 0xf : 0x1f; + for (i = 0; i < numfields; i++) + if (val[i] != -(i + 1)) { + mask = 0xffff; + mask ^= maxval << (field_sz * i); + newval = (newval & mask) | + (((val[i] / KSZ9031_PS_TO_REG) & maxval) + << (field_sz * i)); + } + + phy_write_mmd_indirect(phydev, reg, 2, newval); + return 0; +} + +static int ksz9031_config_init(struct phy_device *phydev) +{ + struct device_d *dev = &phydev->dev; + struct device_node *of_node = dev->device_node; + char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"}; + char *rx_data_skews[4] = { + "rxd0-skew-ps", "rxd1-skew-ps", + "rxd2-skew-ps", "rxd3-skew-ps" + }; + char *tx_data_skews[4] = { + "txd0-skew-ps", "txd1-skew-ps", + "txd2-skew-ps", "txd3-skew-ps" + }; + char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; + + if (!of_node && dev->parent->device_node) + of_node = dev->parent->device_node; + + if (of_node) { + ksz9031_of_load_skew_values(phydev, of_node, + MII_KSZ9031RN_CLK_PAD_SKEW, 5, + clk_skews, 2); + + ksz9031_of_load_skew_values(phydev, of_node, + MII_KSZ9031RN_CONTROL_PAD_SKEW, 4, + control_skews, 2); + + ksz9031_of_load_skew_values(phydev, of_node, + MII_KSZ9031RN_RX_DATA_PAD_SKEW, 4, + rx_data_skews, 4); + + ksz9031_of_load_skew_values(phydev, of_node, + MII_KSZ9031RN_TX_DATA_PAD_SKEW, 4, + tx_data_skews, 4); + } + return 0; +} + #define KSZ8873MLL_GLOBAL_CONTROL_4 0x06 #define KSZ8873MLL_GLOBAL_CONTROL_4_DUPLEX (1 << 6) #define KSZ8873MLL_GLOBAL_CONTROL_4_SPEED (1 << 4) @@ -267,7 +351,7 @@ static struct phy_driver ksphy_driver[] = { .phy_id_mask = 0x00fffff0, .drv.name = "Micrel KSZ9031 Gigabit PHY", .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause), - .config_init = kszphy_config_init, + .config_init = ksz9031_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, }, { diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c index 4ca74446b3..53d48a06c2 100644 --- a/drivers/serial/serial_ns16550.c +++ b/drivers/serial/serial_ns16550.c @@ -441,10 +441,7 @@ static int ns16550_probe(struct device_d *dev) cdev->setbrg = ns16550_setbaudrate; cdev->linux_console_name = devtype->linux_console_name; - if (plat && (plat->flags & NS16650_FLAG_DISABLE_FIFO)) - priv->fcrval = FCRVAL & ~FCR_FIFO_EN; - else - priv->fcrval = FCRVAL; + priv->fcrval = FCRVAL; devtype->init_port(cdev); |