162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * B53 register access through memory mapped registers
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2012-2013 Jonas Gorski <jogo@openwrt.org>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Permission to use, copy, modify, and/or distribute this software for any
762306a36Sopenharmony_ci * purpose with or without fee is hereby granted, provided that the above
862306a36Sopenharmony_ci * copyright notice and this permission notice appear in all copies.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1162306a36Sopenharmony_ci * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1262306a36Sopenharmony_ci * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1362306a36Sopenharmony_ci * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1462306a36Sopenharmony_ci * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1562306a36Sopenharmony_ci * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1662306a36Sopenharmony_ci * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1762306a36Sopenharmony_ci */
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include <linux/bits.h>
2062306a36Sopenharmony_ci#include <linux/kernel.h>
2162306a36Sopenharmony_ci#include <linux/module.h>
2262306a36Sopenharmony_ci#include <linux/of.h>
2362306a36Sopenharmony_ci#include <linux/io.h>
2462306a36Sopenharmony_ci#include <linux/platform_device.h>
2562306a36Sopenharmony_ci#include <linux/platform_data/b53.h>
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#include "b53_priv.h"
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct b53_mmap_priv {
3062306a36Sopenharmony_ci	void __iomem *regs;
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic int b53_mmap_read8(struct b53_device *dev, u8 page, u8 reg, u8 *val)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	struct b53_mmap_priv *priv = dev->priv;
3662306a36Sopenharmony_ci	void __iomem *regs = priv->regs;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	*val = readb(regs + (page << 8) + reg);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	return 0;
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic int b53_mmap_read16(struct b53_device *dev, u8 page, u8 reg, u16 *val)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	struct b53_mmap_priv *priv = dev->priv;
4662306a36Sopenharmony_ci	void __iomem *regs = priv->regs;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	if (WARN_ON(reg % 2))
4962306a36Sopenharmony_ci		return -EINVAL;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	if (dev->pdata && dev->pdata->big_endian)
5262306a36Sopenharmony_ci		*val = ioread16be(regs + (page << 8) + reg);
5362306a36Sopenharmony_ci	else
5462306a36Sopenharmony_ci		*val = readw(regs + (page << 8) + reg);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	return 0;
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic int b53_mmap_read32(struct b53_device *dev, u8 page, u8 reg, u32 *val)
6062306a36Sopenharmony_ci{
6162306a36Sopenharmony_ci	struct b53_mmap_priv *priv = dev->priv;
6262306a36Sopenharmony_ci	void __iomem *regs = priv->regs;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	if (WARN_ON(reg % 4))
6562306a36Sopenharmony_ci		return -EINVAL;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	if (dev->pdata && dev->pdata->big_endian)
6862306a36Sopenharmony_ci		*val = ioread32be(regs + (page << 8) + reg);
6962306a36Sopenharmony_ci	else
7062306a36Sopenharmony_ci		*val = readl(regs + (page << 8) + reg);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	return 0;
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic int b53_mmap_read48(struct b53_device *dev, u8 page, u8 reg, u64 *val)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	struct b53_mmap_priv *priv = dev->priv;
7862306a36Sopenharmony_ci	void __iomem *regs = priv->regs;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	if (WARN_ON(reg % 2))
8162306a36Sopenharmony_ci		return -EINVAL;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	if (reg % 4) {
8462306a36Sopenharmony_ci		u16 lo;
8562306a36Sopenharmony_ci		u32 hi;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci		if (dev->pdata && dev->pdata->big_endian) {
8862306a36Sopenharmony_ci			lo = ioread16be(regs + (page << 8) + reg);
8962306a36Sopenharmony_ci			hi = ioread32be(regs + (page << 8) + reg + 2);
9062306a36Sopenharmony_ci		} else {
9162306a36Sopenharmony_ci			lo = readw(regs + (page << 8) + reg);
9262306a36Sopenharmony_ci			hi = readl(regs + (page << 8) + reg + 2);
9362306a36Sopenharmony_ci		}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci		*val = ((u64)hi << 16) | lo;
9662306a36Sopenharmony_ci	} else {
9762306a36Sopenharmony_ci		u32 lo;
9862306a36Sopenharmony_ci		u16 hi;
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci		if (dev->pdata && dev->pdata->big_endian) {
10162306a36Sopenharmony_ci			lo = ioread32be(regs + (page << 8) + reg);
10262306a36Sopenharmony_ci			hi = ioread16be(regs + (page << 8) + reg + 4);
10362306a36Sopenharmony_ci		} else {
10462306a36Sopenharmony_ci			lo = readl(regs + (page << 8) + reg);
10562306a36Sopenharmony_ci			hi = readw(regs + (page << 8) + reg + 4);
10662306a36Sopenharmony_ci		}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci		*val = ((u64)hi << 32) | lo;
10962306a36Sopenharmony_ci	}
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	return 0;
11262306a36Sopenharmony_ci}
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cistatic int b53_mmap_read64(struct b53_device *dev, u8 page, u8 reg, u64 *val)
11562306a36Sopenharmony_ci{
11662306a36Sopenharmony_ci	struct b53_mmap_priv *priv = dev->priv;
11762306a36Sopenharmony_ci	void __iomem *regs = priv->regs;
11862306a36Sopenharmony_ci	u32 hi, lo;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	if (WARN_ON(reg % 4))
12162306a36Sopenharmony_ci		return -EINVAL;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	if (dev->pdata && dev->pdata->big_endian) {
12462306a36Sopenharmony_ci		lo = ioread32be(regs + (page << 8) + reg);
12562306a36Sopenharmony_ci		hi = ioread32be(regs + (page << 8) + reg + 4);
12662306a36Sopenharmony_ci	} else {
12762306a36Sopenharmony_ci		lo = readl(regs + (page << 8) + reg);
12862306a36Sopenharmony_ci		hi = readl(regs + (page << 8) + reg + 4);
12962306a36Sopenharmony_ci	}
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	*val = ((u64)hi << 32) | lo;
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	return 0;
13462306a36Sopenharmony_ci}
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistatic int b53_mmap_write8(struct b53_device *dev, u8 page, u8 reg, u8 value)
13762306a36Sopenharmony_ci{
13862306a36Sopenharmony_ci	struct b53_mmap_priv *priv = dev->priv;
13962306a36Sopenharmony_ci	void __iomem *regs = priv->regs;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	writeb(value, regs + (page << 8) + reg);
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	return 0;
14462306a36Sopenharmony_ci}
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistatic int b53_mmap_write16(struct b53_device *dev, u8 page, u8 reg,
14762306a36Sopenharmony_ci			    u16 value)
14862306a36Sopenharmony_ci{
14962306a36Sopenharmony_ci	struct b53_mmap_priv *priv = dev->priv;
15062306a36Sopenharmony_ci	void __iomem *regs = priv->regs;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	if (WARN_ON(reg % 2))
15362306a36Sopenharmony_ci		return -EINVAL;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	if (dev->pdata && dev->pdata->big_endian)
15662306a36Sopenharmony_ci		iowrite16be(value, regs + (page << 8) + reg);
15762306a36Sopenharmony_ci	else
15862306a36Sopenharmony_ci		writew(value, regs + (page << 8) + reg);
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	return 0;
16162306a36Sopenharmony_ci}
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_cistatic int b53_mmap_write32(struct b53_device *dev, u8 page, u8 reg,
16462306a36Sopenharmony_ci			    u32 value)
16562306a36Sopenharmony_ci{
16662306a36Sopenharmony_ci	struct b53_mmap_priv *priv = dev->priv;
16762306a36Sopenharmony_ci	void __iomem *regs = priv->regs;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	if (WARN_ON(reg % 4))
17062306a36Sopenharmony_ci		return -EINVAL;
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	if (dev->pdata && dev->pdata->big_endian)
17362306a36Sopenharmony_ci		iowrite32be(value, regs + (page << 8) + reg);
17462306a36Sopenharmony_ci	else
17562306a36Sopenharmony_ci		writel(value, regs + (page << 8) + reg);
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci	return 0;
17862306a36Sopenharmony_ci}
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic int b53_mmap_write48(struct b53_device *dev, u8 page, u8 reg,
18162306a36Sopenharmony_ci			    u64 value)
18262306a36Sopenharmony_ci{
18362306a36Sopenharmony_ci	if (WARN_ON(reg % 2))
18462306a36Sopenharmony_ci		return -EINVAL;
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	if (reg % 4) {
18762306a36Sopenharmony_ci		u32 hi = (u32)(value >> 16);
18862306a36Sopenharmony_ci		u16 lo = (u16)value;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci		b53_mmap_write16(dev, page, reg, lo);
19162306a36Sopenharmony_ci		b53_mmap_write32(dev, page, reg + 2, hi);
19262306a36Sopenharmony_ci	} else {
19362306a36Sopenharmony_ci		u16 hi = (u16)(value >> 32);
19462306a36Sopenharmony_ci		u32 lo = (u32)value;
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci		b53_mmap_write32(dev, page, reg, lo);
19762306a36Sopenharmony_ci		b53_mmap_write16(dev, page, reg + 4, hi);
19862306a36Sopenharmony_ci	}
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	return 0;
20162306a36Sopenharmony_ci}
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cistatic int b53_mmap_write64(struct b53_device *dev, u8 page, u8 reg,
20462306a36Sopenharmony_ci			    u64 value)
20562306a36Sopenharmony_ci{
20662306a36Sopenharmony_ci	u32 hi, lo;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	hi = upper_32_bits(value);
20962306a36Sopenharmony_ci	lo = lower_32_bits(value);
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	if (WARN_ON(reg % 4))
21262306a36Sopenharmony_ci		return -EINVAL;
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	b53_mmap_write32(dev, page, reg, lo);
21562306a36Sopenharmony_ci	b53_mmap_write32(dev, page, reg + 4, hi);
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	return 0;
21862306a36Sopenharmony_ci}
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cistatic int b53_mmap_phy_read16(struct b53_device *dev, int addr, int reg,
22162306a36Sopenharmony_ci			       u16 *value)
22262306a36Sopenharmony_ci{
22362306a36Sopenharmony_ci	return -EIO;
22462306a36Sopenharmony_ci}
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_cistatic int b53_mmap_phy_write16(struct b53_device *dev, int addr, int reg,
22762306a36Sopenharmony_ci				u16 value)
22862306a36Sopenharmony_ci{
22962306a36Sopenharmony_ci	return -EIO;
23062306a36Sopenharmony_ci}
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_cistatic const struct b53_io_ops b53_mmap_ops = {
23362306a36Sopenharmony_ci	.read8 = b53_mmap_read8,
23462306a36Sopenharmony_ci	.read16 = b53_mmap_read16,
23562306a36Sopenharmony_ci	.read32 = b53_mmap_read32,
23662306a36Sopenharmony_ci	.read48 = b53_mmap_read48,
23762306a36Sopenharmony_ci	.read64 = b53_mmap_read64,
23862306a36Sopenharmony_ci	.write8 = b53_mmap_write8,
23962306a36Sopenharmony_ci	.write16 = b53_mmap_write16,
24062306a36Sopenharmony_ci	.write32 = b53_mmap_write32,
24162306a36Sopenharmony_ci	.write48 = b53_mmap_write48,
24262306a36Sopenharmony_ci	.write64 = b53_mmap_write64,
24362306a36Sopenharmony_ci	.phy_read16 = b53_mmap_phy_read16,
24462306a36Sopenharmony_ci	.phy_write16 = b53_mmap_phy_write16,
24562306a36Sopenharmony_ci};
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_cistatic int b53_mmap_probe_of(struct platform_device *pdev,
24862306a36Sopenharmony_ci			     struct b53_platform_data **ppdata)
24962306a36Sopenharmony_ci{
25062306a36Sopenharmony_ci	struct device_node *np = pdev->dev.of_node;
25162306a36Sopenharmony_ci	struct device_node *of_ports, *of_port;
25262306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
25362306a36Sopenharmony_ci	struct b53_platform_data *pdata;
25462306a36Sopenharmony_ci	void __iomem *mem;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	mem = devm_platform_ioremap_resource(pdev, 0);
25762306a36Sopenharmony_ci	if (IS_ERR(mem))
25862306a36Sopenharmony_ci		return PTR_ERR(mem);
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci	pdata = devm_kzalloc(dev, sizeof(struct b53_platform_data),
26162306a36Sopenharmony_ci			     GFP_KERNEL);
26262306a36Sopenharmony_ci	if (!pdata)
26362306a36Sopenharmony_ci		return -ENOMEM;
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	pdata->regs = mem;
26662306a36Sopenharmony_ci	pdata->chip_id = (u32)(unsigned long)device_get_match_data(dev);
26762306a36Sopenharmony_ci	pdata->big_endian = of_property_read_bool(np, "big-endian");
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	of_ports = of_get_child_by_name(np, "ports");
27062306a36Sopenharmony_ci	if (!of_ports) {
27162306a36Sopenharmony_ci		dev_err(dev, "no ports child node found\n");
27262306a36Sopenharmony_ci		return -EINVAL;
27362306a36Sopenharmony_ci	}
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci	for_each_available_child_of_node(of_ports, of_port) {
27662306a36Sopenharmony_ci		u32 reg;
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci		if (of_property_read_u32(of_port, "reg", &reg))
27962306a36Sopenharmony_ci			continue;
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci		if (reg < B53_N_PORTS)
28262306a36Sopenharmony_ci			pdata->enabled_ports |= BIT(reg);
28362306a36Sopenharmony_ci	}
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	of_node_put(of_ports);
28662306a36Sopenharmony_ci	*ppdata = pdata;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	return 0;
28962306a36Sopenharmony_ci}
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_cistatic int b53_mmap_probe(struct platform_device *pdev)
29262306a36Sopenharmony_ci{
29362306a36Sopenharmony_ci	struct device_node *np = pdev->dev.of_node;
29462306a36Sopenharmony_ci	struct b53_platform_data *pdata = pdev->dev.platform_data;
29562306a36Sopenharmony_ci	struct b53_mmap_priv *priv;
29662306a36Sopenharmony_ci	struct b53_device *dev;
29762306a36Sopenharmony_ci	int ret;
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci	if (!pdata && np) {
30062306a36Sopenharmony_ci		ret = b53_mmap_probe_of(pdev, &pdata);
30162306a36Sopenharmony_ci		if (ret) {
30262306a36Sopenharmony_ci			dev_err(&pdev->dev, "OF probe error\n");
30362306a36Sopenharmony_ci			return ret;
30462306a36Sopenharmony_ci		}
30562306a36Sopenharmony_ci	}
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	if (!pdata)
30862306a36Sopenharmony_ci		return -EINVAL;
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
31162306a36Sopenharmony_ci	if (!priv)
31262306a36Sopenharmony_ci		return -ENOMEM;
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci	priv->regs = pdata->regs;
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci	dev = b53_switch_alloc(&pdev->dev, &b53_mmap_ops, priv);
31762306a36Sopenharmony_ci	if (!dev)
31862306a36Sopenharmony_ci		return -ENOMEM;
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	dev->pdata = pdata;
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci	platform_set_drvdata(pdev, dev);
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	return b53_switch_register(dev);
32562306a36Sopenharmony_ci}
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_cistatic int b53_mmap_remove(struct platform_device *pdev)
32862306a36Sopenharmony_ci{
32962306a36Sopenharmony_ci	struct b53_device *dev = platform_get_drvdata(pdev);
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	if (dev)
33262306a36Sopenharmony_ci		b53_switch_remove(dev);
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci	return 0;
33562306a36Sopenharmony_ci}
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_cistatic void b53_mmap_shutdown(struct platform_device *pdev)
33862306a36Sopenharmony_ci{
33962306a36Sopenharmony_ci	struct b53_device *dev = platform_get_drvdata(pdev);
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	if (dev)
34262306a36Sopenharmony_ci		b53_switch_shutdown(dev);
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	platform_set_drvdata(pdev, NULL);
34562306a36Sopenharmony_ci}
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_cistatic const struct of_device_id b53_mmap_of_table[] = {
34862306a36Sopenharmony_ci	{
34962306a36Sopenharmony_ci		.compatible = "brcm,bcm3384-switch",
35062306a36Sopenharmony_ci		.data = (void *)BCM63XX_DEVICE_ID,
35162306a36Sopenharmony_ci	}, {
35262306a36Sopenharmony_ci		.compatible = "brcm,bcm6318-switch",
35362306a36Sopenharmony_ci		.data = (void *)BCM63268_DEVICE_ID,
35462306a36Sopenharmony_ci	}, {
35562306a36Sopenharmony_ci		.compatible = "brcm,bcm6328-switch",
35662306a36Sopenharmony_ci		.data = (void *)BCM63XX_DEVICE_ID,
35762306a36Sopenharmony_ci	}, {
35862306a36Sopenharmony_ci		.compatible = "brcm,bcm6362-switch",
35962306a36Sopenharmony_ci		.data = (void *)BCM63XX_DEVICE_ID,
36062306a36Sopenharmony_ci	}, {
36162306a36Sopenharmony_ci		.compatible = "brcm,bcm6368-switch",
36262306a36Sopenharmony_ci		.data = (void *)BCM63XX_DEVICE_ID,
36362306a36Sopenharmony_ci	}, {
36462306a36Sopenharmony_ci		.compatible = "brcm,bcm63268-switch",
36562306a36Sopenharmony_ci		.data = (void *)BCM63268_DEVICE_ID,
36662306a36Sopenharmony_ci	}, {
36762306a36Sopenharmony_ci		.compatible = "brcm,bcm63xx-switch",
36862306a36Sopenharmony_ci		.data = (void *)BCM63XX_DEVICE_ID,
36962306a36Sopenharmony_ci	}, { /* sentinel */ }
37062306a36Sopenharmony_ci};
37162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, b53_mmap_of_table);
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_cistatic struct platform_driver b53_mmap_driver = {
37462306a36Sopenharmony_ci	.probe = b53_mmap_probe,
37562306a36Sopenharmony_ci	.remove = b53_mmap_remove,
37662306a36Sopenharmony_ci	.shutdown = b53_mmap_shutdown,
37762306a36Sopenharmony_ci	.driver = {
37862306a36Sopenharmony_ci		.name = "b53-switch",
37962306a36Sopenharmony_ci		.of_match_table = b53_mmap_of_table,
38062306a36Sopenharmony_ci	},
38162306a36Sopenharmony_ci};
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_cimodule_platform_driver(b53_mmap_driver);
38462306a36Sopenharmony_ciMODULE_AUTHOR("Jonas Gorski <jogo@openwrt.org>");
38562306a36Sopenharmony_ciMODULE_DESCRIPTION("B53 MMAP access driver");
38662306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL");
387