[PATCH] drm: amd: Fix trailing semicolons

2018-01-19 Thread Luis de Bethencourt
The trailing semicolon is an empty statement that does no operation.
Removing the two instances of them since they don't do anything.

Signed-off-by: Luis de Bethencourt <lui...@kernel.org>
---

Hi,

After fixing the same thing in drivers/staging/rtl8723bs/, Joe Perches
suggested I fix it treewide [0].

Best regards 
Luis


[0] 
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-January/115410.html
[1] 
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-January/115390.html

 drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 2 +-
 drivers/gpu/drm/amd/powerplay/amd_powerplay.c| 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
index 61e8c3e02d16..33d91e4474ea 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
@@ -718,7 +718,7 @@ static enum link_training_result 
perform_channel_equalization_sequence(
uint32_t retries_ch_eq;
enum dc_lane_count lane_count = lt_settings->link_settings.lane_count;
union lane_align_status_updated dpcd_lane_status_updated = {{0}};
-   union lane_status dpcd_lane_status[LANE_COUNT_DP_MAX] = {{{0}}};;
+   union lane_status dpcd_lane_status[LANE_COUNT_DP_MAX] = {{{0}}};
 
hw_tr_pattern = get_supported_tp(link);
 
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c 
b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
index fa9d1615a2cc..b98a7a8a22b5 100644
--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
@@ -162,7 +162,7 @@ static int pp_hw_init(void *handle)
if(hwmgr->smumgr_funcs->start_smu(pp_handle->hwmgr)) {
pr_err("smc start failed\n");
hwmgr->smumgr_funcs->smu_fini(pp_handle->hwmgr);
-   return -EINVAL;;
+   return -EINVAL;
}
if (ret == PP_DPM_DISABLED)
goto exit;
-- 
2.15.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm/msm/mdp5: Fix trailing semicolon

2018-01-19 Thread Luis de Bethencourt
The trailing semicolon is an empty statement that does no operation.
Removing it since it doesn't do anything.

Signed-off-by: Luis de Bethencourt <lui...@kernel.org>
---

Hi,

After fixing the same thing in drivers/staging/rtl8723bs/, Joe Perches
suggested I fix it treewide [0].

Best regards 
Luis


[0] 
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-January/115410.html
[1] 
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-January/115390.html

 drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c 
b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
index 3e9bba4d6624..6d8e3a9a6fc0 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
@@ -680,7 +680,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
} else {
dev_info(>dev,
 "no iommu, fallback to phys contig buffers for 
scanout\n");
-   aspace = NULL;;
+   aspace = NULL;
}
 
pm_runtime_put_sync(>dev);
-- 
2.15.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm/nouveau/mmu: Fix trailing semicolon

2018-01-19 Thread Luis de Bethencourt
The trailing semicolon is an empty statement that does no operation.
Removing it since it doesn't do anything.

Signed-off-by: Luis de Bethencourt <lui...@kernel.org>
---

Hi,

After fixing the same thing in drivers/staging/rtl8723bs/, Joe Perches
suggested I fix it treewide [0].

Best regards 
Luis


[0] 
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-January/115410.html
[1] 
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-January/115390.html

 drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c
index e35d3e17cd7c..93946dcee319 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c
@@ -642,7 +642,7 @@ nvkm_vmm_ptes_sparse(struct nvkm_vmm *vmm, u64 addr, u64 
size, bool ref)
else
block = (size >> page[i].shift) << 
page[i].shift;
} else {
-   block = (size >> page[i].shift) << page[i].shift;;
+   block = (size >> page[i].shift) << page[i].shift;
}
 
/* Perform operation. */
-- 
2.15.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm: Fix trailing semicolon

2018-01-18 Thread Luis de Bethencourt
The trailing semicolon is an empty statement that does no operation.
Removing it since it doesn't do anything.

Signed-off-by: Luis de Bethencourt <lui...@kernel.org>
---

Hi,

After fixing the same thing in drivers/staging/rtl8723bs/, Joe Perches
suggested I fix it treewide [0].

Best regards 
Luis


[0] 
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-January/115410.html
[1] 
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-January/115390.html

 drivers/gpu/drm/scheduler/gpu_scheduler.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler.c 
b/drivers/gpu/drm/scheduler/gpu_scheduler.c
index 2c18996d59c5..0d95888ccc3e 100644
--- a/drivers/gpu/drm/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/scheduler/gpu_scheduler.c
@@ -461,7 +461,7 @@ void drm_sched_hw_job_reset(struct drm_gpu_scheduler 
*sched, struct drm_sched_jo
 {
struct drm_sched_job *s_job;
struct drm_sched_entity *entity, *tmp;
-   int i;;
+   int i;
 
spin_lock(>job_list_lock);
list_for_each_entry_reverse(s_job, >ring_mirror_list, node) {
-- 
2.15.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 1/7] lib: string: add functions to case-convert strings

2016-07-14 Thread Luis de Bethencourt
On 13/07/16 23:26, Markus Mayer wrote:
> On 13 July 2016 at 10:19, Luis de Bethencourt  
> wrote:
>> On 11/07/16 23:46, Markus Mayer wrote:
>>
>> Hi Markus,
>>
>> Amazing. I see this happening as well, but I know it shouldn't.
>>
>> The reason the #ifndef guards in headers are there is precisely to allow
>> circular dependencies.
>>
>> The problem in your output reads as:
>> strstr() is in string.h
>> #include string.h -> that includes kernel.h -> that includes string.h
>>
>> The third should do nothing based on _LINUX_STRING_H_ being defined already
>> and all code inside the #ifndef in string.h not being executed.
>> Yet it shouldn't block the first include above since that macro isn't 
>> defined,
>> which is what the error suggests since it doesn't have strstr()
>> If _LINUX_STRING_H is defined, strstr() should be available.
>>
>> Investigating this issue, it only happens when CONFIG_DYNAMIC_DEBUG is not
>> set and line 170 of dynamic_debug.h runs, but just above we have an
>> include of string.h.
>>
>> Very strange that #include  isn't doing its job.
>>
>> The first thing I tried is to understand where dynamic_debug.h is used and
>> removed the unneeded ones:
>> --
>> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
>> --- a/include/linux/kernel.h
>> +++ b/include/linux/kernel.h
>> @@ -11,7 +11,6 @@
>>  #include 
>>  #include 
>>  #include 
>> -#include 
>>  #include 
>>  #include 
>>
>> diff --git a/include/linux/printk.h b/include/linux/printk.h
>> --- a/include/linux/printk.h
>> +++ b/include/linux/printk.h
>> @@ -307,10 +307,11 @@ asmlinkage __printf(1, 2) __cold void __pr_info(const 
>> char *fmt, ...);
>> no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
>>  #endif
>>
>> -#include 
>>
>>  /* If you are writing a driver, please use dev_dbg instead */
>>  #if defined(CONFIG_DYNAMIC_DEBUG)
>> +#include 
>> +
>>  /* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */
>>  #define pr_debug(fmt, ...) \
>> dynamic_pr_debug(fmt, ##__VA_ARGS__)
>> diff --git a/kernel/module.c b/kernel/module.c
>> index beaebea..e70a2fa 100644
>> --- a/kernel/module.c
>> +++ b/kernel/module.c
>> @@ -60,6 +60,7 @@
>>  #include 
>>  #include 
>>  #include 
>> +#include 
>>  #include 
>>  #include "module-internal.h"
>> --
>>
>> This diff [0] fixes the issue but it is a workaround for the original
>> issue about string.h not being properly included in dynamic_debug.h
>>
>> Puzzled by this and can't figure out what is happening wrong.
>>
>> The second thing I tried was adding
>> #warning "Linking to string header"
>> in include/linux/string.h, and I don't see any include path mentioning
>> kernel.h, where do you see the circular dependency? I might be missing
>> something.
> 
> I did some more poking around and this is what I found.
> 
> For starters, the problem happens with kernel/bounds.c. Without
> worrying about SIZE_MAX or making any other changes, I added a
> #warning line to kernel.h and string.h to see the include sequence.
> 
> $ aarch64-linux-gcc -Wp,-MD,kernel/.bounds.s.d  -nostdinc -isystem
> /opt/toolchain/stbgcc-4.8-1.5/bin/../lib/gcc/aarch64-linux-gnu/4.8.5/include
> -I./arch/arm64/include -Iarch/arm64/include/generated/uapi
> -Iarch/arm64/include/generated  -Iinclude -I./arch/arm64/include/uapi
> -Iarch/arm64/include/generated/uapi -I./include/uapi
> -Iinclude/generated/uapi -include ./include/linux/kconfig.h
> -D__KERNEL__ -mlittle-endian -Wall -Wundef -Wstrict-prototypes
> -Wno-trigraphs -fno-strict-aliasing -fno-common
> -Werror-implicit-function-declaration -Wno-format-security -std=gnu89
> -mgeneral-regs-only -fno-asynchronous-unwind-tables
> -fno-delete-null-pointer-checks -O2 --param=allow-store-data-races=0
> -Wframe-larger-than=2048 -fno-stack-protector
> -Wno-unused-but-set-variable -fno-omit-frame-pointer
> -fno-optimize-sibling-calls -fno-var-tracking-assignments -g
> -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow
> -fconserve-stack -Werror=implicit-int -Werror=strict-prototypes
> -DKBUILD_BASENAME='"bounds"'  -DKBUILD_MODNAME='"bounds"'
> -fverbose-asm -E -o kernel/bounds.i kernel/bounds.c
> In file included from include/asm-generic/bug.h:13:0,
>  from ./arch/arm6

[PATCH v3 1/7] lib: string: add functions to case-convert strings

2016-07-13 Thread Luis de Bethencourt
On 11/07/16 23:46, Markus Mayer wrote:
> On 9 July 2016 at 08:30, Markus Mayer  wrote:
>> On 9 July 2016 at 05:04, Luis de Bethencourt  
>> wrote:
>>> On 08/07/16 23:43, Markus Mayer wrote:
>>>> Add a collection of generic functions to convert strings to lowercase
>>>> or uppercase.
>>>>
>>>> Changing the case of a string (with or without copying it first) seems
>>>> to be a recurring requirement in the kernel that is currently being
>>>> solved by several duplicated implementations doing the same thing. This
>>>> change aims at reducing this code duplication.
>>>>
>>>> The new functions are
>>>> void strlcpytoupper(char *dst, const char *src, size_t len);
>>>> void strlcpytolower(char *dst, const char *src, size_t len);
>>>> void strcpytoupper(char *dst, const char *src);
>>>> void strcpytolower(char *dst, const char *src);
>>>> void strtoupper(char *s);
>>>> void strtolower(char *s);
>>>>
>>>> The "str[l]cpyto*" versions of the function take a destination string
>>>> and a source string as arguments. The "strlcpyto*" versions additionally
>>>> take a length argument like strlcpy() itself. Lastly, the strto*
>>>> functions take a single string argument and modify the passed-in string.
>>>>
>>>> Like strlcpy(), and unlike strncpy(), the functions guarantee NULL
>>>> termination of the destination string.
>>>>
>>>> Signed-off-by: Markus Mayer 
>>>> ---
>>>>  include/linux/string.h | 40 
>>>>  lib/string.c   | 38 ++
>>>>  2 files changed, 78 insertions(+)
>>>>
>>>> diff --git a/include/linux/string.h b/include/linux/string.h
>>>> index 26b6f6a..36c9d14 100644
>>>> --- a/include/linux/string.h
>>>> +++ b/include/linux/string.h
>>>> @@ -116,6 +116,8 @@ extern void * memchr(const void *,int,__kernel_size_t);
>>>>  #endif
>>>>  void *memchr_inv(const void *s, int c, size_t n);
>>>>  char *strreplace(char *s, char old, char new);
>>>> +extern void strlcpytoupper(char *dst, const char *src, size_t len);
>>>> +extern void strlcpytolower(char *dst, const char *src, size_t len);
>>>>
>>>>  extern void kfree_const(const void *x);
>>>>
>>>> @@ -169,4 +171,42 @@ static inline const char *kbasename(const char *path)
>>>>   return tail ? tail + 1 : path;
>>>>  }
>>>>
>>>> +/**
>>>> + * strcpytoupper - Copy string and convert to uppercase.
>>>> + * @dst: The buffer to store the result.
>>>> + * @src: The string to convert to uppercase.
>>>> + */
>>>> +static inline void strcpytoupper(char *dst, const char *src)
>>>> +{
>>>> + strlcpytoupper(dst, src, -1);
>>>> +}
>>>> +
>>>
>>> Why not use SIZE_MAX instead of -1?
>>
>> Sure. I'll change all four of them. Thanks.
> 
> Turns out there's actually a circular dependency here. SIZE_MAX is
> defined in linux/kernel.h. So, string.h would need to include
> kernel.h. But kernel.h, by way of several other headers, includes
> string.h.
> 
> Attempting to include kernel.h in string.h then leads to something like this:
> 
>   CHK include/config/kernel.release
>   CHK include/generated/uapi/linux/version.h
>   CHK include/generated/utsrelease.h
>   CC  scripts/mod/devicetable-offsets.s
>   CHK include/generated/timeconst.h
> In file included from include/linux/printk.h:289:0,
>  from include/linux/kernel.h:13,
>  from include/linux/string.h:11,
>  from include/uapi/linux/uuid.h:21,
>  from include/linux/uuid.h:19,
>  from include/linux/mod_devicetable.h:12,
>  from scripts/mod/devicetable-offsets.c:2:
> include/linux/dynamic_debug.h: In function 
> ‘ddebug_dyndbg_module_param_cb’:
> include/linux/dynamic_debug.h:122:2: error: implicit declaration of
> function ‘strstr’ [-Werror=implicit-function-declaration]
>   if (strstr(param, "dyndbg")) {
>   ^
> include/linux/dynamic_debug.h:122:6: warning: incompatible implicit
> declaration of built-in function ‘strstr’ [enabled by default]
>   if (strstr(param, "dyndbg")) {
>   ^
> Since kernel.h is referencing string.h (which is needed, b

[PATCH v3 1/7] lib: string: add functions to case-convert strings

2016-07-09 Thread Luis de Bethencourt
On 08/07/16 23:43, Markus Mayer wrote:
> Add a collection of generic functions to convert strings to lowercase
> or uppercase.
> 
> Changing the case of a string (with or without copying it first) seems
> to be a recurring requirement in the kernel that is currently being
> solved by several duplicated implementations doing the same thing. This
> change aims at reducing this code duplication.
> 
> The new functions are
> void strlcpytoupper(char *dst, const char *src, size_t len);
> void strlcpytolower(char *dst, const char *src, size_t len);
> void strcpytoupper(char *dst, const char *src);
> void strcpytolower(char *dst, const char *src);
> void strtoupper(char *s);
> void strtolower(char *s);
> 
> The "str[l]cpyto*" versions of the function take a destination string
> and a source string as arguments. The "strlcpyto*" versions additionally
> take a length argument like strlcpy() itself. Lastly, the strto*
> functions take a single string argument and modify the passed-in string.
> 
> Like strlcpy(), and unlike strncpy(), the functions guarantee NULL
> termination of the destination string.
> 
> Signed-off-by: Markus Mayer 
> ---
>  include/linux/string.h | 40 
>  lib/string.c   | 38 ++
>  2 files changed, 78 insertions(+)
> 
> diff --git a/include/linux/string.h b/include/linux/string.h
> index 26b6f6a..36c9d14 100644
> --- a/include/linux/string.h
> +++ b/include/linux/string.h
> @@ -116,6 +116,8 @@ extern void * memchr(const void *,int,__kernel_size_t);
>  #endif
>  void *memchr_inv(const void *s, int c, size_t n);
>  char *strreplace(char *s, char old, char new);
> +extern void strlcpytoupper(char *dst, const char *src, size_t len);
> +extern void strlcpytolower(char *dst, const char *src, size_t len);
>  
>  extern void kfree_const(const void *x);
>  
> @@ -169,4 +171,42 @@ static inline const char *kbasename(const char *path)
>   return tail ? tail + 1 : path;
>  }
>  
> +/**
> + * strcpytoupper - Copy string and convert to uppercase.
> + * @dst: The buffer to store the result.
> + * @src: The string to convert to uppercase.
> + */
> +static inline void strcpytoupper(char *dst, const char *src)
> +{
> + strlcpytoupper(dst, src, -1);
> +}
> +

Why not use SIZE_MAX instead of -1?

> +/**
> + * strcpytolower - Copy string and convert to lowercase.
> + * @dst: The buffer to store the result.
> + * @src: The string to convert to lowercase.
> + */
> +static inline void strcpytolower(char *dst, const char *src)
> +{
> + strlcpytolower(dst, src, -1);
> +}
> +

Same here, and the 2 below :)

Thanks Markus,
Luis

> +/**
> + * strtoupper - Convert string to uppercase.
> + * @s: The string to operate on.
> + */
> +static inline void strtoupper(char *s)
> +{
> + strlcpytoupper(s, s, -1);
> +}
> +
> +/**
> + * strtolower - Convert string to lowercase.
> + * @s: The string to operate on.
> + */
> +static inline void strtolower(char *s)
> +{
> + strlcpytolower(s, s, -1);
> +}
> +
>  #endif /* _LINUX_STRING_H_ */
> diff --git a/lib/string.c b/lib/string.c
> index ed83562..fd8c427 100644
> --- a/lib/string.c
> +++ b/lib/string.c
> @@ -952,3 +952,41 @@ char *strreplace(char *s, char old, char new)
>   return s;
>  }
>  EXPORT_SYMBOL(strreplace);
> +
> +/**
> + * strlcpytoupper - Copy a length-limited string and convert to uppercase.
> + * @dst: The buffer to store the result.
> + * @src: The string to convert to uppercase.
> + * @len: Maximum string length. May be SIZE_MAX (-1) to set no limit.
> + */
> +void strlcpytoupper(char *dst, const char *src, size_t len)
> +{
> + size_t i;
> +
> + if (!len)
> + return;
> +
> + for (i = 0; i < len && src[i]; ++i)
> + dst[i] = toupper(src[i]);
> + dst[i < len ? i : i - 1] = '\0';
> +}
> +EXPORT_SYMBOL(strlcpytoupper);
> +
> +/**
> + * strlcpytolower - Copy a length-limited string and convert to lowercase.
> + * @dst: The buffer to store the result.
> + * @src: The string to convert to lowercase.
> + * @len: Maximum string length. May be SIZE_MAX (-1) to set no limit.
> + */
> +void strlcpytolower(char *dst, const char *src, size_t len)
> +{
> + size_t i;
> +
> + if (!len)
> + return;
> +
> + for (i = 0; i < len && src[i]; ++i)
> + dst[i] = tolower(src[i]);
> + dst[i < len ? i : i - 1] = '\0';
> +}
> +EXPORT_SYMBOL(strlcpytolower);
> 



[RESEND] fence: add missing descriptions for fence

2016-04-12 Thread Luis de Bethencourt
On 11/04/16 21:09, Gustavo Padovan wrote:
> Hi Luis,
> 
> 2016-04-11 Luis de Bethencourt :
> 
>> The members child_list and active_list were added to the fence struct
>> without descriptions for the Documentation. Adding these.
>>
>> Fixes: b55b54b5db33 ("staging/android: remove struct sync_pt")
>> Signed-off-by: Luis de Bethencourt 
>> Reviewed-by: Javier Martinez Canillas 
>> ---
>> Hi,
>>
>> Just resending this patch since it hasn't had any reviews in since
>> March 21st.
>>
>> Thanks,
>> Luis
>>
>>  include/linux/fence.h | 2 ++
>>  1 file changed, 2 insertions(+)
> 
> Reviewed-by: Gustavo Padovan 
> 
>   Gustavo
> 

Thank you Gustavo.

Nice seeing you around here :)

Luis


[RESEND] fence: add missing descriptions for fence

2016-04-11 Thread Luis de Bethencourt
The members child_list and active_list were added to the fence struct
without descriptions for the Documentation. Adding these.

Fixes: b55b54b5db33 ("staging/android: remove struct sync_pt")
Signed-off-by: Luis de Bethencourt 
Reviewed-by: Javier Martinez Canillas 
---
Hi,

Just resending this patch since it hasn't had any reviews in since
March 21st.

Thanks,
Luis

 include/linux/fence.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/fence.h b/include/linux/fence.h
index 2b17698..2056e9f 100644
--- a/include/linux/fence.h
+++ b/include/linux/fence.h
@@ -49,6 +49,8 @@ struct fence_cb;
  * @timestamp: Timestamp when the fence was signaled.
  * @status: Optional, only valid if < 0, must be set before calling
  * fence_signal, indicates that the fence has completed with an error.
+ * @child_list: list of children fences
+ * @active_list: list of active fences
  *
  * the flags member must be manipulated and read using the appropriate
  * atomic ops (bit_*), so taking the spinlock will not be needed most
-- 
2.6.4



[PATCH v2] fence: add missing descriptions for fence

2016-03-21 Thread Luis de Bethencourt
The members child_list and active_list were added to the fence struct
without descriptions for the Documentation. Adding these.

Fixes: b55b54b5db33 ("staging/android: remove struct sync_pt")
Signed-off-by: Luis de Bethencourt 
Reviewed-by: Javier Martinez Canillas 
---
Hi,

This second version fixes the commit message as suggested by Javier Martinez.
https://lkml.org/lkml/2016/3/19/135

Thanks,
Luis

 include/linux/fence.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/fence.h b/include/linux/fence.h
index bb52201..ba5b678 100644
--- a/include/linux/fence.h
+++ b/include/linux/fence.h
@@ -49,6 +49,8 @@ struct fence_cb;
  * @timestamp: Timestamp when the fence was signaled.
  * @status: Optional, only valid if < 0, must be set before calling
  * fence_signal, indicates that the fence has completed with an error.
+ * @child_list: list of children fences
+ * @active_list: list of active fences
  *
  * the flags member must be manipulated and read using the appropriate
  * atomic ops (bit_*), so taking the spinlock will not be needed most
-- 
2.6.4



[PATCH] fence: add missing descriptions for fence

2016-03-20 Thread Luis de Bethencourt
On 19/03/16 23:55, Javier Martinez Canillas wrote:
> Hello Luis,
> 
> On Sat, Mar 19, 2016 at 4:50 PM, Luis de Bethencourt
>  wrote:
>> Commit b55b54b5db33 ("staging/android: remove struct sync_pt")
>> added the members child_list and active_list to the fence struct, but
>> didn't add descriptions for these. Adding the descriptions.
>>
> 
> Patches whose commit message mentions a specific commit that
> introduced and issue, usually also have a "Fixes:" tag before the
> S-o-B. For example this patch should have:
> 
> Fixes: b55b54b5db33 ("staging/android: remove struct sync_pt")
>> Signed-off-by: Luis de Bethencourt 
>> ---
>> Hi,
>>
>> Noticed this missing descriptions when running make htmldocs.
>>
>> Got the following warnings:
>> .//include/linux/fence.h:84: warning: No description found for parameter 
>> 'child_list'
>> .//include/linux/fence.h:84: warning: No description found for parameter 
>> 'active_list'
>>
>> Thanks :)
>> Luis
>>
> 
> Patch looks good to me.
> 
> Reviewed-by: Javier Martinez Canillas 
> 
> Best regards,
> Javier
> 

Hi Javier,

I didn't knew that, but thanks for saying so I can learn and use it in the
future.

I used the 'Commit b55b54b5db33 ("staging/android: remove struct sync_pt")'
format because that is what checkpatch recommended. But after re-reading
Documentation/SubmittingPatches it all makes sense and the process is clear
in my head.

Thanks!
Luis


[PATCH] fence: add missing descriptions for fence

2016-03-19 Thread Luis de Bethencourt
Commit b55b54b5db33 ("staging/android: remove struct sync_pt")
added the members child_list and active_list to the fence struct, but
didn't add descriptions for these. Adding the descriptions.

Signed-off-by: Luis de Bethencourt 
---
Hi,

Noticed this missing descriptions when running make htmldocs.

Got the following warnings:
.//include/linux/fence.h:84: warning: No description found for parameter 
'child_list'
.//include/linux/fence.h:84: warning: No description found for parameter 
'active_list'

Thanks :)
Luis

 include/linux/fence.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/fence.h b/include/linux/fence.h
index 2b17698..2056e9f 100644
--- a/include/linux/fence.h
+++ b/include/linux/fence.h
@@ -49,6 +49,8 @@ struct fence_cb;
  * @timestamp: Timestamp when the fence was signaled.
  * @status: Optional, only valid if < 0, must be set before calling
  * fence_signal, indicates that the fence has completed with an error.
+ * @child_list: list of children fences
+ * @active_list: list of active fences
  *
  * the flags member must be manipulated and read using the appropriate
  * atomic ops (bit_*), so taking the spinlock will not be needed most
-- 
2.5.1



[PATCH] drm: remove excess description

2016-03-19 Thread Luis de Bethencourt
Description of expected_size doesn't match any parameter of the function
drm_atomic_replace_property_blob. Removing it.

Signed-off-by: Luis de Bethencourt 
---
Hi,

I noticed this while running make htmldocs. It gives the following warning:
.//drivers/gpu/drm/drm_atomic.c:393: warning: Excess function parameter 
'expected_size' description in 'drm_atomic_replace_property_blob'

Thanks,
Luis

 drivers/gpu/drm/drm_atomic.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index a2596eb..8ee1db8 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -380,7 +380,6 @@ EXPORT_SYMBOL(drm_atomic_set_mode_prop_for_crtc);
  * drm_atomic_replace_property_blob - replace a blob property
  * @blob: a pointer to the member blob to be replaced
  * @new_blob: the new blob to replace with
- * @expected_size: the expected size of the new blob
  * @replaced: whether the blob has been replaced
  *
  * RETURNS:
-- 
2.5.1



[RESEND] drm: imx: imx-tve: Fix module autoload for OF platform driver

2015-11-30 Thread Luis de Bethencourt
On 30/11/15 21:28, Philipp Zabel wrote:
> Hi Luis,
> 
> thanks for the reminder.
>

No problem. I was worried I was bothering.

> Am Montag, den 30.11.2015, 15:02 +0000 schrieb Luis de Bethencourt:
>> This platform driver has a OF device ID table but the OF module
>> alias information is not created so module autoloading won't work.
>>
>> Signed-off-by: Luis de Bethencourt 
>> ---
>>
>> Hi,
>>
>> This is a resend of a patch from October 20th [0]
> 
> Sorry to have missed it, I was in the middle of a vacation then.
> I've applied it to my fixes branch now.
> 

I understand, we all have a few emails that fall between the cracks.

Thank you very much for reviewing and applying.
Luis

>> I am adding Andrew Morton to the CC list as was recommended at the Korea 
>> Linux
>> Forum.
>>
>> This patch adds the missing MODULE_DEVICE_TABLE() for OF to export
>> that information so modules have the correct aliases built-in and
>> autoloading works correctly.
>>
>> A longer explanation by Javier Canillas can be found here:
>> https://lkml.org/lkml/2015/7/30/519
>> A multitude of similar patches have been merged for other drivers, search
>> the git log for "module autoload for OF platform driver".
>>
>> Thanks,
>> Luis
> 
> regards
> Philipp
> 



[RESEND] drm/rockchip: Fix module autoload for OF platform driver

2015-11-12 Thread Luis de Bethencourt
From: Luis de Bethencourt <l...@debethencourt.com>

This platform driver has a OF device ID table but the OF module
alias information is not created so module autoloading won't work.

Signed-off-by: Luis de Bethencourt 

---
Hi,

This is a Resend of a patch from 20 Oct [0]

I am adding Andrew Morton to the CC list as was recommended at the Korea Linux
Forum.

This patch adds the missing MODULE_DEVICE_TABLE() for OF to export
that information so modules have the correct aliases built-in and
autoloading works correctly.

A longer explanation by Javier Canillas can be found here:
https://lkml.org/lkml/2015/7/30/519

Thanks,
Luis

[0] https://lkml.org/lkml/2015/10/20/485

 drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c 
b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 5d8ae5e..5897851 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -374,6 +374,7 @@ static const struct of_device_id vop_driver_dt_match[] = {
  .data = _vop },
{},
 };
+MODULE_DEVICE_TABLE(of, vop_driver_dt_match);

 static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v)
 {


[RESEND] drm: imx: imx-tve: Fix module autoload for OF platform driver

2015-11-12 Thread Luis de Bethencourt
From: Luis de Bethencourt <l...@debethencourt.com>

This platform driver has a OF device ID table but the OF module
alias information is not created so module autoloading won't work.

Signed-off-by: Luis de Bethencourt 

---

Hi,

This is a Resend of a patch from 20 Oct [0]

I am adding Andrew Morton to the CC list as was recommended at the Korea Linux
Forum.

This patch adds the missing MODULE_DEVICE_TABLE() for OF to export
that information so modules have the correct aliases built-in and
autoloading works correctly.

A longer explanation by Javier Canillas can be found here:
https://lkml.org/lkml/2015/7/30/519

Thanks,
Luis

[0] https://lkml.org/lkml/2015/10/20/478

drivers/gpu/drm/imx/imx-tve.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/imx/imx-tve.c b/drivers/gpu/drm/imx/imx-tve.c
index e671ad3..f959714 100644
--- a/drivers/gpu/drm/imx/imx-tve.c
+++ b/drivers/gpu/drm/imx/imx-tve.c
@@ -721,6 +721,7 @@ static const struct of_device_id imx_tve_dt_ids[] = {
{ .compatible = "fsl,imx53-tve", },
{ /* sentinel */ }
 };
+MODULE_DEVICE_TABLE(of, imx_tve_dt_ids);

 static struct platform_driver imx_tve_driver = {
.probe  = imx_tve_probe,


[RESEND PATCH] drm: omapdrm: tiler: Remove unneded module alias for tiler

2015-10-20 Thread Luis de Bethencourt
omap_dmm_tiler.c can't be compiled as a module and it is built
unconditionally as part of omapdrm. Since it can't be used as a module,
there is no need for it to have an unused MODULE_ALIAS().

Signed-off-by: Luis de Bethencourt 
---

Hi,

This is a resend of a patch sent September 24 [0]

Submitting the removal of MODULE_ALIAS("platform:" DMM_DRIVER_NAME):
As discussed with Tomi Valkeinen in:
https://lkml.org/lkml/2015/9/24/379

Thanks,
Luis

 drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c 
b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
index 7841970..51554c9 100644
--- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
+++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
@@ -1030,4 +1030,3 @@ struct platform_driver omap_dmm_driver = {
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Andy Gross ");
 MODULE_DESCRIPTION("OMAP DMM/Tiler Driver");
-MODULE_ALIAS("platform:" DMM_DRIVER_NAME);
-- 
2.5.3



[RESEND PATCH 1/2] drm: atmel-hlcdc: Fix module autoload for OF platform driver

2015-10-20 Thread Luis de Bethencourt
From: Luis de Bethencourt <l...@debethencourt.com>

This platform driver has a OF device ID table but the OF module
alias information is not created so module autoloading won't work.

Signed-off-by: Luis de Bethencourt 
Acked-by: Boris Brezillon 
---
 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c 
b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 244df0a..0126918 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -342,6 +342,7 @@ static const struct of_device_id atmel_hlcdc_of_match[] = {
},
{ /* sentinel */ },
 };
+MODULE_DEVICE_TABLE(of, atmel_hlcdc_of_match);

 int atmel_hlcdc_dc_mode_valid(struct atmel_hlcdc_dc *dc,
  struct drm_display_mode *mode)
-- 
2.5.3



[RESEND PATCH 0/2] drm: Fix module autoload for OF platform drivers

2015-10-20 Thread Luis de Bethencourt
Hello,

This is a resend of two patches posted in September 17 [0]

These patches add the missing MODULE_DEVICE_TABLE() for OF to export
the information so modules have the correct aliases built-in and
autoloading works correctly.

A longer explanation by Javier Canillas can be found here:
https://lkml.org/lkml/2015/7/30/519

The first patch is Acked by Boris Brezillon.

Thanks,
Luis

[0] https://lkml.org/lkml/2015/9/17/427
[1] https://lkml.org/lkml/2015/9/17/428

Luis de Bethencourt (2):
  drm: atmel-hlcdc: Fix module autoload for OF platform driver
  drm: imx: imx-tve: Fix module autoload for OF platform driver

 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 1 +
 drivers/gpu/drm/imx/imx-tve.c| 1 +
 2 files changed, 2 insertions(+)

-- 
2.5.3



[PATCH 3/5] drm: omapdrm: tiler: Fix module autoload for OF platform driver

2015-09-24 Thread Luis de Bethencourt
On Thu, Sep 24, 2015 at 06:43:33PM +0300, Tomi Valkeinen wrote:
> 
> On 24/09/15 18:36, Luis de Bethencourt wrote:
> 
> > I am a bit confused.
> 
> Yes, it's an interesting mess due to legacy reasons. Maybe we manage to
> fix it some day...
> 
> > So how the OMAP DRM auto loading is supposed to work when using Device 
> > Trees?
> 
> omapdrm isn't a real HW device driver at the moment. There's another
> driver, omapdss, which is the HW driver, and omapdrm uses omapdss.
> omapdrm platform device is created by omap platform code at boot time,
> the same way for both DT and non-DT boots.
> 
> > As far as I can tell, the main omap drm driver does not have a OF device ID
> > table and a .of_match it only has a MODULE_ALIAS("platform:" DRIVER_NAME),
> > but the tiler driver (that is built-in the omap drm driver) does have a a
> > OF device ID table and I see in DTS that are device nodes using those 
> > compatible
> > strings
> > 
> > $ git grep omap4-dmm arch/arm/boot/dts/omap*
> > arch/arm/boot/dts/omap4.dtsi:   compatible = "ti,omap4-dmm";
> > 
> > Does that mean there is no need for MODULE_ALIAS("platform:" 
> > DMM_DRIVER_NAME)?
> 
> No, I think that's the thing that makes omapdrm load.
> 
>  Tomi
> 

Makes sense. Thank you for the explanation.

I didn't know that a omapdrm platform device was registered explictly by 
platform
code.

Please notice that I wrote MODULE_ALIAS("platform:" DMM_DRIVER_NAME) not
MODULE_ALIAS("platform:" DRIVER_NAME)
In other words, I meant if alias: platform:dmm is needed besides alias:
platform:omapdrm?

Thanks,
Luis


[PATCH 3/5] drm: omapdrm: tiler: Fix module autoload for OF platform driver

2015-09-24 Thread Luis de Bethencourt
On Thu, Sep 24, 2015 at 01:41:56PM +0300, Tomi Valkeinen wrote:
> 
> On 17/09/15 17:21, Luis de Bethencourt wrote:
> > This platform driver has a OF device ID table but the OF module
> > alias information is not created so module autoloading won't work.
> > 
> > Signed-off-by: Luis de Bethencourt 
> > ---
> >  drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c 
> > b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
> > index 7841970..ecbc9e5 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
> > @@ -1014,6 +1014,7 @@ static const struct of_device_id dmm_of_match[] = {
> > },
> > {},
> >  };
> > +MODULE_DEVICE_TABLE(of, dmm_of_match);
> >  #endif
> >  
> >  struct platform_driver omap_dmm_driver = {
> 
> I think this one is not needed.
> 
> Tiler cannot be compiled as a module. Or, to be more exact, the tiler
> driver is included in the omapdrm module, along with the main omapdrm
> driver, which can be a module.
> 
> The autoloading should happen via omapdrm, and when that happens, tiler
> driver comes along.
> 
>  Tomi
> 

Hi Tomi,

I am a bit confused.

So how the OMAP DRM auto loading is supposed to work when using Device Trees?
As far as I can tell, the main omap drm driver does not have a OF device ID
table and a .of_match it only has a MODULE_ALIAS("platform:" DRIVER_NAME),
but the tiler driver (that is built-in the omap drm driver) does have a a
OF device ID table and I see in DTS that are device nodes using those compatible
strings

$ git grep omap4-dmm arch/arm/boot/dts/omap*
arch/arm/boot/dts/omap4.dtsi:   compatible = "ti,omap4-dmm";

Does that mean there is no need for MODULE_ALIAS("platform:" DMM_DRIVER_NAME)?

Because right now omapdrm.ko is exporting the alias for legacy / platform
device registration but not for OF.

Thanks,
Luis


[PATCH] drm: omapdrm: tiler: Remove unneded module alias for tiler

2015-09-24 Thread Luis de Bethencourt
omap_dmm_tiler.c can't be compiled as a module and it is built
unconditionally as part of omapdrm. Since it can't be used as a module,
there is no need for it to have an unused MODULE_ALIAS().

Signed-off-by: Luis de Bethencourt 
---

Hi,

Submitting the removal of MODULE_ALIAS("platform:" DMM_DRIVER_NAME):
As discussed in:
https://lkml.org/lkml/2015/9/24/379

Thanks,
Luis

 drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c 
b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
index 7841970..51554c9 100644
--- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
+++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
@@ -1030,4 +1030,3 @@ struct platform_driver omap_dmm_driver = {
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Andy Gross ");
 MODULE_DESCRIPTION("OMAP DMM/Tiler Driver");
-MODULE_ALIAS("platform:" DMM_DRIVER_NAME);
-- 
2.5.1



[PATCH 4/5] drm/rockchip: Fix module autoload for OF platform driver

2015-09-17 Thread Luis de Bethencourt
This platform driver has a OF device ID table but the OF module
alias information is not created so module autoloading won't work.

Signed-off-by: Luis de Bethencourt 
---
 drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c 
b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 5d8ae5e..5897851 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -374,6 +374,7 @@ static const struct of_device_id vop_driver_dt_match[] = {
  .data = _vop },
{},
 };
+MODULE_DEVICE_TABLE(of, vop_driver_dt_match);

 static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v)
 {
-- 
2.4.6



[PATCH 3/5] drm: omapdrm: tiler: Fix module autoload for OF platform driver

2015-09-17 Thread Luis de Bethencourt
This platform driver has a OF device ID table but the OF module
alias information is not created so module autoloading won't work.

Signed-off-by: Luis de Bethencourt 
---
 drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c 
b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
index 7841970..ecbc9e5 100644
--- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
+++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
@@ -1014,6 +1014,7 @@ static const struct of_device_id dmm_of_match[] = {
},
{},
 };
+MODULE_DEVICE_TABLE(of, dmm_of_match);
 #endif

 struct platform_driver omap_dmm_driver = {
-- 
2.4.6



[PATCH 2/5] drm: imx: imx-tve: Fix module autoload for OF platform driver

2015-09-17 Thread Luis de Bethencourt
This platform driver has a OF device ID table but the OF module
alias information is not created so module autoloading won't work.

Signed-off-by: Luis de Bethencourt 
---
 drivers/gpu/drm/imx/imx-tve.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/imx/imx-tve.c b/drivers/gpu/drm/imx/imx-tve.c
index e671ad3..f959714 100644
--- a/drivers/gpu/drm/imx/imx-tve.c
+++ b/drivers/gpu/drm/imx/imx-tve.c
@@ -721,6 +721,7 @@ static const struct of_device_id imx_tve_dt_ids[] = {
{ .compatible = "fsl,imx53-tve", },
{ /* sentinel */ }
 };
+MODULE_DEVICE_TABLE(of, imx_tve_dt_ids);

 static struct platform_driver imx_tve_driver = {
.probe  = imx_tve_probe,
-- 
2.4.6



[PATCH 1/5] drm: atmel-hlcdc: Fix module autoload for OF platform driver

2015-09-17 Thread Luis de Bethencourt
This platform driver has a OF device ID table but the OF module
alias information is not created so module autoloading won't work.

Signed-off-by: Luis de Bethencourt 
---
 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c 
b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 8bc62ec..a83c431 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -342,6 +342,7 @@ static const struct of_device_id atmel_hlcdc_of_match[] = {
},
{ /* sentinel */ },
 };
+MODULE_DEVICE_TABLE(of, atmel_hlcdc_of_match);

 int atmel_hlcdc_dc_mode_valid(struct atmel_hlcdc_dc *dc,
  struct drm_display_mode *mode)
-- 
2.4.6



[PATCH 0/5] drm: Fix module autoload for OF platform drivers

2015-09-17 Thread Luis de Bethencourt
These patches add the missing MODULE_DEVICE_TABLE() for OF to export
the information so modules have the correct aliases built-in and
autoloading works correctly.

A longer explanation by Javier Canillas can be found here:
https://lkml.org/lkml/2015/7/30/519

Thanks,
Luis

Luis de Bethencourt (5):
  drm: atmel-hlcdc: Fix module autoload for OF platform driver
  drm: imx: imx-tve: Fix module autoload for OF platform driver
  drm: omapdrm: tiler: Fix module autoload for OF platform driver
  drm/rockchip: Fix module autoload for OF platform driver
  drm/tegra: Fix module autoload for OF platform driver

 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 1 +
 drivers/gpu/drm/imx/imx-tve.c| 1 +
 drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 1 +
 drivers/gpu/drm/rockchip/rockchip_drm_vop.c  | 1 +
 drivers/gpu/drm/tegra/drm.c  | 1 +
 5 files changed, 5 insertions(+)

-- 
2.4.6