Lines Matching full:sr

38 static inline void sr_write_reg(struct omap_sr *sr, unsigned offset, u32 value)  in sr_write_reg()  argument
40 __raw_writel(value, (sr->base + offset)); in sr_write_reg()
43 static inline void sr_modify_reg(struct omap_sr *sr, unsigned offset, u32 mask, in sr_modify_reg() argument
57 if (sr->ip_type == SR_TYPE_V1 && offset == ERRCONFIG_V1) in sr_modify_reg()
59 else if (sr->ip_type == SR_TYPE_V2 && offset == ERRCONFIG_V2) in sr_modify_reg()
62 reg_val = __raw_readl(sr->base + offset); in sr_modify_reg()
69 __raw_writel(reg_val, (sr->base + offset)); in sr_modify_reg()
72 static inline u32 sr_read_reg(struct omap_sr *sr, unsigned offset) in sr_read_reg() argument
74 return __raw_readl(sr->base + offset); in sr_read_reg()
126 static void sr_set_clk_length(struct omap_sr *sr) in sr_set_clk_length() argument
131 if (IS_ERR(sr->fck)) in sr_set_clk_length()
134 fclk_speed = clk_get_rate(sr->fck); in sr_set_clk_length()
138 sr->clk_length = SRCLKLENGTH_12MHZ_SYSCLK; in sr_set_clk_length()
141 sr->clk_length = SRCLKLENGTH_13MHZ_SYSCLK; in sr_set_clk_length()
144 sr->clk_length = SRCLKLENGTH_19MHZ_SYSCLK; in sr_set_clk_length()
147 sr->clk_length = SRCLKLENGTH_26MHZ_SYSCLK; in sr_set_clk_length()
150 sr->clk_length = SRCLKLENGTH_38MHZ_SYSCLK; in sr_set_clk_length()
153 dev_err(&sr->pdev->dev, "%s: Invalid fclk rate: %d\n", in sr_set_clk_length()
159 static void sr_start_vddautocomp(struct omap_sr *sr) in sr_start_vddautocomp() argument
162 dev_warn(&sr->pdev->dev, in sr_start_vddautocomp()
168 if (!sr_class->enable(sr)) in sr_start_vddautocomp()
169 sr->autocomp_active = true; in sr_start_vddautocomp()
172 static void sr_stop_vddautocomp(struct omap_sr *sr) in sr_stop_vddautocomp() argument
175 dev_warn(&sr->pdev->dev, in sr_stop_vddautocomp()
181 if (sr->autocomp_active) { in sr_stop_vddautocomp()
182 sr_class->disable(sr, 1); in sr_stop_vddautocomp()
183 sr->autocomp_active = false; in sr_stop_vddautocomp()
189 * only when both sr device and class driver regiter has
190 * completed. This will be attempted to be called from both sr class
191 * driver register and sr device intializtion API's. Only one call
194 * Currently this function registers interrupt handler for a particular SR
196 * requested for interrupts and the SR interrupt line in present.
220 static void sr_v1_disable(struct omap_sr *sr) in sr_v1_disable() argument
227 sr_modify_reg(sr, ERRCONFIG_V1, in sr_v1_disable()
230 /* SRCONFIG - disable SR */ in sr_v1_disable()
231 sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, 0x0); in sr_v1_disable()
233 /* Disable all other SR interrupts and clear the status as needed */ in sr_v1_disable()
234 if (sr_read_reg(sr, ERRCONFIG_V1) & ERRCONFIG_VPBOUNDINTST_V1) in sr_v1_disable()
236 sr_modify_reg(sr, ERRCONFIG_V1, in sr_v1_disable()
242 * Wait for SR to be disabled. in sr_v1_disable()
245 sr_test_cond_timeout((sr_read_reg(sr, ERRCONFIG_V1) & in sr_v1_disable()
250 dev_warn(&sr->pdev->dev, "%s: Smartreflex disable timedout\n", in sr_v1_disable()
254 sr_modify_reg(sr, ERRCONFIG_V1, ERRCONFIG_MCUDISACKINTEN, in sr_v1_disable()
258 static void sr_v2_disable(struct omap_sr *sr) in sr_v2_disable() argument
263 sr_write_reg(sr, IRQENABLE_SET, IRQENABLE_MCUDISABLEACKINT); in sr_v2_disable()
265 /* SRCONFIG - disable SR */ in sr_v2_disable()
266 sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, 0x0); in sr_v2_disable()
269 * Disable all other SR interrupts and clear the status in sr_v2_disable()
273 if (sr_read_reg(sr, ERRCONFIG_V2) & ERRCONFIG_VPBOUNDINTST_V2) in sr_v2_disable()
274 sr_modify_reg(sr, ERRCONFIG_V2, ERRCONFIG_VPBOUNDINTEN_V2, in sr_v2_disable()
277 sr_modify_reg(sr, ERRCONFIG_V2, ERRCONFIG_VPBOUNDINTEN_V2, in sr_v2_disable()
279 sr_write_reg(sr, IRQENABLE_CLR, (IRQENABLE_MCUACCUMINT | in sr_v2_disable()
282 sr_write_reg(sr, IRQSTATUS, (IRQSTATUS_MCUACCUMINT | in sr_v2_disable()
287 * Wait for SR to be disabled. in sr_v2_disable()
290 sr_test_cond_timeout((sr_read_reg(sr, IRQSTATUS) & in sr_v2_disable()
295 dev_warn(&sr->pdev->dev, "%s: Smartreflex disable timedout\n", in sr_v2_disable()
299 sr_write_reg(sr, IRQENABLE_CLR, IRQENABLE_MCUDISABLEACKINT); in sr_v2_disable()
300 sr_write_reg(sr, IRQSTATUS, IRQSTATUS_MCUDISABLEACKINT); in sr_v2_disable()
304 struct omap_sr *sr, u32 efuse_offs) in sr_retrieve_nvalue_row() argument
308 if (!sr->nvalue_table) { in sr_retrieve_nvalue_row()
309 dev_warn(&sr->pdev->dev, "%s: Missing ntarget value table\n", in sr_retrieve_nvalue_row()
314 for (i = 0; i < sr->nvalue_count; i++) { in sr_retrieve_nvalue_row()
315 if (sr->nvalue_table[i].efuse_offs == efuse_offs) in sr_retrieve_nvalue_row()
316 return &sr->nvalue_table[i]; in sr_retrieve_nvalue_row()
327 * @sr: SR module to be configured.
331 * SR settings if using the ERROR module inside Smartreflex.
332 * SR CLASS 3 by default uses only the ERROR module where as
333 * SR CLASS 2 can choose between ERROR module and MINMAXAVG
336 int sr_configure_errgen(struct omap_sr *sr) in sr_configure_errgen() argument
343 if (!sr) { in sr_configure_errgen()
349 if (!sr->clk_length) in sr_configure_errgen()
350 sr_set_clk_length(sr); in sr_configure_errgen()
352 senp_en = sr->senp_mod; in sr_configure_errgen()
353 senn_en = sr->senn_mod; in sr_configure_errgen()
355 sr_config = (sr->clk_length << SRCONFIG_SRCLKLENGTH_SHIFT) | in sr_configure_errgen()
358 switch (sr->ip_type) { in sr_configure_errgen()
375 dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n", in sr_configure_errgen()
381 sr_write_reg(sr, SRCONFIG, sr_config); in sr_configure_errgen()
382 sr_errconfig = (sr->err_weight << ERRCONFIG_ERRWEIGHT_SHIFT) | in sr_configure_errgen()
383 (sr->err_maxlimit << ERRCONFIG_ERRMAXLIMIT_SHIFT) | in sr_configure_errgen()
384 (sr->err_minlimit << ERRCONFIG_ERRMINLIMIT_SHIFT); in sr_configure_errgen()
385 sr_modify_reg(sr, errconfig_offs, (SR_ERRWEIGHT_MASK | in sr_configure_errgen()
390 sr_modify_reg(sr, errconfig_offs, (vpboundint_en | vpboundint_st), in sr_configure_errgen()
398 * @sr: SR module to be configured.
405 int sr_disable_errgen(struct omap_sr *sr) in sr_disable_errgen() argument
410 if (!sr) { in sr_disable_errgen()
416 switch (sr->ip_type) { in sr_disable_errgen()
428 dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n", in sr_disable_errgen()
434 sr_modify_reg(sr, SRCONFIG, SRCONFIG_SENENABLE | SRCONFIG_ERRGEN_EN, 0); in sr_disable_errgen()
442 sr_modify_reg(sr, errconfig_offs, vpboundint_en | vpboundint_st, 0); in sr_disable_errgen()
450 * @sr: SR module to be configured.
454 * SR settings if using the ERROR module inside Smartreflex.
455 * SR CLASS 3 by default uses only the ERROR module where as
456 * SR CLASS 2 can choose between ERROR module and MINMAXAVG
459 int sr_configure_minmax(struct omap_sr *sr) in sr_configure_minmax() argument
465 if (!sr) { in sr_configure_minmax()
471 if (!sr->clk_length) in sr_configure_minmax()
472 sr_set_clk_length(sr); in sr_configure_minmax()
474 senp_en = sr->senp_mod; in sr_configure_minmax()
475 senn_en = sr->senn_mod; in sr_configure_minmax()
477 sr_config = (sr->clk_length << SRCONFIG_SRCLKLENGTH_SHIFT) | in sr_configure_minmax()
479 (sr->accum_data << SRCONFIG_ACCUMDATA_SHIFT); in sr_configure_minmax()
481 switch (sr->ip_type) { in sr_configure_minmax()
492 dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n", in sr_configure_minmax()
498 sr_write_reg(sr, SRCONFIG, sr_config); in sr_configure_minmax()
499 sr_avgwt = (sr->senp_avgweight << AVGWEIGHT_SENPAVGWEIGHT_SHIFT) | in sr_configure_minmax()
500 (sr->senn_avgweight << AVGWEIGHT_SENNAVGWEIGHT_SHIFT); in sr_configure_minmax()
501 sr_write_reg(sr, AVGWEIGHT, sr_avgwt); in sr_configure_minmax()
507 switch (sr->ip_type) { in sr_configure_minmax()
509 sr_modify_reg(sr, ERRCONFIG_V1, in sr_configure_minmax()
517 sr_write_reg(sr, IRQSTATUS, in sr_configure_minmax()
520 sr_write_reg(sr, IRQENABLE_SET, in sr_configure_minmax()
525 dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n", in sr_configure_minmax()
535 * @sr: pointer to which the SR module to be configured belongs to.
544 int sr_enable(struct omap_sr *sr, unsigned long volt) in sr_enable() argument
550 if (!sr) { in sr_enable()
556 volt_data = omap_voltage_get_voltdata(sr->voltdm, volt); in sr_enable()
559 dev_warn(&sr->pdev->dev, "%s: Unable to get voltage table for nominal voltage %ld\n", in sr_enable()
564 nvalue_row = sr_retrieve_nvalue_row(sr, volt_data->sr_efuse_offs); in sr_enable()
567 dev_warn(&sr->pdev->dev, "%s: failure getting SR data for this voltage %ld\n", in sr_enable()
573 sr->err_minlimit = nvalue_row->errminlimit; in sr_enable()
575 clk_enable(sr->fck); in sr_enable()
577 /* Check if SR is already enabled. If yes do nothing */ in sr_enable()
578 if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE) in sr_enable()
581 /* Configure SR */ in sr_enable()
582 ret = sr_class->configure(sr); in sr_enable()
586 sr_write_reg(sr, NVALUERECIPROCAL, nvalue_row->nvalue); in sr_enable()
588 /* SRCONFIG - enable SR */ in sr_enable()
589 sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, SRCONFIG_SRENABLE); in sr_enable()
592 sr->enabled = 1; in sr_enable()
599 * @sr: pointer to which the SR module to be configured belongs to.
604 void sr_disable(struct omap_sr *sr) in sr_disable() argument
606 if (!sr) { in sr_disable()
612 /* Check if SR clocks are already disabled. If yes do nothing */ in sr_disable()
613 if (!sr->enabled) in sr_disable()
617 * Disable SR if only it is indeed enabled. Else just in sr_disable()
620 if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE) { in sr_disable()
621 switch (sr->ip_type) { in sr_disable()
623 sr_v1_disable(sr); in sr_disable()
626 sr_v2_disable(sr); in sr_disable()
629 dev_err(&sr->pdev->dev, "UNKNOWN IP type %d\n", in sr_disable()
630 sr->ip_type); in sr_disable()
634 clk_disable(sr->fck); in sr_disable()
635 sr->enabled = 0; in sr_disable()
640 * @class_data: The structure containing various sr class specific data.
666 * both sr driver and sr class driver to be initiallized. in sr_register_class()
675 * omap_sr_enable() - API to enable SR clocks and to call into the
677 * @voltdm: VDD pointer to which the SR module to be configured belongs to.
686 struct omap_sr *sr = _sr_lookup(voltdm); in omap_sr_enable() local
688 if (IS_ERR(sr)) { in omap_sr_enable()
693 if (!sr->autocomp_active) in omap_sr_enable()
697 dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n", in omap_sr_enable()
702 sr_class->enable(sr); in omap_sr_enable()
706 * omap_sr_disable() - API to disable SR without resetting the voltage
708 * @voltdm: VDD pointer to which the SR module to be configured belongs to.
718 struct omap_sr *sr = _sr_lookup(voltdm); in omap_sr_disable() local
720 if (IS_ERR(sr)) { in omap_sr_disable()
725 if (!sr->autocomp_active) in omap_sr_disable()
729 dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n", in omap_sr_disable()
734 sr_class->disable(sr, 0); in omap_sr_disable()
738 * omap_sr_disable_reset_volt() - API to disable SR and reset the
740 * @voltdm: VDD pointer to which the SR module to be configured belongs to.
750 struct omap_sr *sr = _sr_lookup(voltdm); in omap_sr_disable_reset_volt() local
752 if (IS_ERR(sr)) { in omap_sr_disable_reset_volt()
757 if (!sr->autocomp_active) in omap_sr_disable_reset_volt()
761 dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n", in omap_sr_disable_reset_volt()
766 sr_class->disable(sr, 1); in omap_sr_disable_reset_volt()
876 * both sr driver and sr class driver to be initiallized. in omap_sr_probe()
881 pr_warn("%s: Error in SR late init\n", __func__); in omap_sr_probe()
985 pr_err("%s: platform driver register failed for SR\n", in sr_init()