summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/rockchip/clk-rk3568.c10
-rw-r--r--drivers/ddr/imx/imx8m_ddr_init.c7
-rw-r--r--drivers/dma/debug.c5
-rw-r--r--drivers/dma/map.c17
-rw-r--r--drivers/firmware/qemu_fw_cfg.c20
-rw-r--r--drivers/hab/habv4.c3
-rw-r--r--drivers/mci/mci-core.c17
-rw-r--r--drivers/mfd/pca9450.c2
-rw-r--r--drivers/net/bcmgenet.c13
-rw-r--r--drivers/net/dsa.c9
-rw-r--r--drivers/net/fsl-fman.c9
-rw-r--r--drivers/net/ksz9477.c16
-rw-r--r--drivers/net/ksz_common.h6
-rw-r--r--drivers/net/macb.c4
-rw-r--r--drivers/net/phy/mdio_bus.c5
-rw-r--r--drivers/net/usb/asix.c8
-rw-r--r--drivers/net/usb/smsc95xx.c15
-rw-r--r--drivers/soc/starfive/jh7100_dma.c2
-rw-r--r--drivers/usb/core/hub.c49
-rw-r--r--drivers/usb/dwc2/host.c4
-rw-r--r--drivers/usb/gadget/function/f_fastboot.c3
-rw-r--r--drivers/video/mipi_dbi.c3
22 files changed, 158 insertions, 69 deletions
diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c
index d07d7aef5d..50fbf66d23 100644
--- a/drivers/clk/rockchip/clk-rk3568.c
+++ b/drivers/clk/rockchip/clk-rk3568.c
@@ -73,11 +73,21 @@ static struct rockchip_pll_rate_table rk3568_pll_rates[] = {
RK3036_PLL_RATE(500000000, 1, 125, 6, 1, 1, 0),
RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0),
+ RK3036_PLL_RATE(297000000, 2, 99, 4, 1, 1, 0),
+ RK3036_PLL_RATE(292500000, 1, 195, 4, 4, 1, 0),
+ RK3036_PLL_RATE(241500000, 2, 161, 4, 2, 1, 0),
RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
RK3036_PLL_RATE(200000000, 1, 100, 3, 4, 1, 0),
RK3036_PLL_RATE(148500000, 1, 99, 4, 4, 1, 0),
+ RK3036_PLL_RATE(135000000, 2, 45, 4, 1, 1, 0),
+ RK3036_PLL_RATE(126400000, 1, 79, 5, 3, 1, 0),
+ RK3036_PLL_RATE(119000000, 3, 119, 4, 2, 1, 0),
+ RK3036_PLL_RATE(115200000, 1, 24, 5, 1, 1, 0),
+ RK3036_PLL_RATE(108000000, 2, 45, 5, 1, 1, 0),
+ RK3036_PLL_RATE(101000000, 1, 101, 6, 4, 1, 0),
RK3036_PLL_RATE(100000000, 1, 150, 6, 6, 1, 0),
RK3036_PLL_RATE(96000000, 1, 96, 6, 4, 1, 0),
+ RK3036_PLL_RATE(78750000, 4, 315, 6, 4, 1, 0),
RK3036_PLL_RATE(74250000, 2, 99, 4, 4, 1, 0),
{ /* sentinel */ },
};
diff --git a/drivers/ddr/imx/imx8m_ddr_init.c b/drivers/ddr/imx/imx8m_ddr_init.c
index d9a5d589f2..c16e04d274 100644
--- a/drivers/ddr/imx/imx8m_ddr_init.c
+++ b/drivers/ddr/imx/imx8m_ddr_init.c
@@ -481,6 +481,7 @@ static void ddrphy_init_set_dfi_clk(struct dram_controller *dram, unsigned int d
int imx8m_ddr_init(struct dram_controller *dram, struct dram_timing_info *dram_timing)
{
+ struct dram_timing_info *saved_timing;
unsigned long src_ddrc_rcr = MX8M_SRC_DDRC_RCR_ADDR;
unsigned int tmp, initial_drate, target_freq;
int ret;
@@ -644,5 +645,11 @@ int imx8m_ddr_init(struct dram_controller *dram, struct dram_timing_info *dram_t
/* save the dram timing config into memory */
dram_config_save(dram, dram_timing, IMX8M_SAVED_DRAM_TIMING_BASE);
+ saved_timing = (struct dram_timing_info *)IMX8M_SAVED_DRAM_TIMING_BASE;
+
+ /* There's no fsp_cfg for i.MX8, so we must close the gap again */
+ memmove(&saved_timing->fsp_config, &saved_timing->common_config,
+ sizeof(saved_timing->common_config));
+
return 0;
}
diff --git a/drivers/dma/debug.c b/drivers/dma/debug.c
index e524dc4127..32a4175044 100644
--- a/drivers/dma/debug.c
+++ b/drivers/dma/debug.c
@@ -2,6 +2,7 @@
#include <dma.h>
#include <linux/list.h>
+#include <linux/printk.h>
#include "debug.h"
static LIST_HEAD(dma_mappings);
@@ -127,6 +128,10 @@ void debug_dma_map(struct device *dev, void *addr,
list_add(&entry->list, &dma_mappings);
dma_debug(entry, "allocated\n");
+
+ if (!IS_ALIGNED(dev_addr, DMA_ALIGNMENT))
+ dma_dev_warn(dev, "Mapping insufficiently aligned %s buffer 0x%llx+0x%zx: %u bytes required!\n",
+ dir2name[direction], (u64)addr, size, DMA_ALIGNMENT);
}
void debug_dma_unmap(struct device *dev, dma_addr_t addr,
diff --git a/drivers/dma/map.c b/drivers/dma/map.c
index ab86a8c7b1..cd0f5c3d34 100644
--- a/drivers/dma/map.c
+++ b/drivers/dma/map.c
@@ -1,7 +1,24 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <dma.h>
+#include <driver.h>
#include "debug.h"
+void *dma_alloc(size_t size)
+{
+ return xmemalign(DMA_ALIGNMENT, ALIGN(size, DMA_ALIGNMENT));
+}
+
+void *dma_zalloc(size_t size)
+{
+ void *buf;
+
+ buf = dma_alloc(size);
+ if (buf)
+ memset(buf, 0x00, size);
+
+ return buf;
+}
+
void dma_sync_single_for_cpu(struct device *dev, dma_addr_t address,
size_t size, enum dma_data_direction dir)
{
diff --git a/drivers/firmware/qemu_fw_cfg.c b/drivers/firmware/qemu_fw_cfg.c
index 1ba81d1b50..3f129a2c1e 100644
--- a/drivers/firmware/qemu_fw_cfg.c
+++ b/drivers/firmware/qemu_fw_cfg.c
@@ -173,14 +173,24 @@ static ssize_t fw_cfg_write(struct cdev *cdev, const void *buf, size_t count,
struct fw_cfg *fw_cfg = to_fw_cfg(cdev);
struct device *dev = cdev->dev;
struct fw_cfg_dma __iomem *acc = fw_cfg->acc_virt;
+ void *dma_buf;
dma_addr_t mapping;
+ int ret = 0;
if (pos != 0)
return -EINVAL;
- mapping = dma_map_single(dev, (void *)buf, count, DMA_TO_DEVICE);
- if (dma_mapping_error(dev, mapping))
- return -EFAULT;
+ dma_buf = dma_alloc(count);
+ if (!dma_buf)
+ return -ENOMEM;
+
+ memcpy(dma_buf, buf, count);
+
+ mapping = dma_map_single(dev, dma_buf, count, DMA_TO_DEVICE);
+ if (dma_mapping_error(dev, mapping)) {
+ ret = -EFAULT;
+ goto free_buf;
+ }
fw_cfg->next_read_offset = 0;
@@ -195,8 +205,10 @@ static ssize_t fw_cfg_write(struct cdev *cdev, const void *buf, size_t count,
;
dma_unmap_single(dev, mapping, count, DMA_FROM_DEVICE);
+free_buf:
+ dma_free(dma_buf);
- return count;
+ return ret ?: count;
}
static struct cdev_operations fw_cfg_ops = {
diff --git a/drivers/hab/habv4.c b/drivers/hab/habv4.c
index a1d823ed25..0f5618116e 100644
--- a/drivers/hab/habv4.c
+++ b/drivers/hab/habv4.c
@@ -12,6 +12,7 @@
#include <init.h>
#include <types.h>
#include <mmu.h>
+#include <dma.h>
#include <zero_page.h>
#include <linux/sizes.h>
#include <linux/arm-smccc.h>
@@ -581,7 +582,7 @@ static uint8_t *hab_get_event(const struct habv4_rvt *rvt, int index, size_t *le
if (err != HAB_STATUS_SUCCESS)
return NULL;
- buf = malloc(*len);
+ buf = dma_alloc(*len);
if (!buf)
return NULL;
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index 1d383e6449..f6565b2b64 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -1349,8 +1349,14 @@ int mci_execute_tuning(struct mci *mci)
struct mci_host *host = mci->host;
u32 opcode;
- if (!host->execute_tuning)
- return 0;
+ if (!host->execute_tuning) {
+ /*
+ * For us, implementing ->execute_tuning is mandatory to
+ * support higher speed modes
+ */
+ dev_warn(&mci->dev, "tuning failed: no host diver support\n");
+ return -EOPNOTSUPP;
+ }
/* Tuning is only supported for MMC / HS200 */
if (mmc_card_hs200(mci))
@@ -1551,6 +1557,11 @@ static int mci_startup_mmc(struct mci *mci)
if (mmc_card_hs200(mci))
ret = mmc_hs200_tuning(mci);
+
+ if (ret) {
+ host->timing = MMC_TIMING_MMC_HS;
+ mci_switch(mci, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
+ }
}
if (ret || !IS_ENABLED(CONFIG_MCI_TUNING)) {
@@ -1566,7 +1577,7 @@ static int mci_startup_mmc(struct mci *mci)
}
}
- return ret;
+ return ret >= MMC_BUS_WIDTH_1 ? 0 : ret;
}
/**
diff --git a/drivers/mfd/pca9450.c b/drivers/mfd/pca9450.c
index 8fa5363f8a..be357c1023 100644
--- a/drivers/mfd/pca9450.c
+++ b/drivers/mfd/pca9450.c
@@ -52,7 +52,7 @@ static int pca9450_get_reset_source(struct device *dev, struct regmap *map)
type = RESET_EXT;
break;
default:
- dev_warn(dev, "Could not determine reset reason.\n");
+ dev_warn(dev, "Unknown reset reason: 0x%02x\n", reg);
type = RESET_UKWN;
}
diff --git a/drivers/net/bcmgenet.c b/drivers/net/bcmgenet.c
index 9e0bacb31a..acbb973a92 100644
--- a/drivers/net/bcmgenet.c
+++ b/drivers/net/bcmgenet.c
@@ -356,12 +356,13 @@ static void rx_descs_init(struct bcmgenet_eth_priv *priv)
len_stat = (RX_BUF_LENGTH << DMA_BUFLENGTH_SHIFT) | DMA_OWN;
for (i = 0; i < RX_DESCS; i++) {
- writel(lower_32_bits((uintptr_t)&rxbuffs[i * RX_BUF_LENGTH]),
- desc_base + i * DMA_DESC_SIZE + DMA_DESC_ADDRESS_LO);
- writel(upper_32_bits((uintptr_t)&rxbuffs[i * RX_BUF_LENGTH]),
- desc_base + i * DMA_DESC_SIZE + DMA_DESC_ADDRESS_HI);
- writel(len_stat,
- desc_base + i * DMA_DESC_SIZE + DMA_DESC_LENGTH_STATUS);
+ dma_addr_t dma_addr = dma_map_single(priv->dev, &rxbuffs[i * RX_BUF_LENGTH],
+ RX_BUF_LENGTH, DMA_FROM_DEVICE);
+ void *desc = desc_base + i * DMA_DESC_SIZE;
+
+ writel(lower_32_bits(dma_addr), desc + DMA_DESC_ADDRESS_LO);
+ writel(upper_32_bits(dma_addr), desc + DMA_DESC_ADDRESS_HI);
+ writel(len_stat, desc + DMA_DESC_LENGTH_STATUS);
}
}
diff --git a/drivers/net/dsa.c b/drivers/net/dsa.c
index ccd7d87550..e0bf079e4d 100644
--- a/drivers/net/dsa.c
+++ b/drivers/net/dsa.c
@@ -270,7 +270,14 @@ static int dsa_switch_register_edev(struct dsa_switch *ds,
struct dsa_port *dp;
dp = dsa_port_alloc(ds, dn, port);
- dp->rx_buf = xmalloc(DSA_PKTSIZE);
+
+ /* DMA is done on buffer in receive ring allocated by network
+ * driver. This is then copied into this buffer, so we don't
+ * strictly need to use dma_alloc() here, unlike ds->tx_buf.
+ * We do it anyway as we don't want DSA buffers to be subtly
+ * different to that of a directly used network interface.
+ */
+ dp->rx_buf = dma_alloc(DSA_PKTSIZE);
edev = &dp->edev;
edev->priv = dp;
diff --git a/drivers/net/fsl-fman.c b/drivers/net/fsl-fman.c
index 5262928480..5528ecccc9 100644
--- a/drivers/net/fsl-fman.c
+++ b/drivers/net/fsl-fman.c
@@ -615,13 +615,8 @@ static int fm_eth_rx_port_parameter_init(struct fm_eth *fm_eth)
if (!rx_bd_ring_base)
return -ENOMEM;
- memset(rx_bd_ring_base, 0, sizeof(struct fm_port_bd)
- * RX_BD_RING_SIZE);
-
/* alloc Rx buffer from main memory */
- rx_buf_pool = dma_alloc(MAX_RXBUF_LEN * RX_BD_RING_SIZE);
-
- memset(rx_buf_pool, 0, MAX_RXBUF_LEN * RX_BD_RING_SIZE);
+ rx_buf_pool = dma_zalloc(MAX_RXBUF_LEN * RX_BD_RING_SIZE);
/* save them to fm_eth */
fm_eth->rx_bd_ring = rx_bd_ring_base;
@@ -698,8 +693,6 @@ static int fm_eth_tx_port_parameter_init(struct fm_eth *fm_eth)
if (!tx_bd_ring_base)
return -ENOMEM;
- memset(tx_bd_ring_base, 0, sizeof(struct fm_port_bd)
- * TX_BD_RING_SIZE);
/* save it to fm_eth */
fm_eth->tx_bd_ring = tx_bd_ring_base;
fm_eth->cur_txbd_idx = 0;
diff --git a/drivers/net/ksz9477.c b/drivers/net/ksz9477.c
index 1abea9d040..950eb89c09 100644
--- a/drivers/net/ksz9477.c
+++ b/drivers/net/ksz9477.c
@@ -29,12 +29,15 @@ static int ksz9477_phy_read16(struct dsa_switch *ds, int addr, int reg)
{
struct device *dev = ds->dev;
struct ksz_switch *priv = dev_get_priv(dev);
- u16 val = 0xffff;
+ int ret;
+ u16 val;
if (addr >= priv->phy_port_cnt)
- return val;
+ return 0xffff;
- ksz_pread16(priv, addr, 0x100 + (reg << 1), &val);
+ ret = ksz_pread16(priv, addr, 0x100 + (reg << 1), &val);
+ if (ret)
+ return ret;
return val;
}
@@ -52,9 +55,8 @@ static int ksz9477_phy_write16(struct dsa_switch *ds, int addr, int reg,
/* No gigabit support. Do not write to this register. */
if (!(priv->features & GBIT_SUPPORT) && reg == MII_CTRL1000)
return 0;
- ksz_pwrite16(priv, addr, 0x100 + (reg << 1), val);
- return 0;
+ return ksz_pwrite16(priv, addr, 0x100 + (reg << 1), val);
}
static int ksz9477_switch_detect(struct ksz_switch *priv)
@@ -433,8 +435,10 @@ static int microchip_switch_probe(struct device *dev)
if (IS_ERR(gpio)) {
dev_warn(dev, "Failed to get 'reset' GPIO (ignored)\n");
} else if (gpio) {
- mdelay(1);
+ gpiod_set_value(gpio, true);
+ mdelay(10);
gpiod_set_value(gpio, false);
+ udelay(100);
}
ksz_reset_switch(dev->priv);
diff --git a/drivers/net/ksz_common.h b/drivers/net/ksz_common.h
index 291488fe34..44b5055ee3 100644
--- a/drivers/net/ksz_common.h
+++ b/drivers/net/ksz_common.h
@@ -20,7 +20,7 @@ struct ksz_switch {
static inline int ksz_read8(struct ksz_switch *priv, u32 reg, u8 *val)
{
- unsigned int value;
+ unsigned int value = 0;
int ret = regmap_read(priv->regmap[0], reg, &value);
*val = value;
@@ -29,7 +29,7 @@ static inline int ksz_read8(struct ksz_switch *priv, u32 reg, u8 *val)
static inline int ksz_read16(struct ksz_switch *priv, u32 reg, u16 *val)
{
- unsigned int value;
+ unsigned int value = 0;
int ret = regmap_read(priv->regmap[1], reg, &value);
*val = value;
@@ -38,7 +38,7 @@ static inline int ksz_read16(struct ksz_switch *priv, u32 reg, u16 *val)
static inline int ksz_read32(struct ksz_switch *priv, u32 reg, u32 *val)
{
- unsigned int value;
+ unsigned int value = 0;
int ret = regmap_read(priv->regmap[2], reg, &value);
*val = value;
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index f5b2fa74dc..bcad88f60e 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -910,7 +910,7 @@ static int macb_probe(struct device *dev)
macb->gem_q1_descs = dma_alloc_coherent(GEM_Q1_DESC_BYTES,
DMA_ADDRESS_BROKEN);
- macb->rx_packet_buf = xmalloc(PKTSIZE);
+ macb->rx_packet_buf = net_alloc_packet();
macb_reset_hw(macb);
ncfgr = macb_mdc_clk_div(macb);
@@ -938,7 +938,7 @@ static void macb_remove(struct device *dev)
macb_halt(&macb->netdev);
- free(macb->rx_packet_buf);
+ net_free_packet(macb->rx_packet_buf);
}
static const struct macb_config fu540_c000_config = {
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index eed7c779e7..30d5aeacff 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -472,12 +472,13 @@ int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
static ssize_t phydev_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags)
{
- int i = count;
+ int ret, i = count;
uint16_t *buf = _buf;
struct phy_device *phydev = cdev->priv;
while (i > 0) {
- *buf = phy_read(phydev, offset / 2);
+ ret = phy_read(phydev, offset / 2);
+ *buf = ret >= 0 ? ret : 0xffff;
buf++;
i -= 2;
offset += 2;
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
index 9d34beab0d..8ee0bc8534 100644
--- a/drivers/net/usb/asix.c
+++ b/drivers/net/usb/asix.c
@@ -175,7 +175,7 @@ static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
dev_dbg(&dev->edev.dev, "asix_read_cmd() cmd=0x%02x value=0x%04x index=0x%04x size=%d\n",
cmd, value, index, size);
- buf = malloc(size);
+ buf = dma_alloc(size);
if (!buf)
goto out;
@@ -193,7 +193,7 @@ static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
memcpy(data, buf, size);
else if (err >= 0)
err = -EINVAL;
- free(buf);
+ dma_free(buf);
out:
return err;
@@ -209,7 +209,7 @@ static int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
cmd, value, index, size);
if (data) {
- buf = malloc(size);
+ buf = dma_alloc(size);
if (!buf)
goto out;
memcpy(buf, data, size);
@@ -225,7 +225,7 @@ static int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
buf,
size,
USB_CTRL_SET_TIMEOUT);
- free(buf);
+ dma_free(buf);
out:
return err;
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 1d8eacb86e..00267f282c 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -44,23 +44,25 @@
struct smsc95xx_priv {
u32 mac_cr;
+ __le32 *iobuf;
};
static int turbo_mode = 0;
static int smsc95xx_read_reg(struct usbnet *dev, u32 index, u32 *data)
{
+ struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
int ret;
ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
USB_VENDOR_REQUEST_READ_REGISTER,
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- 00, index, data, 4, USB_CTRL_GET_TIMEOUT);
+ 00, index, pdata->iobuf, 4, USB_CTRL_GET_TIMEOUT);
if (ret < 0)
netdev_warn(dev->net, "Failed to read register index 0x%08x\n", index);
-
- le32_to_cpus(data);
+ else
+ *data = le32_to_cpup(pdata->iobuf);
debug("%s: 0x%08x 0x%08x\n", __func__, index, *data);
@@ -69,14 +71,15 @@ static int smsc95xx_read_reg(struct usbnet *dev, u32 index, u32 *data)
static int smsc95xx_write_reg(struct usbnet *dev, u32 index, u32 data)
{
+ struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
int ret;
- cpu_to_le32s(&data);
+ *pdata->iobuf = cpu_to_le32(data);
ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
USB_VENDOR_REQUEST_WRITE_REGISTER,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- 00, index, &data, 4, USB_CTRL_SET_TIMEOUT);
+ 00, index, pdata->iobuf, 4, USB_CTRL_SET_TIMEOUT);
if (ret < 0)
netdev_warn(dev->net, "Failed to write register index 0x%08x\n", index);
@@ -718,6 +721,8 @@ static int smsc95xx_bind(struct usbnet *dev)
return -ENOMEM;
}
+ pdata->iobuf = dma_alloc(4);
+
/* Init all registers */
ret = smsc95xx_reset(dev);
diff --git a/drivers/soc/starfive/jh7100_dma.c b/drivers/soc/starfive/jh7100_dma.c
index e3cfc8cf65..5f6e78fc36 100644
--- a/drivers/soc/starfive/jh7100_dma.c
+++ b/drivers/soc/starfive/jh7100_dma.c
@@ -4,7 +4,7 @@
*/
#include <common.h>
-#include <asm/dma.h>
+#include <dma.h>
#include <soc/sifive/l2_cache.h>
#define SDRAM_CACHED_BASE 0x80000000
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 650af0e884..bef428f7fb 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -86,18 +86,25 @@ static int usb_get_hub_status(struct usb_device *dev, void *data)
data, sizeof(struct usb_hub_status), USB_CNTL_TIMEOUT);
}
-static int usb_get_port_status(struct usb_device *dev, int port, void *data)
+static int usb_get_port_status(struct usb_device *dev, int port,
+ struct usb_port_status *status)
{
+ struct usb_port_status *data;
int ret;
+ data = dma_alloc(sizeof(*data));
+ if (!data)
+ return -ENOMEM;
+
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port,
data, sizeof(struct usb_hub_status), USB_CNTL_TIMEOUT);
if (ret < 0)
- return ret;
+ goto out;
+
+ *status = *data;
if (!usb_hub_is_root_hub(dev) && usb_hub_is_superspeed(dev)) {
- struct usb_port_status *status = data;
u16 tmp = status->wPortStatus & USB_SS_PORT_STAT_MASK;
if (status->wPortStatus & USB_SS_PORT_STAT_POWER)
@@ -109,6 +116,8 @@ static int usb_get_port_status(struct usb_device *dev, int port, void *data)
status->wPortStatus = tmp;
}
+out:
+ dma_free(data);
return ret;
}
@@ -434,12 +443,16 @@ out:
static int usb_hub_configure(struct usb_device *dev)
{
- unsigned char buffer[USB_BUFSIZ], *bitmap;
+ unsigned char *buffer, *bitmap;
struct usb_hub_descriptor *descriptor;
struct usb_hub_status *hubsts;
int i, ret;
struct usb_hub_device *hub;
+ buffer = dma_alloc(USB_BUFSIZ);
+ if (!buffer)
+ return -ENOMEM;
+
hub = xzalloc(sizeof (*hub));
dev->hub = hub;
@@ -448,7 +461,8 @@ static int usb_hub_configure(struct usb_device *dev)
if (usb_get_hub_descriptor(dev, buffer, 4) < 0) {
dev_dbg(&dev->dev, "%s: failed to get hub " \
"descriptor, giving up %lX\n", __func__, dev->status);
- return -1;
+ ret = -1;
+ goto out;
}
descriptor = (struct usb_hub_descriptor *)buffer;
@@ -458,13 +472,15 @@ static int usb_hub_configure(struct usb_device *dev)
dev_dbg(&dev->dev, "%s: failed to get hub " \
"descriptor - too long: %d\n", __func__,
descriptor->bLength);
- return -1;
+ ret = -1;
+ goto out;
}
if (usb_get_hub_descriptor(dev, buffer, descriptor->bLength) < 0) {
dev_dbg(&dev->dev, "%s: failed to get hub " \
"descriptor 2nd giving up %lX\n", __func__, dev->status);
- return -1;
+ ret = -1;
+ goto out;
}
memcpy((unsigned char *)&hub->desc, buffer, descriptor->bLength);
/* adjust 16bit values */
@@ -580,13 +596,15 @@ static int usb_hub_configure(struct usb_device *dev)
if (sizeof(struct usb_hub_status) > USB_BUFSIZ) {
dev_dbg(&dev->dev, "%s: failed to get Status - " \
"too long: %d\n", __func__, descriptor->bLength);
- return -1;
+ ret = -1;
+ goto out;
}
if (usb_get_hub_status(dev, buffer) < 0) {
dev_dbg(&dev->dev, "%s: failed to get Status %lX\n", __func__,
dev->status);
- return -1;
+ ret = -1;
+ goto out;
}
hubsts = (struct usb_hub_status *)buffer;
@@ -601,16 +619,12 @@ static int usb_hub_configure(struct usb_device *dev)
"" : "no ");
if (dev->host->update_hub_device) {
- int ret;
-
ret = dev->host->update_hub_device(dev);
if (ret)
- return ret;
+ goto out;
}
if (!usb_hub_is_root_hub(dev) && usb_hub_is_superspeed(dev)) {
- int ret;
-
/*
* This request sets the value that the hub uses to
* determine the index into the 'route string index'
@@ -620,13 +634,16 @@ static int usb_hub_configure(struct usb_device *dev)
if (ret < 0) {
dev_dbg(&dev->dev, "failed to set hub depth (0x%08lx)\n",
dev->status);
- return ret;
+ goto out;
}
}
usb_hub_power_on(hub);
- return 0;
+ ret = 0;
+out:
+ dma_free(buffer);
+ return ret;
}
static int usb_hub_configure_ports(struct usb_device *dev)
diff --git a/drivers/usb/dwc2/host.c b/drivers/usb/dwc2/host.c
index 344f058be2..a9b25aeeaa 100644
--- a/drivers/usb/dwc2/host.c
+++ b/drivers/usb/dwc2/host.c
@@ -209,9 +209,9 @@ static int transfer_chunk(struct dwc2 *dwc2, u8 hc,
if (ret < 0)
goto exit;
- if (in)
- xfer_len -= sub;
*actual_len = xfer_len;
+ if (in)
+ *actual_len -= sub;
exit:
if (xfer_len)
diff --git a/drivers/usb/gadget/function/f_fastboot.c b/drivers/usb/gadget/function/f_fastboot.c
index 41450268fc..30d257b500 100644
--- a/drivers/usb/gadget/function/f_fastboot.c
+++ b/drivers/usb/gadget/function/f_fastboot.c
@@ -199,12 +199,11 @@ static struct usb_request *fastboot_alloc_request(struct usb_ep *ep)
return NULL;
req->length = EP_BUFFER_SIZE;
- req->buf = dma_alloc(EP_BUFFER_SIZE);
+ req->buf = dma_zalloc(EP_BUFFER_SIZE);
if (!req->buf) {
usb_ep_free_request(ep, req);
return NULL;
}
- memset(req->buf, 0, EP_BUFFER_SIZE);
return req;
}
diff --git a/drivers/video/mipi_dbi.c b/drivers/video/mipi_dbi.c
index 2f8d6ecc72..9611a402d1 100644
--- a/drivers/video/mipi_dbi.c
+++ b/drivers/video/mipi_dbi.c
@@ -398,8 +398,7 @@ int mipi_dbi_dev_init(struct mipi_dbi_dev *dbidev, struct fb_ops *ops,
info->bits_per_pixel = 16;
info->line_length = info->xres * 2;
info->screen_size = info->line_length * info->yres;
- info->screen_base = dma_alloc(info->screen_size);
- memset(info->screen_base, 0, info->screen_size);
+ info->screen_base = dma_zalloc(info->screen_size);
info->red.length = 5;
info->red.offset = 11;