|
|
@@ -349,7 +349,7 @@ static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata,
|
|
|
{
|
|
|
struct samsung_pin_bank *b;
|
|
|
|
|
|
- b = drvdata->ctrl->pin_banks;
|
|
|
+ b = drvdata->pin_banks;
|
|
|
|
|
|
while ((pin >= b->pin_base) &&
|
|
|
((b->pin_base + b->nr_pins - 1) < pin))
|
|
|
@@ -378,7 +378,7 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
|
|
|
func = &drvdata->pmx_functions[selector];
|
|
|
grp = &drvdata->pin_groups[group];
|
|
|
|
|
|
- pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->ctrl->base,
|
|
|
+ pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->pin_base,
|
|
|
®, &pin_offset, &bank);
|
|
|
type = bank->type;
|
|
|
mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
|
|
|
@@ -431,7 +431,7 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,
|
|
|
unsigned long flags;
|
|
|
|
|
|
drvdata = pinctrl_dev_get_drvdata(pctldev);
|
|
|
- pin_to_reg_bank(drvdata, pin - drvdata->ctrl->base, ®_base,
|
|
|
+ pin_to_reg_bank(drvdata, pin - drvdata->pin_base, ®_base,
|
|
|
&pin_offset, &bank);
|
|
|
type = bank->type;
|
|
|
|
|
|
@@ -834,32 +834,32 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
|
|
|
ctrldesc->confops = &samsung_pinconf_ops;
|
|
|
|
|
|
pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
|
|
|
- drvdata->ctrl->nr_pins, GFP_KERNEL);
|
|
|
+ drvdata->nr_pins, GFP_KERNEL);
|
|
|
if (!pindesc) {
|
|
|
dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
ctrldesc->pins = pindesc;
|
|
|
- ctrldesc->npins = drvdata->ctrl->nr_pins;
|
|
|
+ ctrldesc->npins = drvdata->nr_pins;
|
|
|
|
|
|
/* dynamically populate the pin number and pin name for pindesc */
|
|
|
for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
|
|
|
- pdesc->number = pin + drvdata->ctrl->base;
|
|
|
+ pdesc->number = pin + drvdata->pin_base;
|
|
|
|
|
|
/*
|
|
|
* allocate space for storing the dynamically generated names for all
|
|
|
* the pins which belong to this pin-controller.
|
|
|
*/
|
|
|
pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *
|
|
|
- drvdata->ctrl->nr_pins, GFP_KERNEL);
|
|
|
+ drvdata->nr_pins, GFP_KERNEL);
|
|
|
if (!pin_names) {
|
|
|
dev_err(&pdev->dev, "mem alloc for pin names failed\n");
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
/* for each pin, the name of the pin is pin-bank name + pin number */
|
|
|
- for (bank = 0; bank < drvdata->ctrl->nr_banks; bank++) {
|
|
|
- pin_bank = &drvdata->ctrl->pin_banks[bank];
|
|
|
+ for (bank = 0; bank < drvdata->nr_banks; bank++) {
|
|
|
+ pin_bank = &drvdata->pin_banks[bank];
|
|
|
for (pin = 0; pin < pin_bank->nr_pins; pin++) {
|
|
|
sprintf(pin_names, "%s-%d", pin_bank->name, pin);
|
|
|
pdesc = pindesc + pin_bank->pin_base + pin;
|
|
|
@@ -878,11 +878,11 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- for (bank = 0; bank < drvdata->ctrl->nr_banks; ++bank) {
|
|
|
- pin_bank = &drvdata->ctrl->pin_banks[bank];
|
|
|
+ for (bank = 0; bank < drvdata->nr_banks; ++bank) {
|
|
|
+ pin_bank = &drvdata->pin_banks[bank];
|
|
|
pin_bank->grange.name = pin_bank->name;
|
|
|
pin_bank->grange.id = bank;
|
|
|
- pin_bank->grange.pin_base = drvdata->ctrl->base
|
|
|
+ pin_bank->grange.pin_base = drvdata->pin_base
|
|
|
+ pin_bank->pin_base;
|
|
|
pin_bank->grange.base = pin_bank->gpio_chip.base;
|
|
|
pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
|
|
|
@@ -918,17 +918,16 @@ static const struct gpio_chip samsung_gpiolib_chip = {
|
|
|
static int samsung_gpiolib_register(struct platform_device *pdev,
|
|
|
struct samsung_pinctrl_drv_data *drvdata)
|
|
|
{
|
|
|
- struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
|
|
- struct samsung_pin_bank *bank = ctrl->pin_banks;
|
|
|
+ struct samsung_pin_bank *bank = drvdata->pin_banks;
|
|
|
struct gpio_chip *gc;
|
|
|
int ret;
|
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
|
|
|
+ for (i = 0; i < drvdata->nr_banks; ++i, ++bank) {
|
|
|
bank->gpio_chip = samsung_gpiolib_chip;
|
|
|
|
|
|
gc = &bank->gpio_chip;
|
|
|
- gc->base = ctrl->base + bank->pin_base;
|
|
|
+ gc->base = drvdata->pin_base + bank->pin_base;
|
|
|
gc->ngpio = bank->nr_pins;
|
|
|
gc->dev = &pdev->dev;
|
|
|
gc->of_node = bank->of_node;
|
|
|
@@ -954,27 +953,27 @@ fail:
|
|
|
static int samsung_gpiolib_unregister(struct platform_device *pdev,
|
|
|
struct samsung_pinctrl_drv_data *drvdata)
|
|
|
{
|
|
|
- struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
|
|
- struct samsung_pin_bank *bank = ctrl->pin_banks;
|
|
|
+ struct samsung_pin_bank *bank = drvdata->pin_banks;
|
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
|
|
|
+ for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
|
|
|
gpiochip_remove(&bank->gpio_chip);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static const struct of_device_id samsung_pinctrl_dt_match[];
|
|
|
|
|
|
/* retrieve the soc specific data */
|
|
|
-static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
|
|
|
- struct samsung_pinctrl_drv_data *d,
|
|
|
- struct platform_device *pdev)
|
|
|
+static const struct samsung_pin_ctrl *
|
|
|
+samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,
|
|
|
+ struct platform_device *pdev)
|
|
|
{
|
|
|
int id;
|
|
|
const struct of_device_id *match;
|
|
|
struct device_node *node = pdev->dev.of_node;
|
|
|
struct device_node *np;
|
|
|
- struct samsung_pin_ctrl *ctrl;
|
|
|
+ const struct samsung_pin_ctrl *ctrl;
|
|
|
struct samsung_pin_bank *bank;
|
|
|
int i;
|
|
|
|
|
|
@@ -986,19 +985,24 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
|
|
|
match = of_match_node(samsung_pinctrl_dt_match, node);
|
|
|
ctrl = (struct samsung_pin_ctrl *)match->data + id;
|
|
|
|
|
|
- bank = ctrl->pin_banks;
|
|
|
- for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
|
|
|
+ d->suspend = ctrl->suspend;
|
|
|
+ d->resume = ctrl->resume;
|
|
|
+ d->pin_banks = ctrl->pin_banks;
|
|
|
+ d->nr_banks = ctrl->nr_banks;
|
|
|
+
|
|
|
+ bank = d->pin_banks;
|
|
|
+ for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
|
|
spin_lock_init(&bank->slock);
|
|
|
bank->drvdata = d;
|
|
|
- bank->pin_base = ctrl->nr_pins;
|
|
|
- ctrl->nr_pins += bank->nr_pins;
|
|
|
+ bank->pin_base = d->nr_pins;
|
|
|
+ d->nr_pins += bank->nr_pins;
|
|
|
}
|
|
|
|
|
|
for_each_child_of_node(node, np) {
|
|
|
if (!of_find_property(np, "gpio-controller", NULL))
|
|
|
continue;
|
|
|
- bank = ctrl->pin_banks;
|
|
|
- for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
|
|
|
+ bank = d->pin_banks;
|
|
|
+ for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
|
|
if (!strcmp(bank->name, np->name)) {
|
|
|
bank->of_node = np;
|
|
|
break;
|
|
|
@@ -1006,8 +1010,8 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ctrl->base = pin_base;
|
|
|
- pin_base += ctrl->nr_pins;
|
|
|
+ d->pin_base = pin_base;
|
|
|
+ pin_base += d->nr_pins;
|
|
|
|
|
|
return ctrl;
|
|
|
}
|
|
|
@@ -1015,8 +1019,8 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
|
|
|
static int samsung_pinctrl_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct samsung_pinctrl_drv_data *drvdata;
|
|
|
+ const struct samsung_pin_ctrl *ctrl;
|
|
|
struct device *dev = &pdev->dev;
|
|
|
- struct samsung_pin_ctrl *ctrl;
|
|
|
struct resource *res;
|
|
|
int ret;
|
|
|
|
|
|
@@ -1037,7 +1041,6 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
|
|
|
dev_err(&pdev->dev, "driver data not available\n");
|
|
|
return PTR_ERR(ctrl);
|
|
|
}
|
|
|
- drvdata->ctrl = ctrl;
|
|
|
drvdata->dev = dev;
|
|
|
|
|
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
@@ -1082,12 +1085,11 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
|
|
|
static void samsung_pinctrl_suspend_dev(
|
|
|
struct samsung_pinctrl_drv_data *drvdata)
|
|
|
{
|
|
|
- struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
|
|
void __iomem *virt_base = drvdata->virt_base;
|
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < ctrl->nr_banks; i++) {
|
|
|
- struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
|
|
|
+ for (i = 0; i < drvdata->nr_banks; i++) {
|
|
|
+ struct samsung_pin_bank *bank = &drvdata->pin_banks[i];
|
|
|
void __iomem *reg = virt_base + bank->pctl_offset;
|
|
|
const u8 *offs = bank->type->reg_offset;
|
|
|
const u8 *widths = bank->type->fld_width;
|
|
|
@@ -1115,8 +1117,8 @@ static void samsung_pinctrl_suspend_dev(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (ctrl->suspend)
|
|
|
- ctrl->suspend(drvdata);
|
|
|
+ if (drvdata->suspend)
|
|
|
+ drvdata->suspend(drvdata);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1129,15 +1131,14 @@ static void samsung_pinctrl_suspend_dev(
|
|
|
*/
|
|
|
static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata)
|
|
|
{
|
|
|
- struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
|
|
void __iomem *virt_base = drvdata->virt_base;
|
|
|
int i;
|
|
|
|
|
|
- if (ctrl->resume)
|
|
|
- ctrl->resume(drvdata);
|
|
|
+ if (drvdata->resume)
|
|
|
+ drvdata->resume(drvdata);
|
|
|
|
|
|
- for (i = 0; i < ctrl->nr_banks; i++) {
|
|
|
- struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
|
|
|
+ for (i = 0; i < drvdata->nr_banks; i++) {
|
|
|
+ struct samsung_pin_bank *bank = &drvdata->pin_banks[i];
|
|
|
void __iomem *reg = virt_base + bank->pctl_offset;
|
|
|
const u8 *offs = bank->type->reg_offset;
|
|
|
const u8 *widths = bank->type->fld_width;
|