ODROID-M1/S: Fix PWM mux error

Signed-off-by: Steve Jeong <steve@how2flow.net>
Change-Id: I17b12bf8762a5beb1ab149074ab27eaac4234967
diff --git a/wiringPi/odroidm1.c b/wiringPi/odroidm1.c
index b095983..16998f3 100644
--- a/wiringPi/odroidm1.c
+++ b/wiringPi/odroidm1.c
@@ -425,13 +425,18 @@
 	bank = (bank != 0);
 	data = *(grf[bank] + regOffset);
 
-	// Common IOMUX Funtion 1 : GPIO (3'h0)
 	switch (mode) {
 	case M1_FUNC_GPIO: // Common IOMUX Function 1_GPIO (3'h0)
 		data &= ~(0x7 << ((groupOffset % 4) * 4)); // ~0x07 = 3'h0
 		data |= (0x7 << ((groupOffset % 4) * 4 + 16)); // write_mask
 		*(grf[bank] + regOffset) = data;
 		break;
+	case M1_FUNC_PWM: // gpio0_B5/B6: 3'h100 gpio3_B2: 3'h101
+		data |= (bank == 0 ? (0x4 << ((groupOffset % 4) * 4)) : (0x5 << ((groupOffset % 4) * 4)));
+		data &= (bank == 0 ? ~(0x3 << ((groupOffset % 4) * 4)) : ~(0x2 << ((groupOffset % 4) * 4)));
+		data |= (0x7 << ((groupOffset % 4) * 4 + 16)); // write_mask
+		*(grf[bank] + regOffset) = data;
+		break;
 	default:
 		break;
 	}
@@ -460,9 +465,7 @@
 	pwmRelease(origPin);
 	softPwmStop(origPin);
 	softToneStop(origPin);
-
 	setClkState(bank, M1_CLK_ENABLE);
-	setIomuxMode(origPin, M1_FUNC_GPIO);
 
 	data = *(gpio[bank] + regOffset);
 
@@ -473,6 +476,7 @@
 			_pullUpDnControl(origPin, mode);
 			__attribute__((fallthrough));
 		case OUTPUT:
+			setIomuxMode(origPin, M1_FUNC_GPIO);
 			mode = (mode == OUTPUT);
 			data &= ~(1 << gpioToShiftRegBy16(pin));
 			data |=(mode << gpioToShiftRegBy16(pin));
@@ -486,6 +490,7 @@
 			softToneCreate(origPin);
 			break;
 		case PWM_OUTPUT:
+			setIomuxMode(origPin, M1_FUNC_PWM);
 			pwmSetup(origPin);
 			break;
 		default:
diff --git a/wiringPi/odroidm1.h b/wiringPi/odroidm1.h
index f98abee..b272967 100644
--- a/wiringPi/odroidm1.h
+++ b/wiringPi/odroidm1.h
@@ -36,6 +36,7 @@
 #define GPIO_SIZE	32
 
 #define M1_FUNC_GPIO 0
+#define M1_FUNC_PWM 1
 
 // GPIO[0]
 #define M1_GPIO_0_BASE	0xFDD60000
diff --git a/wiringPi/odroidm1s.c b/wiringPi/odroidm1s.c
index d0856cc..6a75195 100644
--- a/wiringPi/odroidm1s.c
+++ b/wiringPi/odroidm1s.c
@@ -427,13 +427,18 @@
 	bank = (bank != 0);
 	data = *(grf[bank] + regOffset);
 
-	// Common IOMUX Funtion 1 : GPIO (3'h0)
 	switch (mode) {
 	case M1_FUNC_GPIO: // Common IOMUX Function 1_GPIO (3'h0)
 		data &= ~(0x7 << ((groupOffset % 4) * 4)); // ~0x07 = 3'h0
 		data |= (0x7 << ((groupOffset % 4) * 4 + 16)); // write_mask
 		*(grf[bank] + regOffset) = data;
 		break;
+	case M1_FUNC_PWM: // gpio0_B5/B6: 3'h100 gpio0_C2: 3'h001
+		data |= (group < 2 ? (0x4 << ((groupOffset % 4) * 4)) : (0x1 << ((groupOffset % 4) * 4)));
+		data &= (group < 2 ? ~(0x3 << ((groupOffset % 4) * 4)) : ~(0x6 << ((groupOffset % 4) * 4)));
+		data |= (0x7 << ((groupOffset % 4) * 4 + 16)); // write_mask
+		*(grf[bank] + regOffset) = data;
+		break;
 	default:
 		break;
 	}
@@ -462,9 +467,7 @@
 	pwmRelease(origPin);
 	softPwmStop(origPin);
 	softToneStop(origPin);
-
 	setClkState(bank, M1_CLK_ENABLE);
-	setIomuxMode(origPin, M1_FUNC_GPIO);
 
 	data = *(gpio[bank] + regOffset);
 
@@ -475,6 +478,7 @@
 			_pullUpDnControl(origPin, mode);
 			__attribute__((fallthrough));
 		case OUTPUT:
+			setIomuxMode(origPin, M1_FUNC_GPIO);
 			mode = (mode == OUTPUT);
 			data &= ~(1 << gpioToShiftRegBy16(pin));
 			data |=(mode << gpioToShiftRegBy16(pin));
@@ -488,6 +492,7 @@
 			softToneCreate(origPin);
 			break;
 		case PWM_OUTPUT:
+			setIomuxMode(origPin, M1_FUNC_PWM);
 			pwmSetup(origPin);
 			break;
 		default: