On Thu, Apr 30, 2020 at 02:56:57PM +0300, Priit Laes wrote: > On sun7i, the gmac clock is handled by the dwmac-sunxi driver, but > its configuration register is located in the CCU register range, > requiring proper regmap setup. > > In order to do that, we use CLK_OF_DECLARE_DRIVER to initialize > sun7i ccu, which clears the OF_POPULATED flag, allowing the > platform device to probe the same resource with proper device node. > > Signed-off-by: Priit Laes <plaes@xxxxxxxxx> > --- > drivers/clk/sunxi-ng/ccu-sun4i-a10.c | 62 +++++++++++++++++++++++++++- > 1 file changed, 60 insertions(+), 2 deletions(-) > > diff --git a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c > index f32366d9336e..fa147b8ce705 100644 > --- a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c > +++ b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c > @@ -8,6 +8,8 @@ > #include <linux/clk-provider.h> > #include <linux/io.h> > #include <linux/of_address.h> > +#include <linux/platform_device.h> > +#include <linux/regmap.h> > > #include "ccu_common.h" > #include "ccu_reset.h" > @@ -1478,5 +1480,61 @@ static void __init sun7i_a20_ccu_setup(struct device_node *node) > { > sun4i_ccu_init(node, &sun7i_a20_ccu_desc); > } > -CLK_OF_DECLARE(sun7i_a20_ccu, "allwinner,sun7i-a20-ccu", > - sun7i_a20_ccu_setup); > +CLK_OF_DECLARE_DRIVER(sun7i_a20_ccu, "allwinner,sun7i-a20-ccu", > + sun7i_a20_ccu_setup); > + > +/* > + * Regmap for the GMAC driver (dwmac-sunxi) to allow access to > + * GMAC configuration register. > + */ > +#define SUN7I_A20_GMAC_CFG_REG 0x164 > +static bool sun7i_a20_ccu_regmap_accessible_reg(struct device *dev, > + unsigned int reg) > +{ > + if (reg == SUN7I_A20_GMAC_CFG_REG) > + return true; > + return false; > +} > + > +static struct regmap_config sun7i_a20_ccu_regmap_config = { > + .reg_bits = 32, > + .val_bits = 32, > + .reg_stride = 4, > + .max_register = 0x1f4, /* clk_out_b */ > + > + .readable_reg = sun7i_a20_ccu_regmap_accessible_reg, > + .writeable_reg = sun7i_a20_ccu_regmap_accessible_reg, > +}; > + > +static int sun7i_a20_ccu_probe_regmap(struct platform_device *pdev) > +{ > + void __iomem *reg; > + struct resource *res; > + struct regmap *regmap; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + reg = devm_ioremap(&pdev->dev, res->start, resource_size(res)); > + if (IS_ERR(reg)) > + return PTR_ERR(reg); You shouldn't really create a second mapping here but reuse the one you got in sun7i_a20_ccu_setup, since that code expect to be the sole user of it. Storing the virtual address in a global variable should work fine since we only ever have a single instance of the controller Maxime
Attachment:
signature.asc
Description: PGP signature