|
@@ -639,6 +639,20 @@ static struct musb_fifo_cfg sunxi_musb_mode_cfg[] = {
|
|
|
MUSB_EP_FIFO_SINGLE(5, FIFO_RX, 512),
|
|
|
};
|
|
|
|
|
|
+/* H3/V3s OTG supports only 4 endpoints */
|
|
|
+#define SUNXI_MUSB_MAX_EP_NUM_H3 5
|
|
|
+
|
|
|
+static struct musb_fifo_cfg sunxi_musb_mode_cfg_h3[] = {
|
|
|
+ MUSB_EP_FIFO_SINGLE(1, FIFO_TX, 512),
|
|
|
+ MUSB_EP_FIFO_SINGLE(1, FIFO_RX, 512),
|
|
|
+ MUSB_EP_FIFO_SINGLE(2, FIFO_TX, 512),
|
|
|
+ MUSB_EP_FIFO_SINGLE(2, FIFO_RX, 512),
|
|
|
+ MUSB_EP_FIFO_SINGLE(3, FIFO_TX, 512),
|
|
|
+ MUSB_EP_FIFO_SINGLE(3, FIFO_RX, 512),
|
|
|
+ MUSB_EP_FIFO_SINGLE(4, FIFO_TX, 512),
|
|
|
+ MUSB_EP_FIFO_SINGLE(4, FIFO_RX, 512),
|
|
|
+};
|
|
|
+
|
|
|
static const struct musb_hdrc_config sunxi_musb_hdrc_config = {
|
|
|
.fifo_cfg = sunxi_musb_mode_cfg,
|
|
|
.fifo_cfg_size = ARRAY_SIZE(sunxi_musb_mode_cfg),
|
|
@@ -650,6 +664,18 @@ static const struct musb_hdrc_config sunxi_musb_hdrc_config = {
|
|
|
.dma = 0,
|
|
|
};
|
|
|
|
|
|
+static struct musb_hdrc_config sunxi_musb_hdrc_config_h3 = {
|
|
|
+ .fifo_cfg = sunxi_musb_mode_cfg_h3,
|
|
|
+ .fifo_cfg_size = ARRAY_SIZE(sunxi_musb_mode_cfg_h3),
|
|
|
+ .multipoint = true,
|
|
|
+ .dyn_fifo = true,
|
|
|
+ .soft_con = true,
|
|
|
+ .num_eps = SUNXI_MUSB_MAX_EP_NUM_H3,
|
|
|
+ .ram_bits = SUNXI_MUSB_RAM_BITS,
|
|
|
+ .dma = 0,
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
static int sunxi_musb_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct musb_hdrc_platform_data pdata;
|
|
@@ -692,7 +718,10 @@ static int sunxi_musb_probe(struct platform_device *pdev)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
pdata.platform_ops = &sunxi_musb_ops;
|
|
|
- pdata.config = &sunxi_musb_hdrc_config;
|
|
|
+ if (!of_device_is_compatible(np, "allwinner,sun8i-h3-musb"))
|
|
|
+ pdata.config = &sunxi_musb_hdrc_config;
|
|
|
+ else
|
|
|
+ pdata.config = &sunxi_musb_hdrc_config_h3;
|
|
|
|
|
|
glue->dev = &pdev->dev;
|
|
|
INIT_WORK(&glue->work, sunxi_musb_work);
|
|
@@ -704,7 +733,8 @@ static int sunxi_musb_probe(struct platform_device *pdev)
|
|
|
if (of_device_is_compatible(np, "allwinner,sun6i-a31-musb"))
|
|
|
set_bit(SUNXI_MUSB_FL_HAS_RESET, &glue->flags);
|
|
|
|
|
|
- if (of_device_is_compatible(np, "allwinner,sun8i-a33-musb")) {
|
|
|
+ if (of_device_is_compatible(np, "allwinner,sun8i-a33-musb") ||
|
|
|
+ of_device_is_compatible(np, "allwinner,sun8i-h3-musb")) {
|
|
|
set_bit(SUNXI_MUSB_FL_HAS_RESET, &glue->flags);
|
|
|
set_bit(SUNXI_MUSB_FL_NO_CONFIGDATA, &glue->flags);
|
|
|
}
|
|
@@ -798,6 +828,7 @@ static const struct of_device_id sunxi_musb_match[] = {
|
|
|
{ .compatible = "allwinner,sun4i-a10-musb", },
|
|
|
{ .compatible = "allwinner,sun6i-a31-musb", },
|
|
|
{ .compatible = "allwinner,sun8i-a33-musb", },
|
|
|
+ { .compatible = "allwinner,sun8i-h3-musb", },
|
|
|
{}
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(of, sunxi_musb_match);
|