From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754225AbcHSJIQ (ORCPT ); Fri, 19 Aug 2016 05:08:16 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:48710 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752965AbcHSJH7 (ORCPT ); Fri, 19 Aug 2016 05:07:59 -0400 MIME-version: 1.0 Content-type: text/plain; charset=UTF-8 X-AuditID: cbfee68d-f79286d000007a9a-af-57b6cc391f2b Content-transfer-encoding: 8BIT Message-id: <57B6CC38.9090403@samsung.com> Date: Fri, 19 Aug 2016 18:07:04 +0900 From: Chanwoo Choi Organization: Samsung Electronics User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 To: Tomasz Figa Cc: k.kozlowski@samsung.com, kgene@kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, catalin.marinas@arm.com, will.deacon@arm.com, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, krzk@kernel.org, jh80.chung@samsung.com, sw0312.kim@samsung.com, jy0922.shim@samsung.com, inki.dae@samsung.com, jonghwa3.lee@samsung.com, beomho.seo@samsung.com, jaewon02.kim@samsung.com, human.hwang@samsung.com, ideal.song@samsung.com, ingi2.kim@samsung.com, m.szyprowski@samsung.com, a.hajda@samsung.com, s.nawrocki@samsung.com, chanwoo@kernel.org, Linus Walleij , linux-gpio@vger.kernel.org Subject: Re: [PATCH 4/7] pinctrl: samsung: Add GPFx support of Exynos5433 References: <1471328843-26653-1-git-send-email-cw00.choi@samsung.com> <1471328843-26653-5-git-send-email-cw00.choi@samsung.com> In-reply-to: <1471328843-26653-5-git-send-email-cw00.choi@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA02SaUhUYRSG+eZu49TUzVw+zQpHQjKyXPskE3+EjL8KMgyLbLKLijrqzCgJ RVOW4ZLbSNjFZaxcUDMdl9TMrUEtTdNcJtdAMzeK1FzKsrkOkf9e3vfhnPPC4WPGOYQlP1iq YGRSSaiIFOClJs6RR926anyPj6j3oeGybgJ1LtZQ6FtBEkBpun4c5Wr1Xn5mMoHqf08AVPtx mUTpE6k4qlVqCaT7GUeg+HdTGJoZ78XR/IwDSpmcx1BPTzmFMjYKeUgzOUigytwNgD7UZ5Eo s6eRh55pxyiUP9TLQ/deaSn0euE+gTJVsyQqrtdzs987cE8rcWlOKRDXsWOUWFMcT4pHBxtI ceXTW+LkqmIgXtIcOEv5CdyvMaHB0YzsmMcVQdBI1mdeBBt5Pf4LSylBu18CMOJD2hkmDJfw DNoMvh9/TiYAAd+YLgLwdouS+gdN51XwDAEL4N2kKZwLhPQeuKYa12s+H6MPQm1fCGdjtC1M z3mMGfhPAGY/LNtihLQdrB6/yTE4fQjGV6gAp0m93TSjIzm9m7aGA2uTgMNN6QswsSOGs030 I1cyUihuJEY3EXCuS7l1wl7aG3ZP9gLDrgEAS3vzMC4wor3g2OoLwlAg0QgutrkbFtNwRdW6 dQ+k90NNM2ZALGBLkQ5PBebstmbs/2bstmZqgBUDUyYiIEJ+NVDmYC+XhMmjpIH2AeFhGqB/ m84/0w9qwUjzyVZA84Fop7C2pdrXmJBEy2PCWoGL/og0zNI0IFz/aVKFv4OTqyNycXZxcjzh 5ioyF1pbrp8zpgMlCiaEYSIYmb8sKpSRtwIe38hSCaovrvt1/VI0LJyyWO7vKhFFFk5rUn02 O5mWDSufILVNWKTwKzRPKW+UbnrlVbXHsbG2P/qc3FSBAm+16HycY+xpwdDqzGG2wuxy3Vv1 mxtP2u7kzZ3Jrej2T8MRu8upYMnateRIc/YlT/9RG1lluM5b8lLhoS0wi5YO7njUnSHC5UES BztMJpf8BaA9IkQxAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrDKsWRmVeSWpSXmKPExsVy+t9jQV3LM9vCDc70ClrcWneO1eL0p23s Fu+X9TBaTLxxhcVi/hGg2NIZfawWu/7eZ7TYcfMLm8Wk+xNYLHY0HGG1uPGrjdWi8+wTZosX 9y6yWLx+YWjR//g1s8X58xvYLab8Wc5ksenxNVaLzfP/MFpc3jWHzWLG+X1MFmuP3GW3WHr9 IpNF694j7BaH37SzWsyY/JLNYtUuoLqXH0+wOMh4rJm3htFj56y77B6bVnWyedy5tofNY/OS eo++LasYPT5vkgtgj2pgtMlITUxJLVJIzUvOT8nMS7dV8g6Od443NTMw1DW0tDBXUshLzE21 VXLxCdB1y8wBelxJoSwxpxQoFJBYXKykb4dpQmiIm64FTGOErm9IEFyPkQEaSFjDmHF7zlOm glmFFZ3PZ7E3MB6P6mLk5JAQMJF4tnAjE4QtJnHh3nq2LkYuDiGBWYwSLT1PWEASvAKCEj8m 3wOyOTiYBeQljlzKBgkzC6hLTJq3iBmi/gGjxNxp68BqeAW0JLbeqwWpYRFQlejcOJkRxGYD Cu9/cYMNxOYXUJS4+uMxI0i5qECERPeJSpCwCNDIb1P62UFGMgvsZ5V4daYB7ARhAU+Jc48v MkLsusoosebiQmaQBKeAm8Td79tZJzAKzkJy6iyEU2chOXUBI/MqRonUguSC4qT0XKO81HK9 4sTc4tK8dL3k/NxNjOCU9kx6B+PhXe6HGAU4GJV4eBl8toULsSaWFVfmHmKU4GBWEuEtPwQU 4k1JrKxKLcqPLyrNSS0+xGgK9OxEZinR5Hxgus0riTc0NjEzsjQyN7QwMjZXEud9/H9dmJBA emJJanZqakFqEUwfEwenVANj/mv+lfkCOfH7Ov05a3+xP/n8/XdzxMKPQpe1W9ZMnskspc/3 WFN4a31966Kq6w9Pbz8XZRAXf7HGUfubW4temPg6xpre46Xh99Jmf/flepqkvTwtt+vgvl/n GG+lawfMYd73UzX62kGZmQlrCj8eFfx0ZqeNeSj33Dj14og5e+7VLJnWfsxZiaU4I9FQi7mo OBEA2+dtJn8DAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Tomasz Figa, Due to wrong setting of email client, your reply is deleted on my email client at the company. I'm so sorry. So, I add your comment on below and then I reply the detailed description. On 2016년 08월 16일 15:27, Chanwoo Choi wrote: > From: Joonyoung Shim > > This patch add the support of GPFx pin of Exynos5433 SoC. Exynos5433 has > different memory map of GPFx from previous Exynos SoC. Exynos GPIO has > following register to control gpio funciton. Usually, all registers of GPIO > are included in same domain. > - CON / DAT / PUD / DRV / CONPDN / PUDPDN > - EINT_CON/ EINT_FLTCON0, EINT_FLTCON1 / EINT_MASK / EINT_PEND > > But, GPFx are included in two domain as following. So, this patch supports > the GPFx pin which handle the on separate two domains. > - ALIVE domain : CON / DAT / PUD / DRV / CONPDN / PUDPDN > - IMEM domain : EINT_CON/ EINT_FLTCON0, EINT_FLTCON1 / EINT_MASK / EINT_PEND --------- I'm afraid I don't get anything from the description above. Could you describe the layout of registers in memory map and IRQ routing of the pins? Best regards, Tomasz ---------- On this patch, I'm sorry that I described the wrong information about GFP1~5. I explained the memory map of GPF[1-5] the oppositely. Following compositions are correct. - ALIVE : WEINT_FLTCONx, WEINT_MASK, WEING_PEND - IMEM : CON, DAT, PUD, DRV, CONPDN, PUDPDN And, I add the memory map for GPF[1~5][2] and the wakeup interrupt information[1]. [1] Memory map for GPF1~5 [ALIVE] WEINT_GPA0_CON : 0x1058_0000 (ALIVE) + (0x0700 = 0x0700 + 0x0) WEINT_GPA1_CON : 0x1058_0000 (ALIVE) + (0x0704 = 0x0700 + 0x4) WEINT_GPA2_CON : 0x1058_0000 (ALIVE) + (0x0708 = 0x0700 + 0x8) WEINT_GPA3_CON : 0x1058_0000 (ALIVE) + (0x070C = 0x0700 + 0xC) WEINT_GPF1_CON : 0x1058_0000 (ALIVE) + (0x1704 = 0x0700 + 0x1004) WEINT_GPF2_CON : 0x1058_0000 (ALIVE) + (0x1708 = 0x0700 + 0x1008) WEINT_GPF3_CON : 0x1058_0000 (ALIVE) + (0x170C = 0x0700 + 0x100C) WEINT_GPF4_CON : 0x1058_0000 (ALIVE) + (0x1710 = 0x0700 + 0x10010) WEINT_GPF5_CON : 0x1058_0000 (ALIVE) + (0x1714 = 0x0700 + 0x1014) WEINT_GPF[x]_MASK : 0x1058_0000 (ALIVE) + (0x1900 + (x * 4)) WEINT_GPF[x]_PEND : 0x1058_0000 (ALIVE) + (0x1A00 + (x * 4)) (x : 1 ~ 5) [IMEM] GPF1_CON : 0X1109_0000 (IMEM) + 0x0020 GPF1_DAT : 0X1109_0000 (IMEM) + 0x0024 GPF1_PUD : 0X1109_0000 (IMEM) + 0x0028 GPF1_DRV : 0X1109_0000 (IMEM) + 0x002C GPF1_CONPDN : 0X1109_0000 (IMEM) + 0x0030 GPF1_PUDPDN : 0X1109_0000 (IMEM) + 0x0034 GPF2_CON : 0X1109_0000 (IMEM) + 0x0040 ... GPF3_CON : 0X1109_0000 (IMEM) + 0x0060 ... GPF4_CON : 0X1109_0000 (IMEM) + 0x0080 ... GPF5_CON : 0X1109_0000 (IMEM) + 0x00A0 [2] Interrput pin information - the total number of wakeup external IRQ is 64. ---------------------------------------------------------------------------------- domain| gpio : nr | wakeup interrput name | SPI number | ----------------------------------------------------------------------------------- ALIVE | GPA0 : 8 | INTREQ__EINT[0~7] | SPI[0] ~ SPI[7] | ALIVE | GPA1 : 8 | INTREQ__EINT[8~15] | SPI[8] ~ SPI[15] | ALIVE | GPA2 : 8 | INTREQ__EINT_16_63 | SPI[16] | ALIVE | GPA3 : 8 | INTREQ__EINT_16_63 | SPI[16] | ----------------------------------------------------------------------------------- ALIVE | GPF1 : 8 | INTREQ__EINT_16_63 | SPI[16] | ALIVE | GPF2 : 4 | INTREQ__EINT_16_63 | SPI[16] | ALIVE | GPF3 : 4 | INTREQ__EINT_16_63 | SPI[16] | ALIVE | GPF4 : 8 | INTREQ__EINT_16_63 | SPI[16] | ALIVE | GPF5 : 8 | INTREQ__EINT_16_63 | SPI[16] | ----------------------------------------------------------------------------------- In summary, If gpf[1-5] handle the CON/DAT/PUD/DRV register, the driver will use the drvdata->ext_base (IMEM base address) instead of drvdata->virt_base(ALIVE base address) because the CON/DAT/PUD/DRV register of gpf[1-5] are included in the IMEM domain. If gpf[1-5] handle the WEINT_* register, the driver will use the drvdata->virt_base(ALIVE base address) because the WEINT_* registers of gpf[1-5] are included in the ALIVE domain. Best Regards, Chanwoo Choi > > Cc: Linus Walleij > Cc: Rob Herring > Cc: Mark Rutland > Cc: Tomasz Figa > Cc: Krzysztof Kozlowski > Cc: Sylwester Nawrocki > Cc: Kukjin Kim > Cc: linux-gpio@vger.kernel.org > Signed-off-by: Joonyoung Shim > Signed-off-by: Chanwoo Choi > --- > .../bindings/pinctrl/samsung-pinctrl.txt | 1 + > drivers/pinctrl/samsung/pinctrl-exynos.c | 5 +++ > drivers/pinctrl/samsung/pinctrl-exynos.h | 11 ++++++ > drivers/pinctrl/samsung/pinctrl-samsung.c | 43 ++++++++++++++++++---- > drivers/pinctrl/samsung/pinctrl-samsung.h | 5 +++ > 5 files changed, 57 insertions(+), 8 deletions(-) > > diff --git a/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt > index 6db16b90873a..807fba1f829f 100644 > --- a/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt > +++ b/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt > @@ -19,6 +19,7 @@ Required Properties: > - "samsung,exynos5260-pinctrl": for Exynos5260 compatible pin-controller. > - "samsung,exynos5410-pinctrl": for Exynos5410 compatible pin-controller. > - "samsung,exynos5420-pinctrl": for Exynos5420 compatible pin-controller. > + - "samsung,exynos5433-pinctrl": for Exynos5433 compatible pin-controller. > - "samsung,exynos7-pinctrl": for Exynos7 compatible pin-controller. > > - reg: Base address of the pin controller hardware module and length of > diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c > index 051b5bf701a8..4f95983e0cdd 100644 > --- a/drivers/pinctrl/samsung/pinctrl-exynos.c > +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c > @@ -1350,6 +1350,11 @@ static const struct samsung_pin_bank_data exynos5433_pin_banks0[] = { > EXYNOS_PIN_BANK_EINTW(8, 0x020, "gpa1", 0x04), > EXYNOS_PIN_BANK_EINTW(8, 0x040, "gpa2", 0x08), > EXYNOS_PIN_BANK_EINTW(8, 0x060, "gpa3", 0x0c), > + EXYNOS_PIN_BANK_EINTW_EXT(8, 0x020, "gpf1", 0x1004), > + EXYNOS_PIN_BANK_EINTW_EXT(4, 0x040, "gpf2", 0x1008), > + EXYNOS_PIN_BANK_EINTW_EXT(4, 0x060, "gpf3", 0x100c), > + EXYNOS_PIN_BANK_EINTW_EXT(8, 0x080, "gpf4", 0x1010), > + EXYNOS_PIN_BANK_EINTW_EXT(8, 0x0a0, "gpf5", 0x1014), > }; > > /* pin banks of exynos5433 pin-controller - AUD */ > diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.h b/drivers/pinctrl/samsung/pinctrl-exynos.h > index 0f0f7cedb2dc..4b737b6c434d 100644 > --- a/drivers/pinctrl/samsung/pinctrl-exynos.h > +++ b/drivers/pinctrl/samsung/pinctrl-exynos.h > @@ -79,6 +79,17 @@ > .name = id \ > } > > +#define EXYNOS_PIN_BANK_EINTW_EXT(pins, reg, id, offs) \ > + { \ > + .type = &bank_type_off, \ > + .pctl_offset = reg, \ > + .nr_pins = pins, \ > + .eint_type = EINT_TYPE_WKUP, \ > + .eint_offset = offs, \ > + .eint_ext = true, \ > + .name = id \ > + } > + > /** > * struct exynos_weint_data: irq specific data for all the wakeup interrupts > * generated by the external wakeup interrupt controller. > diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c > index 513fe6b23248..57e22085c2db 100644 > --- a/drivers/pinctrl/samsung/pinctrl-samsung.c > +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c > @@ -338,6 +338,7 @@ static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata, > struct samsung_pin_bank **bank) > { > struct samsung_pin_bank *b; > + void __iomem *virt_base = drvdata->virt_base; > > b = drvdata->pin_banks; > > @@ -345,7 +346,10 @@ static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata, > ((b->pin_base + b->nr_pins - 1) < pin)) > b++; > > - *reg = drvdata->virt_base + b->pctl_offset; > + if (b->eint_ext) > + virt_base = drvdata->ext_base; > + > + *reg = virt_base + b->pctl_offset; > *offset = pin - b->pin_base; > if (bank) > *bank = b; > @@ -523,10 +527,12 @@ static void samsung_gpio_set_value(struct gpio_chip *gc, > { > struct samsung_pin_bank *bank = gpiochip_get_data(gc); > const struct samsung_pin_bank_type *type = bank->type; > + void __iomem *virt_base = bank->eint_ext ? > + bank->drvdata->ext_base : bank->drvdata->virt_base; > void __iomem *reg; > u32 data; > > - reg = bank->drvdata->virt_base + bank->pctl_offset; > + reg = virt_base + bank->pctl_offset; > > data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]); > data &= ~(1 << offset); > @@ -553,8 +559,10 @@ static int samsung_gpio_get(struct gpio_chip *gc, unsigned offset) > u32 data; > struct samsung_pin_bank *bank = gpiochip_get_data(gc); > const struct samsung_pin_bank_type *type = bank->type; > + void __iomem *virt_base = bank->eint_ext ? > + bank->drvdata->ext_base : bank->drvdata->virt_base; > > - reg = bank->drvdata->virt_base + bank->pctl_offset; > + reg = virt_base + bank->pctl_offset; > > data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]); > data >>= offset; > @@ -574,6 +582,7 @@ static int samsung_gpio_set_direction(struct gpio_chip *gc, > const struct samsung_pin_bank_type *type; > struct samsung_pin_bank *bank; > struct samsung_pinctrl_drv_data *drvdata; > + void __iomem *virt_base; > void __iomem *reg; > u32 data, mask, shift; > > @@ -581,7 +590,8 @@ static int samsung_gpio_set_direction(struct gpio_chip *gc, > type = bank->type; > drvdata = bank->drvdata; > > - reg = drvdata->virt_base + bank->pctl_offset + > + virt_base = bank->eint_ext ? drvdata->ext_base : drvdata->virt_base; > + reg = virt_base + bank->pctl_offset + > type->reg_offset[PINCFG_TYPE_FUNC]; > > mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1; > @@ -1007,6 +1017,7 @@ samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d, > bank->eint_type = bdata->eint_type; > bank->eint_mask = bdata->eint_mask; > bank->eint_offset = bdata->eint_offset; > + bank->eint_ext = bdata->eint_ext; > bank->name = bdata->name; > > spin_lock_init(&bank->slock); > @@ -1065,6 +1076,14 @@ static int samsung_pinctrl_probe(struct platform_device *pdev) > if (IS_ERR(drvdata->virt_base)) > return PTR_ERR(drvdata->virt_base); > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); > + if (res) { > + drvdata->ext_base = > + devm_ioremap(dev, res->start, resource_size(res)); > + if (!drvdata->ext_base) > + return -ENXIO; > + } > + > res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); > if (res) > drvdata->irq = res->start; > @@ -1102,16 +1121,20 @@ static int samsung_pinctrl_probe(struct platform_device *pdev) > static void samsung_pinctrl_suspend_dev( > struct samsung_pinctrl_drv_data *drvdata) > { > - void __iomem *virt_base = drvdata->virt_base; > + void __iomem *virt_base; > int 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; > + void __iomem *reg; > const u8 *offs = bank->type->reg_offset; > const u8 *widths = bank->type->fld_width; > enum pincfg_type type; > > + virt_base = bank->eint_ext ? > + drvdata->ext_base : drvdata->virt_base; > + reg = virt_base + bank->pctl_offset; > + > /* Registers without a powerdown config aren't lost */ > if (!widths[PINCFG_TYPE_CON_PDN]) > continue; > @@ -1148,7 +1171,7 @@ static void samsung_pinctrl_suspend_dev( > */ > static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata) > { > - void __iomem *virt_base = drvdata->virt_base; > + void __iomem *virt_base; > int i; > > if (drvdata->resume) > @@ -1156,11 +1179,15 @@ static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata) > > 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; > + void __iomem *reg; > const u8 *offs = bank->type->reg_offset; > const u8 *widths = bank->type->fld_width; > enum pincfg_type type; > > + virt_base = bank->eint_ext ? > + drvdata->ext_base : drvdata->virt_base; > + reg = virt_base + bank->pctl_offset; > + > /* Registers without a powerdown config aren't lost */ > if (!widths[PINCFG_TYPE_CON_PDN]) > continue; > diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h > index cd31bfaf62cb..3005135f4565 100644 > --- a/drivers/pinctrl/samsung/pinctrl-samsung.h > +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h > @@ -131,6 +131,7 @@ struct samsung_pin_bank_data { > enum eint_type eint_type; > u32 eint_mask; > u32 eint_offset; > + bool eint_ext; > const char *name; > }; > > @@ -163,6 +164,7 @@ struct samsung_pin_bank { > enum eint_type eint_type; > u32 eint_mask; > u32 eint_offset; > + bool eint_ext; > const char *name; > > u32 pin_base; > @@ -201,6 +203,8 @@ struct samsung_pin_ctrl { > * struct samsung_pinctrl_drv_data: wrapper for holding driver data together. > * @node: global list node > * @virt_base: register base address of the controller. > + * @ext_base: external register base address of the controller. > + * @ext_base: external register base address of the controller. > * @dev: device instance representing the controller. > * @irq: interrpt number used by the controller to notify gpio interrupts. > * @ctrl: pin controller instance managed by the driver. > @@ -216,6 +220,7 @@ struct samsung_pin_ctrl { > struct samsung_pinctrl_drv_data { > struct list_head node; > void __iomem *virt_base; > + void __iomem *ext_base; > struct device *dev; > int irq; > >