diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/clk/rockchip/clk-rk3568.c | 10 | ||||
-rw-r--r-- | drivers/ddr/imx/imx8m_ddr_init.c | 7 | ||||
-rw-r--r-- | drivers/dma/debug.c | 5 | ||||
-rw-r--r-- | drivers/dma/map.c | 17 | ||||
-rw-r--r-- | drivers/firmware/qemu_fw_cfg.c | 20 | ||||
-rw-r--r-- | drivers/hab/habv4.c | 3 | ||||
-rw-r--r-- | drivers/mci/mci-core.c | 17 | ||||
-rw-r--r-- | drivers/mfd/pca9450.c | 2 | ||||
-rw-r--r-- | drivers/net/bcmgenet.c | 13 | ||||
-rw-r--r-- | drivers/net/dsa.c | 9 | ||||
-rw-r--r-- | drivers/net/fsl-fman.c | 9 | ||||
-rw-r--r-- | drivers/net/ksz9477.c | 16 | ||||
-rw-r--r-- | drivers/net/ksz_common.h | 6 | ||||
-rw-r--r-- | drivers/net/macb.c | 4 | ||||
-rw-r--r-- | drivers/net/phy/mdio_bus.c | 5 | ||||
-rw-r--r-- | drivers/net/usb/asix.c | 8 | ||||
-rw-r--r-- | drivers/net/usb/smsc95xx.c | 15 | ||||
-rw-r--r-- | drivers/soc/starfive/jh7100_dma.c | 2 | ||||
-rw-r--r-- | drivers/usb/core/hub.c | 49 | ||||
-rw-r--r-- | drivers/usb/dwc2/host.c | 4 | ||||
-rw-r--r-- | drivers/usb/gadget/function/f_fastboot.c | 3 | ||||
-rw-r--r-- | drivers/video/mipi_dbi.c | 3 |
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; |