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