Пример #1
0
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],&reg,&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;
}
Пример #2
0
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,
				   &reg, &bit);
			ret =  regmap_update_bits(domain->reg_gpio, reg,
				BIT(bit), oenarg ? BIT(bit) : 0);
			if (ret)
				return ret;
		}
	}
	return 0;
}