Lines Matching refs:sr

39 static inline void sr_write_reg(struct omap_sr *sr, unsigned offset, u32 value)
41 __raw_writel(value, (sr->base + offset));
44 static inline void sr_modify_reg(struct omap_sr *sr, unsigned offset, u32 mask,
58 if (sr->ip_type == SR_TYPE_V1 && offset == ERRCONFIG_V1)
60 else if (sr->ip_type == SR_TYPE_V2 && offset == ERRCONFIG_V2)
63 reg_val = __raw_readl(sr->base + offset);
70 __raw_writel(reg_val, (sr->base + offset));
73 static inline u32 sr_read_reg(struct omap_sr *sr, unsigned offset)
75 return __raw_readl(sr->base + offset);
127 static void sr_set_clk_length(struct omap_sr *sr)
132 if (IS_ERR(sr->fck))
135 fclk_speed = clk_get_rate(sr->fck);
139 sr->clk_length = SRCLKLENGTH_12MHZ_SYSCLK;
142 sr->clk_length = SRCLKLENGTH_13MHZ_SYSCLK;
145 sr->clk_length = SRCLKLENGTH_19MHZ_SYSCLK;
148 sr->clk_length = SRCLKLENGTH_26MHZ_SYSCLK;
151 sr->clk_length = SRCLKLENGTH_38MHZ_SYSCLK;
154 dev_err(&sr->pdev->dev, "%s: Invalid fclk rate: %d\n",
160 static void sr_start_vddautocomp(struct omap_sr *sr)
163 dev_warn(&sr->pdev->dev,
169 if (!sr_class->enable(sr))
170 sr->autocomp_active = true;
173 static void sr_stop_vddautocomp(struct omap_sr *sr)
176 dev_warn(&sr->pdev->dev,
182 if (sr->autocomp_active) {
183 sr_class->disable(sr, 1);
184 sr->autocomp_active = false;
190 * only when both sr device and class driver regiter has
191 * completed. This will be attempted to be called from both sr class
192 * driver register and sr device intializtion API's. Only one call
221 static void sr_v1_disable(struct omap_sr *sr)
228 sr_modify_reg(sr, ERRCONFIG_V1,
232 sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, 0x0);
235 if (sr_read_reg(sr, ERRCONFIG_V1) & ERRCONFIG_VPBOUNDINTST_V1)
237 sr_modify_reg(sr, ERRCONFIG_V1,
246 sr_test_cond_timeout((sr_read_reg(sr, ERRCONFIG_V1) &
251 dev_warn(&sr->pdev->dev, "%s: Smartreflex disable timedout\n",
255 sr_modify_reg(sr, ERRCONFIG_V1, ERRCONFIG_MCUDISACKINTEN,
259 static void sr_v2_disable(struct omap_sr *sr)
264 sr_write_reg(sr, IRQENABLE_SET, IRQENABLE_MCUDISABLEACKINT);
267 sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, 0x0);
274 if (sr_read_reg(sr, ERRCONFIG_V2) & ERRCONFIG_VPBOUNDINTST_V2)
275 sr_modify_reg(sr, ERRCONFIG_V2, ERRCONFIG_VPBOUNDINTEN_V2,
278 sr_modify_reg(sr, ERRCONFIG_V2, ERRCONFIG_VPBOUNDINTEN_V2,
280 sr_write_reg(sr, IRQENABLE_CLR, (IRQENABLE_MCUACCUMINT |
283 sr_write_reg(sr, IRQSTATUS, (IRQSTATUS_MCUACCUMINT |
291 sr_test_cond_timeout((sr_read_reg(sr, IRQSTATUS) &
296 dev_warn(&sr->pdev->dev, "%s: Smartreflex disable timedout\n",
300 sr_write_reg(sr, IRQENABLE_CLR, IRQENABLE_MCUDISABLEACKINT);
301 sr_write_reg(sr, IRQSTATUS, IRQSTATUS_MCUDISABLEACKINT);
305 struct omap_sr *sr, u32 efuse_offs)
309 if (!sr->nvalue_table) {
310 dev_warn(&sr->pdev->dev, "%s: Missing ntarget value table\n",
315 for (i = 0; i < sr->nvalue_count; i++) {
316 if (sr->nvalue_table[i].efuse_offs == efuse_offs)
317 return &sr->nvalue_table[i];
328 * @sr: SR module to be configured.
337 int sr_configure_errgen(struct omap_sr *sr)
344 if (!sr) {
350 if (!sr->clk_length)
351 sr_set_clk_length(sr);
353 senp_en = sr->senp_mod;
354 senn_en = sr->senn_mod;
356 sr_config = (sr->clk_length << SRCONFIG_SRCLKLENGTH_SHIFT) |
359 switch (sr->ip_type) {
376 dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
382 sr_write_reg(sr, SRCONFIG, sr_config);
383 sr_errconfig = (sr->err_weight << ERRCONFIG_ERRWEIGHT_SHIFT) |
384 (sr->err_maxlimit << ERRCONFIG_ERRMAXLIMIT_SHIFT) |
385 (sr->err_minlimit << ERRCONFIG_ERRMINLIMIT_SHIFT);
386 sr_modify_reg(sr, errconfig_offs, (SR_ERRWEIGHT_MASK |
391 sr_modify_reg(sr, errconfig_offs, (vpboundint_en | vpboundint_st),
399 * @sr: SR module to be configured.
406 int sr_disable_errgen(struct omap_sr *sr)
411 if (!sr) {
417 switch (sr->ip_type) {
429 dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
435 sr_modify_reg(sr, SRCONFIG, SRCONFIG_SENENABLE | SRCONFIG_ERRGEN_EN, 0);
443 sr_modify_reg(sr, errconfig_offs, vpboundint_en | vpboundint_st, 0);
451 * @sr: SR module to be configured.
460 int sr_configure_minmax(struct omap_sr *sr)
466 if (!sr) {
472 if (!sr->clk_length)
473 sr_set_clk_length(sr);
475 senp_en = sr->senp_mod;
476 senn_en = sr->senn_mod;
478 sr_config = (sr->clk_length << SRCONFIG_SRCLKLENGTH_SHIFT) |
480 (sr->accum_data << SRCONFIG_ACCUMDATA_SHIFT);
482 switch (sr->ip_type) {
493 dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
499 sr_write_reg(sr, SRCONFIG, sr_config);
500 sr_avgwt = (sr->senp_avgweight << AVGWEIGHT_SENPAVGWEIGHT_SHIFT) |
501 (sr->senn_avgweight << AVGWEIGHT_SENNAVGWEIGHT_SHIFT);
502 sr_write_reg(sr, AVGWEIGHT, sr_avgwt);
508 switch (sr->ip_type) {
510 sr_modify_reg(sr, ERRCONFIG_V1,
518 sr_write_reg(sr, IRQSTATUS,
521 sr_write_reg(sr, IRQENABLE_SET,
526 dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
536 * @sr: pointer to which the SR module to be configured belongs to.
545 int sr_enable(struct omap_sr *sr, unsigned long volt)
551 if (!sr) {
557 volt_data = omap_voltage_get_voltdata(sr->voltdm, volt);
560 dev_warn(&sr->pdev->dev, "%s: Unable to get voltage table for nominal voltage %ld\n",
565 nvalue_row = sr_retrieve_nvalue_row(sr, volt_data->sr_efuse_offs);
568 dev_warn(&sr->pdev->dev, "%s: failure getting SR data for this voltage %ld\n",
574 sr->err_minlimit = nvalue_row->errminlimit;
576 clk_enable(sr->fck);
579 if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE)
583 ret = sr_class->configure(sr);
587 sr_write_reg(sr, NVALUERECIPROCAL, nvalue_row->nvalue);
590 sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, SRCONFIG_SRENABLE);
593 sr->enabled = 1;
600 * @sr: pointer to which the SR module to be configured belongs to.
605 void sr_disable(struct omap_sr *sr)
607 if (!sr) {
614 if (!sr->enabled)
621 if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE) {
622 switch (sr->ip_type) {
624 sr_v1_disable(sr);
627 sr_v2_disable(sr);
630 dev_err(&sr->pdev->dev, "UNKNOWN IP type %d\n",
631 sr->ip_type);
635 clk_disable(sr->fck);
636 sr->enabled = 0;
641 * @class_data: The structure containing various sr class specific data.
667 * both sr driver and sr class driver to be initiallized.
687 struct omap_sr *sr = _sr_lookup(voltdm);
689 if (IS_ERR(sr)) {
694 if (!sr->autocomp_active)
698 dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
703 sr_class->enable(sr);
719 struct omap_sr *sr = _sr_lookup(voltdm);
721 if (IS_ERR(sr)) {
726 if (!sr->autocomp_active)
730 dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
735 sr_class->disable(sr, 0);
751 struct omap_sr *sr = _sr_lookup(voltdm);
753 if (IS_ERR(sr)) {
758 if (!sr->autocomp_active)
762 dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
767 sr_class->disable(sr, 1);
877 * both sr driver and sr class driver to be initiallized.