int amlogic_pin_config_group_set(struct pinctrl_dev *pctldev, unsigned group, unsigned long config) { unsigned reg,bit,ret=-1,i; struct amlogic_pmx *apmx = pinctrl_dev_get_drvdata(pctldev); u16 pullparam = AML_PINCONF_UNPACK_PULL_PARA(config); u16 oenparam = AML_PINCONF_UNPACK_ENOUT_PARA(config); u16 oenarg = AML_PINCONF_UNPACK_ENOUT_ARG(config); const struct amlogic_pin_group *pin_group=&apmx->soc->groups[group]; const unsigned int *pins=pin_group->pins; const unsigned int num_pins=pin_group->num_pins; dbg_print("config=0x%x\n",config); if(AML_PCON_PULLUP==pullparam) { for(i=0;i<num_pins;i++){ ret=apmx->soc->meson_set_pullup(pins[i],config); } } if(AML_PCON_ENOUT==oenparam) { for(i=0;i<num_pins;i++){ ret=apmx->soc->pin_map_to_direction(pins[i],®,&bit); dbg_print("pin[%d]=%d,reg=%d,bit=%d\n",i,pins[i],reg,bit); if(!ret) { if(oenarg) aml_set_reg32_mask(p_gpio_oen_addr[reg],1<<bit); else aml_clr_reg32_mask(p_gpio_oen_addr[reg],1<<bit); } } } return ret; }
int amlogic_pin_config_group_set(struct pinctrl_dev *pctldev, unsigned group, unsigned long *configs, unsigned num_configs) { unsigned reg, bit, ret = -1, i; struct amlogic_pmx *apmx = pinctrl_dev_get_drvdata(pctldev); unsigned int config = configs[0]; u16 pullparam = AML_PINCONF_UNPACK_PULL_PARA(config); u16 oenparam = AML_PINCONF_UNPACK_ENOUT_PARA(config); u16 oenarg = AML_PINCONF_UNPACK_ENOUT_ARG(config); const struct amlogic_pin_group *pin_group = &apmx->soc->groups[group]; const unsigned int *pins = pin_group->pins; const unsigned int num_pins = pin_group->num_pins; struct meson_domain *domain; struct meson_bank *bank; if (AML_PCON_PULLUP == pullparam) { for (i = 0; i < num_pins; i++) ret = meson_get_domain_and_bank(apmx, pins[i], &domain, &bank); if (ret) return ret; ret = meson_config_pullup(pins[i], domain, bank, config); if (ret) return ret; } if (AML_PCON_ENOUT == oenparam) { for (i = 0; i < num_pins; i++) { ret = meson_get_domain_and_bank(apmx, pins[i], &domain, &bank); if (ret) return ret; meson_calc_reg_and_bit(bank, pins[i], REG_DIR, ®, &bit); ret = regmap_update_bits(domain->reg_gpio, reg, BIT(bit), oenarg ? BIT(bit) : 0); if (ret) return ret; } } return 0; }