Skip to content

Commit 7f1e9e8

Browse files
Chuan Liusuperna9999
authored andcommitted
soc: amlogic: clk-measure: Define MSR_CLK's register offset separately
Since the MSR_CLK register offset differs between chip variants, we replace the macro-based definition with chip-specific assignments. Change the max_register in regmap_config to be retrieved from DTS. Reviewed-by: Neil Armstrong <[email protected]> Signed-off-by: Chuan Liu <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Neil Armstrong <[email protected]>
1 parent ae3e19c commit 7f1e9e8

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

drivers/soc/amlogic/meson-clk-measure.c

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@
1414

1515
static DEFINE_MUTEX(measure_lock);
1616

17-
#define MSR_CLK_DUTY 0x0
18-
#define MSR_CLK_REG0 0x4
19-
#define MSR_CLK_REG1 0x8
20-
#define MSR_CLK_REG2 0xc
21-
2217
#define MSR_DURATION GENMASK(15, 0)
2318
#define MSR_ENABLE BIT(16)
2419
#define MSR_CONT BIT(17) /* continuous measurement */
@@ -39,9 +34,17 @@ struct meson_msr_id {
3934
const char *name;
4035
};
4136

37+
struct msr_reg_offset {
38+
unsigned int duty_val;
39+
unsigned int freq_ctrl;
40+
unsigned int duty_ctrl;
41+
unsigned int freq_val;
42+
};
43+
4244
struct meson_msr_data {
4345
struct meson_msr_id *msr_table;
4446
unsigned int msr_count;
47+
const struct msr_reg_offset *reg;
4548
};
4649

4750
struct meson_msr {
@@ -495,40 +498,41 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
495498
unsigned int duration)
496499
{
497500
struct meson_msr *priv = clk_msr_id->priv;
501+
const struct msr_reg_offset *reg = priv->data.reg;
498502
unsigned int val;
499503
int ret;
500504

501505
ret = mutex_lock_interruptible(&measure_lock);
502506
if (ret)
503507
return ret;
504508

505-
regmap_write(priv->regmap, MSR_CLK_REG0, 0);
509+
regmap_write(priv->regmap, reg->freq_ctrl, 0);
506510

507511
/* Set measurement duration */
508-
regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_DURATION,
512+
regmap_update_bits(priv->regmap, reg->freq_ctrl, MSR_DURATION,
509513
FIELD_PREP(MSR_DURATION, duration - 1));
510514

511515
/* Set ID */
512-
regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_CLK_SRC,
516+
regmap_update_bits(priv->regmap, reg->freq_ctrl, MSR_CLK_SRC,
513517
FIELD_PREP(MSR_CLK_SRC, clk_msr_id->id));
514518

515519
/* Enable & Start */
516-
regmap_update_bits(priv->regmap, MSR_CLK_REG0,
520+
regmap_update_bits(priv->regmap, reg->freq_ctrl,
517521
MSR_RUN | MSR_ENABLE,
518522
MSR_RUN | MSR_ENABLE);
519523

520-
ret = regmap_read_poll_timeout(priv->regmap, MSR_CLK_REG0,
524+
ret = regmap_read_poll_timeout(priv->regmap, reg->freq_ctrl,
521525
val, !(val & MSR_BUSY), 10, 10000);
522526
if (ret) {
523527
mutex_unlock(&measure_lock);
524528
return ret;
525529
}
526530

527531
/* Disable */
528-
regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_ENABLE, 0);
532+
regmap_update_bits(priv->regmap, reg->freq_ctrl, MSR_ENABLE, 0);
529533

530534
/* Get the value in multiple of gate time counts */
531-
regmap_read(priv->regmap, MSR_CLK_REG2, &val);
535+
regmap_read(priv->regmap, reg->freq_val, &val);
532536

533537
mutex_unlock(&measure_lock);
534538

@@ -599,18 +603,18 @@ static int clk_msr_summary_show(struct seq_file *s, void *data)
599603
}
600604
DEFINE_SHOW_ATTRIBUTE(clk_msr_summary);
601605

602-
static const struct regmap_config meson_clk_msr_regmap_config = {
606+
static struct regmap_config meson_clk_msr_regmap_config = {
603607
.reg_bits = 32,
604608
.val_bits = 32,
605609
.reg_stride = 4,
606-
.max_register = MSR_CLK_REG2,
607610
};
608611

609612
static int meson_msr_probe(struct platform_device *pdev)
610613
{
611614
const struct meson_msr_data *match_data;
612615
struct meson_msr *priv;
613616
struct dentry *root, *clks;
617+
struct resource *res;
614618
void __iomem *base;
615619
int i;
616620

@@ -636,15 +640,24 @@ static int meson_msr_probe(struct platform_device *pdev)
636640
match_data->msr_count * sizeof(struct meson_msr_id));
637641
priv->data.msr_count = match_data->msr_count;
638642

639-
base = devm_platform_ioremap_resource(pdev, 0);
643+
base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
640644
if (IS_ERR(base))
641645
return PTR_ERR(base);
642646

647+
meson_clk_msr_regmap_config.max_register = resource_size(res) - 4;
643648
priv->regmap = devm_regmap_init_mmio(&pdev->dev, base,
644649
&meson_clk_msr_regmap_config);
645650
if (IS_ERR(priv->regmap))
646651
return PTR_ERR(priv->regmap);
647652

653+
priv->data.reg = devm_kzalloc(&pdev->dev, sizeof(struct msr_reg_offset),
654+
GFP_KERNEL);
655+
if (!priv->data.reg)
656+
return -ENOMEM;
657+
658+
memcpy((void *)priv->data.reg, match_data->reg,
659+
sizeof(struct msr_reg_offset));
660+
648661
root = debugfs_create_dir("meson-clk-msr", NULL);
649662
clks = debugfs_create_dir("clks", root);
650663

@@ -664,29 +677,41 @@ static int meson_msr_probe(struct platform_device *pdev)
664677
return 0;
665678
}
666679

680+
static const struct msr_reg_offset msr_reg_offset = {
681+
.duty_val = 0x0,
682+
.freq_ctrl = 0x4,
683+
.duty_ctrl = 0x8,
684+
.freq_val = 0xc,
685+
};
686+
667687
static const struct meson_msr_data clk_msr_gx_data = {
668688
.msr_table = (void *)clk_msr_gx,
669689
.msr_count = ARRAY_SIZE(clk_msr_gx),
690+
.reg = &msr_reg_offset,
670691
};
671692

672693
static const struct meson_msr_data clk_msr_m8_data = {
673694
.msr_table = (void *)clk_msr_m8,
674695
.msr_count = ARRAY_SIZE(clk_msr_m8),
696+
.reg = &msr_reg_offset,
675697
};
676698

677699
static const struct meson_msr_data clk_msr_axg_data = {
678700
.msr_table = (void *)clk_msr_axg,
679701
.msr_count = ARRAY_SIZE(clk_msr_axg),
702+
.reg = &msr_reg_offset,
680703
};
681704

682705
static const struct meson_msr_data clk_msr_g12a_data = {
683706
.msr_table = (void *)clk_msr_g12a,
684707
.msr_count = ARRAY_SIZE(clk_msr_g12a),
708+
.reg = &msr_reg_offset,
685709
};
686710

687711
static const struct meson_msr_data clk_msr_sm1_data = {
688712
.msr_table = (void *)clk_msr_sm1,
689713
.msr_count = ARRAY_SIZE(clk_msr_sm1),
714+
.reg = &msr_reg_offset,
690715
};
691716

692717
static const struct of_device_id meson_msr_match_table[] = {

0 commit comments

Comments
 (0)