From 13493f42bdc89a3a4783a4e66c1ba2f07009e558 Mon Sep 17 00:00:00 2001
From: Davide Cardillo <davide.cardillo@seco.com>
Date: Tue, 4 Jan 2022 12:22:47 +0100
Subject: [PATCH] [i.MX6][CPLD][driver/seco] Add driver v2.0 for SECO CPLD
 LPC/GPIO

---
 drivers/seco/cpld.c       |  8 ++++----
 drivers/seco/pwm_cpld.c   | 22 +++++++++-------------
 include/linux/seco_cpld.h |  2 +-
 3 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/drivers/seco/cpld.c b/drivers/seco/cpld.c
index b0c0cc19a49500..2cd34aa46a7080 100644
--- a/drivers/seco/cpld.c
+++ b/drivers/seco/cpld.c
@@ -41,7 +41,7 @@ void cpld_reg_write (unsigned int addr, uint16_t value) {
 
 
 void cpld_read (unsigned int addr, uint16_t *data) {
-	*data = readw (WEIM_ADDR(addr << 1));
+	*data = __raw_readw (WEIM_ADDR(addr << 1));
 }
 
 
@@ -97,7 +97,7 @@ void dump_reg (void) {
 
 #define CPLD_NAME   "CPLD_device"
 
-int __cpld_init (struct device_node *dp, struct resource *resource) {
+int __cpld_init (struct device *dev, struct device_node *dp, struct resource *resource) {
 	uint16_t rev = 0;
 	int err = 0;
 
@@ -134,7 +134,7 @@ int __cpld_init (struct device_node *dp, struct resource *resource) {
 	cpld_d->name = CPLD_NAME;
 	cpld_d->mem_addr_base = resource[0].start;
 	cpld_d->mem_size = resource_size(&resource[0]);
-	cpld_d->virt = ioremap_cache (cpld_d->mem_addr_base, cpld_d->mem_size);
+	cpld_d->virt = devm_ioremap (dev, cpld_d->mem_addr_base, cpld_d->mem_size);
 	if (cpld_d->virt == NULL) {
 		CPLD_ERR ("Failed to ioremap seco CPLD region");
 		err = -EIO;
@@ -248,7 +248,7 @@ static int cpld_probe (struct platform_device *pdev) {
 	int error = 0;
 	int registred;
 
-	__cpld_init (dp, &res);
+	__cpld_init (&pdev->dev, dp, &res);
 
 	registred = clpd_client_register (dp, &pdev->dev);
 	if ( registred )
diff --git a/drivers/seco/pwm_cpld.c b/drivers/seco/pwm_cpld.c
index 8d36dd5bb9a34c..9bdc54bf5a0ed6 100644
--- a/drivers/seco/pwm_cpld.c
+++ b/drivers/seco/pwm_cpld.c
@@ -127,8 +127,6 @@ static int cpwm_apply( struct pwm_chip *chip, struct pwm_device *pwm,
     unsigned long long period_cycles, duty_cycles, prescale;
     struct cpwm_chip *cpwm = to_cpwm_chip( chip );
     struct pwm_state cstate;
-    unsigned long long clk1;
-	unsigned long long nclk;
 	uint16_t reg_value;
 
     pwm_get_state(pwm, &cstate);
@@ -136,18 +134,16 @@ static int cpwm_apply( struct pwm_chip *chip, struct pwm_device *pwm,
         prescale = 0;
 		
 	    do {
-		    clk1 = (MAIN_CLK >> 1);
-		    do_div (clk1, (prescale + 1));
-		    nclk = state->period * clk1;	
-		    do_div (nclk, 1000000000);	
-		    nclk--;
+		    period_cycles = (MAIN_CLK >> 1);
+		    do_div (period_cycles, (prescale + 1));
+		    do_div (period_cycles, state->period);
+		    period_cycles--;
 		    prescale++;
-	    } while (nclk & ~((unsigned long long)0xFFFF));
+	    } while (period_cycles & ~((unsigned long long)0xFFFF));
 	    prescale--;
-		
-	    period_cycles = nclk;
-	    duty_cycles = nclk * state->duty_cycle;
-	    do_div (duty_cycles, 100);
+
+		duty_cycles = state->duty_cycle * period_cycles;
+		do_div (duty_cycles, state->period);
 
         cpwm_writeb( cpwm->reg_map.PWM_REG_PERIOD, period_cycles  & PWM_MASK_PERIOD);
 	    cpwm_writeb( cpwm->reg_map.PWM_REG_DUTY, duty_cycles & PWM_MASK_DUTY);
@@ -156,7 +152,7 @@ static int cpwm_apply( struct pwm_chip *chip, struct pwm_device *pwm,
         } else {
             cpwm_pol_inv( chip );
         }
-cpwm_pol_inv( chip );
+		cpwm_pol_inv( chip );
 		cpwm_readb( cpwm->reg_map.PWM_REG_PRESCALE, &reg_value );
 		cpwm_writeb( cpwm->reg_map.PWM_REG_PRESCALE, reg_value | (PWM_MASK_PRESCALE & (~PWM_MASK_PRESCALE | prescale)));
 
diff --git a/include/linux/seco_cpld.h b/include/linux/seco_cpld.h
index 70a816db895f2b..3d39b1f287cc5e 100644
--- a/include/linux/seco_cpld.h
+++ b/include/linux/seco_cpld.h
@@ -47,7 +47,7 @@ extern void cpld_write (unsigned int addr, uint16_t value);
 
 extern int cpld_get_membase (void);
 
-extern int __cpld_init (struct device_node *dp, struct resource *resource);
+extern int __cpld_init (struct device *dev, struct device_node *dp, struct resource *resource);
 
 extern int cpld_get_revision (void);
 
-- 
GitLab