media: atomisp: Replace direct access to MMIO with proper helpers
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 26 Jun 2020 12:19:17 +0000 (14:19 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Sat, 18 Jul 2020 05:20:59 +0000 (07:20 +0200)
We have special helpers to access MMIO. Use them.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/atomisp/pci/atomisp_cmd.c
drivers/staging/media/atomisp/pci/atomisp_compat.h
drivers/staging/media/atomisp/pci/atomisp_compat_css20.c
drivers/staging/media/atomisp/pci/atomisp_internal.h
drivers/staging/media/atomisp/pci/atomisp_v4l2.c

index dddda97..8ea65be 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/firmware.h>
 #include <linux/pci.h>
 #include <linux/interrupt.h>
+#include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/kfifo.h>
 #include <linux/pm_runtime.h>
@@ -669,11 +670,10 @@ bool atomisp_buffers_queued_pipe(struct atomisp_video_pipe *pipe)
 void dump_sp_dmem(struct atomisp_device *isp, unsigned int addr,
                  unsigned int size)
 {
-       u32 __iomem *io_virt_addr;
        unsigned int data = 0;
        unsigned int size32 = DIV_ROUND_UP(size, sizeof(u32));
 
-       dev_dbg(isp->dev, "atomisp_io_base:%p\n", atomisp_io_base);
+       dev_dbg(isp->dev, "atomisp mmio base: %p\n", isp->base);
        dev_dbg(isp->dev, "%s, addr:0x%x, size: %d, size32: %d\n", __func__,
                addr, size, size32);
        if (size32 * 4 + addr > 0x4000) {
@@ -682,13 +682,12 @@ void dump_sp_dmem(struct atomisp_device *isp, unsigned int addr,
                return;
        }
        addr += SP_DMEM_BASE;
-       io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       addr &= 0x003FFFFF;
        do {
-               data = *io_virt_addr;
+               data = readl(isp->base + addr);
                dev_dbg(isp->dev, "%s, \t [0x%x]:0x%x\n", __func__, addr, data);
-               io_virt_addr += sizeof(u32);
-               size32 -= 1;
-       } while (size32 > 0);
+               addr += sizeof(u32);
+       } while (--size32);
 }
 
 static struct videobuf_buffer *atomisp_css_frame_to_vbuf(
index b2ed83c..6a2a81a 100644 (file)
@@ -29,8 +29,6 @@ struct atomisp_sub_device;
 struct video_device;
 enum atomisp_input_stream_id;
 
-extern void __iomem *atomisp_io_base;
-
 struct atomisp_metadata_buf {
        struct ia_css_metadata *metadata;
        void *md_vptr;
index df352be..010b2b1 100644 (file)
@@ -38,6 +38,7 @@
 #include "sh_css_hrt.h"
 #include "ia_css_isys.h"
 
+#include <linux/io.h>
 #include <linux/pm_runtime.h>
 
 /* Assume max number of ACC stages */
@@ -67,92 +68,94 @@ struct bayer_ds_factor {
 
 static void atomisp_css2_hw_store_8(hrt_address addr, uint8_t data)
 {
-       s8 __iomem *io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       struct atomisp_device *isp = dev_get_drvdata(atomisp_dev);
        unsigned long flags;
 
        spin_lock_irqsave(&mmio_lock, flags);
-       *io_virt_addr = data;
+       writeb(data, isp->base + (addr & 0x003FFFFF));
        spin_unlock_irqrestore(&mmio_lock, flags);
 }
 
 static void atomisp_css2_hw_store_16(hrt_address addr, uint16_t data)
 {
-       s16 __iomem *io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       struct atomisp_device *isp = dev_get_drvdata(atomisp_dev);
        unsigned long flags;
 
        spin_lock_irqsave(&mmio_lock, flags);
-       *io_virt_addr = data;
+       writew(data, isp->base + (addr & 0x003FFFFF));
        spin_unlock_irqrestore(&mmio_lock, flags);
 }
 
 void atomisp_css2_hw_store_32(hrt_address addr, uint32_t data)
 {
-       s32 __iomem *io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       struct atomisp_device *isp = dev_get_drvdata(atomisp_dev);
        unsigned long flags;
 
        spin_lock_irqsave(&mmio_lock, flags);
-       *io_virt_addr = data;
+       writel(data, isp->base + (addr & 0x003FFFFF));
        spin_unlock_irqrestore(&mmio_lock, flags);
 }
 
 static uint8_t atomisp_css2_hw_load_8(hrt_address addr)
 {
-       s8 __iomem *io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       struct atomisp_device *isp = dev_get_drvdata(atomisp_dev);
        unsigned long flags;
        u8 ret;
 
        spin_lock_irqsave(&mmio_lock, flags);
-       ret = *io_virt_addr;
+       ret = readb(isp->base + (addr & 0x003FFFFF));
        spin_unlock_irqrestore(&mmio_lock, flags);
        return ret;
 }
 
 static uint16_t atomisp_css2_hw_load_16(hrt_address addr)
 {
-       s16 __iomem *io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       struct atomisp_device *isp = dev_get_drvdata(atomisp_dev);
        unsigned long flags;
        u16 ret;
 
        spin_lock_irqsave(&mmio_lock, flags);
-       ret = *io_virt_addr;
+       ret = readw(isp->base + (addr & 0x003FFFFF));
        spin_unlock_irqrestore(&mmio_lock, flags);
        return ret;
 }
 
 static uint32_t atomisp_css2_hw_load_32(hrt_address addr)
 {
-       s32 __iomem *io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       struct atomisp_device *isp = dev_get_drvdata(atomisp_dev);
        unsigned long flags;
        u32 ret;
 
        spin_lock_irqsave(&mmio_lock, flags);
-       ret = *io_virt_addr;
+       ret = readl(isp->base + (addr & 0x003FFFFF));
        spin_unlock_irqrestore(&mmio_lock, flags);
        return ret;
 }
 
-static void atomisp_css2_hw_store(hrt_address addr,
-                                 const void *from, uint32_t n)
+static void atomisp_css2_hw_store(hrt_address addr, const void *from, uint32_t n)
 {
-       s8 __iomem *io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       struct atomisp_device *isp = dev_get_drvdata(atomisp_dev);
        unsigned long flags;
        unsigned int i;
 
+       addr &= 0x003FFFFF;
        spin_lock_irqsave(&mmio_lock, flags);
-       for (i = 0; i < n; i++, io_virt_addr++, from++)
-               *io_virt_addr = *(s8 *)from;
+       for (i = 0; i < n; i++, from++)
+               writeb(*(s8 *)from, isp->base + addr + i);
+
        spin_unlock_irqrestore(&mmio_lock, flags);
 }
 
 static void atomisp_css2_hw_load(hrt_address addr, void *to, uint32_t n)
 {
-       s8 __iomem *io_virt_addr = atomisp_io_base + (addr & 0x003FFFFF);
+       struct atomisp_device *isp = dev_get_drvdata(atomisp_dev);
        unsigned long flags;
        unsigned int i;
 
+       addr &= 0x003FFFFF;
        spin_lock_irqsave(&mmio_lock, flags);
-       for (i = 0; i < n; i++, to++, io_virt_addr++)
-               *(s8 *)to = *io_virt_addr;
+       for (i = 0; i < n; i++, to++)
+               *(s8 *)to = readb(isp->base + addr + i);
        spin_unlock_irqrestore(&mmio_lock, flags);
 }
 
index 5af9bbc..c01db10 100644 (file)
@@ -221,6 +221,7 @@ struct atomisp_device {
        struct media_device media_dev;
        struct atomisp_platform_data *pdata;
        void *mmu_l1_base;
+       void __iomem *base;
        const struct firmware *firmware;
 
        struct pm_qos_request pm_qos;
index e843185..61dcf5c 100644 (file)
@@ -127,8 +127,6 @@ MODULE_PARM_DESC(pad_h, "extra data for ISP processing");
 
 struct device *atomisp_dev;
 
-void __iomem *atomisp_io_base;
-
 static const struct atomisp_freq_scaling_rule dfs_rules_merr[] = {
        {
                .width = ISP_FREQ_RULE_ANY,
@@ -1533,7 +1531,6 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
        const struct atomisp_platform_data *pdata;
        struct atomisp_device *isp;
        unsigned int start;
-       void __iomem *base;
        int err, val;
        u32 irq;
 
@@ -1562,13 +1559,6 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
                goto ioremap_fail;
        }
 
-       base = pcim_iomap_table(pdev)[ATOM_ISP_PCI_BAR];
-       dev_dbg(&pdev->dev, "base: %p\n", base);
-
-       atomisp_io_base = base;
-
-       dev_dbg(&pdev->dev, "atomisp_io_base: %p\n", atomisp_io_base);
-
        isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL);
        if (!isp) {
                err = -ENOMEM;
@@ -1576,9 +1566,12 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
        }
 
        isp->dev = &pdev->dev;
+       isp->base = pcim_iomap_table(pdev)[ATOM_ISP_PCI_BAR];
        isp->sw_contex.power_state = ATOM_ISP_POWER_UP;
        isp->saved_regs.ispmmadr = start;
 
+       dev_dbg(&pdev->dev, "atomisp mmio base: %p\n", isp->base);
+
        rt_mutex_init(&isp->mutex);
        mutex_init(&isp->streamoff_mutex);
        spin_lock_init(&isp->lock);
@@ -1586,6 +1579,8 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
        /* This is not a true PCI device on SoC, so the delay is not needed. */
        pdev->d3_delay = 0;
 
+       pci_set_drvdata(pdev, isp);
+
        switch (id->device & ATOMISP_PCI_DEVICE_SOC_MASK) {
        case ATOMISP_PCI_DEVICE_SOC_MRFLD:
                isp->media_dev.hw_revision =
@@ -1716,7 +1711,6 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
        }
 
        pci_set_master(pdev);
-       pci_set_drvdata(pdev, isp);
 
        err = pci_enable_msi(pdev);
        if (err) {