From f5919b65d4c671fd5083838c7a445f319f9a13c8 Mon Sep 17 00:00:00 2001 From: Stijn Tintel Date: Sat, 10 Nov 2018 13:03:18 +0200 Subject: brcm2708: add kernel 4.14 support Patch generation process: - rebase rpi/rpi-4.14.y on v4.14.89 from linux-stable - git format-patch v4.14.89 Patches skipped during rebase: - lan78xx: Read MAC address from DT if present - lan78xx: Enable LEDs and auto-negotiation - Revert "softirq: Let ksoftirqd do its job" - sc16is7xx: Fix for multi-channel stall - lan78xx: Ignore DT MAC address if already valid - lan78xx: Simple patch to prevent some crashes - tcp_write_queue_purge clears all the SKBs in the write queue - Revert "lan78xx: Simple patch to prevent some crashes" - lan78xx: Connect phy early - Arm: mm: ftrace: Only set text back to ro after kernel has been marked ro - Revert "Revert "softirq: Let ksoftirqd do its job"" - ASoC: cs4265: SOC_SINGLE register value error fix - Revert "ASoC: cs4265: SOC_SINGLE register value error fix" - Revert "net: pskb_trim_rcsum() and CHECKSUM_COMPLETE are friends" - Revert "Revert "net: pskb_trim_rcsum() and CHECKSUM_COMPLETE are friends"" Patches dropped after rebase: - net: Add non-mainline source for rtl8192cu wlan - net: Fix rtl8192cu build errors on other platforms - brcm: adds support for BCM43341 wifi - brcmfmac: Mute expected startup 'errors' - ARM64: Fix build break for RTL8187/RTL8192CU wifi - ARM64: Enable RTL8187/RTL8192CU wifi in build config - This is the driver for Sony CXD2880 DVB-T2/T tuner + demodulator - brcmfmac: add CLM download support - brcmfmac: request_firmware_direct is quieter - Sets the BCDC priority to constant 0 - brcmfmac: Disable ARP offloading when promiscuous - brcmfmac: Avoid possible out-of-bounds read - brcmfmac: Delete redundant length check - net: rtl8192cu: Normalize indentation - net: rtl8192cu: Fix implicit fallthrough warnings - Revert "Sets the BCDC priority to constant 0" - media: cxd2880: Bump to match 4.18.y version - media: cxd2880-spi: Bump to match 4.18.y version - Revert "mm: alloc_contig: re-allow CMA to compact FS pages" - Revert "Revert "mm: alloc_contig: re-allow CMA to compact FS pages"" - cxd2880: CXD2880_SPI_DRV should select DVB_CXD2880 with MEDIA_SUBDRV_AUTOSELECT - 950-0421-HID-hid-bigbenff-driver-for-BigBen-Interactive-PS3OF.patch - 950-0453-Add-hid-bigbenff-to-list-of-have_special_driver-for-.patch Make I2C built-in instead of modular as in upstream defconfig; also the easiest way to get MFD_ARIZONA enabled, which is required by kmod-sound-soc-rpi-cirrus. Add missing compatible strings from 4.9/960-add-rasbperrypi-compatible.patch, using upstream names for compute modules. Add extra patch to enable the LEDs on lan78xx. Compile-tested: bcm2708, bcm2709, bcm2710 (with CONFIG_ALL_KMODS=y) Runtime-tested: bcm2708, bcm2710 Signed-off-by: Stijn Tintel --- ...5-smi-use-clock-manager-and-fix-reload-is.patch | 170 +++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 target/linux/brcm2708/patches-4.14/950-0046-MISC-bcm2835-smi-use-clock-manager-and-fix-reload-is.patch (limited to 'target/linux/brcm2708/patches-4.14/950-0046-MISC-bcm2835-smi-use-clock-manager-and-fix-reload-is.patch') diff --git a/target/linux/brcm2708/patches-4.14/950-0046-MISC-bcm2835-smi-use-clock-manager-and-fix-reload-is.patch b/target/linux/brcm2708/patches-4.14/950-0046-MISC-bcm2835-smi-use-clock-manager-and-fix-reload-is.patch new file mode 100644 index 0000000000..b3d866341c --- /dev/null +++ b/target/linux/brcm2708/patches-4.14/950-0046-MISC-bcm2835-smi-use-clock-manager-and-fix-reload-is.patch @@ -0,0 +1,170 @@ +From af71606e2a65286f07c5908399f275f62fcbe2b9 Mon Sep 17 00:00:00 2001 +From: Martin Sperl +Date: Tue, 26 Apr 2016 14:59:21 +0000 +Subject: [PATCH 046/454] MISC: bcm2835: smi: use clock manager and fix reload + issues + +Use clock manager instead of self-made clockmanager. + +Also fix some error paths that showd up during development +(especially missing release of dma resources on rmmod) + +Signed-off-by: Martin Sperl +--- + drivers/misc/bcm2835_smi.c | 86 +++++++++++++------------------------- + 1 file changed, 28 insertions(+), 58 deletions(-) + +--- a/drivers/misc/bcm2835_smi.c ++++ b/drivers/misc/bcm2835_smi.c +@@ -34,6 +34,7 @@ + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + ++#include + #include + #include + #include +@@ -62,7 +63,7 @@ + struct bcm2835_smi_instance { + struct device *dev; + struct smi_settings settings; +- __iomem void *smi_regs_ptr, *cm_smi_regs_ptr; ++ __iomem void *smi_regs_ptr; + dma_addr_t smi_regs_busaddr; + + struct dma_chan *dma_chan; +@@ -72,8 +73,7 @@ struct bcm2835_smi_instance { + + struct scatterlist buffer_sgl; + +- int clock_source; +- int clock_divisor; ++ struct clk *clk; + + /* Sometimes we are called into in an atomic context (e.g. by + JFFS2 + MTD) so we can't use a mutex */ +@@ -82,42 +82,6 @@ struct bcm2835_smi_instance { + + /**************************************************************************** + * +-* SMI clock manager setup +-* +-***************************************************************************/ +- +-static inline void write_smi_cm_reg(struct bcm2835_smi_instance *inst, +- u32 val, unsigned reg) +-{ +- writel(CM_PWD | val, inst->cm_smi_regs_ptr + reg); +-} +- +-static inline u32 read_smi_cm_reg(struct bcm2835_smi_instance *inst, +- unsigned reg) +-{ +- return readl(inst->cm_smi_regs_ptr + reg); +-} +- +-static void smi_setup_clock(struct bcm2835_smi_instance *inst) +-{ +- dev_dbg(inst->dev, "Setting up clock..."); +- /* Disable SMI clock and wait for it to stop. */ +- write_smi_cm_reg(inst, 0, CM_SMI_CTL); +- while (read_smi_cm_reg(inst, CM_SMI_CTL) & CM_SMI_CTL_BUSY) +- ; +- +- write_smi_cm_reg(inst, (inst->clock_divisor << CM_SMI_DIV_DIVI_OFFS), +- CM_SMI_DIV); +- write_smi_cm_reg(inst, (inst->clock_source << CM_SMI_CTL_SRC_OFFS), +- CM_SMI_CTL); +- +- /* Enable the clock */ +- write_smi_cm_reg(inst, (inst->clock_source << CM_SMI_CTL_SRC_OFFS) | +- CM_SMI_CTL_ENAB, CM_SMI_CTL); +-} +- +-/**************************************************************************** +-* + * SMI peripheral setup + * + ***************************************************************************/ +@@ -894,42 +858,40 @@ static int bcm2835_smi_probe(struct plat + struct device_node *node = dev->of_node; + struct resource *ioresource; + struct bcm2835_smi_instance *inst; ++ const __be32 *addr; + ++ /* We require device tree support */ ++ if (!node) ++ return -EINVAL; + /* Allocate buffers and instance data */ +- + inst = devm_kzalloc(dev, sizeof(struct bcm2835_smi_instance), + GFP_KERNEL); +- + if (!inst) + return -ENOMEM; + + inst->dev = dev; + spin_lock_init(&inst->transaction_lock); + +- /* We require device tree support */ +- if (!node) +- return -EINVAL; +- + ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 0); + inst->smi_regs_ptr = devm_ioremap_resource(dev, ioresource); +- ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 1); +- inst->cm_smi_regs_ptr = devm_ioremap_resource(dev, ioresource); +- inst->smi_regs_busaddr = be32_to_cpu( +- *of_get_address(node, 0, NULL, NULL)); +- of_property_read_u32(node, +- "brcm,smi-clock-source", +- &inst->clock_source); +- of_property_read_u32(node, +- "brcm,smi-clock-divisor", +- &inst->clock_divisor); ++ if (IS_ERR(inst->smi_regs_ptr)) { ++ err = PTR_ERR(inst->smi_regs_ptr); ++ goto err; ++ } ++ addr = of_get_address(node, 0, NULL, NULL); ++ inst->smi_regs_busaddr = be32_to_cpu(addr); + + err = bcm2835_smi_dma_setup(inst); + if (err) +- return err; ++ goto err; + +- /* Finally, do peripheral setup */ ++ /* request clock */ ++ inst->clk = devm_clk_get(dev, NULL); ++ if (!inst->clk) ++ goto err; ++ clk_prepare_enable(inst->clk); + +- smi_setup_clock(inst); ++ /* Finally, do peripheral setup */ + smi_setup_regs(inst); + + platform_set_drvdata(pdev, inst); +@@ -937,6 +899,9 @@ static int bcm2835_smi_probe(struct plat + dev_info(inst->dev, "initialised"); + + return 0; ++err: ++ kfree(inst); ++ return err; + } + + /**************************************************************************** +@@ -950,6 +915,11 @@ static int bcm2835_smi_remove(struct pla + struct bcm2835_smi_instance *inst = platform_get_drvdata(pdev); + struct device *dev = inst->dev; + ++ dmaengine_terminate_all(inst->dma_chan); ++ dma_release_channel(inst->dma_chan); ++ ++ clk_disable_unprepare(inst->clk); ++ + dev_info(dev, "SMI device removed - OK"); + return 0; + } -- cgit v1.2.3