Merge branch 'omap-for-v5.6/sdma' into omap-for-v5.6/ti-sysc-drop-pdata
This commit is contained in:
@ -345,9 +345,12 @@ static inline int dra7xx_pciess_reset(struct omap_hwmod *oh)
|
||||
}
|
||||
#endif
|
||||
|
||||
struct omap_system_dma_plat_info;
|
||||
|
||||
void pdata_quirks_init(const struct of_device_id *);
|
||||
void omap_auxdata_legacy_init(struct device *dev);
|
||||
void omap_pcs_legacy_init(int irq, void (*rearm)(void));
|
||||
extern struct omap_system_dma_plat_info dma_plat_info;
|
||||
|
||||
struct omap_sdrc_params;
|
||||
extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
|
||||
|
@ -30,10 +30,6 @@
|
||||
#include <linux/omap-dma.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "omap_hwmod.h"
|
||||
#include "omap_device.h"
|
||||
|
||||
static enum omap_reg_offsets dma_common_ch_end;
|
||||
|
||||
static const struct omap_dma_reg reg_map[] = {
|
||||
[REVISION] = { 0x0000, 0x00, OMAP_DMA_REG_32BIT },
|
||||
@ -81,42 +77,6 @@ static const struct omap_dma_reg reg_map[] = {
|
||||
[CCDN] = { 0x00d8, 0x60, OMAP_DMA_REG_32BIT },
|
||||
};
|
||||
|
||||
static void __iomem *dma_base;
|
||||
static inline void dma_write(u32 val, int reg, int lch)
|
||||
{
|
||||
void __iomem *addr = dma_base;
|
||||
|
||||
addr += reg_map[reg].offset;
|
||||
addr += reg_map[reg].stride * lch;
|
||||
|
||||
writel_relaxed(val, addr);
|
||||
}
|
||||
|
||||
static inline u32 dma_read(int reg, int lch)
|
||||
{
|
||||
void __iomem *addr = dma_base;
|
||||
|
||||
addr += reg_map[reg].offset;
|
||||
addr += reg_map[reg].stride * lch;
|
||||
|
||||
return readl_relaxed(addr);
|
||||
}
|
||||
|
||||
static void omap2_clear_dma(int lch)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = CSDP; i <= dma_common_ch_end; i += 1)
|
||||
dma_write(0, i, lch);
|
||||
}
|
||||
|
||||
static void omap2_show_dma_caps(void)
|
||||
{
|
||||
u8 revision = dma_read(REVISION, 0) & 0xff;
|
||||
printk(KERN_INFO "OMAP DMA hardware revision %d.%d\n",
|
||||
revision >> 4, revision & 0xf);
|
||||
}
|
||||
|
||||
static unsigned configure_dma_errata(void)
|
||||
{
|
||||
unsigned errata = 0;
|
||||
@ -211,82 +171,35 @@ static const struct dma_slave_map omap24xx_sdma_dt_map[] = {
|
||||
{ "musb-hdrc.1.auto", "dmareq5", SDMA_FILTER_PARAM(64) }, /* OMAP2420 only */
|
||||
};
|
||||
|
||||
static struct omap_system_dma_plat_info dma_plat_info __initdata = {
|
||||
.reg_map = reg_map,
|
||||
.channel_stride = 0x60,
|
||||
.show_dma_caps = omap2_show_dma_caps,
|
||||
.clear_dma = omap2_clear_dma,
|
||||
.dma_write = dma_write,
|
||||
.dma_read = dma_read,
|
||||
static struct omap_dma_dev_attr dma_attr = {
|
||||
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
|
||||
IS_CSSA_32 | IS_CDSA_32,
|
||||
.lch_count = 32,
|
||||
};
|
||||
|
||||
static struct platform_device_info omap_dma_dev_info __initdata = {
|
||||
.name = "omap-dma-engine",
|
||||
.id = -1,
|
||||
.dma_mask = DMA_BIT_MASK(32),
|
||||
struct omap_system_dma_plat_info dma_plat_info = {
|
||||
.reg_map = reg_map,
|
||||
.channel_stride = 0x60,
|
||||
.dma_attr = &dma_attr,
|
||||
};
|
||||
|
||||
/* One time initializations */
|
||||
static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
|
||||
static int __init omap2_system_dma_init(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct omap_system_dma_plat_info p;
|
||||
struct omap_dma_dev_attr *d;
|
||||
struct resource *mem;
|
||||
char *name = "omap_dma_system";
|
||||
|
||||
p = dma_plat_info;
|
||||
p.dma_attr = (struct omap_dma_dev_attr *)oh->dev_attr;
|
||||
p.errata = configure_dma_errata();
|
||||
dma_plat_info.errata = configure_dma_errata();
|
||||
|
||||
if (soc_is_omap24xx()) {
|
||||
/* DMA slave map for drivers not yet converted to DT */
|
||||
p.slave_map = omap24xx_sdma_dt_map;
|
||||
p.slavecnt = ARRAY_SIZE(omap24xx_sdma_dt_map);
|
||||
dma_plat_info.slave_map = omap24xx_sdma_dt_map;
|
||||
dma_plat_info.slavecnt = ARRAY_SIZE(omap24xx_sdma_dt_map);
|
||||
}
|
||||
|
||||
pdev = omap_device_build(name, 0, oh, &p, sizeof(p));
|
||||
if (IS_ERR(pdev)) {
|
||||
pr_err("%s: Can't build omap_device for %s:%s.\n",
|
||||
__func__, name, oh->name);
|
||||
return PTR_ERR(pdev);
|
||||
}
|
||||
if (!soc_is_omap242x())
|
||||
dma_attr.dev_caps |= IS_RW_PRIORITY;
|
||||
|
||||
omap_dma_dev_info.res = pdev->resource;
|
||||
omap_dma_dev_info.num_res = pdev->num_resources;
|
||||
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!mem) {
|
||||
dev_err(&pdev->dev, "%s: no mem resource\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dma_base = ioremap(mem->start, resource_size(mem));
|
||||
if (!dma_base) {
|
||||
dev_err(&pdev->dev, "%s: ioremap fail\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
d = oh->dev_attr;
|
||||
|
||||
if (cpu_is_omap34xx() && (omap_type() != OMAP2_DEVICE_TYPE_GP))
|
||||
d->dev_caps |= HS_CHANNELS_RESERVED;
|
||||
|
||||
if (platform_get_irq_byname(pdev, "0") < 0)
|
||||
d->dev_caps |= DMA_ENGINE_HANDLE_IRQ;
|
||||
|
||||
/* Check the capabilities register for descriptor loading feature */
|
||||
if (dma_read(CAPS_0, 0) & DMA_HAS_DESCRIPTOR_CAPS)
|
||||
dma_common_ch_end = CCDN;
|
||||
else
|
||||
dma_common_ch_end = CCFN;
|
||||
if (soc_is_omap34xx() && (omap_type() != OMAP2_DEVICE_TYPE_GP))
|
||||
dma_attr.dev_caps |= HS_CHANNELS_RESERVED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init omap2_system_dma_init(void)
|
||||
{
|
||||
return omap_hwmod_for_each_by_class("dma",
|
||||
omap2_system_dma_init_dev, NULL);
|
||||
}
|
||||
omap_arch_initcall(omap2_system_dma_init);
|
||||
|
@ -373,176 +373,6 @@ void omap_device_delete(struct omap_device *od)
|
||||
kfree(od);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_device_copy_resources - Add legacy IO and IRQ resources
|
||||
* @oh: interconnect target module
|
||||
* @pdev: platform device to copy resources to
|
||||
*
|
||||
* We still have legacy DMA and smartreflex needing resources.
|
||||
* Let's populate what they need until we can eventually just
|
||||
* remove this function. Note that there should be no need to
|
||||
* call this from omap_device_build_from_dt(), nor should there
|
||||
* be any need to call it for other devices.
|
||||
*/
|
||||
static int
|
||||
omap_device_copy_resources(struct omap_hwmod *oh,
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np, *child;
|
||||
struct property *prop;
|
||||
struct resource *res;
|
||||
const char *name;
|
||||
int error, irq = 0;
|
||||
|
||||
if (!oh || !oh->od || !oh->od->pdev)
|
||||
return -EINVAL;
|
||||
|
||||
np = oh->od->pdev->dev.of_node;
|
||||
if (!np) {
|
||||
error = -ENODEV;
|
||||
goto error;
|
||||
}
|
||||
|
||||
res = kcalloc(2, sizeof(*res), GFP_KERNEL);
|
||||
if (!res)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Do we have a dts range for the interconnect target module? */
|
||||
error = omap_hwmod_parse_module_range(oh, np, res);
|
||||
|
||||
/* No ranges, rely on device reg entry */
|
||||
if (error)
|
||||
error = of_address_to_resource(np, 0, res);
|
||||
if (error)
|
||||
goto free;
|
||||
|
||||
/* SmartReflex needs first IO resource name to be "mpu" */
|
||||
res[0].name = "mpu";
|
||||
|
||||
/*
|
||||
* We may have a configured "ti,sysc" interconnect target with a
|
||||
* dts child with the interrupt. If so use the first child's
|
||||
* first interrupt for "ti-hwmods" legacy support.
|
||||
*/
|
||||
of_property_for_each_string(np, "compatible", prop, name)
|
||||
if (!strncmp("ti,sysc-", name, 8))
|
||||
break;
|
||||
|
||||
child = of_get_next_available_child(np, NULL);
|
||||
|
||||
if (name)
|
||||
irq = irq_of_parse_and_map(child, 0);
|
||||
if (!irq)
|
||||
irq = irq_of_parse_and_map(np, 0);
|
||||
if (!irq) {
|
||||
error = -EINVAL;
|
||||
goto free;
|
||||
}
|
||||
|
||||
/* Legacy DMA code needs interrupt name to be "0" */
|
||||
res[1].start = irq;
|
||||
res[1].end = irq;
|
||||
res[1].flags = IORESOURCE_IRQ;
|
||||
res[1].name = "0";
|
||||
|
||||
error = platform_device_add_resources(pdev, res, 2);
|
||||
|
||||
free:
|
||||
kfree(res);
|
||||
|
||||
error:
|
||||
WARN(error, "%s: %s device %s failed: %i\n",
|
||||
__func__, oh->name, dev_name(&pdev->dev),
|
||||
error);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_device_build - build and register an omap_device with one omap_hwmod
|
||||
* @pdev_name: name of the platform_device driver to use
|
||||
* @pdev_id: this platform_device's connection ID
|
||||
* @oh: ptr to the single omap_hwmod that backs this omap_device
|
||||
* @pdata: platform_data ptr to associate with the platform_device
|
||||
* @pdata_len: amount of memory pointed to by @pdata
|
||||
*
|
||||
* Convenience function for building and registering a single
|
||||
* omap_device record, which in turn builds and registers a
|
||||
* platform_device record. See omap_device_build_ss() for more
|
||||
* information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise,
|
||||
* passes along the return value of omap_device_build_ss().
|
||||
*/
|
||||
struct platform_device __init *omap_device_build(const char *pdev_name,
|
||||
int pdev_id,
|
||||
struct omap_hwmod *oh,
|
||||
void *pdata, int pdata_len)
|
||||
{
|
||||
int ret = -ENOMEM;
|
||||
struct platform_device *pdev;
|
||||
struct omap_device *od;
|
||||
|
||||
if (!oh || !pdev_name)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (!pdata && pdata_len > 0)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (strncmp(oh->name, "smartreflex", 11) &&
|
||||
strncmp(oh->name, "dma", 3)) {
|
||||
pr_warn("%s need to update %s to probe with dt\na",
|
||||
__func__, pdev_name);
|
||||
ret = -ENODEV;
|
||||
goto odbs_exit;
|
||||
}
|
||||
|
||||
pdev = platform_device_alloc(pdev_name, pdev_id);
|
||||
if (!pdev) {
|
||||
ret = -ENOMEM;
|
||||
goto odbs_exit;
|
||||
}
|
||||
|
||||
/* Set the dev_name early to allow dev_xxx in omap_device_alloc */
|
||||
if (pdev->id != -1)
|
||||
dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
|
||||
else
|
||||
dev_set_name(&pdev->dev, "%s", pdev->name);
|
||||
|
||||
/*
|
||||
* Must be called before omap_device_alloc() as oh->od
|
||||
* only contains the currently registered omap_device
|
||||
* and will get overwritten by omap_device_alloc().
|
||||
*/
|
||||
ret = omap_device_copy_resources(oh, pdev);
|
||||
if (ret)
|
||||
goto odbs_exit1;
|
||||
|
||||
od = omap_device_alloc(pdev, &oh, 1);
|
||||
if (IS_ERR(od)) {
|
||||
ret = PTR_ERR(od);
|
||||
goto odbs_exit1;
|
||||
}
|
||||
|
||||
ret = platform_device_add_data(pdev, pdata, pdata_len);
|
||||
if (ret)
|
||||
goto odbs_exit2;
|
||||
|
||||
ret = omap_device_register(pdev);
|
||||
if (ret)
|
||||
goto odbs_exit2;
|
||||
|
||||
return pdev;
|
||||
|
||||
odbs_exit2:
|
||||
omap_device_delete(od);
|
||||
odbs_exit1:
|
||||
platform_device_put(pdev);
|
||||
odbs_exit:
|
||||
|
||||
pr_err("omap_device: %s: build failed (%d)\n", pdev_name, ret);
|
||||
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int _od_runtime_suspend(struct device *dev)
|
||||
{
|
||||
|
@ -68,10 +68,6 @@ int omap_device_idle(struct platform_device *pdev);
|
||||
|
||||
/* Core code interface */
|
||||
|
||||
struct platform_device *omap_device_build(const char *pdev_name, int pdev_id,
|
||||
struct omap_hwmod *oh, void *pdata,
|
||||
int pdata_len);
|
||||
|
||||
struct omap_device *omap_device_alloc(struct platform_device *pdev,
|
||||
struct omap_hwmod **ohs, int oh_cnt);
|
||||
void omap_device_delete(struct omap_device *od);
|
||||
|
@ -11,7 +11,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/platform_data/i2c-omap.h>
|
||||
#include <linux/omap-dma.h>
|
||||
|
||||
#include "omap_hwmod.h"
|
||||
#include "l3_2xxx.h"
|
||||
@ -126,21 +125,6 @@ static struct omap_hwmod omap2420_i2c2_hwmod = {
|
||||
.flags = HWMOD_16BIT_REG,
|
||||
};
|
||||
|
||||
/* dma attributes */
|
||||
static struct omap_dma_dev_attr dma_dev_attr = {
|
||||
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
|
||||
IS_CSSA_32 | IS_CDSA_32,
|
||||
.lch_count = 32,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2420_dma_system_hwmod = {
|
||||
.name = "dma",
|
||||
.class = &omap2xxx_dma_hwmod_class,
|
||||
.main_clk = "core_l3_ck",
|
||||
.dev_attr = &dma_dev_attr,
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
};
|
||||
|
||||
/* mailbox */
|
||||
static struct omap_hwmod omap2420_mailbox_hwmod = {
|
||||
.name = "mailbox",
|
||||
@ -328,22 +312,6 @@ static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio4 = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* dma_system -> L3 */
|
||||
static struct omap_hwmod_ocp_if omap2420_dma_system__l3 = {
|
||||
.master = &omap2420_dma_system_hwmod,
|
||||
.slave = &omap2xxx_l3_main_hwmod,
|
||||
.clk = "core_l3_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_core -> dma_system */
|
||||
static struct omap_hwmod_ocp_if omap2420_l4_core__dma_system = {
|
||||
.master = &omap2xxx_l4_core_hwmod,
|
||||
.slave = &omap2420_dma_system_hwmod,
|
||||
.clk = "sdma_ick",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_core -> mailbox */
|
||||
static struct omap_hwmod_ocp_if omap2420_l4_core__mailbox = {
|
||||
.master = &omap2xxx_l4_core_hwmod,
|
||||
@ -435,8 +403,6 @@ static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = {
|
||||
&omap2420_l4_wkup__gpio2,
|
||||
&omap2420_l4_wkup__gpio3,
|
||||
&omap2420_l4_wkup__gpio4,
|
||||
&omap2420_dma_system__l3,
|
||||
&omap2420_l4_core__dma_system,
|
||||
&omap2420_l4_core__mailbox,
|
||||
&omap2420_l4_core__mcbsp1,
|
||||
&omap2420_l4_core__mcbsp2,
|
||||
|
@ -12,7 +12,6 @@
|
||||
|
||||
#include <linux/platform_data/i2c-omap.h>
|
||||
#include <linux/platform_data/hsmmc-omap.h>
|
||||
#include <linux/omap-dma.h>
|
||||
|
||||
#include "omap_hwmod.h"
|
||||
#include "l3_2xxx.h"
|
||||
@ -121,21 +120,6 @@ static struct omap_hwmod omap2430_gpio5_hwmod = {
|
||||
.class = &omap2xxx_gpio_hwmod_class,
|
||||
};
|
||||
|
||||
/* dma attributes */
|
||||
static struct omap_dma_dev_attr dma_dev_attr = {
|
||||
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
|
||||
IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
|
||||
.lch_count = 32,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2430_dma_system_hwmod = {
|
||||
.name = "dma",
|
||||
.class = &omap2xxx_dma_hwmod_class,
|
||||
.main_clk = "core_l3_ck",
|
||||
.dev_attr = &dma_dev_attr,
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
};
|
||||
|
||||
/* mailbox */
|
||||
static struct omap_hwmod omap2430_mailbox_hwmod = {
|
||||
.name = "mailbox",
|
||||
@ -508,22 +492,6 @@ static struct omap_hwmod_ocp_if omap2430_l4_core__gpio5 = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* dma_system -> L3 */
|
||||
static struct omap_hwmod_ocp_if omap2430_dma_system__l3 = {
|
||||
.master = &omap2430_dma_system_hwmod,
|
||||
.slave = &omap2xxx_l3_main_hwmod,
|
||||
.clk = "core_l3_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_core -> dma_system */
|
||||
static struct omap_hwmod_ocp_if omap2430_l4_core__dma_system = {
|
||||
.master = &omap2xxx_l4_core_hwmod,
|
||||
.slave = &omap2430_dma_system_hwmod,
|
||||
.clk = "sdma_ick",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_core -> mailbox */
|
||||
static struct omap_hwmod_ocp_if omap2430_l4_core__mailbox = {
|
||||
.master = &omap2xxx_l4_core_hwmod,
|
||||
@ -635,8 +603,6 @@ static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = {
|
||||
&omap2430_l4_wkup__gpio3,
|
||||
&omap2430_l4_wkup__gpio4,
|
||||
&omap2430_l4_core__gpio5,
|
||||
&omap2430_dma_system__l3,
|
||||
&omap2430_l4_core__dma_system,
|
||||
&omap2430_l4_core__mailbox,
|
||||
&omap2430_l4_core__mcbsp1,
|
||||
&omap2430_l4_core__mcbsp2,
|
||||
|
@ -7,7 +7,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/omap-dma.h>
|
||||
|
||||
#include "omap_hwmod.h"
|
||||
#include "omap_hwmod_common_data.h"
|
||||
@ -95,23 +94,6 @@ struct omap_hwmod_class omap2xxx_gpio_hwmod_class = {
|
||||
.sysc = &omap2xxx_gpio_sysc,
|
||||
};
|
||||
|
||||
/* system dma */
|
||||
static struct omap_hwmod_class_sysconfig omap2xxx_dma_sysc = {
|
||||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x002c,
|
||||
.syss_offs = 0x0028,
|
||||
.sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_MIDLEMODE |
|
||||
SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_EMUFREE |
|
||||
SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
|
||||
.idlemodes = (MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
struct omap_hwmod_class omap2xxx_dma_hwmod_class = {
|
||||
.name = "dma",
|
||||
.sysc = &omap2xxx_dma_sysc,
|
||||
};
|
||||
|
||||
/*
|
||||
* 'mailbox' class
|
||||
* mailbox module allowing communication between the on-chip processors
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include <linux/power/smartreflex.h>
|
||||
#include <linux/platform_data/hsmmc-omap.h>
|
||||
|
||||
#include <linux/omap-dma.h>
|
||||
#include "l3_3xxx.h"
|
||||
#include "l4_3xxx.h"
|
||||
|
||||
@ -833,47 +832,6 @@ static struct omap_hwmod omap3xxx_gpio6_hwmod = {
|
||||
.class = &omap3xxx_gpio_hwmod_class,
|
||||
};
|
||||
|
||||
/* dma attributes */
|
||||
static struct omap_dma_dev_attr dma_dev_attr = {
|
||||
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
|
||||
IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
|
||||
.lch_count = 32,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap3xxx_dma_sysc = {
|
||||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x002c,
|
||||
.syss_offs = 0x0028,
|
||||
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
|
||||
SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
|
||||
SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE |
|
||||
SYSS_HAS_RESET_STATUS),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
|
||||
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap3xxx_dma_hwmod_class = {
|
||||
.name = "dma",
|
||||
.sysc = &omap3xxx_dma_sysc,
|
||||
};
|
||||
|
||||
/* dma_system */
|
||||
static struct omap_hwmod omap3xxx_dma_system_hwmod = {
|
||||
.name = "dma",
|
||||
.class = &omap3xxx_dma_hwmod_class,
|
||||
.main_clk = "core_l3_ick",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP3430_ST_SDMA_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &dma_dev_attr,
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
};
|
||||
|
||||
/*
|
||||
* 'mcbsp' class
|
||||
* multi channel buffered serial port controller
|
||||
@ -2233,23 +2191,6 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio6 = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* dma_system -> L3 */
|
||||
static struct omap_hwmod_ocp_if omap3xxx_dma_system__l3 = {
|
||||
.master = &omap3xxx_dma_system_hwmod,
|
||||
.slave = &omap3xxx_l3_main_hwmod,
|
||||
.clk = "core_l3_ick",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg -> dma_system */
|
||||
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dma_system = {
|
||||
.master = &omap3xxx_l4_core_hwmod,
|
||||
.slave = &omap3xxx_dma_system_hwmod,
|
||||
.clk = "core_l4_ick",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
|
||||
/* l4_core -> mcbsp1 */
|
||||
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp1 = {
|
||||
.master = &omap3xxx_l4_core_hwmod,
|
||||
@ -2628,8 +2569,6 @@ static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {
|
||||
&omap3xxx_l4_per__gpio4,
|
||||
&omap3xxx_l4_per__gpio5,
|
||||
&omap3xxx_l4_per__gpio6,
|
||||
&omap3xxx_dma_system__l3,
|
||||
&omap3xxx_l4_core__dma_system,
|
||||
&omap3xxx_l4_core__mcbsp1,
|
||||
&omap3xxx_l4_per__mcbsp2,
|
||||
&omap3xxx_l4_per__mcbsp3,
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/omap-dma.h>
|
||||
|
||||
#include "omap_hwmod.h"
|
||||
#include "omap_hwmod_common_data.h"
|
||||
@ -30,9 +29,6 @@
|
||||
/* Base offset for all OMAP4 interrupts external to MPUSS */
|
||||
#define OMAP44XX_IRQ_GIC_START 32
|
||||
|
||||
/* Base offset for all OMAP4 dma requests */
|
||||
#define OMAP44XX_DMA_REQ_START 1
|
||||
|
||||
/*
|
||||
* IP blocks
|
||||
*/
|
||||
@ -359,53 +355,6 @@ static struct omap_hwmod omap44xx_debugss_hwmod = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* 'dma' class
|
||||
* dma controller for data exchange between memory to memory (i.e. internal or
|
||||
* external memory) and gp peripherals to memory or memory to gp peripherals
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap44xx_dma_sysc = {
|
||||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x002c,
|
||||
.syss_offs = 0x0028,
|
||||
.sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
|
||||
SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
|
||||
SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
|
||||
SYSS_HAS_RESET_STATUS),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
|
||||
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap44xx_dma_hwmod_class = {
|
||||
.name = "dma",
|
||||
.sysc = &omap44xx_dma_sysc,
|
||||
};
|
||||
|
||||
/* dma dev_attr */
|
||||
static struct omap_dma_dev_attr dma_dev_attr = {
|
||||
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
|
||||
IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
|
||||
.lch_count = 32,
|
||||
};
|
||||
|
||||
/* dma_system */
|
||||
static struct omap_hwmod omap44xx_dma_system_hwmod = {
|
||||
.name = "dma_system",
|
||||
.class = &omap44xx_dma_hwmod_class,
|
||||
.clkdm_name = "l3_dma_clkdm",
|
||||
.main_clk = "l3_div_ck",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_offs = OMAP4_CM_SDMA_SDMA_CLKCTRL_OFFSET,
|
||||
.context_offs = OMAP4_RM_SDMA_SDMA_CONTEXT_OFFSET,
|
||||
},
|
||||
},
|
||||
.dev_attr = &dma_dev_attr,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* 'dsp' class
|
||||
* dsp sub-system
|
||||
@ -1458,14 +1407,6 @@ static struct omap_hwmod_ocp_if omap44xx_debugss__l3_main_2 = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* dma_system -> l3_main_2 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_dma_system__l3_main_2 = {
|
||||
.master = &omap44xx_dma_system_hwmod,
|
||||
.slave = &omap44xx_l3_main_2_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* ipu -> l3_main_2 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_ipu__l3_main_2 = {
|
||||
.master = &omap44xx_ipu_hwmod,
|
||||
@ -1658,14 +1599,6 @@ static struct omap_hwmod_ocp_if omap44xx_l3_instr__debugss = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg -> dma_system */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_cfg__dma_system = {
|
||||
.master = &omap44xx_l4_cfg_hwmod,
|
||||
.slave = &omap44xx_dma_system_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* dsp -> iva */
|
||||
static struct omap_hwmod_ocp_if omap44xx_dsp__iva = {
|
||||
.master = &omap44xx_dsp_hwmod,
|
||||
@ -1966,7 +1899,6 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = {
|
||||
&omap44xx_l4_cfg__l3_main_1,
|
||||
&omap44xx_mpu__l3_main_1,
|
||||
&omap44xx_debugss__l3_main_2,
|
||||
&omap44xx_dma_system__l3_main_2,
|
||||
&omap44xx_ipu__l3_main_2,
|
||||
&omap44xx_iss__l3_main_2,
|
||||
&omap44xx_iva__l3_main_2,
|
||||
@ -1991,7 +1923,6 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = {
|
||||
&omap44xx_l4_wkup__ctrl_module_wkup,
|
||||
&omap44xx_l4_wkup__ctrl_module_pad_wkup,
|
||||
&omap44xx_l3_instr__debugss,
|
||||
&omap44xx_l4_cfg__dma_system,
|
||||
&omap44xx_dsp__iva,
|
||||
/* &omap44xx_dsp__sl2if, */
|
||||
&omap44xx_l4_cfg__dsp,
|
||||
|
@ -17,8 +17,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/power/smartreflex.h>
|
||||
|
||||
#include <linux/omap-dma.h>
|
||||
|
||||
#include "omap_hwmod.h"
|
||||
#include "omap_hwmod_common_data.h"
|
||||
#include "cm1_54xx.h"
|
||||
@ -28,10 +26,6 @@
|
||||
/* Base offset for all OMAP5 interrupts external to MPUSS */
|
||||
#define OMAP54XX_IRQ_GIC_START 32
|
||||
|
||||
/* Base offset for all OMAP5 dma requests */
|
||||
#define OMAP54XX_DMA_REQ_START 1
|
||||
|
||||
|
||||
/*
|
||||
* IP blocks
|
||||
*/
|
||||
@ -232,53 +226,6 @@ static struct omap_hwmod omap54xx_counter_32k_hwmod = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* 'dma' class
|
||||
* dma controller for data exchange between memory to memory (i.e. internal or
|
||||
* external memory) and gp peripherals to memory or memory to gp peripherals
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap54xx_dma_sysc = {
|
||||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x002c,
|
||||
.syss_offs = 0x0028,
|
||||
.sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
|
||||
SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
|
||||
SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
|
||||
SYSS_HAS_RESET_STATUS),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
|
||||
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap54xx_dma_hwmod_class = {
|
||||
.name = "dma",
|
||||
.sysc = &omap54xx_dma_sysc,
|
||||
};
|
||||
|
||||
/* dma dev_attr */
|
||||
static struct omap_dma_dev_attr dma_dev_attr = {
|
||||
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
|
||||
IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
|
||||
.lch_count = 32,
|
||||
};
|
||||
|
||||
/* dma_system */
|
||||
static struct omap_hwmod omap54xx_dma_system_hwmod = {
|
||||
.name = "dma_system",
|
||||
.class = &omap54xx_dma_hwmod_class,
|
||||
.clkdm_name = "dma_clkdm",
|
||||
.main_clk = "l3_iclk_div",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_offs = OMAP54XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET,
|
||||
.context_offs = OMAP54XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET,
|
||||
},
|
||||
},
|
||||
.dev_attr = &dma_dev_attr,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* 'dss' class
|
||||
* display sub-system
|
||||
@ -961,14 +908,6 @@ static struct omap_hwmod_ocp_if omap54xx_l4_wkup__counter_32k = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg -> dma_system */
|
||||
static struct omap_hwmod_ocp_if omap54xx_l4_cfg__dma_system = {
|
||||
.master = &omap54xx_l4_cfg_hwmod,
|
||||
.slave = &omap54xx_dma_system_hwmod,
|
||||
.clk = "l4_root_clk_div",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l3_main_2 -> dss */
|
||||
static struct omap_hwmod_ocp_if omap54xx_l3_main_2__dss = {
|
||||
.master = &omap54xx_l3_main_2_hwmod,
|
||||
@ -1091,7 +1030,6 @@ static struct omap_hwmod_ocp_if *omap54xx_hwmod_ocp_ifs[] __initdata = {
|
||||
&omap54xx_l3_main_1__l4_wkup,
|
||||
&omap54xx_mpu__mpu_private,
|
||||
&omap54xx_l4_wkup__counter_32k,
|
||||
&omap54xx_l4_cfg__dma_system,
|
||||
&omap54xx_l3_main_2__dss,
|
||||
&omap54xx_l3_main_2__dss_dispc,
|
||||
&omap54xx_l3_main_2__dss_dsi1_a,
|
||||
|
@ -15,7 +15,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/omap-dma.h>
|
||||
|
||||
#include "omap_hwmod.h"
|
||||
#include "omap_hwmod_common_data.h"
|
||||
@ -27,10 +26,6 @@
|
||||
/* Base offset for all DRA7XX interrupts external to MPUSS */
|
||||
#define DRA7XX_IRQ_GIC_START 32
|
||||
|
||||
/* Base offset for all DRA7XX dma requests */
|
||||
#define DRA7XX_DMA_REQ_START 1
|
||||
|
||||
|
||||
/*
|
||||
* IP blocks
|
||||
*/
|
||||
@ -281,52 +276,6 @@ static struct omap_hwmod dra7xx_ctrl_module_wkup_hwmod = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* 'dma' class
|
||||
*
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig dra7xx_dma_sysc = {
|
||||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x002c,
|
||||
.syss_offs = 0x0028,
|
||||
.sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
|
||||
SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
|
||||
SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
|
||||
SYSS_HAS_RESET_STATUS),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
|
||||
SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
|
||||
MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class dra7xx_dma_hwmod_class = {
|
||||
.name = "dma",
|
||||
.sysc = &dra7xx_dma_sysc,
|
||||
};
|
||||
|
||||
/* dma dev_attr */
|
||||
static struct omap_dma_dev_attr dma_dev_attr = {
|
||||
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
|
||||
IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
|
||||
.lch_count = 32,
|
||||
};
|
||||
|
||||
/* dma_system */
|
||||
static struct omap_hwmod dra7xx_dma_system_hwmod = {
|
||||
.name = "dma_system",
|
||||
.class = &dra7xx_dma_hwmod_class,
|
||||
.clkdm_name = "dma_clkdm",
|
||||
.main_clk = "l3_iclk_div",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_offs = DRA7XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET,
|
||||
.context_offs = DRA7XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET,
|
||||
},
|
||||
},
|
||||
.dev_attr = &dma_dev_attr,
|
||||
};
|
||||
|
||||
/*
|
||||
* 'tpcc' class
|
||||
*
|
||||
@ -1128,14 +1077,6 @@ static struct omap_hwmod_ocp_if dra7xx_l4_wkup__ctrl_module_wkup = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg -> dma_system */
|
||||
static struct omap_hwmod_ocp_if dra7xx_l4_cfg__dma_system = {
|
||||
.master = &dra7xx_l4_cfg_hwmod,
|
||||
.slave = &dra7xx_dma_system_hwmod,
|
||||
.clk = "l3_iclk_div",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l3_main_1 -> tpcc */
|
||||
static struct omap_hwmod_ocp_if dra7xx_l3_main_1__tpcc = {
|
||||
.master = &dra7xx_l3_main_1_hwmod,
|
||||
@ -1368,7 +1309,6 @@ static struct omap_hwmod_ocp_if *dra7xx_hwmod_ocp_ifs[] __initdata = {
|
||||
&dra7xx_l3_main_1__bb2d,
|
||||
&dra7xx_l4_wkup__counter_32k,
|
||||
&dra7xx_l4_wkup__ctrl_module_wkup,
|
||||
&dra7xx_l4_cfg__dma_system,
|
||||
&dra7xx_l3_main_1__tpcc,
|
||||
&dra7xx_l3_main_1__tptc0,
|
||||
&dra7xx_l3_main_1__tptc1,
|
||||
|
@ -98,7 +98,6 @@ extern struct omap_hwmod_class omap2_hdq1w_class;
|
||||
extern struct omap_hwmod_class omap2xxx_timer_hwmod_class;
|
||||
extern struct omap_hwmod_class omap2xxx_wd_timer_hwmod_class;
|
||||
extern struct omap_hwmod_class omap2xxx_gpio_hwmod_class;
|
||||
extern struct omap_hwmod_class omap2xxx_dma_hwmod_class;
|
||||
extern struct omap_hwmod_class omap2xxx_mailbox_hwmod_class;
|
||||
extern struct omap_hwmod_class omap2xxx_mcspi_class;
|
||||
|
||||
|
@ -514,6 +514,7 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = {
|
||||
/* Common auxdata */
|
||||
OF_DEV_AUXDATA("ti,sysc", 0, NULL, &ti_sysc_pdata),
|
||||
OF_DEV_AUXDATA("pinctrl-single", 0, NULL, &pcs_pdata),
|
||||
OF_DEV_AUXDATA("ti,omap-sdma", 0, NULL, &dma_plat_info),
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
||||
|
@ -83,8 +83,6 @@ static int omap2_enter_full_retention(void)
|
||||
l = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0) | OMAP24XX_USBSTANDBYCTRL;
|
||||
omap_ctrl_writel(l, OMAP2_CONTROL_DEVCONF0);
|
||||
|
||||
cpu_cluster_pm_enter();
|
||||
|
||||
/* One last check for pending IRQs to avoid extra latency due
|
||||
* to sleeping unnecessarily. */
|
||||
if (omap_irq_pending())
|
||||
@ -96,8 +94,6 @@ static int omap2_enter_full_retention(void)
|
||||
OMAP_SDRC_REGADDR(SDRC_POWER));
|
||||
|
||||
no_sleep:
|
||||
cpu_cluster_pm_exit();
|
||||
|
||||
clk_enable(osc_ck);
|
||||
|
||||
/* clear CORE wake-up events */
|
||||
@ -162,25 +158,27 @@ static int omap2_can_sleep(void)
|
||||
return 0;
|
||||
if (__clk_is_enabled(osc_ck))
|
||||
return 0;
|
||||
if (omap_dma_running())
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void omap2_pm_idle(void)
|
||||
{
|
||||
if (!omap2_can_sleep()) {
|
||||
if (omap_irq_pending())
|
||||
return;
|
||||
omap2_enter_mpu_retention();
|
||||
return;
|
||||
}
|
||||
int error;
|
||||
|
||||
if (omap_irq_pending())
|
||||
return;
|
||||
|
||||
error = cpu_cluster_pm_enter();
|
||||
if (error || !omap2_can_sleep()) {
|
||||
omap2_enter_mpu_retention();
|
||||
goto out_cpu_cluster_pm;
|
||||
}
|
||||
|
||||
omap2_enter_full_retention();
|
||||
|
||||
out_cpu_cluster_pm:
|
||||
cpu_cluster_pm_exit();
|
||||
}
|
||||
|
||||
static void __init prcm_setup_regs(void)
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/omap-dma.h>
|
||||
#include <linux/omap-gpmc.h>
|
||||
|
||||
#include <trace/events/power.h>
|
||||
@ -85,7 +84,6 @@ static void omap3_core_save_context(void)
|
||||
omap3_gpmc_save_context();
|
||||
/* Save the system control module context, padconf already save above*/
|
||||
omap3_control_save_context();
|
||||
omap_dma_global_context_save();
|
||||
}
|
||||
|
||||
static void omap3_core_restore_context(void)
|
||||
@ -96,7 +94,6 @@ static void omap3_core_restore_context(void)
|
||||
omap3_gpmc_restore_context();
|
||||
/* Restore the interrupt controller context */
|
||||
omap_intc_restore_context();
|
||||
omap_dma_global_context_restore();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -547,9 +544,7 @@ int __init omap3_pm_init(void)
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
omap_dma_global_context_save();
|
||||
omap3_save_secure_ram_context();
|
||||
omap_dma_global_context_restore();
|
||||
|
||||
local_irq_enable();
|
||||
}
|
||||
|
Reference in New Issue
Block a user