linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC
@ 2011-10-10 19:46 Heiko Stübner
  2011-10-10 19:47 ` [PATCH 1/5] S3C2443/S3C2416: Add adc registers Heiko Stübner
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Heiko Stübner @ 2011-10-10 19:46 UTC (permalink / raw)
  To: linux-arm-kernel

The adc blocks of S3C2443 and S3C2416/2450 differ in some regards
from previous (S3C2410, etc) and later (S3C64XX, S5P) SoCs.

This patch series adds support for these ADC implementations.

Each patch was compile tested. But as I have only access to S3C2416
hardware, real life testing happened only there.

Changes since v2:
Drop the quirks and follow the proposal of Kukjin Kim introducing
additional cpu types for S3C2443 and S3C2416.
S3C2443 becomes TYPE_ADCV11, as it's older than the S3C2416 implementation
and S3C2416/2450 becomes TYPE_ADCV12.

Changes since v1:
added a wrap for a line over 80 and moved the adc_setname call
to the s3c24XX.c files where all the other names are set.

Heiko Stuebner (5):
  S3C2443/S3C2416: Add adc registers
  s3c-adc: Fix mux bit modification in s3c_adc_select
  S3C24XX: Allow overriding of adc device name
  s3c-adc: Add support for S3C2443
  s3c-adc: Add support for S3C2416/S3C2450

 arch/arm/mach-s3c2416/s3c2416.c               |    3 ++
 arch/arm/mach-s3c2443/s3c2443.c               |    3 ++
 arch/arm/plat-samsung/adc.c                   |   43 ++++++++++++++++++------
 arch/arm/plat-samsung/include/plat/adc-core.h |    2 +-
 arch/arm/plat-samsung/include/plat/regs-adc.h |    3 ++
 5 files changed, 42 insertions(+), 12 deletions(-)

-- 
1.7.2.3

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/5] S3C2443/S3C2416: Add adc registers
  2011-10-10 19:46 [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Heiko Stübner
@ 2011-10-10 19:47 ` Heiko Stübner
  2011-10-10 19:48 ` [PATCH 2/5] s3c-adc: Fix mux bit modification in s3c_adc_select Heiko Stübner
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Heiko Stübner @ 2011-10-10 19:47 UTC (permalink / raw)
  To: linux-arm-kernel

The adc blocks of the S3C2443 and S3C2416 define some
additional registers and bits.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
---
 arch/arm/plat-samsung/include/plat/regs-adc.h |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/arch/arm/plat-samsung/include/plat/regs-adc.h b/arch/arm/plat-samsung/include/plat/regs-adc.h
index 035e8c3..7061210 100644
--- a/arch/arm/plat-samsung/include/plat/regs-adc.h
+++ b/arch/arm/plat-samsung/include/plat/regs-adc.h
@@ -20,6 +20,7 @@
 #define S3C2410_ADCDAT0	   S3C2410_ADCREG(0x0C)
 #define S3C2410_ADCDAT1	   S3C2410_ADCREG(0x10)
 #define S3C64XX_ADCUPDN		S3C2410_ADCREG(0x14)
+#define S3C2443_ADCMUX		S3C2410_ADCREG(0x18)
 #define S3C64XX_ADCCLRINT	S3C2410_ADCREG(0x18)
 #define S5P_ADCMUX		S3C2410_ADCREG(0x1C)
 #define S3C64XX_ADCCLRINTPNDNUP	S3C2410_ADCREG(0x20)
@@ -33,6 +34,7 @@
 #define S3C2410_ADCCON_PRSCVLMASK	(0xFF<<6)
 #define S3C2410_ADCCON_SELMUX(x)	(((x)&0x7)<<3)
 #define S3C2410_ADCCON_MUXMASK		(0x7<<3)
+#define S3C2416_ADCCON_RESSEL		(1 << 3)
 #define S3C2410_ADCCON_STDBM		(1<<2)
 #define S3C2410_ADCCON_READ_START	(1<<1)
 #define S3C2410_ADCCON_ENABLE_START	(1<<0)
@@ -40,6 +42,7 @@
 
 
 /* ADCTSC Register Bits */
+#define S3C2443_ADCTSC_UD_SEN		(1 << 8)
 #define S3C2410_ADCTSC_YM_SEN		(1<<7)
 #define S3C2410_ADCTSC_YP_SEN		(1<<6)
 #define S3C2410_ADCTSC_XM_SEN		(1<<5)
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/5] s3c-adc: Fix mux bit modification in s3c_adc_select
  2011-10-10 19:46 [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Heiko Stübner
  2011-10-10 19:47 ` [PATCH 1/5] S3C2443/S3C2416: Add adc registers Heiko Stübner
@ 2011-10-10 19:48 ` Heiko Stübner
  2011-10-10 19:49 ` [PATCH 3/5] S3C24XX: Allow overriding of adc device name Heiko Stübner
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Heiko Stübner @ 2011-10-10 19:48 UTC (permalink / raw)
  To: linux-arm-kernel

The mux bits in the adccon register should be cleared only
if muxing is really done in ADCCON and not another register.

This patch introduces a conditional for this.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
---
 arch/arm/plat-samsung/adc.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/arm/plat-samsung/adc.c b/arch/arm/plat-samsung/adc.c
index ee8deef..7821055a 100644
--- a/arch/arm/plat-samsung/adc.c
+++ b/arch/arm/plat-samsung/adc.c
@@ -98,7 +98,8 @@ static inline void s3c_adc_select(struct adc_device *adc,
 
 	client->select_cb(client, 1);
 
-	con &= ~S3C2410_ADCCON_MUXMASK;
+	if (cpu == TYPE_ADCV1 || cpu == TYPE_ADCV2)
+		con &= ~S3C2410_ADCCON_MUXMASK;
 	con &= ~S3C2410_ADCCON_STDBM;
 	con &= ~S3C2410_ADCCON_STARTMASK;
 
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/5] S3C24XX: Allow overriding of adc device name
  2011-10-10 19:46 [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Heiko Stübner
  2011-10-10 19:47 ` [PATCH 1/5] S3C2443/S3C2416: Add adc registers Heiko Stübner
  2011-10-10 19:48 ` [PATCH 2/5] s3c-adc: Fix mux bit modification in s3c_adc_select Heiko Stübner
@ 2011-10-10 19:49 ` Heiko Stübner
  2011-10-10 19:50 ` [PATCH 4/5] s3c-adc: Add support for S3C2443 Heiko Stübner
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Heiko Stübner @ 2011-10-10 19:49 UTC (permalink / raw)
  To: linux-arm-kernel

The adc blocks of S3C2443 and S3C2416 contain quirks not present
in the stock S3C24xx adc. Therefore allow them to alter the
device name via s3c_adc_setname.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
---
 arch/arm/plat-samsung/include/plat/adc-core.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/arm/plat-samsung/include/plat/adc-core.h b/arch/arm/plat-samsung/include/plat/adc-core.h
index a281568..a927bee 100644
--- a/arch/arm/plat-samsung/include/plat/adc-core.h
+++ b/arch/arm/plat-samsung/include/plat/adc-core.h
@@ -20,7 +20,7 @@
 /* re-define device name depending on support. */
 static inline void s3c_adc_setname(char *name)
 {
-#ifdef CONFIG_SAMSUNG_DEV_ADC
+#if defined(CONFIG_SAMSUNG_DEV_ADC) || defined(CONFIG_PLAT_S3C24XX)
 	s3c_device_adc.name = name;
 #endif
 }
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/5] s3c-adc: Add support for S3C2443
  2011-10-10 19:46 [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Heiko Stübner
                   ` (2 preceding siblings ...)
  2011-10-10 19:49 ` [PATCH 3/5] S3C24XX: Allow overriding of adc device name Heiko Stübner
@ 2011-10-10 19:50 ` Heiko Stübner
  2011-10-10 19:51 ` [PATCH 5/5] s3c-adc: Add support for S3C2416/S3C2450 Heiko Stübner
  2011-10-14  7:13 ` [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Kukjin Kim
  5 siblings, 0 replies; 7+ messages in thread
From: Heiko Stübner @ 2011-10-10 19:50 UTC (permalink / raw)
  To: linux-arm-kernel

The S3C2443-adc is 10 bit wide and has its mux-select
in an extra register at base+0x18

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
---
 arch/arm/mach-s3c2443/s3c2443.c |    3 +++
 arch/arm/plat-samsung/adc.c     |   17 ++++++++++++-----
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-s3c2443/s3c2443.c b/arch/arm/mach-s3c2443/s3c2443.c
index e6a28ba..11dae3e 100644
--- a/arch/arm/mach-s3c2443/s3c2443.c
+++ b/arch/arm/mach-s3c2443/s3c2443.c
@@ -41,6 +41,7 @@
 #include <plat/cpu.h>
 #include <plat/fb-core.h>
 #include <plat/nand-core.h>
+#include <plat/adc-core.h>
 
 static struct map_desc s3c2443_iodesc[] __initdata = {
 	IODESC_ENT(WATCHDOG),
@@ -70,6 +71,8 @@ int __init s3c2443_init(void)
 	s3c_nand_setname("s3c2412-nand");
 	s3c_fb_setname("s3c2443-fb");
 
+	s3c_adc_setname("s3c2443-adc");
+
 	/* change WDT IRQ number */
 	s3c_device_wdt.resource[1].start = IRQ_S3C2443_WDT;
 	s3c_device_wdt.resource[1].end   = IRQ_S3C2443_WDT;
diff --git a/arch/arm/plat-samsung/adc.c b/arch/arm/plat-samsung/adc.c
index 7821055a..266544b 100644
--- a/arch/arm/plat-samsung/adc.c
+++ b/arch/arm/plat-samsung/adc.c
@@ -41,6 +41,7 @@
 
 enum s3c_cpu_type {
 	TYPE_ADCV1, /* S3C24XX */
+	TYPE_ADCV11, /* S3C2443 */
 	TYPE_ADCV2, /* S3C64XX, S5P64X0, S5PC100 */
 	TYPE_ADCV3, /* S5PV210, S5PC110, EXYNOS4210 */
 };
@@ -106,6 +107,9 @@ static inline void s3c_adc_select(struct adc_device *adc,
 	if (!client->is_ts) {
 		if (cpu == TYPE_ADCV3)
 			writel(client->channel & 0xf, adc->regs + S5P_ADCMUX);
+		else if (cpu == TYPE_ADCV11)
+			writel(client->channel & 0xf,
+						adc->regs + S3C2443_ADCMUX);
 		else
 			con |= S3C2410_ADCCON_SELMUX(client->channel);
 	}
@@ -294,13 +298,13 @@ static irqreturn_t s3c_adc_irq(int irq, void *pw)
 
 	client->nr_samples--;
 
-	if (cpu != TYPE_ADCV1) {
+	if (cpu == TYPE_ADCV1 || cpu == TYPE_ADCV11) {
+		data0 &= 0x3ff;
+		data1 &= 0x3ff;
+	} else {
 		/* S3C64XX/S5P ADC resolution is 12-bit */
 		data0 &= 0xfff;
 		data1 &= 0xfff;
-	} else {
-		data0 &= 0x3ff;
-		data1 &= 0x3ff;
 	}
 
 	if (client->convert_cb)
@@ -321,7 +325,7 @@ static irqreturn_t s3c_adc_irq(int irq, void *pw)
 	}
 
 exit:
-	if (cpu != TYPE_ADCV1) {
+	if (cpu == TYPE_ADCV2 || cpu == TYPE_ADCV3) {
 		/* Clear ADC interrupt */
 		writel(0, adc->regs + S3C64XX_ADCCLRINT);
 	}
@@ -493,6 +497,9 @@ static struct platform_device_id s3c_adc_driver_ids[] = {
 		.name           = "s3c24xx-adc",
 		.driver_data    = TYPE_ADCV1,
 	}, {
+		.name           = "s3c2443-adc",
+		.driver_data    = TYPE_ADCV11,
+	}, {
 		.name           = "s3c64xx-adc",
 		.driver_data    = TYPE_ADCV2,
 	}, {
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 5/5] s3c-adc: Add support for S3C2416/S3C2450
  2011-10-10 19:46 [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Heiko Stübner
                   ` (3 preceding siblings ...)
  2011-10-10 19:50 ` [PATCH 4/5] s3c-adc: Add support for S3C2443 Heiko Stübner
@ 2011-10-10 19:51 ` Heiko Stübner
  2011-10-14  7:13 ` [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Kukjin Kim
  5 siblings, 0 replies; 7+ messages in thread
From: Heiko Stübner @ 2011-10-10 19:51 UTC (permalink / raw)
  To: linux-arm-kernel

The ADC of the S3C2416/2450 SoC is 10 or 12 bit wide, has its
source selection in the register base+0x18 and its width
selection in bit 03 of the ADCCON register.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
---
 arch/arm/mach-s3c2416/s3c2416.c |    3 +++
 arch/arm/plat-samsung/adc.c     |   25 +++++++++++++++++++------
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-s3c2416/s3c2416.c b/arch/arm/mach-s3c2416/s3c2416.c
index 494ce91..4261bdc 100644
--- a/arch/arm/mach-s3c2416/s3c2416.c
+++ b/arch/arm/mach-s3c2416/s3c2416.c
@@ -60,6 +60,7 @@
 #include <plat/iic-core.h>
 #include <plat/fb-core.h>
 #include <plat/nand-core.h>
+#include <plat/adc-core.h>
 
 static struct map_desc s3c2416_iodesc[] __initdata = {
 	IODESC_ENT(WATCHDOG),
@@ -97,6 +98,8 @@ int __init s3c2416_init(void)
 
 	s3c_fb_setname("s3c2443-fb");
 
+	s3c_adc_setname("s3c2416-adc");
+
 	register_syscore_ops(&s3c2416_pm_syscore_ops);
 	register_syscore_ops(&s3c24xx_irq_syscore_ops);
 
diff --git a/arch/arm/plat-samsung/adc.c b/arch/arm/plat-samsung/adc.c
index 266544b..94cb793 100644
--- a/arch/arm/plat-samsung/adc.c
+++ b/arch/arm/plat-samsung/adc.c
@@ -42,6 +42,7 @@
 enum s3c_cpu_type {
 	TYPE_ADCV1, /* S3C24XX */
 	TYPE_ADCV11, /* S3C2443 */
+	TYPE_ADCV12, /* S3C2416, S3C2450 */
 	TYPE_ADCV2, /* S3C64XX, S5P64X0, S5PC100 */
 	TYPE_ADCV3, /* S5PV210, S5PC110, EXYNOS4210 */
 };
@@ -107,7 +108,7 @@ static inline void s3c_adc_select(struct adc_device *adc,
 	if (!client->is_ts) {
 		if (cpu == TYPE_ADCV3)
 			writel(client->channel & 0xf, adc->regs + S5P_ADCMUX);
-		else if (cpu == TYPE_ADCV11)
+		else if (cpu == TYPE_ADCV11 || cpu == TYPE_ADCV12)
 			writel(client->channel & 0xf,
 						adc->regs + S3C2443_ADCMUX);
 		else
@@ -302,7 +303,7 @@ static irqreturn_t s3c_adc_irq(int irq, void *pw)
 		data0 &= 0x3ff;
 		data1 &= 0x3ff;
 	} else {
-		/* S3C64XX/S5P ADC resolution is 12-bit */
+		/* S3C2416/S3C64XX/S5P ADC resolution is 12-bit */
 		data0 &= 0xfff;
 		data1 &= 0xfff;
 	}
@@ -337,6 +338,7 @@ static int s3c_adc_probe(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	struct adc_device *adc;
 	struct resource *regs;
+	enum s3c_cpu_type cpu = platform_get_device_id(pdev)->driver_data;
 	int ret;
 	unsigned tmp;
 
@@ -399,10 +401,13 @@ static int s3c_adc_probe(struct platform_device *pdev)
 	clk_enable(adc->clk);
 
 	tmp = adc->prescale | S3C2410_ADCCON_PRSCEN;
-	if (platform_get_device_id(pdev)->driver_data != TYPE_ADCV1) {
-		/* Enable 12-bit ADC resolution */
+
+	/* Enable 12-bit ADC resolution */
+	if (cpu == TYPE_ADCV12)
+		tmp |= S3C2416_ADCCON_RESSEL;
+	if (cpu == TYPE_ADCV2 || cpu == TYPE_ADCV3)
 		tmp |= S3C64XX_ADCCON_RESSEL;
-	}
+
 	writel(tmp, adc->regs + S3C2410_ADCCON);
 
 	dev_info(dev, "attached adc driver\n");
@@ -469,6 +474,7 @@ static int s3c_adc_resume(struct device *dev)
 	struct platform_device *pdev = container_of(dev,
 			struct platform_device, dev);
 	struct adc_device *adc = platform_get_drvdata(pdev);
+	enum s3c_cpu_type cpu = platform_get_device_id(pdev)->driver_data;
 	int ret;
 	unsigned long tmp;
 
@@ -479,9 +485,13 @@ static int s3c_adc_resume(struct device *dev)
 	enable_irq(adc->irq);
 
 	tmp = adc->prescale | S3C2410_ADCCON_PRSCEN;
+
 	/* Enable 12-bit ADC resolution */
-	if (platform_get_device_id(pdev)->driver_data != TYPE_ADCV1)
+	if (cpu == TYPE_ADCV12)
+		tmp |= S3C2416_ADCCON_RESSEL;
+	if (cpu == TYPE_ADCV2 || cpu == TYPE_ADCV3)
 		tmp |= S3C64XX_ADCCON_RESSEL;
+
 	writel(tmp, adc->regs + S3C2410_ADCCON);
 
 	return 0;
@@ -500,6 +510,9 @@ static struct platform_device_id s3c_adc_driver_ids[] = {
 		.name           = "s3c2443-adc",
 		.driver_data    = TYPE_ADCV11,
 	}, {
+		.name           = "s3c2416-adc",
+		.driver_data    = TYPE_ADCV12,
+	}, {
 		.name           = "s3c64xx-adc",
 		.driver_data    = TYPE_ADCV2,
 	}, {
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC
  2011-10-10 19:46 [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Heiko Stübner
                   ` (4 preceding siblings ...)
  2011-10-10 19:51 ` [PATCH 5/5] s3c-adc: Add support for S3C2416/S3C2450 Heiko Stübner
@ 2011-10-14  7:13 ` Kukjin Kim
  5 siblings, 0 replies; 7+ messages in thread
From: Kukjin Kim @ 2011-10-14  7:13 UTC (permalink / raw)
  To: linux-arm-kernel

Heiko St?bner wrote:
> 
> The adc blocks of S3C2443 and S3C2416/2450 differ in some regards
> from previous (S3C2410, etc) and later (S3C64XX, S5P) SoCs.
> 
> This patch series adds support for these ADC implementations.
> 
> Each patch was compile tested. But as I have only access to S3C2416
> hardware, real life testing happened only there.
> 
> Changes since v2:
> Drop the quirks and follow the proposal of Kukjin Kim introducing
> additional cpu types for S3C2443 and S3C2416.
> S3C2443 becomes TYPE_ADCV11, as it's older than the S3C2416 implementation
> and S3C2416/2450 becomes TYPE_ADCV12.
> 
> Changes since v1:
> added a wrap for a line over 80 and moved the adc_setname call
> to the s3c24XX.c files where all the other names are set.
> 
> Heiko Stuebner (5):
>   S3C2443/S3C2416: Add adc registers
>   s3c-adc: Fix mux bit modification in s3c_adc_select
>   S3C24XX: Allow overriding of adc device name
>   s3c-adc: Add support for S3C2443
>   s3c-adc: Add support for S3C2416/S3C2450
> 
>  arch/arm/mach-s3c2416/s3c2416.c               |    3 ++
>  arch/arm/mach-s3c2443/s3c2443.c               |    3 ++
>  arch/arm/plat-samsung/adc.c                   |   43
> ++++++++++++++++++------
>  arch/arm/plat-samsung/include/plat/adc-core.h |    2 +-
>  arch/arm/plat-samsung/include/plat/regs-adc.h |    3 ++
>  5 files changed, 42 insertions(+), 12 deletions(-)
> 
> --
> 1.7.2.3

Hi Heiko,

Thanks for your re-work and looks ok to me, applied.

Best regards,
Kgene.
--
Kukjin Kim <kgene.kim@samsung.com>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-10-14  7:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-10 19:46 [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Heiko Stübner
2011-10-10 19:47 ` [PATCH 1/5] S3C2443/S3C2416: Add adc registers Heiko Stübner
2011-10-10 19:48 ` [PATCH 2/5] s3c-adc: Fix mux bit modification in s3c_adc_select Heiko Stübner
2011-10-10 19:49 ` [PATCH 3/5] S3C24XX: Allow overriding of adc device name Heiko Stübner
2011-10-10 19:50 ` [PATCH 4/5] s3c-adc: Add support for S3C2443 Heiko Stübner
2011-10-10 19:51 ` [PATCH 5/5] s3c-adc: Add support for S3C2416/S3C2450 Heiko Stübner
2011-10-14  7:13 ` [PATCH v3 0/5] S3C2443/S3C2416: Implement support for ADC Kukjin Kim

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).