[PATCH] spi: s3c64xx: Remove unused platform_device_id entries

2015-12-29 Thread Sylwester Nawrocki
s5pv210 and exynos4 are now DT only platforms hence these
entries can now be safely removed from the match table.

Signed-off-by: Sylwester Nawrocki 
---
 drivers/spi/spi-s3c64xx.c |6 --
 1 file changed, 6 deletions(-)

diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index 8e86e7f..ec697fe 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -1370,12 +1370,6 @@ static const struct platform_device_id 
s3c64xx_spi_driver_ids[] = {
}, {
.name   = "s3c6410-spi",
.driver_data= (kernel_ulong_t)_spi_port_config,
-   }, {
-   .name   = "s5pv210-spi",
-   .driver_data= (kernel_ulong_t)_spi_port_config,
-   }, {
-   .name   = "exynos4210-spi",
-   .driver_data= (kernel_ulong_t)_spi_port_config,
},
{ },
 };
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/3] rtc: s5m: Add separate field for storing auto-cleared mask in register config

2015-12-29 Thread Krzysztof Kozlowski
Some devices from S2M/S5M family use different register update masks for
different operations (alarm and register update). Now the driver uses
common register configuration and a lot of exceptions per device in code.

Before eliminating the exceptions and using specific register
configuration for given device, make the auto-cleared mask a separate
field. This is merely a refactoring.

Signed-off-by: Krzysztof Kozlowski 
---
 drivers/rtc/rtc-s5m.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index 85649861a6b0..559db8f72117 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -56,6 +56,8 @@ struct s5m_rtc_reg_config {
 * auto-cleared after successful update.
 */
unsigned int udr_update;
+   /* Auto-cleared mask in UDR field for writing time and alarm */
+   unsigned int autoclear_udr_mask;
/* Mask for UDR field in 'udr_update' register */
unsigned int udr_mask;
 };
@@ -68,6 +70,7 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
.alarm0 = S5M_ALARM0_SEC,
.alarm1 = S5M_ALARM1_SEC,
.udr_update = S5M_RTC_UDR_CON,
+   .autoclear_udr_mask = S5M_RTC_UDR_MASK,
.udr_mask   = S5M_RTC_UDR_MASK,
 };
 
@@ -82,6 +85,7 @@ static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
.alarm0 = S2MPS_ALARM0_SEC,
.alarm1 = S2MPS_ALARM1_SEC,
.udr_update = S2MPS_RTC_UDR_CON,
+   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
.udr_mask   = S2MPS_RTC_WUDR_MASK,
 };
 
@@ -167,7 +171,7 @@ static inline int s5m8767_wait_for_udr_update(struct 
s5m_rtc_info *info)
 
do {
ret = regmap_read(info->regmap, info->regs->udr_update, );
-   } while (--retry && (data & info->regs->udr_mask) && !ret);
+   } while (--retry && (data & info->regs->autoclear_udr_mask) && !ret);
 
if (!retry)
dev_err(info->dev, "waiting for UDR update, reached max number 
of retries\n");
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 3/3] rtc: s5m: Make register configuration per S2MPS device to remove exceptions

2015-12-29 Thread Krzysztof Kozlowski
Before updating time and alarm the driver must set appropriate mask in
UDR register. For that purpose the driver uses common register
configuration and a lot of exceptions per device in the code. The
exceptions are not obvious, for example except the change in the logic
sometimes the fields are swapped (WUDR and AUDR between S2MPS14 and
S2MPS15). This leads to quite complicated code.

Try to make it more obvious by:
1. Documenting the UDR masks for devices and operations.
2. Adding fields in register configuration structure for each operation
   (read time, write time and alarm).
3. Splitting the configuration per S2MPS13, S2MPS14 and S2MPS15 thus
   removing exceptions for them.

Signed-off-by: Krzysztof Kozlowski 

---

Tested only on S2MPS11 (Odroid XU4).
---
 drivers/rtc/rtc-s5m.c   | 110 +++-
 include/linux/mfd/samsung/rtc.h |   2 +
 2 files changed, 77 insertions(+), 35 deletions(-)

diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index 559db8f72117..7407d7394bb4 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -38,7 +38,22 @@
  */
 #define UDR_READ_RETRY_CNT 5
 
-/* Registers used by the driver which are different between chipsets. */
+/*
+ * Registers used by the driver which are different between chipsets.
+ *
+ * Operations like read time and write alarm/time require updating
+ * specific fields in UDR register. These fields usually are auto-cleared
+ * (with some exceptions).
+ *
+ * Table of operations per device:
+ *
+ * Device | Write time | Read time | Write alarm
+ * =
+ * S5M8767| UDR + TIME |   | UDR
+ * S2MPS11/14 | WUDR   | RUDR  | WUDR + RUDR
+ * S2MPS13| WUDR   | RUDR  | WUDR + AUDR
+ * S2MPS15| WUDR   | RUDR  | AUDR
+ */
 struct s5m_rtc_reg_config {
/* Number of registers used for setting time/alarm0/alarm1 */
unsigned int regs_count;
@@ -58,8 +73,13 @@ struct s5m_rtc_reg_config {
unsigned int udr_update;
/* Auto-cleared mask in UDR field for writing time and alarm */
unsigned int autoclear_udr_mask;
-   /* Mask for UDR field in 'udr_update' register */
-   unsigned int udr_mask;
+   /*
+* Masks in UDR field for time and alarm operations.
+* The read time mask can be 0. Rest should not.
+*/
+   unsigned int read_time_udr_mask;
+   unsigned int write_time_udr_mask;
+   unsigned int write_alarm_udr_mask;
 };
 
 /* Register map for S5M8763 and S5M8767 */
@@ -71,14 +91,44 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
.alarm1 = S5M_ALARM1_SEC,
.udr_update = S5M_RTC_UDR_CON,
.autoclear_udr_mask = S5M_RTC_UDR_MASK,
-   .udr_mask   = S5M_RTC_UDR_MASK,
+   .read_time_udr_mask = 0, /* Not needed */
+   .write_time_udr_mask= S5M_RTC_UDR_MASK | S5M_RTC_TIME_EN_MASK,
+   .write_alarm_udr_mask   = S5M_RTC_UDR_MASK,
+};
+
+/* Register map for S2MPS13 */
+static const struct s5m_rtc_reg_config s2mps13_rtc_regs = {
+   .regs_count = 7,
+   .time   = S2MPS_RTC_SEC,
+   .ctrl   = S2MPS_RTC_CTRL,
+   .alarm0 = S2MPS_ALARM0_SEC,
+   .alarm1 = S2MPS_ALARM1_SEC,
+   .udr_update = S2MPS_RTC_UDR_CON,
+   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
+   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
+   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
+   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | S2MPS13_RTC_AUDR_MASK,
+};
+
+/* Register map for S2MPS11/14 */
+static const struct s5m_rtc_reg_config s2mps14_rtc_regs = {
+   .regs_count = 7,
+   .time   = S2MPS_RTC_SEC,
+   .ctrl   = S2MPS_RTC_CTRL,
+   .alarm0 = S2MPS_ALARM0_SEC,
+   .alarm1 = S2MPS_ALARM1_SEC,
+   .udr_update = S2MPS_RTC_UDR_CON,
+   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
+   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
+   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
+   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | S2MPS_RTC_RUDR_MASK,
 };
 
 /*
- * Register map for S2MPS14.
- * It may be also suitable for S2MPS11 but this was not tested.
+ * Register map for S2MPS15 - in comparison to S2MPS14 the WUDR and AUDR bits
+ * are swapped.
  */
-static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
+static const struct s5m_rtc_reg_config s2mps15_rtc_regs = {
.regs_count = 7,
.time   = S2MPS_RTC_SEC,
.ctrl   = S2MPS_RTC_CTRL,
@@ -86,7 +136,9 @@ static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
.alarm1 = S2MPS_ALARM1_SEC,
.udr_update = S2MPS_RTC_UDR_CON,

[PATCH 1/3] rtc: s5m: Cleanup by removing useless 'rtc' prefix from fields

2015-12-29 Thread Krzysztof Kozlowski
Remove the 'rtc' prefix from some of the fields in struct
s5m_rtc_reg_config because it is obvious - this is a RTC driver. No
functional changes.

Signed-off-by: Krzysztof Kozlowski 
---
 drivers/rtc/rtc-s5m.c | 40 +++-
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index 0d68a85dd429..85649861a6b0 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -55,9 +55,9 @@ struct s5m_rtc_reg_config {
 * will enable update of time or alarm register. Then it will be
 * auto-cleared after successful update.
 */
-   unsigned int rtc_udr_update;
-   /* Mask for UDR field in 'rtc_udr_update' register */
-   unsigned int rtc_udr_mask;
+   unsigned int udr_update;
+   /* Mask for UDR field in 'udr_update' register */
+   unsigned int udr_mask;
 };
 
 /* Register map for S5M8763 and S5M8767 */
@@ -67,8 +67,8 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
.ctrl   = S5M_ALARM1_CONF,
.alarm0 = S5M_ALARM0_SEC,
.alarm1 = S5M_ALARM1_SEC,
-   .rtc_udr_update = S5M_RTC_UDR_CON,
-   .rtc_udr_mask   = S5M_RTC_UDR_MASK,
+   .udr_update = S5M_RTC_UDR_CON,
+   .udr_mask   = S5M_RTC_UDR_MASK,
 };
 
 /*
@@ -81,8 +81,8 @@ static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
.ctrl   = S2MPS_RTC_CTRL,
.alarm0 = S2MPS_ALARM0_SEC,
.alarm1 = S2MPS_ALARM1_SEC,
-   .rtc_udr_update = S2MPS_RTC_UDR_CON,
-   .rtc_udr_mask   = S2MPS_RTC_WUDR_MASK,
+   .udr_update = S2MPS_RTC_UDR_CON,
+   .udr_mask   = S2MPS_RTC_WUDR_MASK,
 };
 
 struct s5m_rtc_info {
@@ -166,9 +166,8 @@ static inline int s5m8767_wait_for_udr_update(struct 
s5m_rtc_info *info)
unsigned int data;
 
do {
-   ret = regmap_read(info->regmap, info->regs->rtc_udr_update,
-   );
-   } while (--retry && (data & info->regs->rtc_udr_mask) && !ret);
+   ret = regmap_read(info->regmap, info->regs->udr_update, );
+   } while (--retry && (data & info->regs->udr_mask) && !ret);
 
if (!retry)
dev_err(info->dev, "waiting for UDR update, reached max number 
of retries\n");
@@ -214,7 +213,7 @@ static inline int s5m8767_rtc_set_time_reg(struct 
s5m_rtc_info *info)
int ret;
unsigned int data;
 
-   ret = regmap_read(info->regmap, info->regs->rtc_udr_update, );
+   ret = regmap_read(info->regmap, info->regs->udr_update, );
if (ret < 0) {
dev_err(info->dev, "failed to read update reg(%d)\n", ret);
return ret;
@@ -223,21 +222,20 @@ static inline int s5m8767_rtc_set_time_reg(struct 
s5m_rtc_info *info)
switch (info->device_type) {
case S5M8763X:
case S5M8767X:
-   data |= info->regs->rtc_udr_mask | S5M_RTC_TIME_EN_MASK;
+   data |= info->regs->udr_mask | S5M_RTC_TIME_EN_MASK;
case S2MPS15X:
/* As per UM, for write time register, set WUDR bit to high */
data |= S2MPS15_RTC_WUDR_MASK;
break;
case S2MPS14X:
case S2MPS13X:
-   data |= info->regs->rtc_udr_mask;
+   data |= info->regs->udr_mask;
break;
default:
return -EINVAL;
}
 
-
-   ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data);
+   ret = regmap_write(info->regmap, info->regs->udr_update, data);
if (ret < 0) {
dev_err(info->dev, "failed to write update reg(%d)\n", ret);
return ret;
@@ -253,14 +251,14 @@ static inline int s5m8767_rtc_set_alarm_reg(struct 
s5m_rtc_info *info)
int ret;
unsigned int data;
 
-   ret = regmap_read(info->regmap, info->regs->rtc_udr_update, );
+   ret = regmap_read(info->regmap, info->regs->udr_update, );
if (ret < 0) {
dev_err(info->dev, "%s: fail to read update reg(%d)\n",
__func__, ret);
return ret;
}
 
-   data |= info->regs->rtc_udr_mask;
+   data |= info->regs->udr_mask;
switch (info->device_type) {
case S5M8763X:
case S5M8767X:
@@ -268,7 +266,7 @@ static inline int s5m8767_rtc_set_alarm_reg(struct 
s5m_rtc_info *info)
break;
case S2MPS15X:
/* As per UM, for write alarm, set A_UDR(bit[4]) to high
-* rtc_udr_mask above sets bit[4]
+* udr_mask above sets bit[4]
 */
break;
case S2MPS14X:
@@ -281,7 +279,7 @@ static inline int s5m8767_rtc_set_alarm_reg(struct 
s5m_rtc_info *info)
return -EINVAL;
}
 
-   

Re: [PATCH 3/3] rtc: s5m: Make register configuration per S2MPS device to remove exceptions

2015-12-29 Thread Yadwinder Singh Brar
Hi Krysztof,

On Tue, Dec 29, 2015 at 5:53 PM, Krzysztof Kozlowski
 wrote:
> Before updating time and alarm the driver must set appropriate mask in
> UDR register. For that purpose the driver uses common register
> configuration and a lot of exceptions per device in the code. The
> exceptions are not obvious, for example except the change in the logic
> sometimes the fields are swapped (WUDR and AUDR between S2MPS14 and
> S2MPS15). This leads to quite complicated code.
>
> Try to make it more obvious by:
> 1. Documenting the UDR masks for devices and operations.
> 2. Adding fields in register configuration structure for each operation
>(read time, write time and alarm).
> 3. Splitting the configuration per S2MPS13, S2MPS14 and S2MPS15 thus
>removing exceptions for them.
>
> Signed-off-by: Krzysztof Kozlowski 
>
> ---
>
> Tested only on S2MPS11 (Odroid XU4).
> ---
>  drivers/rtc/rtc-s5m.c   | 110 
> +++-
>  include/linux/mfd/samsung/rtc.h |   2 +
>  2 files changed, 77 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
> index 559db8f72117..7407d7394bb4 100644
> --- a/drivers/rtc/rtc-s5m.c
> +++ b/drivers/rtc/rtc-s5m.c
> @@ -38,7 +38,22 @@
>   */
>  #define UDR_READ_RETRY_CNT 5
>
> -/* Registers used by the driver which are different between chipsets. */
> +/*
> + * Registers used by the driver which are different between chipsets.
> + *
> + * Operations like read time and write alarm/time require updating
> + * specific fields in UDR register. These fields usually are auto-cleared
> + * (with some exceptions).
> + *
> + * Table of operations per device:
> + *
> + * Device | Write time | Read time | Write alarm
> + * =
> + * S5M8767| UDR + TIME |   | UDR
> + * S2MPS11/14 | WUDR   | RUDR  | WUDR + RUDR
> + * S2MPS13| WUDR   | RUDR  | WUDR + AUDR
> + * S2MPS15| WUDR   | RUDR  | AUDR
> + */
>  struct s5m_rtc_reg_config {
> /* Number of registers used for setting time/alarm0/alarm1 */
> unsigned int regs_count;
> @@ -58,8 +73,13 @@ struct s5m_rtc_reg_config {
> unsigned int udr_update;
> /* Auto-cleared mask in UDR field for writing time and alarm */
> unsigned int autoclear_udr_mask;
> -   /* Mask for UDR field in 'udr_update' register */
> -   unsigned int udr_mask;
> +   /*
> +* Masks in UDR field for time and alarm operations.
> +* The read time mask can be 0. Rest should not.
> +*/
> +   unsigned int read_time_udr_mask;
> +   unsigned int write_time_udr_mask;
> +   unsigned int write_alarm_udr_mask;
>  };
>
>  /* Register map for S5M8763 and S5M8767 */
> @@ -71,14 +91,44 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
> .alarm1 = S5M_ALARM1_SEC,
> .udr_update = S5M_RTC_UDR_CON,
> .autoclear_udr_mask = S5M_RTC_UDR_MASK,
> -   .udr_mask   = S5M_RTC_UDR_MASK,
> +   .read_time_udr_mask = 0, /* Not needed */
> +   .write_time_udr_mask= S5M_RTC_UDR_MASK | S5M_RTC_TIME_EN_MASK,
> +   .write_alarm_udr_mask   = S5M_RTC_UDR_MASK,
> +};
> +
> +/* Register map for S2MPS13 */
> +static const struct s5m_rtc_reg_config s2mps13_rtc_regs = {
> +   .regs_count = 7,
> +   .time   = S2MPS_RTC_SEC,
> +   .ctrl   = S2MPS_RTC_CTRL,
> +   .alarm0 = S2MPS_ALARM0_SEC,
> +   .alarm1 = S2MPS_ALARM1_SEC,
> +   .udr_update = S2MPS_RTC_UDR_CON,
> +   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
> +   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
> +   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
> +   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | S2MPS13_RTC_AUDR_MASK,
> +};
> +
> +/* Register map for S2MPS11/14 */
> +static const struct s5m_rtc_reg_config s2mps14_rtc_regs = {
> +   .regs_count = 7,
> +   .time   = S2MPS_RTC_SEC,
> +   .ctrl   = S2MPS_RTC_CTRL,
> +   .alarm0 = S2MPS_ALARM0_SEC,
> +   .alarm1 = S2MPS_ALARM1_SEC,
> +   .udr_update = S2MPS_RTC_UDR_CON,
> +   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
> +   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
> +   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
> +   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | S2MPS_RTC_RUDR_MASK,
>  };
>
>  /*
> - * Register map for S2MPS14.
> - * It may be also suitable for S2MPS11 but this was not tested.
> + * Register map for S2MPS15 - in comparison to S2MPS14 the WUDR and AUDR bits
> + * are swapped.
>   */
> -static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
> +static const struct s5m_rtc_reg_config s2mps15_rtc_regs = {
> 

Re: [PATCH 3/3] rtc: s5m: Make register configuration per S2MPS device to remove exceptions

2015-12-29 Thread Krzysztof Kozlowski
On 30.12.2015 11:53, Yadwinder Singh Brar wrote:
> Hi Krysztof,
> 
> On Tue, Dec 29, 2015 at 5:53 PM, Krzysztof Kozlowski
>  wrote:
>> Before updating time and alarm the driver must set appropriate mask in
>> UDR register. For that purpose the driver uses common register
>> configuration and a lot of exceptions per device in the code. The
>> exceptions are not obvious, for example except the change in the logic
>> sometimes the fields are swapped (WUDR and AUDR between S2MPS14 and
>> S2MPS15). This leads to quite complicated code.
>>
>> Try to make it more obvious by:
>> 1. Documenting the UDR masks for devices and operations.
>> 2. Adding fields in register configuration structure for each operation
>>(read time, write time and alarm).
>> 3. Splitting the configuration per S2MPS13, S2MPS14 and S2MPS15 thus
>>removing exceptions for them.
>>
>> Signed-off-by: Krzysztof Kozlowski 
>>
>> ---
>>
>> Tested only on S2MPS11 (Odroid XU4).
>> ---
>>  drivers/rtc/rtc-s5m.c   | 110 
>> +++-
>>  include/linux/mfd/samsung/rtc.h |   2 +
>>  2 files changed, 77 insertions(+), 35 deletions(-)
>>
>> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
>> index 559db8f72117..7407d7394bb4 100644
>> --- a/drivers/rtc/rtc-s5m.c
>> +++ b/drivers/rtc/rtc-s5m.c
>> @@ -38,7 +38,22 @@
>>   */
>>  #define UDR_READ_RETRY_CNT 5
>>
>> -/* Registers used by the driver which are different between chipsets. */
>> +/*
>> + * Registers used by the driver which are different between chipsets.
>> + *
>> + * Operations like read time and write alarm/time require updating
>> + * specific fields in UDR register. These fields usually are auto-cleared
>> + * (with some exceptions).
>> + *
>> + * Table of operations per device:
>> + *
>> + * Device | Write time | Read time | Write alarm
>> + * =
>> + * S5M8767| UDR + TIME |   | UDR
>> + * S2MPS11/14 | WUDR   | RUDR  | WUDR + RUDR
>> + * S2MPS13| WUDR   | RUDR  | WUDR + AUDR
>> + * S2MPS15| WUDR   | RUDR  | AUDR
>> + */
>>  struct s5m_rtc_reg_config {
>> /* Number of registers used for setting time/alarm0/alarm1 */
>> unsigned int regs_count;
>> @@ -58,8 +73,13 @@ struct s5m_rtc_reg_config {
>> unsigned int udr_update;
>> /* Auto-cleared mask in UDR field for writing time and alarm */
>> unsigned int autoclear_udr_mask;
>> -   /* Mask for UDR field in 'udr_update' register */
>> -   unsigned int udr_mask;
>> +   /*
>> +* Masks in UDR field for time and alarm operations.
>> +* The read time mask can be 0. Rest should not.
>> +*/
>> +   unsigned int read_time_udr_mask;
>> +   unsigned int write_time_udr_mask;
>> +   unsigned int write_alarm_udr_mask;
>>  };
>>
>>  /* Register map for S5M8763 and S5M8767 */
>> @@ -71,14 +91,44 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
>> .alarm1 = S5M_ALARM1_SEC,
>> .udr_update = S5M_RTC_UDR_CON,
>> .autoclear_udr_mask = S5M_RTC_UDR_MASK,
>> -   .udr_mask   = S5M_RTC_UDR_MASK,
>> +   .read_time_udr_mask = 0, /* Not needed */
>> +   .write_time_udr_mask= S5M_RTC_UDR_MASK | S5M_RTC_TIME_EN_MASK,
>> +   .write_alarm_udr_mask   = S5M_RTC_UDR_MASK,
>> +};
>> +
>> +/* Register map for S2MPS13 */
>> +static const struct s5m_rtc_reg_config s2mps13_rtc_regs = {
>> +   .regs_count = 7,
>> +   .time   = S2MPS_RTC_SEC,
>> +   .ctrl   = S2MPS_RTC_CTRL,
>> +   .alarm0 = S2MPS_ALARM0_SEC,
>> +   .alarm1 = S2MPS_ALARM1_SEC,
>> +   .udr_update = S2MPS_RTC_UDR_CON,
>> +   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
>> +   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
>> +   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
>> +   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | 
>> S2MPS13_RTC_AUDR_MASK,
>> +};
>> +
>> +/* Register map for S2MPS11/14 */
>> +static const struct s5m_rtc_reg_config s2mps14_rtc_regs = {
>> +   .regs_count = 7,
>> +   .time   = S2MPS_RTC_SEC,
>> +   .ctrl   = S2MPS_RTC_CTRL,
>> +   .alarm0 = S2MPS_ALARM0_SEC,
>> +   .alarm1 = S2MPS_ALARM1_SEC,
>> +   .udr_update = S2MPS_RTC_UDR_CON,
>> +   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
>> +   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
>> +   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
>> +   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | S2MPS_RTC_RUDR_MASK,
>>  };
>>
>>  /*
>> - * Register map for S2MPS14.
>> - * It may be also suitable for S2MPS11 but this was not tested.
>> + * Register map for S2MPS15 - in comparison to S2MPS14 the WUDR and AUDR 

[PATCH v2 2/3] rtc: s5m: Add separate field for storing auto-cleared mask in register config

2015-12-29 Thread Krzysztof Kozlowski
Some devices from S2M/S5M family use different register update masks for
different operations (alarm and register update). Now the driver uses
common register configuration and a lot of exceptions per device in code.

Before eliminating the exceptions and using specific register
configuration for given device, make the auto-cleared mask a separate
field. This is merely a refactoring.

Signed-off-by: Krzysztof Kozlowski 

---

Changes since v1:
1. None.
---
 drivers/rtc/rtc-s5m.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index 85649861a6b0..559db8f72117 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -56,6 +56,8 @@ struct s5m_rtc_reg_config {
 * auto-cleared after successful update.
 */
unsigned int udr_update;
+   /* Auto-cleared mask in UDR field for writing time and alarm */
+   unsigned int autoclear_udr_mask;
/* Mask for UDR field in 'udr_update' register */
unsigned int udr_mask;
 };
@@ -68,6 +70,7 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
.alarm0 = S5M_ALARM0_SEC,
.alarm1 = S5M_ALARM1_SEC,
.udr_update = S5M_RTC_UDR_CON,
+   .autoclear_udr_mask = S5M_RTC_UDR_MASK,
.udr_mask   = S5M_RTC_UDR_MASK,
 };
 
@@ -82,6 +85,7 @@ static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
.alarm0 = S2MPS_ALARM0_SEC,
.alarm1 = S2MPS_ALARM1_SEC,
.udr_update = S2MPS_RTC_UDR_CON,
+   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
.udr_mask   = S2MPS_RTC_WUDR_MASK,
 };
 
@@ -167,7 +171,7 @@ static inline int s5m8767_wait_for_udr_update(struct 
s5m_rtc_info *info)
 
do {
ret = regmap_read(info->regmap, info->regs->udr_update, );
-   } while (--retry && (data & info->regs->udr_mask) && !ret);
+   } while (--retry && (data & info->regs->autoclear_udr_mask) && !ret);
 
if (!retry)
dev_err(info->dev, "waiting for UDR update, reached max number 
of retries\n");
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 1/3] rtc: s5m: Cleanup by removing useless 'rtc' prefix from fields

2015-12-29 Thread Krzysztof Kozlowski
Remove the 'rtc' prefix from some of the fields in struct
s5m_rtc_reg_config because it is obvious - this is a RTC driver. No
functional changes.

Signed-off-by: Krzysztof Kozlowski 

---

Changes since v1:
1. None.
---
 drivers/rtc/rtc-s5m.c | 40 +++-
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index 0d68a85dd429..85649861a6b0 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -55,9 +55,9 @@ struct s5m_rtc_reg_config {
 * will enable update of time or alarm register. Then it will be
 * auto-cleared after successful update.
 */
-   unsigned int rtc_udr_update;
-   /* Mask for UDR field in 'rtc_udr_update' register */
-   unsigned int rtc_udr_mask;
+   unsigned int udr_update;
+   /* Mask for UDR field in 'udr_update' register */
+   unsigned int udr_mask;
 };
 
 /* Register map for S5M8763 and S5M8767 */
@@ -67,8 +67,8 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
.ctrl   = S5M_ALARM1_CONF,
.alarm0 = S5M_ALARM0_SEC,
.alarm1 = S5M_ALARM1_SEC,
-   .rtc_udr_update = S5M_RTC_UDR_CON,
-   .rtc_udr_mask   = S5M_RTC_UDR_MASK,
+   .udr_update = S5M_RTC_UDR_CON,
+   .udr_mask   = S5M_RTC_UDR_MASK,
 };
 
 /*
@@ -81,8 +81,8 @@ static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
.ctrl   = S2MPS_RTC_CTRL,
.alarm0 = S2MPS_ALARM0_SEC,
.alarm1 = S2MPS_ALARM1_SEC,
-   .rtc_udr_update = S2MPS_RTC_UDR_CON,
-   .rtc_udr_mask   = S2MPS_RTC_WUDR_MASK,
+   .udr_update = S2MPS_RTC_UDR_CON,
+   .udr_mask   = S2MPS_RTC_WUDR_MASK,
 };
 
 struct s5m_rtc_info {
@@ -166,9 +166,8 @@ static inline int s5m8767_wait_for_udr_update(struct 
s5m_rtc_info *info)
unsigned int data;
 
do {
-   ret = regmap_read(info->regmap, info->regs->rtc_udr_update,
-   );
-   } while (--retry && (data & info->regs->rtc_udr_mask) && !ret);
+   ret = regmap_read(info->regmap, info->regs->udr_update, );
+   } while (--retry && (data & info->regs->udr_mask) && !ret);
 
if (!retry)
dev_err(info->dev, "waiting for UDR update, reached max number 
of retries\n");
@@ -214,7 +213,7 @@ static inline int s5m8767_rtc_set_time_reg(struct 
s5m_rtc_info *info)
int ret;
unsigned int data;
 
-   ret = regmap_read(info->regmap, info->regs->rtc_udr_update, );
+   ret = regmap_read(info->regmap, info->regs->udr_update, );
if (ret < 0) {
dev_err(info->dev, "failed to read update reg(%d)\n", ret);
return ret;
@@ -223,21 +222,20 @@ static inline int s5m8767_rtc_set_time_reg(struct 
s5m_rtc_info *info)
switch (info->device_type) {
case S5M8763X:
case S5M8767X:
-   data |= info->regs->rtc_udr_mask | S5M_RTC_TIME_EN_MASK;
+   data |= info->regs->udr_mask | S5M_RTC_TIME_EN_MASK;
case S2MPS15X:
/* As per UM, for write time register, set WUDR bit to high */
data |= S2MPS15_RTC_WUDR_MASK;
break;
case S2MPS14X:
case S2MPS13X:
-   data |= info->regs->rtc_udr_mask;
+   data |= info->regs->udr_mask;
break;
default:
return -EINVAL;
}
 
-
-   ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data);
+   ret = regmap_write(info->regmap, info->regs->udr_update, data);
if (ret < 0) {
dev_err(info->dev, "failed to write update reg(%d)\n", ret);
return ret;
@@ -253,14 +251,14 @@ static inline int s5m8767_rtc_set_alarm_reg(struct 
s5m_rtc_info *info)
int ret;
unsigned int data;
 
-   ret = regmap_read(info->regmap, info->regs->rtc_udr_update, );
+   ret = regmap_read(info->regmap, info->regs->udr_update, );
if (ret < 0) {
dev_err(info->dev, "%s: fail to read update reg(%d)\n",
__func__, ret);
return ret;
}
 
-   data |= info->regs->rtc_udr_mask;
+   data |= info->regs->udr_mask;
switch (info->device_type) {
case S5M8763X:
case S5M8767X:
@@ -268,7 +266,7 @@ static inline int s5m8767_rtc_set_alarm_reg(struct 
s5m_rtc_info *info)
break;
case S2MPS15X:
/* As per UM, for write alarm, set A_UDR(bit[4]) to high
-* rtc_udr_mask above sets bit[4]
+* udr_mask above sets bit[4]
 */
break;
case S2MPS14X:
@@ -281,7 +279,7 @@ static inline int s5m8767_rtc_set_alarm_reg(struct 
s5m_rtc_info *info)

Re: [PATCH 3/3] rtc: s5m: Make register configuration per S2MPS device to remove exceptions

2015-12-29 Thread Krzysztof Kozlowski
On 30.12.2015 12:38, Krzysztof Kozlowski wrote:
> On 30.12.2015 11:53, Yadwinder Singh Brar wrote:
>> Hi Krysztof,
>>
>> On Tue, Dec 29, 2015 at 5:53 PM, Krzysztof Kozlowski
>>  wrote:
>>> Before updating time and alarm the driver must set appropriate mask in
>>> UDR register. For that purpose the driver uses common register
>>> configuration and a lot of exceptions per device in the code. The
>>> exceptions are not obvious, for example except the change in the logic
>>> sometimes the fields are swapped (WUDR and AUDR between S2MPS14 and
>>> S2MPS15). This leads to quite complicated code.
>>>
>>> Try to make it more obvious by:
>>> 1. Documenting the UDR masks for devices and operations.
>>> 2. Adding fields in register configuration structure for each operation
>>>(read time, write time and alarm).
>>> 3. Splitting the configuration per S2MPS13, S2MPS14 and S2MPS15 thus
>>>removing exceptions for them.
>>>
>>> Signed-off-by: Krzysztof Kozlowski 
>>>
>>> ---
>>>
>>> Tested only on S2MPS11 (Odroid XU4).
>>> ---
>>>  drivers/rtc/rtc-s5m.c   | 110 
>>> +++-
>>>  include/linux/mfd/samsung/rtc.h |   2 +
>>>  2 files changed, 77 insertions(+), 35 deletions(-)
>>>
>>> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
>>> index 559db8f72117..7407d7394bb4 100644
>>> --- a/drivers/rtc/rtc-s5m.c
>>> +++ b/drivers/rtc/rtc-s5m.c
>>> @@ -38,7 +38,22 @@
>>>   */
>>>  #define UDR_READ_RETRY_CNT 5
>>>
>>> -/* Registers used by the driver which are different between chipsets. */
>>> +/*
>>> + * Registers used by the driver which are different between chipsets.
>>> + *
>>> + * Operations like read time and write alarm/time require updating
>>> + * specific fields in UDR register. These fields usually are auto-cleared
>>> + * (with some exceptions).
>>> + *
>>> + * Table of operations per device:
>>> + *
>>> + * Device | Write time | Read time | Write alarm
>>> + * =
>>> + * S5M8767| UDR + TIME |   | UDR
>>> + * S2MPS11/14 | WUDR   | RUDR  | WUDR + RUDR
>>> + * S2MPS13| WUDR   | RUDR  | WUDR + AUDR
>>> + * S2MPS15| WUDR   | RUDR  | AUDR
>>> + */
>>>  struct s5m_rtc_reg_config {
>>> /* Number of registers used for setting time/alarm0/alarm1 */
>>> unsigned int regs_count;
>>> @@ -58,8 +73,13 @@ struct s5m_rtc_reg_config {
>>> unsigned int udr_update;
>>> /* Auto-cleared mask in UDR field for writing time and alarm */
>>> unsigned int autoclear_udr_mask;
>>> -   /* Mask for UDR field in 'udr_update' register */
>>> -   unsigned int udr_mask;
>>> +   /*
>>> +* Masks in UDR field for time and alarm operations.
>>> +* The read time mask can be 0. Rest should not.
>>> +*/
>>> +   unsigned int read_time_udr_mask;
>>> +   unsigned int write_time_udr_mask;
>>> +   unsigned int write_alarm_udr_mask;
>>>  };
>>>
>>>  /* Register map for S5M8763 and S5M8767 */
>>> @@ -71,14 +91,44 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
>>> .alarm1 = S5M_ALARM1_SEC,
>>> .udr_update = S5M_RTC_UDR_CON,
>>> .autoclear_udr_mask = S5M_RTC_UDR_MASK,
>>> -   .udr_mask   = S5M_RTC_UDR_MASK,
>>> +   .read_time_udr_mask = 0, /* Not needed */
>>> +   .write_time_udr_mask= S5M_RTC_UDR_MASK | S5M_RTC_TIME_EN_MASK,
>>> +   .write_alarm_udr_mask   = S5M_RTC_UDR_MASK,
>>> +};
>>> +
>>> +/* Register map for S2MPS13 */
>>> +static const struct s5m_rtc_reg_config s2mps13_rtc_regs = {
>>> +   .regs_count = 7,
>>> +   .time   = S2MPS_RTC_SEC,
>>> +   .ctrl   = S2MPS_RTC_CTRL,
>>> +   .alarm0 = S2MPS_ALARM0_SEC,
>>> +   .alarm1 = S2MPS_ALARM1_SEC,
>>> +   .udr_update = S2MPS_RTC_UDR_CON,
>>> +   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
>>> +   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
>>> +   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
>>> +   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | 
>>> S2MPS13_RTC_AUDR_MASK,
>>> +};
>>> +
>>> +/* Register map for S2MPS11/14 */
>>> +static const struct s5m_rtc_reg_config s2mps14_rtc_regs = {
>>> +   .regs_count = 7,
>>> +   .time   = S2MPS_RTC_SEC,
>>> +   .ctrl   = S2MPS_RTC_CTRL,
>>> +   .alarm0 = S2MPS_ALARM0_SEC,
>>> +   .alarm1 = S2MPS_ALARM1_SEC,
>>> +   .udr_update = S2MPS_RTC_UDR_CON,
>>> +   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
>>> +   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
>>> +   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
>>> +   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | S2MPS_RTC_RUDR_MASK,
>>>  };
>>>
>>>  /*
>>> - * Register 

[PATCH v2 3/3] rtc: s5m: Make register configuration per S2MPS device to remove exceptions

2015-12-29 Thread Krzysztof Kozlowski
Before updating time and alarm the driver must set appropriate mask in
UDR register. For that purpose the driver uses common register
configuration and a lot of exceptions per device in the code. The
exceptions are not obvious, for example except the change in the logic
sometimes the fields are swapped (WUDR and AUDR between S2MPS14 and
S2MPS15). This leads to quite complicated code.

Try to make it more obvious by:
1. Documenting the UDR masks for devices and operations.
2. Adding fields in register configuration structure for each operation
   (read time, write time and alarm).
3. Splitting the configuration per S2MPS13, S2MPS14 and S2MPS15 thus
   removing exceptions for them.

Signed-off-by: Krzysztof Kozlowski 

---

Tested on S2MPS11 (Odroid XU4) and S2MPS13. Testing on S2MPS15 would be
appreciated!

Changes since v1:
1. Fix value used in S2MPS15_RTC_AUDR_MASK, pointed by Yadwinder Singh
   Brar.
---
 drivers/rtc/rtc-s5m.c   | 110 +++-
 include/linux/mfd/samsung/rtc.h |   2 +
 2 files changed, 77 insertions(+), 35 deletions(-)

diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index 559db8f72117..7407d7394bb4 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -38,7 +38,22 @@
  */
 #define UDR_READ_RETRY_CNT 5
 
-/* Registers used by the driver which are different between chipsets. */
+/*
+ * Registers used by the driver which are different between chipsets.
+ *
+ * Operations like read time and write alarm/time require updating
+ * specific fields in UDR register. These fields usually are auto-cleared
+ * (with some exceptions).
+ *
+ * Table of operations per device:
+ *
+ * Device | Write time | Read time | Write alarm
+ * =
+ * S5M8767| UDR + TIME |   | UDR
+ * S2MPS11/14 | WUDR   | RUDR  | WUDR + RUDR
+ * S2MPS13| WUDR   | RUDR  | WUDR + AUDR
+ * S2MPS15| WUDR   | RUDR  | AUDR
+ */
 struct s5m_rtc_reg_config {
/* Number of registers used for setting time/alarm0/alarm1 */
unsigned int regs_count;
@@ -58,8 +73,13 @@ struct s5m_rtc_reg_config {
unsigned int udr_update;
/* Auto-cleared mask in UDR field for writing time and alarm */
unsigned int autoclear_udr_mask;
-   /* Mask for UDR field in 'udr_update' register */
-   unsigned int udr_mask;
+   /*
+* Masks in UDR field for time and alarm operations.
+* The read time mask can be 0. Rest should not.
+*/
+   unsigned int read_time_udr_mask;
+   unsigned int write_time_udr_mask;
+   unsigned int write_alarm_udr_mask;
 };
 
 /* Register map for S5M8763 and S5M8767 */
@@ -71,14 +91,44 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
.alarm1 = S5M_ALARM1_SEC,
.udr_update = S5M_RTC_UDR_CON,
.autoclear_udr_mask = S5M_RTC_UDR_MASK,
-   .udr_mask   = S5M_RTC_UDR_MASK,
+   .read_time_udr_mask = 0, /* Not needed */
+   .write_time_udr_mask= S5M_RTC_UDR_MASK | S5M_RTC_TIME_EN_MASK,
+   .write_alarm_udr_mask   = S5M_RTC_UDR_MASK,
+};
+
+/* Register map for S2MPS13 */
+static const struct s5m_rtc_reg_config s2mps13_rtc_regs = {
+   .regs_count = 7,
+   .time   = S2MPS_RTC_SEC,
+   .ctrl   = S2MPS_RTC_CTRL,
+   .alarm0 = S2MPS_ALARM0_SEC,
+   .alarm1 = S2MPS_ALARM1_SEC,
+   .udr_update = S2MPS_RTC_UDR_CON,
+   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
+   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
+   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
+   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | S2MPS13_RTC_AUDR_MASK,
+};
+
+/* Register map for S2MPS11/14 */
+static const struct s5m_rtc_reg_config s2mps14_rtc_regs = {
+   .regs_count = 7,
+   .time   = S2MPS_RTC_SEC,
+   .ctrl   = S2MPS_RTC_CTRL,
+   .alarm0 = S2MPS_ALARM0_SEC,
+   .alarm1 = S2MPS_ALARM1_SEC,
+   .udr_update = S2MPS_RTC_UDR_CON,
+   .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
+   .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
+   .write_time_udr_mask= S2MPS_RTC_WUDR_MASK,
+   .write_alarm_udr_mask   = S2MPS_RTC_WUDR_MASK | S2MPS_RTC_RUDR_MASK,
 };
 
 /*
- * Register map for S2MPS14.
- * It may be also suitable for S2MPS11 but this was not tested.
+ * Register map for S2MPS15 - in comparison to S2MPS14 the WUDR and AUDR bits
+ * are swapped.
  */
-static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
+static const struct s5m_rtc_reg_config s2mps15_rtc_regs = {
.regs_count = 7,
.time   = S2MPS_RTC_SEC,
.ctrl   = S2MPS_RTC_CTRL,
@@ -86,7 +136,9 @@ static const struct