[PATCH] Samsung SoCs: OneNAND support

Kyungmin Park kmpark at infradead.org
Thu Sep 17 06:02:09 EDT 2009


On Thu, Sep 17, 2009 at 6:45 PM, Kyungmin Park <kmpark at infradead.org> wrote:
> On Thu, Sep 17, 2009 at 5:31 PM, Artem Bityutskiy <dedekind1 at gmail.com> wrote:
>> On 09/17/2009 11:16 AM, Kyungmin Park wrote:
>>>
>>> +static int s3c_onenand_wait(struct mtd_info *mtd, int state)
>>> +{
>>> +       unsigned int flags = INT_ACT;
>>> +       unsigned int stat, ecc;
>>> +       unsigned long timeout;
>>> +
>>> +       switch (state) {
>>> +       case FL_READING:
>>> +               flags |= BLK_RW_CMP | LOAD_CMP;
>>> +               break;
>>> +       case FL_WRITING:
>>> +               flags |= BLK_RW_CMP | PGM_CMP;
>>> +               break;
>>> +       case FL_ERASING:
>>> +               flags |= BLK_RW_CMP | ERS_CMP;
>>> +               break;
>>> +       case FL_LOCKING:
>>> +               flags |= BLK_RW_CMP;
>>> +               break;
>>> +       default:
>>> +               break;
>>> +       }
>>> +
>>> +       /* The 20 msec is enough */
>>> +       timeout = jiffies + msecs_to_jiffies(20);
>>> +       while (time_before(jiffies, timeout)) {
>>> +               stat = s3c_read_reg(INT_ERR_STAT_OFFSET);
>>> +               if (stat&  flags)
>>> +                       break;
>>> +
>>> +               if (state != FL_READING)
>>> +                       cond_resched();
>>> +       }
>>> +       /* To get correct interrupt status in timeout case */
>>> +       stat = s3c_read_reg(INT_ERR_STAT_OFFSET);
>>> +       s3c_write_reg(stat, INT_ERR_ACK_OFFSET);
>>> +
>>> +       /*
>>> +        *
>>> +        * In the Spec. it checks the controller status first
>>> +        * However if you get the correct information in case of
>>> +        * power off recovery (POR) test, it should read ECC status first
>>> +        */
>>> +       if (stat&  LOAD_CMP) {
>>> +               ecc = s3c_read_reg(ECC_ERR_STAT_OFFSET);
>>> +               if (ecc&  ONENAND_ECC_4BIT_UNCORRECTABLE) {
>>> +                       printk(KERN_INFO "onenand_wait: ECC error =
>>> 0x%04x\n", ecc);
>>
>> Copy-paste error? Also see below.
>
> Nice catch.
>
>>
>>> +                       mtd->ecc_stats.failed++;
>>> +                       return -EBADMSG;
>>> +               }
>>> +       }
>>> +
>>> +       if (stat&  (LOCKED_BLK | ERS_FAIL | PGM_FAIL | LD_FAIL_ECC_ERR)) {
>>> +               printk(KERN_INFO "s3c_onenand_wait: controller error =
>>> 0x%04x\n", stat);
>>> +               if (stat&  LOCKED_BLK)
>>> +                       printk(KERN_INFO "s3c_onenand_wait: it's locked
>>> error = 0x%04x\n", stat);
>>
>> Very quick comment. Could you please avoid this style of putting function
>> name to the printk? We have lots of this in onenand_base.c, and they are
>> often wrong, because function names change.
>>
>> Could we please use dev_printk(), dev_dbg() and the like instead? You'll

FYI: In case of MTD,
dev_printk(), dev_dbg() not working. I used &mtd->dev,

Do you know how to set the dev instead of &mtd->dev?

Thank you,
Kyungmin Park



More information about the linux-mtd mailing list