Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'spi-fix-v7.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Pull spi fixes from Mark Brown:
"There's a couple of core fixes here from Johan, fixing a race
condition and an error handling path, plus a bunch of driver specific
fixups.

The Qualcomm issues could be nasty if you ran into them, especially
the DMA ordering one"

* tag 'spi-fix-v7.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
spi: geni-qcom: Check DMA interrupts early in ISR
spi: fix statistics allocation
spi: fix use-after-free on controller registration failure
spi: geni-qcom: Fix CPHA and CPOL mode change detection
spi: axiado: Fix double-free in ax_spi_probe()
spi: amlogic-spisg: Fix memory leak in aml_spisg_probe()
spi: amlogic: spifc-a4: Remove redundant clock cleanup

+41 -86
+7 -39
drivers/spi/spi-amlogic-spifc-a4.c
··· 1083 1083 return clk_set_rate(sfc->core_clk, SFC_BUS_DEFAULT_CLK); 1084 1084 } 1085 1085 1086 - static int aml_sfc_disable_clk(struct aml_sfc *sfc) 1087 - { 1088 - clk_disable_unprepare(sfc->core_clk); 1089 - clk_disable_unprepare(sfc->gate_clk); 1090 - 1091 - return 0; 1092 - } 1093 - 1094 1086 static int aml_sfc_probe(struct platform_device *pdev) 1095 1087 { 1096 1088 struct device_node *np = pdev->dev.of_node; ··· 1133 1141 1134 1142 /* Enable Amlogic flash controller spi mode */ 1135 1143 ret = regmap_write(sfc->regmap_base, SFC_SPI_CFG, SPI_MODE_EN); 1136 - if (ret) { 1137 - dev_err(dev, "failed to enable SPI mode\n"); 1138 - goto err_out; 1139 - } 1144 + if (ret) 1145 + return dev_err_probe(dev, ret, "failed to enable SPI mode\n"); 1140 1146 1141 1147 ret = dma_set_mask(sfc->dev, DMA_BIT_MASK(32)); 1142 - if (ret) { 1143 - dev_err(sfc->dev, "failed to set dma mask\n"); 1144 - goto err_out; 1145 - } 1148 + if (ret) 1149 + return dev_err_probe(sfc->dev, ret, "failed to set dma mask\n"); 1146 1150 1147 1151 sfc->ecc_eng.dev = &pdev->dev; 1148 1152 sfc->ecc_eng.integration = NAND_ECC_ENGINE_INTEGRATION_PIPELINED; ··· 1146 1158 sfc->ecc_eng.priv = sfc; 1147 1159 1148 1160 ret = nand_ecc_register_on_host_hw_engine(&sfc->ecc_eng); 1149 - if (ret) { 1150 - dev_err(&pdev->dev, "failed to register Aml host ecc engine.\n"); 1151 - goto err_out; 1152 - } 1161 + if (ret) 1162 + return dev_err_probe(&pdev->dev, ret, "failed to register Aml host ecc engine.\n"); 1153 1163 1154 1164 ret = of_property_read_u32(np, "amlogic,rx-adj", &val); 1155 1165 if (!ret) ··· 1163 1177 ctrl->min_speed_hz = SFC_MIN_FREQUENCY; 1164 1178 ctrl->num_chipselect = SFC_MAX_CS_NUM; 1165 1179 1166 - ret = devm_spi_register_controller(dev, ctrl); 1167 - if (ret) 1168 - goto err_out; 1169 - 1170 - return 0; 1171 - 1172 - err_out: 1173 - aml_sfc_disable_clk(sfc); 1174 - 1175 - return ret; 1176 - } 1177 - 1178 - static void aml_sfc_remove(struct platform_device *pdev) 1179 - { 1180 - struct spi_controller *ctlr = platform_get_drvdata(pdev); 1181 - struct aml_sfc *sfc = spi_controller_get_devdata(ctlr); 1182 - 1183 - aml_sfc_disable_clk(sfc); 1180 + return devm_spi_register_controller(dev, ctrl); 1184 1181 } 1185 1182 1186 1183 static const struct of_device_id aml_sfc_of_match[] = { ··· 1181 1212 .of_match_table = aml_sfc_of_match, 1182 1213 }, 1183 1214 .probe = aml_sfc_probe, 1184 - .remove = aml_sfc_remove, 1185 1215 }; 1186 1216 module_platform_driver(aml_sfc_driver); 1187 1217
+4 -8
drivers/spi/spi-amlogic-spisg.c
··· 729 729 }; 730 730 731 731 if (of_property_read_bool(dev->of_node, "spi-slave")) 732 - ctlr = spi_alloc_target(dev, sizeof(*spisg)); 732 + ctlr = devm_spi_alloc_target(dev, sizeof(*spisg)); 733 733 else 734 - ctlr = spi_alloc_host(dev, sizeof(*spisg)); 734 + ctlr = devm_spi_alloc_host(dev, sizeof(*spisg)); 735 735 if (!ctlr) 736 736 return -ENOMEM; 737 737 ··· 750 750 return dev_err_probe(dev, PTR_ERR(spisg->map), "regmap init failed\n"); 751 751 752 752 irq = platform_get_irq(pdev, 0); 753 - if (irq < 0) { 754 - ret = irq; 755 - goto out_controller; 756 - } 753 + if (irq < 0) 754 + return irq; 757 755 758 756 ret = device_reset_optional(dev); 759 757 if (ret) ··· 815 817 if (spisg->core) 816 818 clk_disable_unprepare(spisg->core); 817 819 clk_disable_unprepare(spisg->pclk); 818 - out_controller: 819 - spi_controller_put(ctlr); 820 820 821 821 return ret; 822 822 }
+11 -20
drivers/spi/spi-axiado.c
··· 765 765 platform_set_drvdata(pdev, ctlr); 766 766 767 767 xspi->regs = devm_platform_ioremap_resource(pdev, 0); 768 - if (IS_ERR(xspi->regs)) { 769 - ret = PTR_ERR(xspi->regs); 770 - goto remove_ctlr; 771 - } 768 + if (IS_ERR(xspi->regs)) 769 + return PTR_ERR(xspi->regs); 772 770 773 771 xspi->pclk = devm_clk_get(&pdev->dev, "pclk"); 774 - if (IS_ERR(xspi->pclk)) { 775 - dev_err(&pdev->dev, "pclk clock not found.\n"); 776 - ret = PTR_ERR(xspi->pclk); 777 - goto remove_ctlr; 778 - } 772 + if (IS_ERR(xspi->pclk)) 773 + return dev_err_probe(&pdev->dev, PTR_ERR(xspi->pclk), 774 + "pclk clock not found.\n"); 779 775 780 776 xspi->ref_clk = devm_clk_get(&pdev->dev, "ref"); 781 - if (IS_ERR(xspi->ref_clk)) { 782 - dev_err(&pdev->dev, "ref clock not found.\n"); 783 - ret = PTR_ERR(xspi->ref_clk); 784 - goto remove_ctlr; 785 - } 777 + if (IS_ERR(xspi->ref_clk)) 778 + return dev_err_probe(&pdev->dev, PTR_ERR(xspi->ref_clk), 779 + "ref clock not found.\n"); 786 780 787 781 ret = clk_prepare_enable(xspi->pclk); 788 - if (ret) { 789 - dev_err(&pdev->dev, "Unable to enable APB clock.\n"); 790 - goto remove_ctlr; 791 - } 782 + if (ret) 783 + return dev_err_probe(&pdev->dev, ret, "Unable to enable APB clock.\n"); 792 784 793 785 ret = clk_prepare_enable(xspi->ref_clk); 794 786 if (ret) { ··· 861 869 clk_disable_unprepare(xspi->ref_clk); 862 870 clk_dis_apb: 863 871 clk_disable_unprepare(xspi->pclk); 864 - remove_ctlr: 865 - spi_controller_put(ctlr); 872 + 866 873 return ret; 867 874 } 868 875
+7 -6
drivers/spi/spi-geni-qcom.c
··· 359 359 writel((spi_slv->mode & SPI_LOOP) ? LOOPBACK_ENABLE : 0, se->base + SE_SPI_LOOPBACK); 360 360 if (cs_changed) 361 361 writel(chipselect, se->base + SE_SPI_DEMUX_SEL); 362 - if (mode_changed & SE_SPI_CPHA) 362 + if (mode_changed & SPI_CPHA) 363 363 writel((spi_slv->mode & SPI_CPHA) ? CPHA : 0, se->base + SE_SPI_CPHA); 364 - if (mode_changed & SE_SPI_CPOL) 364 + if (mode_changed & SPI_CPOL) 365 365 writel((spi_slv->mode & SPI_CPOL) ? CPOL : 0, se->base + SE_SPI_CPOL); 366 366 if ((mode_changed & SPI_CS_HIGH) || (cs_changed && (spi_slv->mode & SPI_CS_HIGH))) 367 367 writel((spi_slv->mode & SPI_CS_HIGH) ? BIT(chipselect) : 0, se->base + SE_SPI_DEMUX_OUTPUT_INV); ··· 906 906 struct spi_controller *spi = data; 907 907 struct spi_geni_master *mas = spi_controller_get_devdata(spi); 908 908 struct geni_se *se = &mas->se; 909 - u32 m_irq; 909 + u32 m_irq, dma_tx_status, dma_rx_status; 910 910 911 911 m_irq = readl(se->base + SE_GENI_M_IRQ_STATUS); 912 - if (!m_irq) 912 + dma_tx_status = readl_relaxed(se->base + SE_DMA_TX_IRQ_STAT); 913 + dma_rx_status = readl_relaxed(se->base + SE_DMA_RX_IRQ_STAT); 914 + 915 + if (!m_irq && !dma_tx_status && !dma_rx_status) 913 916 return IRQ_NONE; 914 917 915 918 if (m_irq & (M_CMD_OVERRUN_EN | M_ILLEGAL_CMD_EN | M_CMD_FAILURE_EN | ··· 960 957 } 961 958 } else if (mas->cur_xfer_mode == GENI_SE_DMA) { 962 959 const struct spi_transfer *xfer = mas->cur_xfer; 963 - u32 dma_tx_status = readl_relaxed(se->base + SE_DMA_TX_IRQ_STAT); 964 - u32 dma_rx_status = readl_relaxed(se->base + SE_DMA_RX_IRQ_STAT); 965 960 966 961 if (dma_tx_status) 967 962 writel(dma_tx_status, se->base + SE_DMA_TX_IRQ_CLR);
+12 -13
drivers/spi/spi.c
··· 3049 3049 struct spi_controller *ctlr; 3050 3050 3051 3051 ctlr = container_of(dev, struct spi_controller, dev); 3052 + 3053 + free_percpu(ctlr->pcpu_statistics); 3052 3054 kfree(ctlr); 3053 3055 } 3054 3056 ··· 3193 3191 ctlr = kzalloc(size + ctlr_size, GFP_KERNEL); 3194 3192 if (!ctlr) 3195 3193 return NULL; 3194 + 3195 + ctlr->pcpu_statistics = spi_alloc_pcpu_stats(NULL); 3196 + if (!ctlr->pcpu_statistics) { 3197 + kfree(ctlr); 3198 + return NULL; 3199 + } 3196 3200 3197 3201 device_initialize(&ctlr->dev); 3198 3202 INIT_LIST_HEAD(&ctlr->queue); ··· 3488 3480 dev_info(dev, "controller is unqueued, this is deprecated\n"); 3489 3481 } else if (ctlr->transfer_one || ctlr->transfer_one_message) { 3490 3482 status = spi_controller_initialize_queue(ctlr); 3491 - if (status) { 3492 - device_del(&ctlr->dev); 3493 - goto free_bus_id; 3494 - } 3495 - } 3496 - /* Add statistics */ 3497 - ctlr->pcpu_statistics = spi_alloc_pcpu_stats(dev); 3498 - if (!ctlr->pcpu_statistics) { 3499 - dev_err(dev, "Error allocating per-cpu statistics\n"); 3500 - status = -ENOMEM; 3501 - goto destroy_queue; 3483 + if (status) 3484 + goto del_ctrl; 3502 3485 } 3503 3486 3504 3487 mutex_lock(&board_lock); ··· 3503 3504 acpi_register_spi_devices(ctlr); 3504 3505 return status; 3505 3506 3506 - destroy_queue: 3507 - spi_destroy_queue(ctlr); 3507 + del_ctrl: 3508 + device_del(&ctlr->dev); 3508 3509 free_bus_id: 3509 3510 mutex_lock(&board_lock); 3510 3511 idr_remove(&spi_controller_idr, ctlr->bus_num);