int stmp3xxx_request_pin_group(struct pin_group *pin_group, const char *label) { struct pin_desc *pin; int p; int err = 0; /* Allocate and configure pins */ for (p = 0; p < pin_group->nr_pins; p++) { pr_debug("%s: #%d\n", __func__, p); pin = &pin_group->pins[p]; err = stmp3xxx_request_pin(pin->id, pin->fun, label); if (err) goto out_err; stmp3xxx_pin_strength(pin->id, pin->strength, label); stmp3xxx_pin_voltage(pin->id, pin->voltage, label); stmp3xxx_pin_pullup(pin->id, pin->pullup, label); } return 0; out_err: /* Release allocated pins in case of error */ while (--p >= 0) { pr_debug("%s: releasing #%d\n", __func__, p); stmp3xxx_release_pin(pin_group->pins[p].id, label); } return err; }
static int init_bl(struct stmp3xxx_platform_bl_data *data) { int ret = 0; pwm_clk = clk_get(NULL, "pwm"); if (IS_ERR(pwm_clk)) { ret = PTR_ERR(pwm_clk); goto out; } clk_enable(pwm_clk); stmp3xxx_reset_block(REGS_PWM_BASE, 1); ret = stmp3xxx_request_pin(PINID_PWM2, PIN_FUN1, "lcd_hx8238a"); if (ret) goto out_mux; stmp3xxx_pin_voltage(PINID_PWM2, PIN_12MA, "lcd_hx8238a"); stmp3xxx_pin_strength(PINID_PWM2, PIN_3_3V, "lcd_hx8238a"); stmp3xxx_clearl(BM_PWM_CTRL_PWM2_ENABLE, REGS_PWM_BASE + HW_PWM_CTRL); stmp3xxx_setl(BM_PWM_CTRL_PWM2_ANA_CTRL_ENABLE, REGS_PWM_BASE + HW_PWM_CTRL); __raw_writel(BF(10, PWM_ACTIVEn_INACTIVE) | BF(5, PWM_ACTIVEn_ACTIVE), REGS_PWM_BASE + HW_PWM_ACTIVEn(2)); __raw_writel(BF(1, PWM_PERIODn_CDIV) | /* divide by 2 */ BF(2, PWM_PERIODn_INACTIVE_STATE) | /* low */ BF(3, PWM_PERIODn_ACTIVE_STATE) | /* high */ BF(14, PWM_PERIODn_PERIOD), REGS_PWM_BASE + HW_PWM_PERIODn(2)); return 0; out_mux: clk_put(pwm_clk); out: return ret; }
static int init_bl(struct stmp3xxx_platform_bl_data *data) { int ret = 0; pwm_clk = clk_get(NULL, "pwm"); if (IS_ERR(pwm_clk)) { ret = PTR_ERR(pwm_clk); goto out; } clk_enable(pwm_clk); stmp3xxx_reset_block(REGS_PWM_BASE, 1); ret = stmp3xxx_request_pin(PINID_PWM2, PIN_FUN1, "lcd_lms430"); if (ret) goto out_mux; stmp3xxx_pin_voltage(PINID_PWM2, PIN_8MA, "lcd_lms430"); stmp3xxx_pin_strength(PINID_PWM2, PIN_3_3V, "lcd_lms430"); HW_PWM_ACTIVEn_WR(2, BF_PWM_ACTIVEn_INACTIVE(0) | BF_PWM_ACTIVEn_ACTIVE(0)); HW_PWM_PERIODn_WR(2, BF_PWM_PERIODn_CDIV(6) | /* divide by 64 */ BF_PWM_PERIODn_INACTIVE_STATE(2) | /* low */ BF_PWM_PERIODn_ACTIVE_STATE(3) | /* high */ BF_PWM_PERIODn_PERIOD(599)); HW_PWM_CTRL_SET(BM_PWM_CTRL_PWM2_ENABLE); return 0; out_mux: clk_put(pwm_clk); out: return ret; }
static void free_bl(struct stmp3xxx_platform_bl_data *data) { HW_PWM_ACTIVEn_WR(2, BF_PWM_ACTIVEn_INACTIVE(0) | BF_PWM_ACTIVEn_ACTIVE(0)); HW_PWM_PERIODn_WR(2, BF_PWM_PERIODn_CDIV(6) | /* divide by 64 */ BF_PWM_PERIODn_INACTIVE_STATE(2) | /* low */ BF_PWM_PERIODn_ACTIVE_STATE(3) | /* high */ BF_PWM_PERIODn_PERIOD(599)); HW_PWM_CTRL_CLR(BM_PWM_CTRL_PWM2_ENABLE); stmp3xxx_pin_voltage(PINID_PWM2, PIN_4MA, "lcd_lms430"); stmp3xxx_pin_strength(PINID_PWM2, PIN_1_8V, "lcd_lms430"); stmp3xxx_release_pin(PINID_PWM2, "lcd_lms430"); clk_disable(pwm_clk); clk_put(pwm_clk); }