pinctrl: samsung: Constify samsung_pin_ctrl struct
In order to separate initialization constants from runtime data, this patch modifies the driver to store only constant data in samsung_pin_ctrl struct and copy data required at runtime to samsung_pinctrl_drv_data struct. This makes it possible to mark all existing instances of samsung_pin_ctrl struct as const and __initconst. Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
This commit is contained in:
parent
94ce944bed
commit
1bf00d7a6d
@ -277,8 +277,7 @@ static const struct irq_domain_ops exynos_gpio_irqd_ops = {
|
|||||||
static irqreturn_t exynos_eint_gpio_irq(int irq, void *data)
|
static irqreturn_t exynos_eint_gpio_irq(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct samsung_pinctrl_drv_data *d = data;
|
struct samsung_pinctrl_drv_data *d = data;
|
||||||
struct samsung_pin_ctrl *ctrl = d->ctrl;
|
struct samsung_pin_bank *bank = d->pin_banks;
|
||||||
struct samsung_pin_bank *bank = ctrl->pin_banks;
|
|
||||||
unsigned int svc, group, pin, virq;
|
unsigned int svc, group, pin, virq;
|
||||||
|
|
||||||
svc = readl(d->virt_base + EXYNOS_SVC_OFFSET);
|
svc = readl(d->virt_base + EXYNOS_SVC_OFFSET);
|
||||||
@ -325,8 +324,8 @@ static int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
|
|||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
bank = d->ctrl->pin_banks;
|
bank = d->pin_banks;
|
||||||
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
|
for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
||||||
if (bank->eint_type != EINT_TYPE_GPIO)
|
if (bank->eint_type != EINT_TYPE_GPIO)
|
||||||
continue;
|
continue;
|
||||||
bank->irq_domain = irq_domain_add_linear(bank->of_node,
|
bank->irq_domain = irq_domain_add_linear(bank->of_node,
|
||||||
@ -498,8 +497,8 @@ static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
|
|||||||
if (!wkup_np)
|
if (!wkup_np)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
bank = d->ctrl->pin_banks;
|
bank = d->pin_banks;
|
||||||
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
|
for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
||||||
if (bank->eint_type != EINT_TYPE_WKUP)
|
if (bank->eint_type != EINT_TYPE_WKUP)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -556,9 +555,9 @@ static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
|
|||||||
irq_set_chained_handler(irq, exynos_irq_demux_eint16_31);
|
irq_set_chained_handler(irq, exynos_irq_demux_eint16_31);
|
||||||
irq_set_handler_data(irq, muxed_data);
|
irq_set_handler_data(irq, muxed_data);
|
||||||
|
|
||||||
bank = d->ctrl->pin_banks;
|
bank = d->pin_banks;
|
||||||
idx = 0;
|
idx = 0;
|
||||||
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
|
for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
||||||
if (bank->eint_type != EINT_TYPE_WKUP_MUX)
|
if (bank->eint_type != EINT_TYPE_WKUP_MUX)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -590,11 +589,10 @@ static void exynos_pinctrl_suspend_bank(
|
|||||||
|
|
||||||
static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
|
static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
|
||||||
{
|
{
|
||||||
struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
struct samsung_pin_bank *bank = drvdata->pin_banks;
|
||||||
struct samsung_pin_bank *bank = ctrl->pin_banks;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
|
for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
|
||||||
if (bank->eint_type == EINT_TYPE_GPIO)
|
if (bank->eint_type == EINT_TYPE_GPIO)
|
||||||
exynos_pinctrl_suspend_bank(drvdata, bank);
|
exynos_pinctrl_suspend_bank(drvdata, bank);
|
||||||
}
|
}
|
||||||
@ -626,11 +624,10 @@ static void exynos_pinctrl_resume_bank(
|
|||||||
|
|
||||||
static void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
|
static void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
|
||||||
{
|
{
|
||||||
struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
struct samsung_pin_bank *bank = drvdata->pin_banks;
|
||||||
struct samsung_pin_bank *bank = ctrl->pin_banks;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
|
for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
|
||||||
if (bank->eint_type == EINT_TYPE_GPIO)
|
if (bank->eint_type == EINT_TYPE_GPIO)
|
||||||
exynos_pinctrl_resume_bank(drvdata, bank);
|
exynos_pinctrl_resume_bank(drvdata, bank);
|
||||||
}
|
}
|
||||||
@ -673,7 +670,7 @@ static struct samsung_pin_bank s5pv210_pin_bank[] = {
|
|||||||
EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
|
EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct samsung_pin_ctrl s5pv210_pin_ctrl[] = {
|
const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
/* pin-controller instance 0 data */
|
/* pin-controller instance 0 data */
|
||||||
.pin_banks = s5pv210_pin_bank,
|
.pin_banks = s5pv210_pin_bank,
|
||||||
@ -720,7 +717,7 @@ static struct samsung_pin_bank exynos3250_pin_banks1[] = {
|
|||||||
* Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
|
* Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
|
||||||
* two gpio/pin-mux/pinconfig controllers.
|
* two gpio/pin-mux/pinconfig controllers.
|
||||||
*/
|
*/
|
||||||
struct samsung_pin_ctrl exynos3250_pin_ctrl[] = {
|
const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
/* pin-controller instance 0 data */
|
/* pin-controller instance 0 data */
|
||||||
.pin_banks = exynos3250_pin_banks0,
|
.pin_banks = exynos3250_pin_banks0,
|
||||||
@ -792,7 +789,7 @@ static struct samsung_pin_bank exynos4210_pin_banks2[] = {
|
|||||||
* Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
|
* Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
|
||||||
* three gpio/pin-mux/pinconfig controllers.
|
* three gpio/pin-mux/pinconfig controllers.
|
||||||
*/
|
*/
|
||||||
struct samsung_pin_ctrl exynos4210_pin_ctrl[] = {
|
const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
/* pin-controller instance 0 data */
|
/* pin-controller instance 0 data */
|
||||||
.pin_banks = exynos4210_pin_banks0,
|
.pin_banks = exynos4210_pin_banks0,
|
||||||
@ -877,7 +874,7 @@ static struct samsung_pin_bank exynos4x12_pin_banks3[] = {
|
|||||||
* Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
|
* Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
|
||||||
* four gpio/pin-mux/pinconfig controllers.
|
* four gpio/pin-mux/pinconfig controllers.
|
||||||
*/
|
*/
|
||||||
struct samsung_pin_ctrl exynos4x12_pin_ctrl[] = {
|
const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
/* pin-controller instance 0 data */
|
/* pin-controller instance 0 data */
|
||||||
.pin_banks = exynos4x12_pin_banks0,
|
.pin_banks = exynos4x12_pin_banks0,
|
||||||
@ -970,7 +967,7 @@ static struct samsung_pin_bank exynos5250_pin_banks3[] = {
|
|||||||
* Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
|
* Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
|
||||||
* four gpio/pin-mux/pinconfig controllers.
|
* four gpio/pin-mux/pinconfig controllers.
|
||||||
*/
|
*/
|
||||||
struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {
|
const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
/* pin-controller instance 0 data */
|
/* pin-controller instance 0 data */
|
||||||
.pin_banks = exynos5250_pin_banks0,
|
.pin_banks = exynos5250_pin_banks0,
|
||||||
@ -1047,7 +1044,7 @@ static struct samsung_pin_bank exynos5260_pin_banks2[] = {
|
|||||||
* Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
|
* Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
|
||||||
* three gpio/pin-mux/pinconfig controllers.
|
* three gpio/pin-mux/pinconfig controllers.
|
||||||
*/
|
*/
|
||||||
struct samsung_pin_ctrl exynos5260_pin_ctrl[] = {
|
const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
/* pin-controller instance 0 data */
|
/* pin-controller instance 0 data */
|
||||||
.pin_banks = exynos5260_pin_banks0,
|
.pin_banks = exynos5260_pin_banks0,
|
||||||
@ -1127,7 +1124,7 @@ static struct samsung_pin_bank exynos5420_pin_banks4[] = {
|
|||||||
* Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
|
* Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
|
||||||
* four gpio/pin-mux/pinconfig controllers.
|
* four gpio/pin-mux/pinconfig controllers.
|
||||||
*/
|
*/
|
||||||
struct samsung_pin_ctrl exynos5420_pin_ctrl[] = {
|
const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
/* pin-controller instance 0 data */
|
/* pin-controller instance 0 data */
|
||||||
.pin_banks = exynos5420_pin_banks0,
|
.pin_banks = exynos5420_pin_banks0,
|
||||||
|
@ -518,8 +518,8 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d)
|
|||||||
irq_set_handler_data(irq, eint_data);
|
irq_set_handler_data(irq, eint_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
bank = d->ctrl->pin_banks;
|
bank = d->pin_banks;
|
||||||
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
|
for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
||||||
struct s3c24xx_eint_domain_data *ddata;
|
struct s3c24xx_eint_domain_data *ddata;
|
||||||
unsigned int mask;
|
unsigned int mask;
|
||||||
unsigned int irq;
|
unsigned int irq;
|
||||||
@ -573,7 +573,7 @@ static struct samsung_pin_bank s3c2412_pin_banks[] = {
|
|||||||
PIN_BANK_2BIT(13, 0x080, "gpj"),
|
PIN_BANK_2BIT(13, 0x080, "gpj"),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct samsung_pin_ctrl s3c2412_pin_ctrl[] = {
|
const struct samsung_pin_ctrl s3c2412_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
.pin_banks = s3c2412_pin_banks,
|
.pin_banks = s3c2412_pin_banks,
|
||||||
.nr_banks = ARRAY_SIZE(s3c2412_pin_banks),
|
.nr_banks = ARRAY_SIZE(s3c2412_pin_banks),
|
||||||
@ -595,7 +595,7 @@ static struct samsung_pin_bank s3c2416_pin_banks[] = {
|
|||||||
PIN_BANK_2BIT(2, 0x100, "gpm"),
|
PIN_BANK_2BIT(2, 0x100, "gpm"),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct samsung_pin_ctrl s3c2416_pin_ctrl[] = {
|
const struct samsung_pin_ctrl s3c2416_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
.pin_banks = s3c2416_pin_banks,
|
.pin_banks = s3c2416_pin_banks,
|
||||||
.nr_banks = ARRAY_SIZE(s3c2416_pin_banks),
|
.nr_banks = ARRAY_SIZE(s3c2416_pin_banks),
|
||||||
@ -615,7 +615,7 @@ static struct samsung_pin_bank s3c2440_pin_banks[] = {
|
|||||||
PIN_BANK_2BIT(13, 0x0d0, "gpj"),
|
PIN_BANK_2BIT(13, 0x0d0, "gpj"),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct samsung_pin_ctrl s3c2440_pin_ctrl[] = {
|
const struct samsung_pin_ctrl s3c2440_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
.pin_banks = s3c2440_pin_banks,
|
.pin_banks = s3c2440_pin_banks,
|
||||||
.nr_banks = ARRAY_SIZE(s3c2440_pin_banks),
|
.nr_banks = ARRAY_SIZE(s3c2440_pin_banks),
|
||||||
@ -638,7 +638,7 @@ static struct samsung_pin_bank s3c2450_pin_banks[] = {
|
|||||||
PIN_BANK_2BIT(2, 0x100, "gpm"),
|
PIN_BANK_2BIT(2, 0x100, "gpm"),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct samsung_pin_ctrl s3c2450_pin_ctrl[] = {
|
const struct samsung_pin_ctrl s3c2450_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
.pin_banks = s3c2450_pin_banks,
|
.pin_banks = s3c2450_pin_banks,
|
||||||
.nr_banks = ARRAY_SIZE(s3c2450_pin_banks),
|
.nr_banks = ARRAY_SIZE(s3c2450_pin_banks),
|
||||||
|
@ -468,8 +468,8 @@ static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
|
|||||||
}
|
}
|
||||||
|
|
||||||
nr_domains = 0;
|
nr_domains = 0;
|
||||||
bank = d->ctrl->pin_banks;
|
bank = d->pin_banks;
|
||||||
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
|
for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
||||||
unsigned int nr_eints;
|
unsigned int nr_eints;
|
||||||
unsigned int mask;
|
unsigned int mask;
|
||||||
|
|
||||||
@ -497,9 +497,9 @@ static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
|
|||||||
}
|
}
|
||||||
data->drvdata = d;
|
data->drvdata = d;
|
||||||
|
|
||||||
bank = d->ctrl->pin_banks;
|
bank = d->pin_banks;
|
||||||
nr_domains = 0;
|
nr_domains = 0;
|
||||||
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
|
for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
||||||
if (bank->eint_type != EINT_TYPE_GPIO)
|
if (bank->eint_type != EINT_TYPE_GPIO)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -735,8 +735,8 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d)
|
|||||||
irq_set_handler_data(irq, data);
|
irq_set_handler_data(irq, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
bank = d->ctrl->pin_banks;
|
bank = d->pin_banks;
|
||||||
for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
|
for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
||||||
struct s3c64xx_eint0_domain_data *ddata;
|
struct s3c64xx_eint0_domain_data *ddata;
|
||||||
unsigned int nr_eints;
|
unsigned int nr_eints;
|
||||||
unsigned int mask;
|
unsigned int mask;
|
||||||
@ -804,7 +804,7 @@ static struct samsung_pin_bank s3c64xx_pin_banks0[] = {
|
|||||||
* Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes
|
* Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes
|
||||||
* one gpio/pin-mux/pinconfig controller.
|
* one gpio/pin-mux/pinconfig controller.
|
||||||
*/
|
*/
|
||||||
struct samsung_pin_ctrl s3c64xx_pin_ctrl[] = {
|
const struct samsung_pin_ctrl s3c64xx_pin_ctrl[] __initconst = {
|
||||||
{
|
{
|
||||||
/* pin-controller instance 1 data */
|
/* pin-controller instance 1 data */
|
||||||
.pin_banks = s3c64xx_pin_banks0,
|
.pin_banks = s3c64xx_pin_banks0,
|
||||||
|
@ -349,7 +349,7 @@ static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata,
|
|||||||
{
|
{
|
||||||
struct samsung_pin_bank *b;
|
struct samsung_pin_bank *b;
|
||||||
|
|
||||||
b = drvdata->ctrl->pin_banks;
|
b = drvdata->pin_banks;
|
||||||
|
|
||||||
while ((pin >= b->pin_base) &&
|
while ((pin >= b->pin_base) &&
|
||||||
((b->pin_base + b->nr_pins - 1) < pin))
|
((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];
|
func = &drvdata->pmx_functions[selector];
|
||||||
grp = &drvdata->pin_groups[group];
|
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);
|
®, &pin_offset, &bank);
|
||||||
type = bank->type;
|
type = bank->type;
|
||||||
mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
|
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;
|
unsigned long flags;
|
||||||
|
|
||||||
drvdata = pinctrl_dev_get_drvdata(pctldev);
|
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);
|
&pin_offset, &bank);
|
||||||
type = bank->type;
|
type = bank->type;
|
||||||
|
|
||||||
@ -834,32 +834,32 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
|
|||||||
ctrldesc->confops = &samsung_pinconf_ops;
|
ctrldesc->confops = &samsung_pinconf_ops;
|
||||||
|
|
||||||
pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
|
pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
|
||||||
drvdata->ctrl->nr_pins, GFP_KERNEL);
|
drvdata->nr_pins, GFP_KERNEL);
|
||||||
if (!pindesc) {
|
if (!pindesc) {
|
||||||
dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
|
dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
ctrldesc->pins = pindesc;
|
ctrldesc->pins = pindesc;
|
||||||
ctrldesc->npins = drvdata->ctrl->nr_pins;
|
ctrldesc->npins = drvdata->nr_pins;
|
||||||
|
|
||||||
/* dynamically populate the pin number and pin name for pindesc */
|
/* dynamically populate the pin number and pin name for pindesc */
|
||||||
for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
|
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
|
* allocate space for storing the dynamically generated names for all
|
||||||
* the pins which belong to this pin-controller.
|
* the pins which belong to this pin-controller.
|
||||||
*/
|
*/
|
||||||
pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *
|
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) {
|
if (!pin_names) {
|
||||||
dev_err(&pdev->dev, "mem alloc for pin names failed\n");
|
dev_err(&pdev->dev, "mem alloc for pin names failed\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for each pin, the name of the pin is pin-bank name + pin number */
|
/* for each pin, the name of the pin is pin-bank name + pin number */
|
||||||
for (bank = 0; bank < drvdata->ctrl->nr_banks; bank++) {
|
for (bank = 0; bank < drvdata->nr_banks; bank++) {
|
||||||
pin_bank = &drvdata->ctrl->pin_banks[bank];
|
pin_bank = &drvdata->pin_banks[bank];
|
||||||
for (pin = 0; pin < pin_bank->nr_pins; pin++) {
|
for (pin = 0; pin < pin_bank->nr_pins; pin++) {
|
||||||
sprintf(pin_names, "%s-%d", pin_bank->name, pin);
|
sprintf(pin_names, "%s-%d", pin_bank->name, pin);
|
||||||
pdesc = pindesc + pin_bank->pin_base + pin;
|
pdesc = pindesc + pin_bank->pin_base + pin;
|
||||||
@ -878,11 +878,11 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (bank = 0; bank < drvdata->ctrl->nr_banks; ++bank) {
|
for (bank = 0; bank < drvdata->nr_banks; ++bank) {
|
||||||
pin_bank = &drvdata->ctrl->pin_banks[bank];
|
pin_bank = &drvdata->pin_banks[bank];
|
||||||
pin_bank->grange.name = pin_bank->name;
|
pin_bank->grange.name = pin_bank->name;
|
||||||
pin_bank->grange.id = bank;
|
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->pin_base;
|
||||||
pin_bank->grange.base = pin_bank->gpio_chip.base;
|
pin_bank->grange.base = pin_bank->gpio_chip.base;
|
||||||
pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
|
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,
|
static int samsung_gpiolib_register(struct platform_device *pdev,
|
||||||
struct samsung_pinctrl_drv_data *drvdata)
|
struct samsung_pinctrl_drv_data *drvdata)
|
||||||
{
|
{
|
||||||
struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
struct samsung_pin_bank *bank = drvdata->pin_banks;
|
||||||
struct samsung_pin_bank *bank = ctrl->pin_banks;
|
|
||||||
struct gpio_chip *gc;
|
struct gpio_chip *gc;
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
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;
|
bank->gpio_chip = samsung_gpiolib_chip;
|
||||||
|
|
||||||
gc = &bank->gpio_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->ngpio = bank->nr_pins;
|
||||||
gc->dev = &pdev->dev;
|
gc->dev = &pdev->dev;
|
||||||
gc->of_node = bank->of_node;
|
gc->of_node = bank->of_node;
|
||||||
@ -954,27 +953,27 @@ fail:
|
|||||||
static int samsung_gpiolib_unregister(struct platform_device *pdev,
|
static int samsung_gpiolib_unregister(struct platform_device *pdev,
|
||||||
struct samsung_pinctrl_drv_data *drvdata)
|
struct samsung_pinctrl_drv_data *drvdata)
|
||||||
{
|
{
|
||||||
struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
struct samsung_pin_bank *bank = drvdata->pin_banks;
|
||||||
struct samsung_pin_bank *bank = ctrl->pin_banks;
|
|
||||||
int i;
|
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);
|
gpiochip_remove(&bank->gpio_chip);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id samsung_pinctrl_dt_match[];
|
static const struct of_device_id samsung_pinctrl_dt_match[];
|
||||||
|
|
||||||
/* retrieve the soc specific data */
|
/* retrieve the soc specific data */
|
||||||
static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
|
static const struct samsung_pin_ctrl *
|
||||||
struct samsung_pinctrl_drv_data *d,
|
samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,
|
||||||
struct platform_device *pdev)
|
struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
const struct of_device_id *match;
|
const struct of_device_id *match;
|
||||||
struct device_node *node = pdev->dev.of_node;
|
struct device_node *node = pdev->dev.of_node;
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
struct samsung_pin_ctrl *ctrl;
|
const struct samsung_pin_ctrl *ctrl;
|
||||||
struct samsung_pin_bank *bank;
|
struct samsung_pin_bank *bank;
|
||||||
int i;
|
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);
|
match = of_match_node(samsung_pinctrl_dt_match, node);
|
||||||
ctrl = (struct samsung_pin_ctrl *)match->data + id;
|
ctrl = (struct samsung_pin_ctrl *)match->data + id;
|
||||||
|
|
||||||
bank = ctrl->pin_banks;
|
d->suspend = ctrl->suspend;
|
||||||
for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
|
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);
|
spin_lock_init(&bank->slock);
|
||||||
bank->drvdata = d;
|
bank->drvdata = d;
|
||||||
bank->pin_base = ctrl->nr_pins;
|
bank->pin_base = d->nr_pins;
|
||||||
ctrl->nr_pins += bank->nr_pins;
|
d->nr_pins += bank->nr_pins;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_child_of_node(node, np) {
|
for_each_child_of_node(node, np) {
|
||||||
if (!of_find_property(np, "gpio-controller", NULL))
|
if (!of_find_property(np, "gpio-controller", NULL))
|
||||||
continue;
|
continue;
|
||||||
bank = ctrl->pin_banks;
|
bank = d->pin_banks;
|
||||||
for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
|
for (i = 0; i < d->nr_banks; ++i, ++bank) {
|
||||||
if (!strcmp(bank->name, np->name)) {
|
if (!strcmp(bank->name, np->name)) {
|
||||||
bank->of_node = np;
|
bank->of_node = np;
|
||||||
break;
|
break;
|
||||||
@ -1006,8 +1010,8 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrl->base = pin_base;
|
d->pin_base = pin_base;
|
||||||
pin_base += ctrl->nr_pins;
|
pin_base += d->nr_pins;
|
||||||
|
|
||||||
return ctrl;
|
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)
|
static int samsung_pinctrl_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct samsung_pinctrl_drv_data *drvdata;
|
struct samsung_pinctrl_drv_data *drvdata;
|
||||||
|
const struct samsung_pin_ctrl *ctrl;
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct samsung_pin_ctrl *ctrl;
|
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -1037,7 +1041,6 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
|
|||||||
dev_err(&pdev->dev, "driver data not available\n");
|
dev_err(&pdev->dev, "driver data not available\n");
|
||||||
return PTR_ERR(ctrl);
|
return PTR_ERR(ctrl);
|
||||||
}
|
}
|
||||||
drvdata->ctrl = ctrl;
|
|
||||||
drvdata->dev = dev;
|
drvdata->dev = dev;
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
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(
|
static void samsung_pinctrl_suspend_dev(
|
||||||
struct samsung_pinctrl_drv_data *drvdata)
|
struct samsung_pinctrl_drv_data *drvdata)
|
||||||
{
|
{
|
||||||
struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
|
|
||||||
void __iomem *virt_base = drvdata->virt_base;
|
void __iomem *virt_base = drvdata->virt_base;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ctrl->nr_banks; i++) {
|
for (i = 0; i < drvdata->nr_banks; i++) {
|
||||||
struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
|
struct samsung_pin_bank *bank = &drvdata->pin_banks[i];
|
||||||
void __iomem *reg = virt_base + bank->pctl_offset;
|
void __iomem *reg = virt_base + bank->pctl_offset;
|
||||||
const u8 *offs = bank->type->reg_offset;
|
const u8 *offs = bank->type->reg_offset;
|
||||||
const u8 *widths = bank->type->fld_width;
|
const u8 *widths = bank->type->fld_width;
|
||||||
@ -1115,8 +1117,8 @@ static void samsung_pinctrl_suspend_dev(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctrl->suspend)
|
if (drvdata->suspend)
|
||||||
ctrl->suspend(drvdata);
|
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)
|
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;
|
void __iomem *virt_base = drvdata->virt_base;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ctrl->resume)
|
if (drvdata->resume)
|
||||||
ctrl->resume(drvdata);
|
drvdata->resume(drvdata);
|
||||||
|
|
||||||
for (i = 0; i < ctrl->nr_banks; i++) {
|
for (i = 0; i < drvdata->nr_banks; i++) {
|
||||||
struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
|
struct samsung_pin_bank *bank = &drvdata->pin_banks[i];
|
||||||
void __iomem *reg = virt_base + bank->pctl_offset;
|
void __iomem *reg = virt_base + bank->pctl_offset;
|
||||||
const u8 *offs = bank->type->reg_offset;
|
const u8 *offs = bank->type->reg_offset;
|
||||||
const u8 *widths = bank->type->fld_width;
|
const u8 *widths = bank->type->fld_width;
|
||||||
|
@ -155,8 +155,6 @@ struct samsung_pin_bank {
|
|||||||
* struct samsung_pin_ctrl: represent a pin controller.
|
* struct samsung_pin_ctrl: represent a pin controller.
|
||||||
* @pin_banks: list of pin banks included in this controller.
|
* @pin_banks: list of pin banks included in this controller.
|
||||||
* @nr_banks: number of pin banks.
|
* @nr_banks: number of pin banks.
|
||||||
* @base: starting system wide pin number.
|
|
||||||
* @nr_pins: number of pins supported by the controller.
|
|
||||||
* @eint_gpio_init: platform specific callback to setup the external gpio
|
* @eint_gpio_init: platform specific callback to setup the external gpio
|
||||||
* interrupts for the controller.
|
* interrupts for the controller.
|
||||||
* @eint_wkup_init: platform specific callback to setup the external wakeup
|
* @eint_wkup_init: platform specific callback to setup the external wakeup
|
||||||
@ -166,9 +164,6 @@ struct samsung_pin_ctrl {
|
|||||||
struct samsung_pin_bank *pin_banks;
|
struct samsung_pin_bank *pin_banks;
|
||||||
u32 nr_banks;
|
u32 nr_banks;
|
||||||
|
|
||||||
u32 base;
|
|
||||||
u32 nr_pins;
|
|
||||||
|
|
||||||
int (*eint_gpio_init)(struct samsung_pinctrl_drv_data *);
|
int (*eint_gpio_init)(struct samsung_pinctrl_drv_data *);
|
||||||
int (*eint_wkup_init)(struct samsung_pinctrl_drv_data *);
|
int (*eint_wkup_init)(struct samsung_pinctrl_drv_data *);
|
||||||
void (*suspend)(struct samsung_pinctrl_drv_data *);
|
void (*suspend)(struct samsung_pinctrl_drv_data *);
|
||||||
@ -188,6 +183,8 @@ struct samsung_pin_ctrl {
|
|||||||
* @nr_groups: number of such pin groups.
|
* @nr_groups: number of such pin groups.
|
||||||
* @pmx_functions: list of pin functions available to the driver.
|
* @pmx_functions: list of pin functions available to the driver.
|
||||||
* @nr_function: number of such pin functions.
|
* @nr_function: number of such pin functions.
|
||||||
|
* @pin_base: starting system wide pin number.
|
||||||
|
* @nr_pins: number of pins supported by the controller.
|
||||||
*/
|
*/
|
||||||
struct samsung_pinctrl_drv_data {
|
struct samsung_pinctrl_drv_data {
|
||||||
struct list_head node;
|
struct list_head node;
|
||||||
@ -195,7 +192,6 @@ struct samsung_pinctrl_drv_data {
|
|||||||
struct device *dev;
|
struct device *dev;
|
||||||
int irq;
|
int irq;
|
||||||
|
|
||||||
struct samsung_pin_ctrl *ctrl;
|
|
||||||
struct pinctrl_desc pctl;
|
struct pinctrl_desc pctl;
|
||||||
struct pinctrl_dev *pctl_dev;
|
struct pinctrl_dev *pctl_dev;
|
||||||
|
|
||||||
@ -203,6 +199,14 @@ struct samsung_pinctrl_drv_data {
|
|||||||
unsigned int nr_groups;
|
unsigned int nr_groups;
|
||||||
const struct samsung_pmx_func *pmx_functions;
|
const struct samsung_pmx_func *pmx_functions;
|
||||||
unsigned int nr_functions;
|
unsigned int nr_functions;
|
||||||
|
|
||||||
|
struct samsung_pin_bank *pin_banks;
|
||||||
|
u32 nr_banks;
|
||||||
|
unsigned int pin_base;
|
||||||
|
unsigned int nr_pins;
|
||||||
|
|
||||||
|
void (*suspend)(struct samsung_pinctrl_drv_data *);
|
||||||
|
void (*resume)(struct samsung_pinctrl_drv_data *);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -233,17 +237,17 @@ struct samsung_pmx_func {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* list of all exported SoC specific data */
|
/* list of all exported SoC specific data */
|
||||||
extern struct samsung_pin_ctrl exynos3250_pin_ctrl[];
|
extern const struct samsung_pin_ctrl exynos3250_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl exynos4210_pin_ctrl[];
|
extern const struct samsung_pin_ctrl exynos4210_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl exynos4x12_pin_ctrl[];
|
extern const struct samsung_pin_ctrl exynos4x12_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl exynos5250_pin_ctrl[];
|
extern const struct samsung_pin_ctrl exynos5250_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl exynos5260_pin_ctrl[];
|
extern const struct samsung_pin_ctrl exynos5260_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl exynos5420_pin_ctrl[];
|
extern const struct samsung_pin_ctrl exynos5420_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl s3c64xx_pin_ctrl[];
|
extern const struct samsung_pin_ctrl s3c64xx_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl s3c2412_pin_ctrl[];
|
extern const struct samsung_pin_ctrl s3c2412_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl s3c2416_pin_ctrl[];
|
extern const struct samsung_pin_ctrl s3c2416_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl s3c2440_pin_ctrl[];
|
extern const struct samsung_pin_ctrl s3c2440_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl s3c2450_pin_ctrl[];
|
extern const struct samsung_pin_ctrl s3c2450_pin_ctrl[];
|
||||||
extern struct samsung_pin_ctrl s5pv210_pin_ctrl[];
|
extern const struct samsung_pin_ctrl s5pv210_pin_ctrl[];
|
||||||
|
|
||||||
#endif /* __PINCTRL_SAMSUNG_H */
|
#endif /* __PINCTRL_SAMSUNG_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user