Skip to content

Commit e0d8ea4

Browse files
LorenzoBianconibebarino
authored andcommitted
clk: en7523: Add reset-controller support for EN7581 SoC
Introduce reset API support to EN7581 clock driver. Reviewed-by: AngeloGioacchino Del Regno <[email protected]> Tested-by: Zhengping Zhang <[email protected]> Signed-off-by: Lorenzo Bianconi <[email protected]> Link: https://lore.kernel.org/r/4f735d17e549ea53769bf5a3f50406debb879a44.1719485847.git.lorenzo@kernel.org Signed-off-by: Stephen Boyd <[email protected]>
1 parent 7aa2919 commit e0d8ea4

File tree

1 file changed

+187
-5
lines changed

1 file changed

+187
-5
lines changed

drivers/clk/clk-en7523.c

Lines changed: 187 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
#include <linux/io.h>
66
#include <linux/platform_device.h>
77
#include <linux/property.h>
8+
#include <linux/reset-controller.h>
89
#include <dt-bindings/clock/en7523-clk.h>
10+
#include <dt-bindings/reset/airoha,en7581-reset.h>
11+
12+
#define RST_NR_PER_BANK 32
913

1014
#define REG_PCI_CONTROL 0x88
1115
#define REG_PCI_CONTROL_PERSTOUT BIT(29)
@@ -40,6 +44,9 @@
4044
#define REG_PCIE_XSI0_SEL_MASK GENMASK(14, 13)
4145
#define REG_PCIE_XSI1_SEL_MASK GENMASK(12, 11)
4246

47+
#define REG_RST_CTRL2 0x00
48+
#define REG_RST_CTRL1 0x04
49+
4350
struct en_clk_desc {
4451
int id;
4552
const char *name;
@@ -64,8 +71,20 @@ struct en_clk_gate {
6471
struct clk_hw hw;
6572
};
6673

74+
struct en_rst_data {
75+
const u16 *bank_ofs;
76+
const u16 *idx_map;
77+
void __iomem *base;
78+
struct reset_controller_dev rcdev;
79+
};
80+
6781
struct en_clk_soc_data {
6882
const struct clk_ops pcie_ops;
83+
struct {
84+
const u16 *bank_ofs;
85+
const u16 *idx_map;
86+
u16 idx_map_nr;
87+
} reset;
6988
int (*hw_init)(struct platform_device *pdev, void __iomem *base,
7089
void __iomem *np_base);
7190
};
@@ -168,6 +187,69 @@ static const struct en_clk_desc en7523_base_clks[] = {
168187
}
169188
};
170189

190+
static const u16 en7581_rst_ofs[] = {
191+
REG_RST_CTRL2,
192+
REG_RST_CTRL1,
193+
};
194+
195+
static const u16 en7581_rst_map[] = {
196+
/* RST_CTRL2 */
197+
[EN7581_XPON_PHY_RST] = 0,
198+
[EN7581_CPU_TIMER2_RST] = 2,
199+
[EN7581_HSUART_RST] = 3,
200+
[EN7581_UART4_RST] = 4,
201+
[EN7581_UART5_RST] = 5,
202+
[EN7581_I2C2_RST] = 6,
203+
[EN7581_XSI_MAC_RST] = 7,
204+
[EN7581_XSI_PHY_RST] = 8,
205+
[EN7581_NPU_RST] = 9,
206+
[EN7581_I2S_RST] = 10,
207+
[EN7581_TRNG_RST] = 11,
208+
[EN7581_TRNG_MSTART_RST] = 12,
209+
[EN7581_DUAL_HSI0_RST] = 13,
210+
[EN7581_DUAL_HSI1_RST] = 14,
211+
[EN7581_HSI_RST] = 15,
212+
[EN7581_DUAL_HSI0_MAC_RST] = 16,
213+
[EN7581_DUAL_HSI1_MAC_RST] = 17,
214+
[EN7581_HSI_MAC_RST] = 18,
215+
[EN7581_WDMA_RST] = 19,
216+
[EN7581_WOE0_RST] = 20,
217+
[EN7581_WOE1_RST] = 21,
218+
[EN7581_HSDMA_RST] = 22,
219+
[EN7581_TDMA_RST] = 24,
220+
[EN7581_EMMC_RST] = 25,
221+
[EN7581_SOE_RST] = 26,
222+
[EN7581_PCIE2_RST] = 27,
223+
[EN7581_XFP_MAC_RST] = 28,
224+
[EN7581_USB_HOST_P1_RST] = 29,
225+
[EN7581_USB_HOST_P1_U3_PHY_RST] = 30,
226+
/* RST_CTRL1 */
227+
[EN7581_PCM1_ZSI_ISI_RST] = RST_NR_PER_BANK + 0,
228+
[EN7581_FE_PDMA_RST] = RST_NR_PER_BANK + 1,
229+
[EN7581_FE_QDMA_RST] = RST_NR_PER_BANK + 2,
230+
[EN7581_PCM_SPIWP_RST] = RST_NR_PER_BANK + 4,
231+
[EN7581_CRYPTO_RST] = RST_NR_PER_BANK + 6,
232+
[EN7581_TIMER_RST] = RST_NR_PER_BANK + 8,
233+
[EN7581_PCM1_RST] = RST_NR_PER_BANK + 11,
234+
[EN7581_UART_RST] = RST_NR_PER_BANK + 12,
235+
[EN7581_GPIO_RST] = RST_NR_PER_BANK + 13,
236+
[EN7581_GDMA_RST] = RST_NR_PER_BANK + 14,
237+
[EN7581_I2C_MASTER_RST] = RST_NR_PER_BANK + 16,
238+
[EN7581_PCM2_ZSI_ISI_RST] = RST_NR_PER_BANK + 17,
239+
[EN7581_SFC_RST] = RST_NR_PER_BANK + 18,
240+
[EN7581_UART2_RST] = RST_NR_PER_BANK + 19,
241+
[EN7581_GDMP_RST] = RST_NR_PER_BANK + 20,
242+
[EN7581_FE_RST] = RST_NR_PER_BANK + 21,
243+
[EN7581_USB_HOST_P0_RST] = RST_NR_PER_BANK + 22,
244+
[EN7581_GSW_RST] = RST_NR_PER_BANK + 23,
245+
[EN7581_SFC2_PCM_RST] = RST_NR_PER_BANK + 25,
246+
[EN7581_PCIE0_RST] = RST_NR_PER_BANK + 26,
247+
[EN7581_PCIE1_RST] = RST_NR_PER_BANK + 27,
248+
[EN7581_CPU_TIMER_RST] = RST_NR_PER_BANK + 28,
249+
[EN7581_PCIE_HB_RST] = RST_NR_PER_BANK + 29,
250+
[EN7581_XPON_MAC_RST] = RST_NR_PER_BANK + 31,
251+
};
252+
171253
static unsigned int en7523_get_base_rate(void __iomem *base, unsigned int i)
172254
{
173255
const struct en_clk_desc *desc = &en7523_base_clks[i];
@@ -370,7 +452,7 @@ static int en7581_clk_hw_init(struct platform_device *pdev,
370452
void __iomem *pb_base;
371453
u32 val;
372454

373-
pb_base = devm_platform_ioremap_resource(pdev, 2);
455+
pb_base = devm_platform_ioremap_resource(pdev, 3);
374456
if (IS_ERR(pb_base))
375457
return PTR_ERR(pb_base);
376458

@@ -423,6 +505,95 @@ static void en7523_register_clocks(struct device *dev, struct clk_hw_onecell_dat
423505
clk_data->num = EN7523_NUM_CLOCKS;
424506
}
425507

508+
static int en7523_reset_update(struct reset_controller_dev *rcdev,
509+
unsigned long id, bool assert)
510+
{
511+
struct en_rst_data *rst_data = container_of(rcdev, struct en_rst_data, rcdev);
512+
void __iomem *addr = rst_data->base + rst_data->bank_ofs[id / RST_NR_PER_BANK];
513+
u32 val;
514+
515+
val = readl(addr);
516+
if (assert)
517+
val |= BIT(id % RST_NR_PER_BANK);
518+
else
519+
val &= ~BIT(id % RST_NR_PER_BANK);
520+
writel(val, addr);
521+
522+
return 0;
523+
}
524+
525+
static int en7523_reset_assert(struct reset_controller_dev *rcdev,
526+
unsigned long id)
527+
{
528+
return en7523_reset_update(rcdev, id, true);
529+
}
530+
531+
static int en7523_reset_deassert(struct reset_controller_dev *rcdev,
532+
unsigned long id)
533+
{
534+
return en7523_reset_update(rcdev, id, false);
535+
}
536+
537+
static int en7523_reset_status(struct reset_controller_dev *rcdev,
538+
unsigned long id)
539+
{
540+
struct en_rst_data *rst_data = container_of(rcdev, struct en_rst_data, rcdev);
541+
void __iomem *addr = rst_data->base + rst_data->bank_ofs[id / RST_NR_PER_BANK];
542+
543+
return !!(readl(addr) & BIT(id % RST_NR_PER_BANK));
544+
}
545+
546+
static int en7523_reset_xlate(struct reset_controller_dev *rcdev,
547+
const struct of_phandle_args *reset_spec)
548+
{
549+
struct en_rst_data *rst_data = container_of(rcdev, struct en_rst_data, rcdev);
550+
551+
if (reset_spec->args[0] >= rcdev->nr_resets)
552+
return -EINVAL;
553+
554+
return rst_data->idx_map[reset_spec->args[0]];
555+
}
556+
557+
static const struct reset_control_ops en7523_reset_ops = {
558+
.assert = en7523_reset_assert,
559+
.deassert = en7523_reset_deassert,
560+
.status = en7523_reset_status,
561+
};
562+
563+
static int en7523_reset_register(struct platform_device *pdev,
564+
const struct en_clk_soc_data *soc_data)
565+
{
566+
struct device *dev = &pdev->dev;
567+
struct en_rst_data *rst_data;
568+
void __iomem *base;
569+
570+
/* no reset lines available */
571+
if (!soc_data->reset.idx_map_nr)
572+
return 0;
573+
574+
base = devm_platform_ioremap_resource(pdev, 2);
575+
if (IS_ERR(base))
576+
return PTR_ERR(base);
577+
578+
rst_data = devm_kzalloc(dev, sizeof(*rst_data), GFP_KERNEL);
579+
if (!rst_data)
580+
return -ENOMEM;
581+
582+
rst_data->bank_ofs = soc_data->reset.bank_ofs;
583+
rst_data->idx_map = soc_data->reset.idx_map;
584+
rst_data->base = base;
585+
586+
rst_data->rcdev.nr_resets = soc_data->reset.idx_map_nr;
587+
rst_data->rcdev.of_xlate = en7523_reset_xlate;
588+
rst_data->rcdev.ops = &en7523_reset_ops;
589+
rst_data->rcdev.of_node = dev->of_node;
590+
rst_data->rcdev.of_reset_n_cells = 1;
591+
rst_data->rcdev.owner = THIS_MODULE;
592+
rst_data->rcdev.dev = dev;
593+
594+
return devm_reset_controller_register(dev, &rst_data->rcdev);
595+
}
596+
426597
static int en7523_clk_probe(struct platform_device *pdev)
427598
{
428599
struct device_node *node = pdev->dev.of_node;
@@ -456,11 +627,17 @@ static int en7523_clk_probe(struct platform_device *pdev)
456627

457628
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
458629
if (r)
459-
dev_err(&pdev->dev,
460-
"could not register clock provider: %s: %d\n",
461-
pdev->name, r);
630+
return dev_err_probe(&pdev->dev, r, "Could not register clock provider: %s\n",
631+
pdev->name);
632+
633+
r = en7523_reset_register(pdev, soc_data);
634+
if (r) {
635+
of_clk_del_provider(node);
636+
return dev_err_probe(&pdev->dev, r, "Could not register reset controller: %s\n",
637+
pdev->name);
638+
}
462639

463-
return r;
640+
return 0;
464641
}
465642

466643
static const struct en_clk_soc_data en7523_data = {
@@ -479,6 +656,11 @@ static const struct en_clk_soc_data en7581_data = {
479656
.unprepare = en7581_pci_unprepare,
480657
.disable = en7581_pci_disable,
481658
},
659+
.reset = {
660+
.bank_ofs = en7581_rst_ofs,
661+
.idx_map = en7581_rst_map,
662+
.idx_map_nr = ARRAY_SIZE(en7581_rst_map),
663+
},
482664
.hw_init = en7581_clk_hw_init,
483665
};
484666

0 commit comments

Comments
 (0)