* [PATCH 0/3 v2] Updates for exynos4210 and DT-based systems @ 2012-03-13 16:54 Karol Lewandowski 2012-03-13 16:54 ` [PATCH 1/3] i2c-s3c2410: Drop unused define Karol Lewandowski ` (3 more replies) 0 siblings, 4 replies; 22+ messages in thread From: Karol Lewandowski @ 2012-03-13 16:54 UTC (permalink / raw) To: ben-linux-elnMNo+KYs3YtjvyW6yDsg Cc: thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, Karol Lewandowski Changes since v1: - Move unrelated code fragment to separate patch (of_match_ptr()) - Move device-type handling to separate function and rework its internals a bit This patchset reworks i2c-s3c2410 driver a bit to better handle device tree-enabled platforms and adds two quirks required by exynos4210-specific I2C controller used by s5p-hdmi driver. This patchset is based on "i2c-bjdooks/for-34/i2c/i2c-samsung" branch taken from: git://git.fluff.org/bjdooks/linux.git Karol Lewandowski (3): i2c-s3c2410: Drop unused define i2c-s3c2410: Rework device type handling i2c-s3c2410: Add HDMIPHY quirk for S3C2440 .../devicetree/bindings/i2c/samsung-i2c.txt | 10 ++- drivers/i2c/busses/i2c-s3c2410.c | 93 +++++++++++++++----- 2 files changed, 77 insertions(+), 26 deletions(-) -- 1.7.9 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 1/3] i2c-s3c2410: Drop unused define 2012-03-13 16:54 [PATCH 0/3 v2] Updates for exynos4210 and DT-based systems Karol Lewandowski @ 2012-03-13 16:54 ` Karol Lewandowski 2012-03-18 20:49 ` Grant Likely 2012-03-13 16:54 ` [PATCH 2/3] i2c-s3c2410: Rework device type handling Karol Lewandowski ` (2 subsequent siblings) 3 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-03-13 16:54 UTC (permalink / raw) To: ben-linux Cc: thomas.abraham, m.szyprowski, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws, Karol Lewandowski, Kyungmin Park Use standard of_match_ptr() to avoid defining variable unused in non device tree builds. Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> --- drivers/i2c/busses/i2c-s3c2410.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 737f721..85e3664 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -1128,8 +1128,6 @@ static const struct of_device_id s3c24xx_i2c_match[] = { {}, }; MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match); -#else -#define s3c24xx_i2c_match NULL #endif static struct platform_driver s3c24xx_i2c_driver = { @@ -1140,7 +1138,7 @@ static struct platform_driver s3c24xx_i2c_driver = { .owner = THIS_MODULE, .name = "s3c-i2c", .pm = S3C24XX_DEV_PM_OPS, - .of_match_table = s3c24xx_i2c_match, + .of_match_table = of_match_ptr(s3c24xx_i2c_match), }, }; -- 1.7.9 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 1/3] i2c-s3c2410: Drop unused define 2012-03-13 16:54 ` [PATCH 1/3] i2c-s3c2410: Drop unused define Karol Lewandowski @ 2012-03-18 20:49 ` Grant Likely 0 siblings, 0 replies; 22+ messages in thread From: Grant Likely @ 2012-03-18 20:49 UTC (permalink / raw) To: ben-linux Cc: thomas.abraham, m.szyprowski, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws, Karol Lewandowski, Kyungmin Park On Tue, 13 Mar 2012 17:54:37 +0100, Karol Lewandowski <k.lewandowsk@samsung.com> wrote: > Use standard of_match_ptr() to avoid defining variable unused > in non device tree builds. > > Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Acked-by: Grant Likely <grant.likely@secretlab.ca> > --- > drivers/i2c/busses/i2c-s3c2410.c | 4 +--- > 1 files changed, 1 insertions(+), 3 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c > index 737f721..85e3664 100644 > --- a/drivers/i2c/busses/i2c-s3c2410.c > +++ b/drivers/i2c/busses/i2c-s3c2410.c > @@ -1128,8 +1128,6 @@ static const struct of_device_id s3c24xx_i2c_match[] = { > {}, > }; > MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match); > -#else > -#define s3c24xx_i2c_match NULL > #endif > > static struct platform_driver s3c24xx_i2c_driver = { > @@ -1140,7 +1138,7 @@ static struct platform_driver s3c24xx_i2c_driver = { > .owner = THIS_MODULE, > .name = "s3c-i2c", > .pm = S3C24XX_DEV_PM_OPS, > - .of_match_table = s3c24xx_i2c_match, > + .of_match_table = of_match_ptr(s3c24xx_i2c_match), > }, > }; > > -- > 1.7.9 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- Grant Likely, B.Sc, P.Eng. Secret Lab Technologies,Ltd. ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 2/3] i2c-s3c2410: Rework device type handling 2012-03-13 16:54 [PATCH 0/3 v2] Updates for exynos4210 and DT-based systems Karol Lewandowski 2012-03-13 16:54 ` [PATCH 1/3] i2c-s3c2410: Drop unused define Karol Lewandowski @ 2012-03-13 16:54 ` Karol Lewandowski [not found] ` <1331657679-31302-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> [not found] ` <1331657679-31302-1-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-14 1:49 ` [PATCH 0/3 v2] Updates for exynos4210 and DT-based systems Kyungmin Park 3 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-03-13 16:54 UTC (permalink / raw) To: ben-linux Cc: thomas.abraham, m.szyprowski, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws, Karol Lewandowski, Kyungmin Park Reorganize driver a bit to better handle device tree-based systems: - move machine type to driver's private structure instead of quering platform device variants in runtime - replace s3c24xx_i2c_type enum with plain unsigned int that can hold not only device type but also hw revision-specific quirks Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> --- drivers/i2c/busses/i2c-s3c2410.c | 53 +++++++++++++++++++++++--------------- 1 files changed, 32 insertions(+), 21 deletions(-) diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 85e3664..f84d26f 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -44,8 +44,16 @@ #include <plat/regs-iic.h> #include <plat/iic.h> -/* i2c controller state */ +#ifdef CONFIG_OF +static const struct of_device_id s3c24xx_i2c_match[]; +#endif + +/* reserve lower 8 bits for device type, use remaining space for hw quirks */ +#define TYPE_BITS 0x000000ff +#define TYPE_S3C2410 0x00000001 +#define TYPE_S3C2440 0x00000002 +/* i2c controller state */ enum s3c24xx_i2c_state { STATE_IDLE, STATE_START, @@ -54,14 +62,10 @@ enum s3c24xx_i2c_state { STATE_STOP }; -enum s3c24xx_i2c_type { - TYPE_S3C2410, - TYPE_S3C2440, -}; - struct s3c24xx_i2c { spinlock_t lock; wait_queue_head_t wait; + unsigned int type; unsigned int suspended:1; struct i2c_msg *msg; @@ -88,26 +92,32 @@ struct s3c24xx_i2c { #endif }; -/* default platform data removed, dev should always carry data. */ - -/* s3c24xx_i2c_is2440() +/* s3c24xx_i2c_is_type() * - * return true is this is an s3c2440 + * return true if this controller is of specified type */ -static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c) +static inline int s3c24xx_i2c_is_type(struct s3c24xx_i2c *i2c, unsigned int type) { - struct platform_device *pdev = to_platform_device(i2c->dev); - enum s3c24xx_i2c_type type; + return (i2c->type & TYPE_BITS) == type; +} + +/* s3c24xx_get_device_type + * + * Get controller type either from device tree or platform device variant. +*/ +static inline unsigned int s3c24xx_get_device_type(struct platform_device *pdev) +{ #ifdef CONFIG_OF - if (i2c->dev->of_node) - return of_device_is_compatible(i2c->dev->of_node, - "samsung,s3c2440-i2c"); + if (pdev->dev.of_node) { + const struct of_device_id *match; + match = of_match_node(&s3c24xx_i2c_match[0], pdev->dev.of_node); + return (unsigned int)match->data; + } #endif - type = platform_get_device_id(pdev)->driver_data; - return type == TYPE_S3C2440; + return platform_get_device_id(pdev)->driver_data; } /* s3c24xx_i2c_master_complete @@ -676,7 +686,7 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got) writel(iiccon, i2c->regs + S3C2410_IICCON); - if (s3c24xx_i2c_is2440(i2c)) { + if (s3c24xx_i2c_is_type(i2c, TYPE_S3C2440)) { unsigned long sda_delay; if (pdata->sda_delay) { @@ -906,6 +916,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) goto err_noclk; } + i2c->type = s3c24xx_get_device_type(pdev); if (pdata) memcpy(i2c->pdata, pdata, sizeof(*pdata)); else @@ -1123,8 +1134,8 @@ MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); #ifdef CONFIG_OF static const struct of_device_id s3c24xx_i2c_match[] = { - { .compatible = "samsung,s3c2410-i2c" }, - { .compatible = "samsung,s3c2440-i2c" }, + { .compatible = "samsung,s3c2410-i2c", .data = (void *)TYPE_S3C2410 }, + { .compatible = "samsung,s3c2440-i2c", .data = (void *)TYPE_S3C2440 }, {}, }; MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match); -- 1.7.9 ^ permalink raw reply related [flat|nested] 22+ messages in thread
[parent not found: <1331657679-31302-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling [not found] ` <1331657679-31302-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2012-03-14 17:29 ` Mark Brown [not found] ` <20120314172915.GB13393-GFdadSzt00ze9xe1eoZjHA@public.gmane.org> 0 siblings, 1 reply; 22+ messages in thread From: Mark Brown @ 2012-03-14 17:29 UTC (permalink / raw) To: Karol Lewandowski Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, Kyungmin Park On Tue, Mar 13, 2012 at 05:54:38PM +0100, Karol Lewandowski wrote: > - replace s3c24xx_i2c_type enum with plain unsigned int that can > hold not only device type but also hw revision-specific quirks Would it not be clearer to just have explicit flags for the quirks (eg, as a set of bitfield flags)? ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <20120314172915.GB13393-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>]
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling [not found] ` <20120314172915.GB13393-GFdadSzt00ze9xe1eoZjHA@public.gmane.org> @ 2012-03-15 10:04 ` Karol Lewandowski [not found] ` <4F61BEC8.4030008-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 0 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-03-15 10:04 UTC (permalink / raw) To: Mark Brown Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, Kyungmin Park On 14.03.2012 18:29, Mark Brown wrote: > On Tue, Mar 13, 2012 at 05:54:38PM +0100, Karol Lewandowski wrote: > >> - replace s3c24xx_i2c_type enum with plain unsigned int that can >> hold not only device type but also hw revision-specific quirks > > Would it not be clearer to just have explicit flags for the quirks (eg, > as a set of bitfield flags)? That would work on runtime but we also need to initialize this somehow. The way it was done today on non-dt platforms is via platform device variants, i.e. (taken from 3rd patch): @@ -1128,6 +1161,9 @@ static struct platform_device_id s3c24xx_driver_ids[] = { }, { .name = "s3c2440-i2c", .driver_data = TYPE_S3C2440, + }, { + .name = "s3c2440-hdmiphy-i2c", + .driver_data = TYPE_S3C2440 | FLAG_HDMIPHY | FLAG_NO_GPIO, Ability to address above scenario was sole motivation for this change. Without it one would need either need separate type (e.g. TYPE_S3C2440_HDMIPHY) or setting flags based just on device name. Introducing separate type (TYPE_S3C2440_HDMIPHY) has been our original attempt to solve this issue. However, this required adding explicit checks to driver code all over the place (if (type == S3C2400 || type == S3c2440_HDMIPHY). Thus, I felt that sqeezing quirks into type is a bit cleaner approach. Regards, -- Karol Lewandowski | Samsung Poland R&D Center | Linux/Platform ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <4F61BEC8.4030008-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling [not found] ` <4F61BEC8.4030008-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2012-03-15 12:56 ` Mark Brown [not found] ` <20120315125630.GK3138-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> 0 siblings, 1 reply; 22+ messages in thread From: Mark Brown @ 2012-03-15 12:56 UTC (permalink / raw) To: Karol Lewandowski Cc: t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Kyungmin Park, linux-i2c-u79uwXL29TY76Z2rM5mHXA, ben-linux-elnMNo+KYs3YtjvyW6yDsg, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ [-- Attachment #1.1: Type: text/plain, Size: 397 bytes --] On Thu, Mar 15, 2012 at 11:04:56AM +0100, Karol Lewandowski wrote: > Introducing separate type (TYPE_S3C2440_HDMIPHY) has been our original > attempt to solve this issue. However, this required adding explicit > checks to driver code all over the place (if (type == S3C2400 || > type == S3c2440_HDMIPHY). Another option is to change the type to be a pointer to a struct with quirk flags in it. [-- Attachment #1.2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] [-- Attachment #2: Type: text/plain, Size: 192 bytes --] _______________________________________________ devicetree-discuss mailing list devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org https://lists.ozlabs.org/listinfo/devicetree-discuss ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <20120315125630.GK3138-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org>]
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling [not found] ` <20120315125630.GK3138-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> @ 2012-03-15 16:54 ` Karol Lewandowski 2012-03-19 19:55 ` Mark Brown 0 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-03-15 16:54 UTC (permalink / raw) To: Mark Brown Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, Kyungmin Park On 15.03.2012 13:56, Mark Brown wrote: > On Thu, Mar 15, 2012 at 11:04:56AM +0100, Karol Lewandowski wrote: > >> Introducing separate type (TYPE_S3C2440_HDMIPHY) has been our original >> attempt to solve this issue. However, this required adding explicit >> checks to driver code all over the place (if (type == S3C2400 || >> type == S3c2440_HDMIPHY). > > Another option is to change the type to be a pointer to a struct with > quirk flags in it. Sure, that's possible. However, I don't find it any simpler than using bitmasks. Quite to contrary - I consider it redundant to bring new structure into existence when simple uint does the trick just fine (IMHO, of course). If you consider code to be inherently less readable because of this approach I'll rework it. If it's not a such big deal for you I would prefer to keep it as is. Thanks! -- Karol Lewandowski | Samsung Poland R&D Center | Linux/Platform ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling 2012-03-15 16:54 ` Karol Lewandowski @ 2012-03-19 19:55 ` Mark Brown 2012-03-21 10:33 ` Karol Lewandowski 0 siblings, 1 reply; 22+ messages in thread From: Mark Brown @ 2012-03-19 19:55 UTC (permalink / raw) To: Karol Lewandowski Cc: ben-linux, thomas.abraham, m.szyprowski, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws, Kyungmin Park [-- Attachment #1: Type: text/plain, Size: 567 bytes --] On Thu, Mar 15, 2012 at 05:54:33PM +0100, Karol Lewandowski wrote: > If you consider code to be inherently less readable because of this > approach I'll rework it. If it's not a such big deal for you I would > prefer to keep it as is. The thing that was causing me to think the code was funny was mainly the fact that we're now combining both quirk based selection and chip type based selection into the same bitmask. If the chip types were quirks it'd probably not have looked odd, and that might just be a case of renaming them - I can't remember what they do. [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling 2012-03-19 19:55 ` Mark Brown @ 2012-03-21 10:33 ` Karol Lewandowski [not found] ` <4F69AE96.6060901-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 0 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-03-21 10:33 UTC (permalink / raw) To: Mark Brown Cc: ben-linux, thomas.abraham, m.szyprowski, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws, Kyungmin Park, w.sang On 19.03.2012 20:55, Mark Brown wrote: > On Thu, Mar 15, 2012 at 05:54:33PM +0100, Karol Lewandowski wrote: > >> If you consider code to be inherently less readable because of this >> approach I'll rework it. If it's not a such big deal for you I would >> prefer to keep it as is. > > The thing that was causing me to think the code was funny was mainly the > fact that we're now combining both quirk based selection and chip type > based selection into the same bitmask. If the chip types were quirks > it'd probably not have looked odd, and that might just be a case of > renaming them - I can't remember what they do. What do you think about following changes, then? diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index fa5f8c4..18c9760 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -48,12 +48,9 @@ static const struct of_device_id s3c24xx_i2c_match[]; #endif -/* reserve lower 8 bits for device type, use remaining space for hw quirks */ -#define TYPE_BITS 0x000000ff -#define TYPE_S3C2410 0x00000001 -#define TYPE_S3C2440 0x00000002 -#define FLAG_HDMIPHY 0x00000100 -#define FLAG_NO_GPIO 0x00000200 +#define QUIRK_S3C2440 (1 << 0) +#define QUIRK_HDMIPHY (1 << 1) +#define QUIRK_NO_GPIO (1 << 2) /* i2c controller state */ enum s3c24xx_i2c_state { @@ -67,7 +64,7 @@ enum s3c24xx_i2c_state { struct s3c24xx_i2c { spinlock_t lock; wait_queue_head_t wait; - unsigned int type; + unsigned int quirks; unsigned int suspended:1; struct i2c_msg *msg; @@ -94,22 +91,12 @@ struct s3c24xx_i2c { #endif }; -/* s3c24xx_i2c_is_type() - * - * return true if this controller is of specified type -*/ - -static inline int s3c24xx_i2c_is_type(struct s3c24xx_i2c *i2c, unsigned int type) -{ - return (i2c->type & TYPE_BITS) == type; -} - -/* s3c24xx_get_device_type +/* s3c24xx_get_device_quirks * * Get controller type either from device tree or platform device variant. */ -static inline unsigned int s3c24xx_get_device_type(struct platform_device *pdev) +static inline unsigned int s3c24xx_get_device_quirks(struct platform_device *pdev) { #ifdef CONFIG_OF if (pdev->dev.of_node) { @@ -487,7 +474,7 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c) * the hangup is expected to happen, so waiting 400 ms * causes only unnecessary system hangup */ - if (i2c->type & FLAG_HDMIPHY) + if (i2c->quirks & QUIRK_HDMIPHY) timeout = 10; while (timeout-- > 0) { @@ -500,7 +487,7 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c) } /* hang-up of bus dedicated for HDMIPHY occurred, resetting */ - if (i2c->type & FLAG_HDMIPHY) { + if (i2c->quirks & QUIRK_HDMIPHY) { writel(0, i2c->regs + S3C2410_IICCON); writel(0, i2c->regs + S3C2410_IICSTAT); writel(0, i2c->regs + S3C2410_IICDS); @@ -704,7 +691,7 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got) writel(iiccon, i2c->regs + S3C2410_IICCON); - if (s3c24xx_i2c_is_type(i2c, TYPE_S3C2440)) { + if (i2c->quirks & QUIRK_S3C2440) { unsigned long sda_delay; if (pdata->sda_delay) { @@ -789,7 +776,7 @@ static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c) { int idx, gpio, ret; - if (i2c->type & FLAG_NO_GPIO) + if (i2c->quirks & QUIRK_NO_GPIO) return 0; for (idx = 0; idx < 2; idx++) { @@ -817,7 +804,7 @@ static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) { unsigned int idx; - if (i2c->type & FLAG_NO_GPIO) + if (i2c->quirks & QUIRK_NO_GPIO) return; for (idx = 0; idx < 2; idx++) @@ -898,10 +885,10 @@ s3c24xx_i2c_parse_dt(struct device_node *np, struct s3c24xx_i2c *i2c) pdata->bus_num = -1; /* i2c bus number is dynamically assigned */ if (of_get_property(np, "samsung,i2c-quirk-hdmiphy", NULL)) - i2c->type |= FLAG_HDMIPHY; + i2c->quirks |= QUIRK_HDMIPHY; if (of_get_property(np, "samsung,i2c-no-gpio", NULL)) - i2c->type |= FLAG_NO_GPIO; + i2c->quirks |= QUIRK_NO_GPIO; of_property_read_u32(np, "samsung,i2c-sda-delay", &pdata->sda_delay); of_property_read_u32(np, "samsung,i2c-slave-addr", &pdata->slave_addr); @@ -948,7 +935,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) goto err_noclk; } - i2c->type = s3c24xx_get_device_type(pdev); + i2c->quirks = s3c24xx_get_device_quirks(pdev); if (pdata) memcpy(i2c->pdata, pdata, sizeof(*pdata)); else @@ -1156,21 +1143,21 @@ static const struct dev_pm_ops s3c24xx_i2c_dev_pm_ops = { static struct platform_device_id s3c24xx_driver_ids[] = { { .name = "s3c2410-i2c", - .driver_data = TYPE_S3C2410, + .driver_data = 0, }, { .name = "s3c2440-i2c", - .driver_data = TYPE_S3C2440, + .driver_data = QUIRK_S3C2440, }, { .name = "s3c2440-hdmiphy-i2c", - .driver_data = TYPE_S3C2440 | FLAG_HDMIPHY | FLAG_NO_GPIO, + .driver_data = QUIRK_S3C2440 | QUIRK_HDMIPHY | QUIRK_NO_GPIO, }, { }, }; MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); #ifdef CONFIG_OF static const struct of_device_id s3c24xx_i2c_match[] = { - { .compatible = "samsung,s3c2410-i2c", .data = (void *)TYPE_S3C2410 }, - { .compatible = "samsung,s3c2440-i2c", .data = (void *)TYPE_S3C2440 }, + { .compatible = "samsung,s3c2410-i2c", .data = (void *)0 }, + { .compatible = "samsung,s3c2440-i2c", .data = (void *)QUIRK_S3C2440 }, {}, }; MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match); Regards, -- Karol Lewandowski | Samsung Poland R&D Center | Linux/Platform ^ permalink raw reply related [flat|nested] 22+ messages in thread
[parent not found: <4F69AE96.6060901-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling [not found] ` <4F69AE96.6060901-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2012-03-21 11:50 ` Mark Brown 2012-03-21 11:54 ` Karol Lewandowski 0 siblings, 1 reply; 22+ messages in thread From: Mark Brown @ 2012-03-21 11:50 UTC (permalink / raw) To: Karol Lewandowski Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, Kyungmin Park, w.sang-bIcnvbaLZ9MEGnE8C9+IrQ [-- Attachment #1: Type: text/plain, Size: 143 bytes --] On Wed, Mar 21, 2012 at 11:33:58AM +0100, Karol Lewandowski wrote: > What do you think about following changes, then? That looks reasonable. [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling 2012-03-21 11:50 ` Mark Brown @ 2012-03-21 11:54 ` Karol Lewandowski 0 siblings, 0 replies; 22+ messages in thread From: Karol Lewandowski @ 2012-03-21 11:54 UTC (permalink / raw) To: Mark Brown Cc: ben-linux, thomas.abraham, m.szyprowski, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws, Kyungmin Park, w.sang On 21.03.2012 12:50, Mark Brown wrote: > On Wed, Mar 21, 2012 at 11:33:58AM +0100, Karol Lewandowski wrote: > >> What do you think about following changes, then? > > That looks reasonable. Thanks. I'll incorporate this change and post whole patchset again. Regards, -- Karol Lewandowski | Samsung Poland R&D Center | Linux/Platform ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <1331657679-31302-1-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* [PATCH 3/3] i2c-s3c2410: Add HDMIPHY quirk for S3C2440 [not found] ` <1331657679-31302-1-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2012-03-13 16:54 ` Karol Lewandowski [not found] ` <1331657679-31302-4-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 0 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-03-13 16:54 UTC (permalink / raw) To: ben-linux-elnMNo+KYs3YtjvyW6yDsg Cc: t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Karol Lewandowski, linux-kernel-u79uwXL29TY76Z2rM5mHXA, Kyungmin Park, linux-i2c-u79uwXL29TY76Z2rM5mHXA, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ This patch adds support for s3c2440 I2C bus controller dedicated HDMIPHY device on Exynos4 platform. Some quirks are introduced due to differences between HDMIPHY and other I2C controllers on Exynos4. These differences are: - no GPIOs, HDMIPHY is inside the SoC and the controller is connected internally - due to unknown reason (probably HW bug in HDMIPHY and/or the controller) a transfer fails to finish. The controller hangs after sending the last byte, the workaround for this bug is resetting the controller after each transfer Signed-off-by: Tomasz Stanislawski <t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Signed-off-by: Karol Lewandowski <k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Tested-by: Tomasz Stanislawski <t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Signed-off-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> --- .../devicetree/bindings/i2c/samsung-i2c.txt | 10 ++++- drivers/i2c/busses/i2c-s3c2410.c | 36 ++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/samsung-i2c.txt b/Documentation/devicetree/bindings/i2c/samsung-i2c.txt index 38832c7..ac0917c 100644 --- a/Documentation/devicetree/bindings/i2c/samsung-i2c.txt +++ b/Documentation/devicetree/bindings/i2c/samsung-i2c.txt @@ -10,14 +10,20 @@ Required properties: region. - interrupts: interrupt number to the cpu. - samsung,i2c-sda-delay: Delay (in ns) applied to data line (SDA) edges. - - gpios: The order of the gpios should be the following: <SDA, SCL>. - The gpio specifier depends on the gpio controller. Optional properties: + - gpios: The order of the gpios should be the following: <SDA, SCL>. + The gpio specifier depends on the gpio controller. Required in all cases + except when "samsung,i2c-no-gpio" is also specified. + - samsung,i2c-no-gpio: input/output lines of the controller are + permanently wired to the respective client, there are no gpio + lines that need to be configured to enable this controller - samsung,i2c-slave-addr: Slave address in multi-master enviroment. If not specified, default value is 0. - samsung,i2c-max-bus-freq: Desired frequency in Hz of the bus. If not specified, the default value in Hz is 100000. + - samsung,i2c-quirk-hdmiphy: Quirk for HDMI PHY block on S3C2440 - + reduce timeout and reset controller when doing transefers Example: diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index f84d26f..23bf7fa 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -52,6 +52,8 @@ static const struct of_device_id s3c24xx_i2c_match[]; #define TYPE_BITS 0x000000ff #define TYPE_S3C2410 0x00000001 #define TYPE_S3C2440 0x00000002 +#define FLAG_HDMIPHY 0x00000100 +#define FLAG_NO_GPIO 0x00000200 /* i2c controller state */ enum s3c24xx_i2c_state { @@ -481,6 +483,13 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c) unsigned long iicstat; int timeout = 400; + /* the timeout for HDMIPHY is reduced to 10 ms because + * the hangup is expected to happen, so waiting 400 ms + * causes only unnecessary system hangup + */ + if (i2c->type & FLAG_HDMIPHY) + timeout = 10; + while (timeout-- > 0) { iicstat = readl(i2c->regs + S3C2410_IICSTAT); @@ -490,6 +499,15 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c) msleep(1); } + /* hang-up of bus dedicated for HDMIPHY occurred, resetting */ + if (i2c->type & FLAG_HDMIPHY) { + writel(0, i2c->regs + S3C2410_IICCON); + writel(0, i2c->regs + S3C2410_IICSTAT); + writel(0, i2c->regs + S3C2410_IICDS); + + return 0; + } + return -ETIMEDOUT; } @@ -771,6 +789,9 @@ static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c) { int idx, gpio, ret; + if (i2c->type & FLAG_NO_GPIO) + return 0; + for (idx = 0; idx < 2; idx++) { gpio = of_get_gpio(i2c->dev->of_node, idx); if (!gpio_is_valid(gpio)) { @@ -795,6 +816,10 @@ free_gpio: static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) { unsigned int idx; + + if (i2c->type & FLAG_NO_GPIO) + return; + for (idx = 0; idx < 2; idx++) gpio_free(i2c->gpios[idx]); } @@ -871,6 +896,14 @@ s3c24xx_i2c_parse_dt(struct device_node *np, struct s3c24xx_i2c *i2c) return; pdata->bus_num = -1; /* i2c bus number is dynamically assigned */ + + if (s3c24xx_i2c_is_type(i2c, TYPE_S3C2440) && + of_get_property(np, "samsung,i2c-quirk-hdmiphy", NULL)) + i2c->type |= FLAG_HDMIPHY; + + if (of_get_property(np, "samsung,i2c-no-gpio", NULL)) + i2c->type |= FLAG_NO_GPIO; + of_property_read_u32(np, "samsung,i2c-sda-delay", &pdata->sda_delay); of_property_read_u32(np, "samsung,i2c-slave-addr", &pdata->slave_addr); of_property_read_u32(np, "samsung,i2c-max-bus-freq", @@ -1128,6 +1161,9 @@ static struct platform_device_id s3c24xx_driver_ids[] = { }, { .name = "s3c2440-i2c", .driver_data = TYPE_S3C2440, + }, { + .name = "s3c2440-hdmiphy-i2c", + .driver_data = TYPE_S3C2440 | FLAG_HDMIPHY | FLAG_NO_GPIO, }, { }, }; MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); -- 1.7.9 ^ permalink raw reply related [flat|nested] 22+ messages in thread
[parent not found: <1331657679-31302-4-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [PATCH 3/3] i2c-s3c2410: Add HDMIPHY quirk for S3C2440 [not found] ` <1331657679-31302-4-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2012-03-13 17:27 ` Tomasz Stanislawski [not found] ` <4F5F838A.6030908-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 0 siblings, 1 reply; 22+ messages in thread From: Tomasz Stanislawski @ 2012-03-13 17:27 UTC (permalink / raw) To: Karol Lewandowski Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, Kyungmin Park Hi Karol, Please refer to comments below, Regards, Tomasz Stanislawski On 03/13/2012 05:54 PM, Karol Lewandowski wrote: > This patch adds support for s3c2440 I2C bus controller dedicated HDMIPHY device on > Exynos4 platform. Some quirks are introduced due to differences between HDMIPHY > and other I2C controllers on Exynos4. These differences are: > - no GPIOs, HDMIPHY is inside the SoC and the controller is connected > internally > - due to unknown reason (probably HW bug in HDMIPHY and/or the controller) a > transfer fails to finish. The controller hangs after sending the last byte, > the workaround for this bug is resetting the controller after each transfer > > Signed-off-by: Tomasz Stanislawski <t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > Signed-off-by: Karol Lewandowski <k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > Tested-by: Tomasz Stanislawski <t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > Signed-off-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > --- > .../devicetree/bindings/i2c/samsung-i2c.txt | 10 ++++- > drivers/i2c/busses/i2c-s3c2410.c | 36 ++++++++++++++++++++ > 2 files changed, 44 insertions(+), 2 deletions(-) > [snip] > @@ -871,6 +896,14 @@ s3c24xx_i2c_parse_dt(struct device_node *np, struct s3c24xx_i2c *i2c) > return; > > pdata->bus_num = -1; /* i2c bus number is dynamically assigned */ > + > + if (s3c24xx_i2c_is_type(i2c, TYPE_S3C2440) && I think that type checking should be removed because hdmiphy quirk is something orthogonal to the controller type. > + of_get_property(np, "samsung,i2c-quirk-hdmiphy", NULL)) > + i2c->type |= FLAG_HDMIPHY; > + > + if (of_get_property(np, "samsung,i2c-no-gpio", NULL)) > + i2c->type |= FLAG_NO_GPIO; > + > of_property_read_u32(np, "samsung,i2c-sda-delay", &pdata->sda_delay); > of_property_read_u32(np, "samsung,i2c-slave-addr", &pdata->slave_addr); > of_property_read_u32(np, "samsung,i2c-max-bus-freq", > @@ -1128,6 +1161,9 @@ static struct platform_device_id s3c24xx_driver_ids[] = { > }, { > .name = "s3c2440-i2c", > .driver_data = TYPE_S3C2440, > + }, { > + .name = "s3c2440-hdmiphy-i2c", > + .driver_data = TYPE_S3C2440 | FLAG_HDMIPHY | FLAG_NO_GPIO, > }, { }, > }; > MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <4F5F838A.6030908-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [PATCH 3/3] i2c-s3c2410: Add HDMIPHY quirk for S3C2440 [not found] ` <4F5F838A.6030908-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2012-03-13 18:00 ` Karol Lewandowski 2012-03-13 18:13 ` [PATCH] " Karol Lewandowski 1 sibling, 0 replies; 22+ messages in thread From: Karol Lewandowski @ 2012-03-13 18:00 UTC (permalink / raw) To: Tomasz Stanislawski Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, Kyungmin Park On 13.03.2012 18:27, Tomasz Stanislawski wrote: > Hi Karol, > Please refer to comments below, > > Regards, > Tomasz Stanislawski > > On 03/13/2012 05:54 PM, Karol Lewandowski wrote: >> This patch adds support for s3c2440 I2C bus controller dedicated HDMIPHY device on >> Exynos4 platform. Some quirks are introduced due to differences between HDMIPHY >> and other I2C controllers on Exynos4. These differences are: >> - no GPIOs, HDMIPHY is inside the SoC and the controller is connected >> internally >> - due to unknown reason (probably HW bug in HDMIPHY and/or the controller) a >> transfer fails to finish. The controller hangs after sending the last byte, >> the workaround for this bug is resetting the controller after each transfer >> >> Signed-off-by: Tomasz Stanislawski <t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> >> Signed-off-by: Karol Lewandowski <k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> >> Tested-by: Tomasz Stanislawski <t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> >> Signed-off-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> >> --- >> .../devicetree/bindings/i2c/samsung-i2c.txt | 10 ++++- >> drivers/i2c/busses/i2c-s3c2410.c | 36 ++++++++++++++++++++ >> 2 files changed, 44 insertions(+), 2 deletions(-) >> > [snip] >> @@ -871,6 +896,14 @@ s3c24xx_i2c_parse_dt(struct device_node *np, struct s3c24xx_i2c *i2c) >> return; >> >> pdata->bus_num = -1; /* i2c bus number is dynamically assigned */ >> + >> + if (s3c24xx_i2c_is_type(i2c, TYPE_S3C2440) && > > I think that type checking should be removed because hdmiphy quirk is something > orthogonal to the controller type. Ok, I'll drop this test and resend patch in a minute. Thanks! -- Karol Lewandowski | Samsung Poland R&D Center | Linux/Platform ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH] i2c-s3c2410: Add HDMIPHY quirk for S3C2440 [not found] ` <4F5F838A.6030908-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-13 18:00 ` Karol Lewandowski @ 2012-03-13 18:13 ` Karol Lewandowski 1 sibling, 0 replies; 22+ messages in thread From: Karol Lewandowski @ 2012-03-13 18:13 UTC (permalink / raw) To: ben-linux-elnMNo+KYs3YtjvyW6yDsg Cc: thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, Karol Lewandowski, Kyungmin Park This patch adds support for s3c2440 I2C bus controller dedicated HDMIPHY device on Exynos4 platform. Some quirks are introduced due to differences between HDMIPHY and other I2C controllers on Exynos4. These differences are: - no GPIOs, HDMIPHY is inside the SoC and the controller is connected internally - due to unknown reason (probably HW bug in HDMIPHY and/or the controller) a transfer fails to finish. The controller hangs after sending the last byte, the workaround for this bug is resetting the controller after each transfer Signed-off-by: Tomasz Stanislawski <t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Signed-off-by: Karol Lewandowski <k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Tested-by: Tomasz Stanislawski <t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Signed-off-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> --- .../devicetree/bindings/i2c/samsung-i2c.txt | 11 +++++- drivers/i2c/busses/i2c-s3c2410.c | 35 ++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/samsung-i2c.txt b/Documentation/devicetree/bindings/i2c/samsung-i2c.txt index 38832c7..c6670f9 100644 --- a/Documentation/devicetree/bindings/i2c/samsung-i2c.txt +++ b/Documentation/devicetree/bindings/i2c/samsung-i2c.txt @@ -10,14 +10,21 @@ Required properties: region. - interrupts: interrupt number to the cpu. - samsung,i2c-sda-delay: Delay (in ns) applied to data line (SDA) edges. - - gpios: The order of the gpios should be the following: <SDA, SCL>. - The gpio specifier depends on the gpio controller. Optional properties: + - gpios: The order of the gpios should be the following: <SDA, SCL>. + The gpio specifier depends on the gpio controller. Required in all cases + except when "samsung,i2c-no-gpio" is also specified. + - samsung,i2c-no-gpio: input/output lines of the controller are + permanently wired to the respective client, there are no gpio + lines that need to be configured to enable this controller - samsung,i2c-slave-addr: Slave address in multi-master enviroment. If not specified, default value is 0. - samsung,i2c-max-bus-freq: Desired frequency in Hz of the bus. If not specified, the default value in Hz is 100000. + - samsung,i2c-quirk-hdmiphy: Quirk for HDMI PHY block found on + Exynos4 platform - reduce timeout and reset controller after each + transfer Example: diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index f84d26f..fa5f8c4 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -52,6 +52,8 @@ static const struct of_device_id s3c24xx_i2c_match[]; #define TYPE_BITS 0x000000ff #define TYPE_S3C2410 0x00000001 #define TYPE_S3C2440 0x00000002 +#define FLAG_HDMIPHY 0x00000100 +#define FLAG_NO_GPIO 0x00000200 /* i2c controller state */ enum s3c24xx_i2c_state { @@ -481,6 +483,13 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c) unsigned long iicstat; int timeout = 400; + /* the timeout for HDMIPHY is reduced to 10 ms because + * the hangup is expected to happen, so waiting 400 ms + * causes only unnecessary system hangup + */ + if (i2c->type & FLAG_HDMIPHY) + timeout = 10; + while (timeout-- > 0) { iicstat = readl(i2c->regs + S3C2410_IICSTAT); @@ -490,6 +499,15 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c) msleep(1); } + /* hang-up of bus dedicated for HDMIPHY occurred, resetting */ + if (i2c->type & FLAG_HDMIPHY) { + writel(0, i2c->regs + S3C2410_IICCON); + writel(0, i2c->regs + S3C2410_IICSTAT); + writel(0, i2c->regs + S3C2410_IICDS); + + return 0; + } + return -ETIMEDOUT; } @@ -771,6 +789,9 @@ static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c) { int idx, gpio, ret; + if (i2c->type & FLAG_NO_GPIO) + return 0; + for (idx = 0; idx < 2; idx++) { gpio = of_get_gpio(i2c->dev->of_node, idx); if (!gpio_is_valid(gpio)) { @@ -795,6 +816,10 @@ free_gpio: static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) { unsigned int idx; + + if (i2c->type & FLAG_NO_GPIO) + return; + for (idx = 0; idx < 2; idx++) gpio_free(i2c->gpios[idx]); } @@ -871,6 +896,13 @@ s3c24xx_i2c_parse_dt(struct device_node *np, struct s3c24xx_i2c *i2c) return; pdata->bus_num = -1; /* i2c bus number is dynamically assigned */ + + if (of_get_property(np, "samsung,i2c-quirk-hdmiphy", NULL)) + i2c->type |= FLAG_HDMIPHY; + + if (of_get_property(np, "samsung,i2c-no-gpio", NULL)) + i2c->type |= FLAG_NO_GPIO; + of_property_read_u32(np, "samsung,i2c-sda-delay", &pdata->sda_delay); of_property_read_u32(np, "samsung,i2c-slave-addr", &pdata->slave_addr); of_property_read_u32(np, "samsung,i2c-max-bus-freq", @@ -1128,6 +1160,9 @@ static struct platform_device_id s3c24xx_driver_ids[] = { }, { .name = "s3c2440-i2c", .driver_data = TYPE_S3C2440, + }, { + .name = "s3c2440-hdmiphy-i2c", + .driver_data = TYPE_S3C2440 | FLAG_HDMIPHY | FLAG_NO_GPIO, }, { }, }; MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); -- 1.7.9 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 0/3 v2] Updates for exynos4210 and DT-based systems 2012-03-13 16:54 [PATCH 0/3 v2] Updates for exynos4210 and DT-based systems Karol Lewandowski ` (2 preceding siblings ...) [not found] ` <1331657679-31302-1-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2012-03-14 1:49 ` Kyungmin Park 3 siblings, 0 replies; 22+ messages in thread From: Kyungmin Park @ 2012-03-14 1:49 UTC (permalink / raw) To: Karol Lewandowski, Wolfram Sang Cc: ben-linux, thomas.abraham, m.szyprowski, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws +CC another i2c subsystem maintainer, Wolfram Sang. On 3/14/12, Karol Lewandowski <k.lewandowsk@samsung.com> wrote: > Changes since v1: > - Move unrelated code fragment to separate patch (of_match_ptr()) > - Move device-type handling to separate function and rework its > internals a bit > > This patchset reworks i2c-s3c2410 driver a bit to better handle > device tree-enabled platforms and adds two quirks required by > exynos4210-specific I2C controller used by s5p-hdmi driver. > > This patchset is based on "i2c-bjdooks/for-34/i2c/i2c-samsung" branch > taken from: > > git://git.fluff.org/bjdooks/linux.git > > Karol Lewandowski (3): > i2c-s3c2410: Drop unused define > i2c-s3c2410: Rework device type handling > i2c-s3c2410: Add HDMIPHY quirk for S3C2440 > > .../devicetree/bindings/i2c/samsung-i2c.txt | 10 ++- > drivers/i2c/busses/i2c-s3c2410.c | 93 > +++++++++++++++----- > 2 files changed, 77 insertions(+), 26 deletions(-) > > -- > 1.7.9 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" > in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v3 0/3] i2c-s3c2410: Updates for exynos4210 and DT-based systems @ 2012-03-21 19:11 Karol Lewandowski 2012-03-21 19:11 ` [PATCH 2/3] i2c-s3c2410: Rework device type handling Karol Lewandowski 0 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-03-21 19:11 UTC (permalink / raw) To: w.sang-bIcnvbaLZ9MEGnE8C9+IrQ Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ, broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E, Karol Lewandowski Changes since v2: - Merge device type and flags into flat bitmask named quirks - Consequently, treat s3c24xx as baseline hardware platform and support all hw variations via quirks [Suggested by Mark Brown] Changes since v1: - Move unrelated code fragment to separate patch (of_match_ptr()) [Suggested by Thomas Abracham] - Move device-type handling to separate function and rework its internals a bit [likewise] This patchset reworks i2c-s3c2410 driver a bit to better handle device tree-enabled platforms and adds two quirks required by exynos4210-specific I2C controller used by s5p-hdmi driver. This patchset is based on "i2c-bjdooks/for-34/i2c/i2c-samsung" branch taken from: git://git.fluff.org/bjdooks/linux.git Karol Lewandowski (3): i2c-s3c2410: Drop unused define i2c-s3c2410: Rework device type handling i2c-s3c2410: Add HDMIPHY quirk for S3C2440 .../devicetree/bindings/i2c/samsung-i2c.txt | 11 ++- drivers/i2c/busses/i2c-s3c2410.c | 86 +++++++++++++------ 2 files changed, 68 insertions(+), 29 deletions(-) -- 1.7.9 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 2/3] i2c-s3c2410: Rework device type handling 2012-03-21 19:11 [PATCH v3 0/3] i2c-s3c2410: " Karol Lewandowski @ 2012-03-21 19:11 ` Karol Lewandowski [not found] ` <1332357113-2973-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 0 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-03-21 19:11 UTC (permalink / raw) To: w.sang Cc: ben-linux, m.szyprowski, thomas.abraham, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws, kyungmin.park, broonie, Karol Lewandowski Reorganize driver a bit to better handle device tree-based systems: - move machine type to driver's private structure instead of quering platform device variants in runtime - replace s3c24xx_i2c_type enum with unsigned int that holds bitmask with revision-specific quirks Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> --- drivers/i2c/busses/i2c-s3c2410.c | 47 ++++++++++++++++++------------------- 1 files changed, 23 insertions(+), 24 deletions(-) diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 85e3664..f7b6a14 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -44,8 +44,14 @@ #include <plat/regs-iic.h> #include <plat/iic.h> -/* i2c controller state */ +#ifdef CONFIG_OF +static const struct of_device_id s3c24xx_i2c_match[]; +#endif +/* Treat S3C2410 as baseline hardware, anything else is supported via quirks */ +#define QUIRK_S3C2440 (1 << 0) + +/* i2c controller state */ enum s3c24xx_i2c_state { STATE_IDLE, STATE_START, @@ -54,14 +60,10 @@ enum s3c24xx_i2c_state { STATE_STOP }; -enum s3c24xx_i2c_type { - TYPE_S3C2410, - TYPE_S3C2440, -}; - struct s3c24xx_i2c { spinlock_t lock; wait_queue_head_t wait; + unsigned int quirks; unsigned int suspended:1; struct i2c_msg *msg; @@ -88,26 +90,22 @@ struct s3c24xx_i2c { #endif }; -/* default platform data removed, dev should always carry data. */ - -/* s3c24xx_i2c_is2440() +/* s3c24xx_get_device_quirks * - * return true is this is an s3c2440 + * Get controller type either from device tree or platform device variant. */ -static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c) +static inline unsigned int s3c24xx_get_device_quirks(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(i2c->dev); - enum s3c24xx_i2c_type type; - #ifdef CONFIG_OF - if (i2c->dev->of_node) - return of_device_is_compatible(i2c->dev->of_node, - "samsung,s3c2440-i2c"); + if (pdev->dev.of_node) { + const struct of_device_id *match; + match = of_match_node(&s3c24xx_i2c_match[0], pdev->dev.of_node); + return (unsigned int)match->data; + } #endif - type = platform_get_device_id(pdev)->driver_data; - return type == TYPE_S3C2440; + return platform_get_device_id(pdev)->driver_data; } /* s3c24xx_i2c_master_complete @@ -676,7 +674,7 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got) writel(iiccon, i2c->regs + S3C2410_IICCON); - if (s3c24xx_i2c_is2440(i2c)) { + if (i2c->quirks & QUIRK_S3C2440) { unsigned long sda_delay; if (pdata->sda_delay) { @@ -906,6 +904,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) goto err_noclk; } + i2c->quirks = s3c24xx_get_device_quirks(pdev); if (pdata) memcpy(i2c->pdata, pdata, sizeof(*pdata)); else @@ -1113,18 +1112,18 @@ static const struct dev_pm_ops s3c24xx_i2c_dev_pm_ops = { static struct platform_device_id s3c24xx_driver_ids[] = { { .name = "s3c2410-i2c", - .driver_data = TYPE_S3C2410, + .driver_data = 0, }, { .name = "s3c2440-i2c", - .driver_data = TYPE_S3C2440, + .driver_data = QUIRK_S3C2440, }, { }, }; MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); #ifdef CONFIG_OF static const struct of_device_id s3c24xx_i2c_match[] = { - { .compatible = "samsung,s3c2410-i2c" }, - { .compatible = "samsung,s3c2440-i2c" }, + { .compatible = "samsung,s3c2410-i2c", .data = (void *)0 }, + { .compatible = "samsung,s3c2440-i2c", .data = (void *)QUIRK_S3C2440 }, {}, }; MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match); -- 1.7.9 ^ permalink raw reply related [flat|nested] 22+ messages in thread
[parent not found: <1332357113-2973-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling [not found] ` <1332357113-2973-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2012-03-21 20:30 ` Mark Brown 2012-04-17 17:31 ` Wolfram Sang 1 sibling, 0 replies; 22+ messages in thread From: Mark Brown @ 2012-03-21 20:30 UTC (permalink / raw) To: Karol Lewandowski Cc: w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, ben-linux-elnMNo+KYs3YtjvyW6yDsg, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ [-- Attachment #1: Type: text/plain, Size: 469 bytes --] On Wed, Mar 21, 2012 at 08:11:52PM +0100, Karol Lewandowski wrote: > Reorganize driver a bit to better handle device tree-based systems: > > - move machine type to driver's private structure instead of > quering platform device variants in runtime > > - replace s3c24xx_i2c_type enum with unsigned int that holds > bitmask with revision-specific quirks Reviewed-by: Mark Brown <broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling [not found] ` <1332357113-2973-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-21 20:30 ` Mark Brown @ 2012-04-17 17:31 ` Wolfram Sang [not found] ` <20120417173136.GB22406-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 1 sibling, 1 reply; 22+ messages in thread From: Wolfram Sang @ 2012-04-17 17:31 UTC (permalink / raw) To: Karol Lewandowski Cc: t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E, linux-kernel-u79uwXL29TY76Z2rM5mHXA, kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ, linux-i2c-u79uwXL29TY76Z2rM5mHXA, ben-linux-elnMNo+KYs3YtjvyW6yDsg, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ [-- Attachment #1.1: Type: text/plain, Size: 5069 bytes --] Hi, On Wed, Mar 21, 2012 at 08:11:52PM +0100, Karol Lewandowski wrote: > Reorganize driver a bit to better handle device tree-based systems: > > - move machine type to driver's private structure instead of > quering platform device variants in runtime > > - replace s3c24xx_i2c_type enum with unsigned int that holds > bitmask with revision-specific quirks > > Signed-off-by: Karol Lewandowski <k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > Signed-off-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Okay, so this driver needs to the 'data' field from either platform_device_id or of_device_id and implements a function for that, namely s3c24xx_get_device_quirks(). Grant, Rob: I'd think there might be more drivers in need of that, so maybe it makes sense to have a generic of-helper function? > --- > drivers/i2c/busses/i2c-s3c2410.c | 47 ++++++++++++++++++------------------- > 1 files changed, 23 insertions(+), 24 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c > index 85e3664..f7b6a14 100644 > --- a/drivers/i2c/busses/i2c-s3c2410.c > +++ b/drivers/i2c/busses/i2c-s3c2410.c > @@ -44,8 +44,14 @@ > #include <plat/regs-iic.h> > #include <plat/iic.h> > > -/* i2c controller state */ > +#ifdef CONFIG_OF > +static const struct of_device_id s3c24xx_i2c_match[]; > +#endif Uh, forward declaration with #ifdef. I'd think we should get this simply to the front. > dd > +/* Treat S3C2410 as baseline hardware, anything else is supported via quirks */ > +#define QUIRK_S3C2440 (1 << 0) Minor: Is it really a quirk being s3c2440? Maybe FLAG_*, dunno. > + > +/* i2c controller state */ > enum s3c24xx_i2c_state { > STATE_IDLE, > STATE_START, > @@ -54,14 +60,10 @@ enum s3c24xx_i2c_state { > STATE_STOP > }; > > -enum s3c24xx_i2c_type { > - TYPE_S3C2410, > - TYPE_S3C2440, > -}; > - > struct s3c24xx_i2c { > spinlock_t lock; > wait_queue_head_t wait; > + unsigned int quirks; > unsigned int suspended:1; > > struct i2c_msg *msg; > @@ -88,26 +90,22 @@ struct s3c24xx_i2c { > #endif > }; > > -/* default platform data removed, dev should always carry data. */ > - > -/* s3c24xx_i2c_is2440() > +/* s3c24xx_get_device_quirks > * > - * return true is this is an s3c2440 > + * Get controller type either from device tree or platform device variant. > */ > > -static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c) > +static inline unsigned int s3c24xx_get_device_quirks(struct platform_device *pdev) > { > - struct platform_device *pdev = to_platform_device(i2c->dev); > - enum s3c24xx_i2c_type type; > - > #ifdef CONFIG_OF > - if (i2c->dev->of_node) > - return of_device_is_compatible(i2c->dev->of_node, > - "samsung,s3c2440-i2c"); > + if (pdev->dev.of_node) { > + const struct of_device_id *match; > + match = of_match_node(&s3c24xx_i2c_match[0], pdev->dev.of_node); Minor: I think it is more readable to drop the [0] > + return (unsigned int)match->data; > + } > #endif > > - type = platform_get_device_id(pdev)->driver_data; > - return type == TYPE_S3C2440; > + return platform_get_device_id(pdev)->driver_data; > } > > /* s3c24xx_i2c_master_complete > @@ -676,7 +674,7 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got) > > writel(iiccon, i2c->regs + S3C2410_IICCON); > > - if (s3c24xx_i2c_is2440(i2c)) { > + if (i2c->quirks & QUIRK_S3C2440) { > unsigned long sda_delay; > > if (pdata->sda_delay) { > @@ -906,6 +904,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) > goto err_noclk; > } > > + i2c->quirks = s3c24xx_get_device_quirks(pdev); > if (pdata) > memcpy(i2c->pdata, pdata, sizeof(*pdata)); > else > @@ -1113,18 +1112,18 @@ static const struct dev_pm_ops s3c24xx_i2c_dev_pm_ops = { > static struct platform_device_id s3c24xx_driver_ids[] = { > { > .name = "s3c2410-i2c", > - .driver_data = TYPE_S3C2410, > + .driver_data = 0, > }, { > .name = "s3c2440-i2c", > - .driver_data = TYPE_S3C2440, > + .driver_data = QUIRK_S3C2440, > }, { }, > }; > MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); > > #ifdef CONFIG_OF > static const struct of_device_id s3c24xx_i2c_match[] = { > - { .compatible = "samsung,s3c2410-i2c" }, > - { .compatible = "samsung,s3c2440-i2c" }, > + { .compatible = "samsung,s3c2410-i2c", .data = (void *)0 }, > + { .compatible = "samsung,s3c2440-i2c", .data = (void *)QUIRK_S3C2440 }, Hmm, the need to sepcify the quirks twice may lead to only one instance being updated in future patches, but I don't see a way around that, currently :( > {}, > }; > MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match); > -- > 1.7.9 > Thanks, Wolfram -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #1.2: Digital signature --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 192 bytes --] _______________________________________________ devicetree-discuss mailing list devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org https://lists.ozlabs.org/listinfo/devicetree-discuss ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <20120417173136.GB22406-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>]
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling [not found] ` <20120417173136.GB22406-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> @ 2012-04-18 11:55 ` Karol Lewandowski 2012-04-18 13:39 ` Wolfram Sang 0 siblings, 1 reply; 22+ messages in thread From: Karol Lewandowski @ 2012-04-18 11:55 UTC (permalink / raw) To: Wolfram Sang Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-i2c-u79uwXL29TY76Z2rM5mHXA, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, t.stanislaws-Sze3O3UU22JBDgjK7y7TUQ, kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ, broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E, Grant Likely, Rob Herring On 17.04.2012 19:31, Wolfram Sang wrote: > Hi, Hi Wolfram! > > On Wed, Mar 21, 2012 at 08:11:52PM +0100, Karol Lewandowski wrote: >> Reorganize driver a bit to better handle device tree-based systems: >> >> - move machine type to driver's private structure instead of >> quering platform device variants in runtime >> >> - replace s3c24xx_i2c_type enum with unsigned int that holds >> bitmask with revision-specific quirks >> >> Signed-off-by: Karol Lewandowski <k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> >> Signed-off-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > > Okay, so this driver needs to the 'data' field from either > platform_device_id or of_device_id and implements a function for that, > namely s3c24xx_get_device_quirks(). Grant, Rob: I'd think there might be > more drivers in need of that, so maybe it makes sense to have a generic > of-helper function? > >> --- >> drivers/i2c/busses/i2c-s3c2410.c | 47 ++++++++++++++++++------------------- >> 1 files changed, 23 insertions(+), 24 deletions(-) >> >> diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c >> index 85e3664..f7b6a14 100644 >> --- a/drivers/i2c/busses/i2c-s3c2410.c >> +++ b/drivers/i2c/busses/i2c-s3c2410.c >> @@ -44,8 +44,14 @@ >> #include <plat/regs-iic.h> >> #include <plat/iic.h> >> >> -/* i2c controller state */ >> +#ifdef CONFIG_OF >> +static const struct of_device_id s3c24xx_i2c_match[]; >> +#endif > > Uh, forward declaration with #ifdef. I'd think we should get this simply > to the front. Ok, as I think it's better to have dt and non-dt definitions together I'll move both of_device_id and platform_device_id to the top. >> +/* Treat S3C2410 as baseline hardware, anything else is supported via quirks */ >> +#define QUIRK_S3C2440 (1 << 0) > > Minor: Is it really a quirk being s3c2440? Maybe FLAG_*, dunno. In first version[1] of this patch I've used TYPEs for device types and FLAGS for quirks. However, I've squashed these into "quirks" after discussion with Mark[2]. [1] http://permalink.gmane.org/gmane.linux.kernel/1266759 [2] http://permalink.gmane.org/gmane.linux.kernel.samsung-soc/10255 >> -static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c) >> +static inline unsigned int s3c24xx_get_device_quirks(struct platform_device *pdev) >> { >> - struct platform_device *pdev = to_platform_device(i2c->dev); >> - enum s3c24xx_i2c_type type; >> - >> #ifdef CONFIG_OF >> - if (i2c->dev->of_node) >> - return of_device_is_compatible(i2c->dev->of_node, >> - "samsung,s3c2440-i2c"); >> + if (pdev->dev.of_node) { >> + const struct of_device_id *match; >> + match = of_match_node(&s3c24xx_i2c_match[0], pdev->dev.of_node); > > Minor: I think it is more readable to drop the [0] I prefer explicit version, but I'll drop [] as both you and Thomas found implicit version more readable. [ I'll also drop above CONFIG_OF ifdef, as of_match_node() seem to be always defined since v3.2-rc1. ] Thanks for review! I'll resubmit updated version shortly. Regards, -- Karol Lewandowski | Samsung Poland R&D Center | Linux/Platform ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/3] i2c-s3c2410: Rework device type handling 2012-04-18 11:55 ` Karol Lewandowski @ 2012-04-18 13:39 ` Wolfram Sang 0 siblings, 0 replies; 22+ messages in thread From: Wolfram Sang @ 2012-04-18 13:39 UTC (permalink / raw) To: Karol Lewandowski Cc: ben-linux, m.szyprowski, thomas.abraham, linux-kernel, linux-i2c, devicetree-discuss, linux-samsung-soc, t.stanislaws, kyungmin.park, broonie, Grant Likely, Rob Herring [-- Attachment #1: Type: text/plain, Size: 2237 bytes --] Hi, > >> Reorganize driver a bit to better handle device tree-based systems: > >> > >> - move machine type to driver's private structure instead of > >> quering platform device variants in runtime > >> > >> - replace s3c24xx_i2c_type enum with unsigned int that holds > >> bitmask with revision-specific quirks > >> > >> Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com> > >> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> > > > > Okay, so this driver needs to the 'data' field from either > > platform_device_id or of_device_id and implements a function for that, > > namely s3c24xx_get_device_quirks(). Grant, Rob: I'd think there might be > > more drivers in need of that, so maybe it makes sense to have a generic > > of-helper function? Please wait one or two days before resending. Maybe Grant or Rob find some time to answer this question. (Yeah, we can fix it later if such a generic function is introduced somewhen). > >> -/* i2c controller state */ > >> +#ifdef CONFIG_OF > >> +static const struct of_device_id s3c24xx_i2c_match[]; > >> +#endif > > > > Uh, forward declaration with #ifdef. I'd think we should get this simply > > to the front. > > > Ok, as I think it's better to have dt and non-dt definitions together > I'll move both of_device_id and platform_device_id to the top. Agreed. > > >> +/* Treat S3C2410 as baseline hardware, anything else is supported via quirks */ > >> +#define QUIRK_S3C2440 (1 << 0) > > > > Minor: Is it really a quirk being s3c2440? Maybe FLAG_*, dunno. > > > In first version[1] of this patch I've used TYPEs for device types > and FLAGS for quirks. However, I've squashed these into "quirks" after > discussion with Mark[2]. > > [1] http://permalink.gmane.org/gmane.linux.kernel/1266759 > [2] http://permalink.gmane.org/gmane.linux.kernel.samsung-soc/10255 It's minor, keep the QUIRKs. > [ I'll also drop above CONFIG_OF ifdef, as of_match_node() seem > to be always defined since v3.2-rc1. ] Great. Thanks, Wolfram -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2012-04-18 13:39 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-03-13 16:54 [PATCH 0/3 v2] Updates for exynos4210 and DT-based systems Karol Lewandowski 2012-03-13 16:54 ` [PATCH 1/3] i2c-s3c2410: Drop unused define Karol Lewandowski 2012-03-18 20:49 ` Grant Likely 2012-03-13 16:54 ` [PATCH 2/3] i2c-s3c2410: Rework device type handling Karol Lewandowski [not found] ` <1331657679-31302-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-14 17:29 ` Mark Brown [not found] ` <20120314172915.GB13393-GFdadSzt00ze9xe1eoZjHA@public.gmane.org> 2012-03-15 10:04 ` Karol Lewandowski [not found] ` <4F61BEC8.4030008-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-15 12:56 ` Mark Brown [not found] ` <20120315125630.GK3138-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> 2012-03-15 16:54 ` Karol Lewandowski 2012-03-19 19:55 ` Mark Brown 2012-03-21 10:33 ` Karol Lewandowski [not found] ` <4F69AE96.6060901-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-21 11:50 ` Mark Brown 2012-03-21 11:54 ` Karol Lewandowski [not found] ` <1331657679-31302-1-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-13 16:54 ` [PATCH 3/3] i2c-s3c2410: Add HDMIPHY quirk for S3C2440 Karol Lewandowski [not found] ` <1331657679-31302-4-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-13 17:27 ` Tomasz Stanislawski [not found] ` <4F5F838A.6030908-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-13 18:00 ` Karol Lewandowski 2012-03-13 18:13 ` [PATCH] " Karol Lewandowski 2012-03-14 1:49 ` [PATCH 0/3 v2] Updates for exynos4210 and DT-based systems Kyungmin Park -- strict thread matches above, loose matches on Subject: below -- 2012-03-21 19:11 [PATCH v3 0/3] i2c-s3c2410: " Karol Lewandowski 2012-03-21 19:11 ` [PATCH 2/3] i2c-s3c2410: Rework device type handling Karol Lewandowski [not found] ` <1332357113-2973-3-git-send-email-k.lewandowsk-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2012-03-21 20:30 ` Mark Brown 2012-04-17 17:31 ` Wolfram Sang [not found] ` <20120417173136.GB22406-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 2012-04-18 11:55 ` Karol Lewandowski 2012-04-18 13:39 ` Wolfram Sang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).