static int axp_gpio_direction_output(struct udevice *dev, unsigned pin, int val) { __maybe_unused int ret; u8 reg; switch (pin) { #ifdef CONFIG_AXP221_POWER /* Only available on axp221/axp223 */ case SUNXI_GPIO_AXP0_VBUS_ENABLE: ret = pmic_bus_clrbits(AXP221_MISC_CTRL, AXP221_MISC_CTRL_N_VBUSEN_FUNC); if (ret) return ret; return axp_gpio_set_value(dev, pin, val); #endif default: reg = axp_get_gpio_ctrl_reg(pin); if (reg == 0) return -EINVAL; return pmic_bus_write(reg, val ? AXP_GPIO_CTRL_OUTPUT_HIGH : AXP_GPIO_CTRL_OUTPUT_LOW); } }
int gpio_set_value(unsigned gpio, int value) { #ifdef AXP_GPIO if (gpio >= SUNXI_GPIO_AXP0_START) return axp_gpio_set_value(gpio - SUNXI_GPIO_AXP0_START, value); #endif return sunxi_gpio_output(gpio, value); }
static void LCD_bl_close(__u32 sel) { //LCD_BL_EN(sel, 0);//config lcd_bl_en pin to close lcd backlight axp_gpio_set_io(1, 1); axp_gpio_set_value(1, 0); LCD_PWM_EN(sel, 0);//close pwm module }
static void LCD_bl_open(__u32 sel) { LCD_PWM_EN(sel, 1);//open pwm module //LCD_BL_EN(sel, 1);//config lcd_bl_en pin to open lcd backlight axp_gpio_set_io(1, 1); axp_gpio_set_value(1, 1); }
static void lcd_power_ctrl(Bool_t status) { mutex_lock(&lcd_power_mutex); printk(KERN_INFO "%s() Power %s\n", __FUNCTION__, (status ? "ON" : "OFF")); if (status) { //GPIOA27 -> LCD_PWR_EN#: 0 lcd 3.3v gpio_out(PAD_GPIOA_27, 1); lcd_mdelay(20); gpio_out(PAD_GPIOD_8, 1); //GPIOC2 -> VCCx3_EN: 0 gpio_out(PAD_GPIOC_2, 1); #ifdef CONFIG_AW_AXP axp_gpio_set_io(3,1); axp_gpio_set_value(3, 0); #endif lcd_mdelay(20); lcd_signals_ports_ctrl(ON); lcd_mdelay(10); gpio_out(PAD_GPIOD_6, 1); lcd_mdelay(200); data_status = status; } else { data_status = status; lcd_mdelay(30); gpio_out(PAD_GPIOD_6, 0); lcd_signals_ports_ctrl(OFF); lcd_mdelay(20); //GPIOC2 -> VCCx3_EN: 1 gpio_out(PAD_GPIOC_2, 0); #ifdef CONFIG_AW_AXP axp_gpio_set_io(3,0); #endif lcd_mdelay(20); gpio_out(PAD_GPIOD_8, 0); //GPIOA27 -> LCD_PWR_EN#: 1 lcd 3.3v gpio_out(PAD_GPIOA_27, 0); lcd_mdelay(100); //power down sequence, needed } printk(KERN_INFO "%s() Power %s finished\n", __FUNCTION__, (status ? "ON" : "OFF")); mutex_unlock(&lcd_power_mutex); }
static void power_off_lcd(void) { //printk("\n\nLCD: power off lcd.\n"); //VCCx3_EN WRITE_MPEG_REG(0x2013, READ_MPEG_REG(0x2013) & ~(1 << 2)); //WRITE_MPEG_REG(0x2012, READ_MPEG_REG(0x2012) & ~(1 << 2)); #ifdef CONFIG_AW_AXP axp_gpio_set_io(3,1); axp_gpio_set_value(3, 1); #endif msleep(50); //LCD_PWR_EN WRITE_MPEG_REG(0x200d, READ_MPEG_REG(0x200d) | (1 << 27)); //WRITE_MPEG_REG(0x200c, READ_MPEG_REG(0x200c) & ~(1 << 27)); msleep(10); }
static void power_on_lcd(void) { //LCD_PWR_EN: GPIOA_27 WRITE_MPEG_REG(0x200d, READ_MPEG_REG(0x200d) & ~(1 << 27)); WRITE_MPEG_REG(0x200c, READ_MPEG_REG(0x200c) & ~(1 << 27)); msleep(10); #ifdef CONFIG_AW_AXP axp_gpio_set_io(3,1); axp_gpio_set_value(3, 0); #else //VCCx3_EN: GPIOD_2 WRITE_MPEG_REG(0x202c, READ_MPEG_REG(0x202c) & ~(1 << 22)); WRITE_MPEG_REG(0x202d, READ_MPEG_REG(0x202d) & ~(1 << 19)); WRITE_MPEG_REG(0x2013, READ_MPEG_REG(0x2013) | (1 << 18)); WRITE_MPEG_REG(0x2012, READ_MPEG_REG(0x2012) & ~(1 << 18)); #endif msleep(10); }
static ssize_t set_value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct virtual_gpio_data *data = dev_get_drvdata(dev); long val; int ret; if (strict_strtol(buf, 10, &val) != 0) return count; mutex_lock(&data->lock); data->value = val; ret = axp_gpio_set_value(data->gpio,data->value); mutex_unlock(&data->lock); if(ret){ return ret; } return count; }
static void LCD_power_off(__u32 sel) { //LCD_POWER_EN(sel, 0);//config lcd_power pin to close lcd power axp_gpio_set_io(0, 1); axp_gpio_set_value(0, 0); }
static void LCD_power_on(__u32 sel) { //LCD_POWER_EN(sel, 1);//config lcd_power pin to open lcd power axp_gpio_set_io(0, 1); axp_gpio_set_value(0, 1); }